#!/bin/bash

# 数组排序的函数，对数组里的内容去除前缀后按照数字排序
function sort_by_index
{
    arr=$1
    prefix=$2

#echo ${arr[@]}

    declare -a numarr
    declare -a res

    prefixlen=${#prefix}

    for el in ${arr[*]};do
        if [[ ! ${el:0:$prefixlen} == $prefix || ! ${el:$prefixlen} -gt 0 ]];then
            continue
        fi

        num=${el:$prefixlen}
        numarr=("${numarr[@]}" $num)
    done

#echo ${numarr[@]}

   sortedstr=$(echo ${numarr[@]} | tr ' ' '\n' | sort -n)
   for el in $sortedstr;do
       res=("${res[@]}" $prefix$el)
   done

   echo "${res[@]}"
}

# 获取grub文件的路径
get_grubfile()
{
	local grubfile=""
	local grubentry=$(ls /.boot.real/loader/entries/*backuprestore*.conf 2> /dev/null | head -1)
        if [[ ! -z $grubentry ]]; then
                grubfile=$grubentry
        else
                local grubfile1="/.boot.real/grub2/grub.cfg"
                # 有可能是通过 uefi 启动
                local grubfile2="/boot/efi/EFI/KylinSecOS/grub.cfg"
                # 有可能 /boot 目录没有挂载为 overlay 
                local grubfile3="/boot/grub2/grub.cfg"

                if [[ -e $grubfile1 ]]; then
                        grubfile=$grubfile1
                elif [[ -e $grubfile2 ]]; then
                        grubfile=$grubfile2
                elif [[ -e $grubfile3 ]]; then
                        grubfile=$grubfile3
                fi
        fi
	echo $grubfile
}

# 获取启动参数里指定的备份点
get_overlayx() 
{
	grubfile=$(get_grubfile)
	if [[ ! -e $grubfile ]]; then
		echo "get grub file failed"
		return 0
	fi 
	
	overlayline=$(cat $grubfile | grep overlayx=)
	if [[ -z $overlayline ]];then 
		echo "    can not find overlayx= in $grubfile, exception"
		return 0
	fi 
	
	for x in $(echo $overlayline); do
		if [ `echo $x|grep "overlayx="` ]; then
			oldoverlayx=${x#overlayx=}
			# is number
			if [[ $oldoverlayx -gt 0 ]];then
				return $oldoverlayx
			fi
		fi
	done
	
	return 0
}

# 设备 grub.cfg 文件的备份点，系统启动时将从这个备份点运行
set_overlayx()
{
	overlayx=$1

	grubfile=$(get_grubfile)
	if [[ ! -e $grubfile ]]; then
		echo "get grub file failed"
		return 1
	fi 
	
	overlayline=$(cat $grubfile | grep overlayx=)
	if [[ -z $overlayline ]];then 
		echo "    can not find overlayx= in $grubfile, exception"
		return 1 
	fi 
	
	for x in $(echo $overlayline); do
		if [ `echo $x|grep "overlayx="` ]; then
			oldoverlayx=${x#overlayx=}
		fi
	done
	
	sed -i "s/overlayx=$oldoverlayx/overlayx=$overlayx/g" $grubfile
	return 0
}

# 获取之前的备份的最大数字索引
get_backup_index()
{
    max=0
    res=`ls /.overlayup/ 2> /dev/null`
    for file in $res;do
        if [[ ! ${file:0:5} == "upper" || ${file} == "upper" ]];then
            continue
        fi
       
        suffix=${file:5}
        # not number
        if [[ ! $suffix -gt 0 ]] 2>/dev/null; then
            continue
        fi

        if [[ $suffix -gt $max ]];then
            max=$suffix
        fi
    done

    return $max
}

# 检查描述信息是否之前的备份已经使用过
if_name_new()
{
    name=$1
    res=`ls /.overlayup/ 2> /dev/null`
    for file in $res;do
        if [[ ! ${file:0:4} == "name" || ${file} == "name" ]];then
            continue
        fi
       
        suffix=${file:4}
        # not number
        if [[ ! $suffix -gt 0 ]] 2>/dev/null; then
            continue
        fi
 
        file_name=`cat /.overlayup/$file`
        if [[ $name == $file_name ]];then
            return 0
        fi
    done

    return 1
}

# 检查描述信息是否之前的备份已经使用过
if_desc_new()
{
    desc=$1
    res=`ls /.overlayup/ 2> /dev/null`
    for file in $res;do
        if [[ ! ${file:0:4} == "desc" || ${file} == "desc" ]];then
            continue
        fi
       
        suffix=${file:4}
        # not number
        if [[ ! $suffix -gt 0 ]] 2>/dev/null; then
            continue
        fi
 
        file_desc=`cat /.overlayup/$file`
        if [[ $desc == $file_desc ]];then
            return 0
        fi
    done

    return 1
}
