#!/bin/sh

ULIB_PATH="/usr/lib/unipi"

create_alternate_script()
{
    altpart="$1"
    bootdev="$2"
    mmc=$(basename "$bootdev")
    mmc=$(echo "$mmc" | sed 's/blk//')
    if [ -w "/boot/" ]; then
        echo "$mmc:$1" > /boot/tryboot
    fi

    #tmp=$(mktemp)
    #echo "distro_bootpart=$altpart" > "$tmp"
    #mkimage -C none -A arm -T script -d "$tmp" /boot/recover.scr >/dev/null
    #rm -f "$tmp"
}

set_boot_permanent()
{
    dev=$1
    old=$2
    new=$3
    [ "$old" = "$new" ] && return
    tmppart=$(mktemp) || return 1
    sfdisk -d "$dev" > "$tmppart"
    if grep -q 'label: gpt' "$tmppart"; then
        sfdisk --no-reread --no-tell-kernel --quiet --part-attrs "$dev" "$new" LegacyBIOSBootable
        sfdisk --no-reread --no-tell-kernel --quiet --part-attrs "$dev" "$old" ""
    else
        sfdisk --no-reread --no-tell-kernel --quiet --activate "$dev" "$new"
    fi
    rm -f "$tmppart"
}

swap_part_number()
{
    if ! [ -r /etc/default/switchboot ]; then
        echo "Cannot read configuration of A/B system from /etc/default/switchboot" >&2
        exit 1
    fi
    unset A
    unset B
    . /etc/default/switchboot
    if [ -z "$A" ] || [ -z "$B" ]; then
        echo "Incorrect definition of variables A and B in /etc/default/switchboot" >&2
        echo "Define in the file for example A=2 and B=3" >&2
        exit 1
    fi
    if [ "$1" = "$B" ]; then
        echo "$A"
    elif [ "$1" = "$A" ]; then
        echo "$B"
    else
        echo "Bootpart unknown ($1)! Alternate boot not set!" >&2
        exit 1
    fi
}

bootdev=$(awk '($2=="/") { print $1;}' /proc/mounts)   #'
if [ "$bootdev" = "/dev/root" ]; then
    majmin=$(stat -c %D $(readlink -f /boot))
    bootdev=$(readlink -f /dev/block/$((0x$majmin>>8)):$((0x$majmin & 0xff)))
fi
bootpart=$(echo "$bootdev" | sed -E 's/^.*(.)$/\1/') #'
bootdev=$(echo "$bootdev" | sed -E 's/^(.*)..$/\1/') #'

pbootdev=$(sfdisk -o Device,Attrs -l "$bootdev" | awk '/LegacyBIOSBootable/ || $2==80  {print $1;}')
pbootpart=$(echo "$pbootdev" | sed -E 's/^.*(.)$/\1/') #'
case "$1" in
  --p*)
        rm -f /boot/recover.scr
        rm -f /boot/tryboot
        set_boot_permanent "$bootdev" "$pbootpart" "$bootpart"
        ;;
  --t*)
        if [ "$bootpart" != "$pbootpart" ]; then
            echo "Boot state inconsistent! Alternate boot not set!" >&2
            exit 1
        fi
        altpart=$(swap_part_number "$bootpart") || exit 1
        create_alternate_script "$altpart" "$bootdev"
        if [ "$altpart" -gt "$bootpart" ]; then mode="b"; else mode="a"; fi
        "$ULIB_PATH/bootcount" set "$mode"
        ;;
  os-configurator-event)
        # call from os-configurator during boot to try reboot again
        if [ "$bootpart" != "$pbootpart" ]; then
            altpart=$(swap_part_number "$pbootpart") || exit 1
            if [ "$altpart" -gt "$pbootpart" ]; then mode="b"; else mode="a"; fi
            "$ULIB_PATH/bootcount" set "$mode"
        fi
        ;;

  mender_boot_part)
        echo "mender_boot_part=$bootpart"
        ;;
  upgrade_available)
        if [ "$bootpart" = "$pbootpart" ] && [ ! -e /boot/tryboot ] ; then
            echo "upgrade_available=0"
        else
            echo "upgrade_available=1"
        fi
        ;;
  mender_check_saveenv_canary)
        ;;
  "")
        printf "Boot device:      $bootdev\nLoaded boot part:    $bootpart\nPermanent boot part: $pbootpart\n"
        ;;
  *)
    echo 'Usage:'
    echo "  $0 [--try] [--permanent] [--help]"
    exit 1
esac
