#!/bin/bash
init_flag="/etc/kysec-scene/.init"
#首次启动标志
first_boot_flag=0

# 用于刚装好系统第一次开机时 给底层标记程序提供策略里包含的文件列表,
# 底层在initrd阶段使用完该文件后, 后续不在需要该文件 
# 为了解决桌面二次重启的问题
origin_resource_file="/etc/kysec-scene/kysec-scene-origin-resource"

# 该文件由kysec-utils的postinst脚本安装或升级时根据ksaf底层状态来创建
# 若ksaf未初始化或ksaf状态为0,则创建该文件,下次开机时,同步变更数据的策略
sync_update_flag="/etc/kysec-scene/.sync_update"

get_ksaf_status(){
    if [ -e "/sys/kernel/security/ksaf/status" ];then
        status=$(cat "/sys/kernel/security/ksaf/status")
        if [ -n "$status" -a "$status" != "0" ];then
            return 1
        fi
    fi
    return 0
}

set_security_mode(){
    # 用于开机打标 以下逻辑仅安装好系统 第一次进入系统时才会触发
    if [ ! -e ${init_flag} ];then
        /usr/bin/kysec-scene-devctl-init
        /usr/bin/kysec-scene-parse-resource -n
        #首次启动标志置1
        first_boot_flag=1
        /usr/sbin/security-switch --set default
        # kysec-scene-init.service 服务判断若该文件不存时,开机过程中将执行本脚本中的内容
        touch ${init_flag}
    fi
    
    # 第一次启动时 删除该文件 initrd阶段已经对该文件中的内容 打完标记了.
    # [ -e "${origin_resource_file}" ] && rm -rf "${origin_resource_file}"
    return 0
}


sync_update(){
    # 用于同步变更数据策略
    [ ! -e ${sync_update_flag} ] && return 0
    get_ksaf_status
    [ $? -eq 0 ] && return 0
    #新增检查：如果存在首次启动标志，则跳过策略文件数据同步过程
    if [ ${first_boot_flag} -eq 1 ]; then
        first_boot_flag=0
    else
        /usr/sbin/kysec_sync_init --netctl /usr/share/kysec-data/netctl/u_v10pro_netctl.xml
        /usr/sbin/kysec_sync_init --netctl_pkg /usr/share/kysec-data/netctl/u_v10pro_netctl_pkg.xml
        /usr/sbin/kysec_sync_init --ppro /usr/share/kysec-data/ppro/u_v10pro_ppro.xml
        /usr/sbin/kysec_sync_init --readonly /usr/share/kysec-utils/data/readonly_list
    fi
    rm -rf ${sync_update_flag}
    return 0
}

do_pkg_update() {
    get_ksaf_status
    [ $? -eq 0 ] && return 0

    PKG_UPDATE_SCRIPTS_DIR="/etc/kysec-scene/pkg-update"

    if [ ! -e "${PKG_UPDATE_SCRIPTS_DIR}" ]; then
        return
    fi

    for script in "${PKG_UPDATE_SCRIPTS_DIR}"/*.sh; do
        "$script" systemd
        status=$?
        if [ $status -ne 0 ]; then
            echo "failed to run pkg-update for $(basename "$script"), exit code=$status"
            continue
        fi
        rm -f "$script"
    done

    return 0
}

set_security_mode
sync_update
do_pkg_update
