#!/bin/bash

# 权限为 0755，执行 update-initramfs -u

PREREQ=""

prereqs()
{
    echo "$PREREQ"
}

case $1 in
    prereqs)
        prereqs
        exit 0
        ;;
esac

. /scripts/local-bottom/recovery-utils

RESTORE_UUID=
RESTORE_UUID_MOUNT_POINT=
LOG_FILE=
ROLL_BACK_VERSION=
RECOVERY_TYPE=
RECOVERY_TYPE_RSYNC=0
UOS_RECOVERY_BY_GRUB_SCHEME="recovery"

unset_recovery_by_grub_global_var()
{
    unset RESTORE_UUID
    unset RESTORE_UUID_MOUNT_POINT
    unset LOG_FILE
    unset ROLL_BACK_VERSION
    unset RECOVERY_TYPE
    unset RECOVERY_TYPE_RSYNC
    unset UOS_RECOVERY_BY_GRUB_SCHEME
}

prepare_restore()
{
    is_fstab_exist
    local errcode=$?
    if [ $errcode -ne 0 ]; then
        write_log " prepare_restore: is_fstab_exist error, root_path = $root_path, errcode = $errcode"
        return $errcode
    fi

    mount_fstab
    errcode=$?
    if [ $errcode -ne 0 ]; then
        write_log " prepare_restore call mount_fstab error, errcode = $errcode "
        return $errcode
    fi

    write_log "`lsblk -f`"
    RESTORE_UUID_MOUNT_POINT=$(echo $(lsblk --output UUID,MOUNTPOINT | grep $RESTORE_UUID) | awk '{print $2}')
    if [ -z "$RESTORE_UUID_MOUNT_POINT" ]; then
        write_log "prepare_restore get restore mount point failed"
        return 1
    fi

    local cur_backup=${RESTORE_UUID_MOUNT_POINT}"/backup/system/snapshots/"$ROLL_BACK_VERSION
    RECOVERY_TYPE=`cat $cur_backup/backup_info.json | grep recoveryType | awk '{print $2}' | awk -F ',' '{print $1}'`

    return 0
}

rsync_restore_by_grub()
{
    local rollback_version=$ROLL_BACK_VERSION
    local restore_backup_uuid=$RESTORE_UUID
    local root_path=${rootmnt}
    local log_file=$LOG_FILE

    write_log "begin rsync_restore_by_grub, rollback_version = $rollback_version, restore_backup_uuid = $restore_backup_uuid"
    local cur_backup=${RESTORE_UUID_MOUNT_POINT}"/backup/system/snapshots/"$rollback_version
    local restore_src=$cur_backup"/localhost/"
    local restore_dest=${root_path}
    exclude_file=${cur_backup}/"exclude.list"
    write_log "call rsync_restore_by_grub begin, exclude_file=$exclude_file, root_path=$root_path"
    write_log "cur_backup=$cur_backup, restore_src=$restore_src, log_file=$log_file"
    # Run rsync to restore snapshot
    local rsyncArgs="-avAXHr --no-inc-recursive --ignore-missing-args --delete --info=progress2 --force"
    rsync $rsyncArgs --exclude-from $exclude_file $restore_src $restore_dest &>>$log_file
    errcode=$?
    if [ $errcode -eq 24 ]; then
        write_log "rsync file has vanished , ignore errcode=$errcode"
        errcode=0
    fi

    if [ $errcode -eq 23 ]; then
        write_log "rsync by grub Operation not supported , ignore errcode=$errcode"
        errcode=0
    fi

    if [ $errcode -ne 0 ]; then
        write_log " rsync restore error !, errcode = $errcode "
        # 需要在umount前先备份日志到真实系统
        return $err_rsync_failed
    fi
    write_log "rsync_restore_by_grub finished"
    return 0
}

main()
{
    mount -o remount,rw ${rootmnt}
    if [ $? -ne 0 ]; then
        echo "call remount error, exit ..."
        exit $err_mount_failed
    fi

    for x in $(cat /proc/cmdline); do
        case $x in
            back_version=*)
                ROLL_BACK_VERSION=${x#back_version=}
                ;;
            back_scheme=*)
                back_scheme=${x#back_scheme=}
                ;;
            backup_uuid=*)
                RESTORE_UUID=${x#backup_uuid=}
                ;;
        esac
    done

#    RESTORE_UUID=26377624-4f85-4caf-8093-13d0a0e3a2c0
#    ROLL_BACK_VERSION=v20.3.1.20220830

    if [ "x$back_scheme" = "x$UOS_RECOVERY_BY_GRUB_SCHEME" ]; then
        init_log
        write_log "back_scheme = $back_scheme, RESTORE_UUID= $RESTORE_UUID, ROLL_BACK_VERSION=$ROLL_BACK_VERSION"
        prepare_restore
        errcode=$?
        if [ $errcode -ne 0 ]; then
            write_log "prepare_restore error! errcode = $errcode, rollback to version: $ROLL_BACK_VERSION failed"
            echo "rollback to version: $ROLL_BACK_VERSION failed"
            copy_log
            sleep 10
            umount_fstab
            errcode=$?
            if [ $errcode -ne 0 ]; then
                write_log "main umount_fstab error !, errcode = $errcode "
                reboot -f
            fi
            return 0
        fi

        if [ "$RECOVERY_TYPE" = "$RECOVERY_TYPE_RSYNC" ]; then
            echo "current scheme is $back_scheme, rollback to version: $ROLL_BACK_VERSION"
            rsync_restore_by_grub
            errcode=$?
            if [ $errcode -ne 0 ]; then
                echo "rollback to version: $ROLL_BACK_VERSION failed"
                write_log "rollback to version: $ROLL_BACK_VERSION failed, errcode = $errcode"
            else
                echo "rollback to version: $ROLL_BACK_VERSION successfully"
                write_log "rollback to version: $ROLL_BACK_VERSION successfully"
            fi
            sleep 10
        fi

        copy_log
        umount_fstab
        errcode=$?
        if [ $errcode -ne 0 ]; then
            write_log "main umount_fstab error !, errcode = $errcode "
            reboot -f
        fi
        return 0
    fi

    unset_recovery_by_grub_global_var
}

main

exit 0
