#!/bin/bash

tmpdir="/tmp/sdk/ar-deb"

init_tmpdir()
{
    del_tmpdir
    mkdir -p $tmpdir
}

del_tmpdir()
{
    rm -rf $tmpdir
}

# whitelist_runtime_check开关是否开启
get_whitelist_runtime_check()
{
    local res=$(kconf2 get libkysdk-package.installation whitelist_runtime_check)
    local return_code=$? 
    echo $res
    return $return_code
}

# privilege_runtime_check开关是否开启
get_privilege_runtime_check()
{
    local res=$(kconf2 get libkysdk-package.installation privilege_runtime_check)
    local return_code=$? 
    echo $res
    return $return_code
}

# 获取_compat字段的值
# 传入解压包的路径,字段名
get_compat_field_value()
{
    local unzip_path=$1
    local field=$2
    local file_name=${unzip_path}"/_compat"
    local runtime_version=''
    mapfile -t lines < $file_name

    for line in "${lines[@]}";do
        if [[ ${line%:*} == $field ]];then
            # 获取冒号后的值
            runtime_version=${line#*:}
        fi
    done
    echo $runtime_version
}

# 解压deb至tmp/sdk/ar-deb
uncompress_deb_to_tmp()
{
    local deb=$1
    ar -x $deb --output $tmpdir
    local return_code=$?
    return $return_code
}

# 获取data.tar.**文件在deb包里所占的长度与偏移量
get_data_size_in_deb()
{
    local deb=$1
    local size=$(ar -tvO $deb | grep data.tar | awk '{print $3+$9}')
    local return_code=$?
    echo $size
    return $return_code
}

# 导入gpg秘钥
import_gpg_key()
{
    GPGTMP=$(mktemp -d)
    export GNUPGHOME="$GPGTMP"
    gpg --import /usr/share/keyrings/deb-sign/* &> /dev/null
}

# 恢复gpghome
unset_gpg()
{
    unset GNUPGHOME
}

# 验签
gpg_verify()
{
    sign=$1
    plain=$2
    gpg --verify $sign $plain &> /dev/null
    local return_code=$?
    return $return_code
}

# 获取deb包sha512的值
get_deb_sha512sum()
{
    size=$1
    deb=$2
    local file_sha512sum=$(head -c $size $deb | sha512sum - | awk '{print $1}')
    echo $file_sha512sum
}

# 查询软件包是否在白名单中
is_in_white_list() {
    array=($(kconf2 list-keys libkysdk-package.direct_install_whitelist))
    for group in ${array[@]}; do
        output=$(kconf2 get libkysdk-package.direct_install_whitelist ${group})
        set -f
        pkgname=($(echo "$output" | sed 's/\[//;s/\]//;s/"//g' | tr ',' ' '))
        for pkg in ${pkgname[@]}; do
            if [[ $1 == $pkg ]]; then
                log "$1 是特权包!!"
                return 0
            fi
        done
        set +f
    done
    log "$1 不是特权包!!"
    return 1
}

is_in_privilege_list() {
    output=$(kconf2 get libkysdk-package.bare_metal pkg-list)
    set -f
    pkgname=($(echo "$output" | sed 's/\[//;s/\]//;s/"//g' | tr ',' ' '))
    for pkg in ${pkgname[@]}; do
        if [[ $1 == $pkg ]]; then
            log "$1 是特权包!!\n"
            return 0
        fi
    done
    set +f
    log "$1 不是特权包!!\n"
    return 1
}

# 添加包到特权列表
add_to_privilege_list() {
    local new_pkg="$1"
    if [ -z "$new_pkg" ]; then
        log "错误: 包名不能为空"
        return 1
    fi

    # 获取当前特权包列表
    local current_list=$(kconf2 get libkysdk-package.bare_metal pkg-list 2>/dev/null)
    if [ $? -ne 0 ]; then
        log "错误: 无法获取当前特权包列表"
        return 1
    fi

    # 如果当前列表为空，初始化为包含新包的列表
    if [ -z "$current_list" ] || [ "$current_list" = "[]" ]; then
        local updated_list="['$new_pkg']"
    else
        # 从字符串格式转换为数组，处理现有的列表格式
        # 假设当前列表格式为 ["pkg1","pkg2"]
        set -f
        local cleaned_list=$(echo "$current_list" | sed "s/\[//;s/\]//;s/\"//g;s/'//g")
        local existing_pkgs=($(echo "$cleaned_list" | tr ',' ' '))

        # 检查包是否已经存在
        for pkg in "${existing_pkgs[@]}"; do
            if [ "$pkg" = "$new_pkg" ]; then
                log "包 $new_pkg 已经在特权列表中"
                return 0
            fi
        done

        # 构造新的列表，添加新包
        local updated_list="["
        local first=true
        for pkg in "${existing_pkgs[@]}"; do
            if [ "$first" = true ]; then
                updated_list="${updated_list}'$pkg'"
                first=false
            else
                updated_list="${updated_list},'$pkg'"
            fi
        done
        set +f
        # 添加新包
        if [ "$first" = false ]; then
            updated_list="${updated_list},'$new_pkg'"
        else
            updated_list="${updated_list}'$new_pkg'"
        fi
        updated_list="${updated_list}]"
    fi

    # 设置更新后的列表
    if kconf2 set libkysdk-package.bare_metal pkg-list "$updated_list"; then
        log "成功将 $new_pkg 添加到特权列表"
        return 0
    else
        log "错误: 无法设置更新后的特权列表"
        return 1
    fi
}

is_package_installed_in_sys()
{
    local deb_file="$1"
    
    if [ ! -f "$deb_file" ]; then
        log "错误: deb 文件不存在 $deb_file"
        return 1
    fi
    
    local package_name=$(dpkg-deb -f "$deb_file" Package)
    local version=$(dpkg-deb -f "$deb_file" Version)
    
    if [ -z "$package_name" ] || [ -z "$version" ]; then
        log "错误: 无法获取包名或版本"
        return 1
    fi
    
    local search_result=$(dpkg -l | grep "^ii[[:space:]]\+${package_name}[[:space:]]" 2>/dev/null)
    
    if [ -z "$search_result" ]; then
        log "包 ${package_name} 未安装"
        return 1
    fi
    
    local installed_version=$(echo "$search_result" | head -n1 | awk '{print $3}')
    
    if [ "$version" = "$installed_version" ]; then
        log "包 ${package_name} 已安装且版本一致 (${version})"
        return 0
    else
        log "包 ${package_name} 版本不一致：期望 ${version}, 已安装 ${installed_version}"
        return 1
    fi
}

