#!/bin/bash
bus_name="com.kylin.systemupgrade"
object_path="/com/kylin/systemupgrade"
interface_name="com.kylin.systemupgrade.interface"

# D-Bus信号名称
update_method="UpdateDetect"

reslove_method="DistUpgradeAll false"

download_method="DistUpgradeAll true"

shutdown_install_method="TriggerInstallOnShutdown reboot"

cancel_method="CancelDownload"

# 检查源信息
if [ -f "/etc/kylin-system-updater/apt_private.conf" ]; then
    SOURCES_LIST="/var/lib/kylin-system-updater/sources.list"
    APT_RUN="apt -c /etc/kylin-system-updater/apt_private.conf"
else
    SOURCES_LIST="/etc/apt/sources.list"
    APT_RUN="apt"
fi

fn_update() {
    gdbus call --system --dest $bus_name --object-path $object_path --method $interface_name.$update_method > /dev/null
}
fn_pre_download_check() {
    gdbus call --system --dest $bus_name --object-path $object_path --method $interface_name.$reslove_method > /dev/null
}

fn_download() {
    gdbus call --system --dest $bus_name --object-path $object_path --method $interface_name.$download_method > /dev/null
}

fn_install() {
    gdbus call --system --dest $bus_name --object-path $object_path --method $interface_name.$shutdown_install_method > /dev/null
}

fn_cancel() {
    gdbus call --system --dest $bus_name --object-path $object_path --method $interface_name.$cancel_method > /dev/null
}

fn_restart() {
    echo "执行重新启动系统更新服务：/usr/share/kylin-system-updater/kylin-system-updater -r $@ &"
    if [ -f "/etc/dbus-1/conf/com.kylin.UpgradeStrategies.limit" ]; then
        echo "删除dbus管控文件"
        sudo rm /etc/dbus-1/conf/com.kylin.UpgradeStrategies.limit* /etc/dbus-1/conf/com.kylin.systemupgrade.limit*
    fi
    sudo /usr/share/kylin-system-updater/kylin-system-updater -r "$@" &
}

fn_apt() {
    echo "执行apt指令: $APT_RUN $@ "
    $APT_RUN "$@"
}


# 帮助信息函数
fn_show_help() {
    cat << EOF
用法: updater-debug [选项]

描述:
    系统更新debug调试脚本,通过命令方式调用系统更新的dbus接口执行相应事务。

选项:
    -h, --help          显示此帮助信息并退出
    update              进行系统更新的检查更新
    restart             进行重启系统更新的服务并删除dbus管控文件
    download-check      进行下载前检查包括依赖检查、磁盘空间检查等等
    download            进行系统更新下载软件包
    cancel              进行取消下载任务
    install             进行触发关机安装

    apt, apt-get        执行apt的相关内容,例如 update-debug apt policy tree
EOF
}


main() {
    while :; do
        case $1 in
            -h|-\?|--help)
                fn_show_help
                ;;
            restart)
                shift
                fn_restart "$@"
                ;;
            update)
                fn_update
                ;;
            download-check)
                fn_pre_download_check
                ;;
            download)
                fn_download
                ;;
            install)
                fn_install
                ;;
            cancel)
                fn_cancel
                ;;
            apt|apt-get)
                shift
                fn_apt "$@"
                ;;
            *)
                fn_show_help
                break
        esac
        exit 0
    done
}

main "$@"
