#!/usr/bin/python3

import datetime
import click
import os
import shutil
import subprocess

import sys
for root, dirs, _ in os.walk("/usr/lib/python3/dist-packages"):
    for dir_name in dirs:
        if dir_name.startswith("UpgradeCheck"):
            sys.path.append(os.path.join(root, dir_name))
        if dir_name.startswith("DependCheck"):
            sys.path.append(os.path.join(root, dir_name))

from DependCheck.static_depend_collect import install_or_deb_func, PathStandardChecker,dpkg_r_deb_to_path,get_control_file_info
from DependCheck.static_depend_collect import get_deb_depend, systemd_service_depend_check, get_deb_elf_depend, extract_imports
from UpgradeCheck.util_deb import KpctDeb
from UpgradeCheck.util_log import Log

# 创建检查器实例
# checker = PathStandardChecker()

# 示例软件包数据
# sample_packages = {
#     'firefox': [
#         '/usr/share/applications/firefox.desktop',
#         '/usr/bin/firefox',
#         '/usr/share/icons/hicolor/64x64/apps/firefox.png',
#         '/usr/lib/firefox/firefox-bin',
#         '/usr/share/doc/firefox/README',
#         '/etc/xdg/autostart/firefox-autostart.desktop'
#     ],
#     'kylin-weather': [
#         '/usr/share/kylin-weather/config.conf',
#         '/usr/bin/kylin-weather',
#         '/usr/share/applications/kylin-weather.desktop',
#         '/usr/share/icons/kylin-weather/icon.png'
#     ],
#     'custom-app': [
#         '/usr/lib/custom-app/main.so',
#         '/opt/custom-app/config.conf'  # 这个应该是合规的
#     ]
# }

# 检查单个包
# print("=== 检查单个包 ===")
# firefox_result = checker.check_package_files('firefox', sample_packages['firefox'])
# print(checker.generate_report(firefox_result))

# 批量检查所有包
# print("\n=== 批量检查所有包 ===")
# batch_results = checker.batch_check_packages(sample_packages)
# print(checker.generate_report(batch_results))

# 生成修复命令
# print("\n=== 修复命令建议 ===")
# for package_name in sample_packages:
#     package_result = checker.check_package_files(package_name, sample_packages[package_name])
#     if package_result['violation_count'] > 0:
#         print(f"\n{package_name} 修复命令:")
#         commands = checker.get_suggested_fix_commands(package_result)
#         for cmd in commands:
#             print(cmd)

@click.command()
@click.option('--package', callback=install_or_deb_func)
@click.option('--opt', 'opt', is_flag=True, help='是否进行磐石架构检测')
@click.option('--save-path', default='{}/.kpct/Depend_Check'.format(os.getenv('HOME')), help='输出存放路径')
def main(package, save_path, opt):
    if opt:
        mid_time = datetime.datetime.now()
        print("===== 磐石架构标准检测开始")
        k_log = Log().getlog()
        kpct_deb = KpctDeb(k_log, third_app_flag=True)
        panshi_check = PathStandardChecker()
        res = panshi_check.batch_check_packages(kpct_deb.deb_dict)
        print(panshi_check.generate_report(res))
        mid_time_end = datetime.datetime.now()
        print("===== 磐石架构标准检测时间：{}s".format((mid_time_end - mid_time).total_seconds()))
        return
    # 相关路径处理
    if not os.path.exists(save_path):
        os.makedirs(save_path)

    tmp_path = '{}/tmp/'.format(save_path)
    if os.path.exists(tmp_path):
        shutil.rmtree(tmp_path)
    os.makedirs(tmp_path)

    # package: (0|1, package_name) | None
    # 0代表系统内软件包，1代表.deb软件包。 None代表未找到软件包
    if not package:
        return

    install_or_deb, package_name = package
    if install_or_deb == 1:
        # deb包依赖检测
        control = dpkg_r_deb_to_path(package_name, tmp_path)
        deb_depends = get_control_file_info(control, 'Depends')
        file_list_cmd = 'find {} -type f'.format(tmp_path)
        file_list_res = subprocess.run(file_list_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
        deb_file_list = [i for i in file_list_res.stdout.splitlines() if 'DEBIAN' not in i]
    else:
        # 系统内包依赖检测
        deb_depends = get_deb_depend(package_name)
        file_list_cmd = 'dpkg -L {}'.format(package_name)
        res = subprocess.run(file_list_cmd, shell=True, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        deb_file_list = res.stdout.splitlines()

    service_depend = systemd_service_depend_check(deb_file_list)
    missing_depends, dbus_control = get_deb_elf_depend(deb_depends, deb_file_list)
    py_import = extract_imports(deb_file_list)

    print('-- 软件包: {} ---'.format(os.path.basename(package_name)))
    print('-- control 文件内依赖 --')
    if len(deb_depends) == 0:
        print('** 无依赖 **')
    else:
        for deb in deb_depends:
            print(deb)

    print('-- 包内文件的一级依赖 --')
    if len(missing_depends) == 0:
        print('** 无依赖 **')
    else:
        for deb, so in missing_depends.items():
            print(deb, ':', so)

    print('-- 包内管控Dbus --')
    if len(dbus_control['deb']) == 0:
        print('** 无管控Dbus **')
    else:
        for k, v in dbus_control['deb'].items():
            print(k, ':', list(v))

    print('-- 包依赖管控Dbus --')
    if len(dbus_control['depends']) == 0:
        print('** 无管控Dbus **')
    else:
        for k, v in dbus_control['depends'].items():
            print(k, ':', list(v))

    print('-- systemd强依赖项 --')
    if len(service_depend) == 0:
        print('** 无强依赖项 **')
    else:
        for k, v in service_depend.items():
            print(k, ':', list(v))

    print('-- python脚本依赖 --')
    if len(py_import) == 0:
        print('** 无依赖项 **')
    else:
        for k, v in py_import.items():
            print(k, ':', list(v))


if __name__ == "__main__":
    main()