diff --git "a/Docs/OSAPIChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" "b/Docs/OSAPIChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" index f3420a974021febdb1577d4eb2a9d421b9f73694..941f7e96679f4beea6bd18d3e4fbc9a3ebca25ce 100644 --- "a/Docs/OSAPIChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" +++ "b/Docs/OSAPIChecker\344\275\277\347\224\250\350\257\264\346\230\216.MD" @@ -5,14 +5,14 @@ OSAPIChecker是测试工具的主程序,将各个子模块进行汇总处理。 ## 环境要求 python 3.7+ golang 1.13+ - +python3-reportlab ## 使用方法 1. 进入OSChecker主目录 ./OSAPIChecker.py 2. 常用参数 -usage: OSChecker [-h] [-c CHANNEL] [-s STRATEGY] [-l LEVEL] [-t OSTYPE] [-p PKGMNGR] [-o ORGANIZE] +usage: OSChecker [-h] [-c CHANNEL] [-s STRATEGY] [-l LEVEL] [-t OSTYPE] [-p PKGMNGR] [-o ORGANIZE] [-R] optional arguments: -h, --help show this help message and exit @@ -30,6 +30,7 @@ optional arguments: Package Manager of current OS: apt-deb, yum-rpm -o ORGANIZE, --organize ORGANIZE Choice Organize + -R, --reports Generate Reports 参数解析: -h, --help: @@ -53,6 +54,9 @@ optional arguments: -o ORGANIZE, --organize ORGANIZE 送测单位名称 默认是空 +-R, --reports + 生成报告(默认不生成报告) + 3. 注意 1) 在进行测试时,请根据需要填写必要的参数信息 diff --git a/OSAPIChecker.py b/OSAPIChecker.py index d221ed3b0dc636717089445ffd7448b7a7bf5a98..0664953330d0e8c5f4b1654ba1978a7e7e780902 100755 --- a/OSAPIChecker.py +++ b/OSAPIChecker.py @@ -58,6 +58,7 @@ parser.add_argument('-p', '--pkgmngr', action='store', type=str, help='Package M parser.add_argument('-o', '--organize', action='store', type=str, help='Choice Organize', default="") +parser.add_argument('-R', '--reports', action='store_true', help='Generate Reports') # --ostype: # desktop # service @@ -71,11 +72,6 @@ l_arch_name = os.popen("uname -m").read().rstrip("\n") # 1. Input Valid Check def input_valid_check(): print("|************************ 操作系统软件兼容性应用编程接口检查工具 ************************|") -# print('the options is', options) - - # Options check - - # Json check # 2. Check Environment Info def gen_envinfo_json(): @@ -101,14 +97,6 @@ def gen_envinfo_json(): with open(env_file_name,"w+") as fw: json.dump(l_envinfodict,fw,ensure_ascii=False,indent=4) - - -# 2. Call Subchecker's Handler - # --channel: [cmdchecker,fschecker,libchecker] - # --strategy: [with-expand, base] - # --level [l1,l2,l3,l1l2,l1l2l3] - # --ostype [desktop,server,embed] - # --pkgmngr [apt-deb,yum-rpm,src-bin,other] def checker_call_handler(channel): if (channel == "libchecker"): print("进入 LibChecker 处理程序 . . .") @@ -117,11 +105,7 @@ def checker_call_handler(channel): os_str = args.ostype pkg_str = args.pkgmngr org_str = args.organize - ### 添加参数错误判断:strategy level ostype pkgmngr - ### 错误即退出 - #args_error_check() - #print("arg.level is ", l_str, "len(l_str) is ", len(l_str)%2) - #print("arg.level is ", l_str, "l_stri[0] is ", l_str[0]) + if ((s_str != "basic") and (s_str != "expansion") and (s_str != "with-expand")): print ("Error: -s or --strategy 参数指定错误") return 2 @@ -135,28 +119,23 @@ def checker_call_handler(channel): print ("Error: -t or --ostype 参数指定错误") return 2 - #print("检测 LibChecker 参数 ") if ((pkg_str != "apt-deb") and (pkg_str != "yum-rpm")): print ("Error: -p or --pkgmngr 参数指定错误") return 2 os.system('python3 LibChecker/lib_checker.py --strategy=%s --level=%s --ostype=%s --pkgmngr=%s --organize=%s --timetmp=%s' %(s_str, l_str, os_str, pkg_str, org_str, l_file_time)) + elif (channel == "cmdchecker"): print("进入 CmdChecker 处理程序 . . .") os.system('python3 CmdChecker/cmd_checker.py') - - # For CmdChecker - # import cmdcheck: input (json-file) (formated-json) - + elif (channel == "fschecker"): print("进入 FsChecker 处理程序 . . .") os.system('python3 FsChecker/fs_checker.py') - # For FsChecker - # import fscheck: input (json-file) (formated-json) elif (channel == "servicechecker"): print("进入 ServiceChecker 处理程序 . . .") @@ -166,24 +145,25 @@ def checker_call_handler(channel): os.system('sudo python3 ServiceChecker/service_checker.py') else: os.system('python3 ServiceChecker/service_checker.py') - #os.system('sudo python3 ServiceChecker/service_checker.py') - - # For CmdChecker - # import cmdcheck: input (json-file) (formated-json) - + else: - print("Invalid Options, please input --channel=[cmdchecker|fschecker|libchecker|servicechecker]") + print("Invalid Options, please input --channel=[cmdchecker|fschecker|libchecker]") +def report_pdf_service(channel): + os.system('sudo reports/reboot-pdf.sh %s %s' %(channel, l_file_time)) -# 3. Generate Output -#def generate_json_file(): -# print("This Label is generatejson ") -# print('Label:', generate_json_file.__name__) +def report_pdf_shell(channel): + os.system('reports/report-pdf.sh %s %s' %(channel, l_file_time)) -#def convert_json_to_txt(): - -#def convert_json_to_pdf(): +# 3. PDF Report files +def generate_report(channel): + if ((channel == "all") or (channel == "servicechecker")): + print ("会重启(包含servicechecker模块)") + report_pdf_service(channel) + elif ((channel == "libchecker") or (channel == "cmdchecker") or (channel == "fschecker")): + print ("不重启,单独程序:", channel) + report_pdf_shell(channel) def main_loop(): @@ -192,12 +172,27 @@ def main_loop(): checker_call_handler("libchecker") checker_call_handler("cmdchecker") checker_call_handler("fschecker") + if(args.reports): + generate_report(args.channel) + else: + print ("NO Report Generation") checker_call_handler("servicechecker") else: if ((args.channel != "libchecker") and (args.channel != "cmdchecker") and (args.channel != "fschecker") and (args.channel != "servicechecker")): print ("Error: -c or --channel 参数指定错误") return 2 - checker_call_handler(args.channel) + if (args.channel == "servicechecker"): + if(args.reports): + generate_report(args.channel) + else: + print ("NO Report Generation") + checker_call_handler(args.channel) + else: + checker_call_handler(args.channel) + if(args.reports): + generate_report(args.channel) + else: + print ("NO Report Generation") # 4. Draw Graphics def draw_main_gui(): @@ -210,8 +205,6 @@ if __name__ == '__main__': try: input_valid_check() main_loop() -# checker_call_handler() -# generate_json_file() # draw_main_gui() except Exception as e: print(e) diff --git a/reports/reboot-pdf.sh b/reports/reboot-pdf.sh new file mode 100755 index 0000000000000000000000000000000000000000..13d4faddcc0fbb627c2b16d7cc61621788d58832 --- /dev/null +++ b/reports/reboot-pdf.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +checker=$1 +time_tmp=$2 +if [ ${checker} = "" ];then + echo "ERROR" + return 2 +elif [ ${time_tmp} = "" ];then + echo "ERROR" + return 2 +fi + +real_p=$(realpath $0) +dir=${real_p%/*} +dir_systemd=/usr/lib/systemd/system + +function generator_enable_service() { +echo "[Unit] +Description=service verify reboot +After=verify_reboot.service + +[Service] +Type=oneshot +ExecStart=${dir}/report-pdf.sh ${checker} ${time_tmp} + +[Install] +WantedBy=multi-user.target" >${dir_systemd}/report_pdf.service + +} + +function config_sudo_passwd() { + sed -i '$ a\%sudo ALL=(ALL:ALL) NOPASSWD:ALL' /etc/sudoers + systemctl daemon-reload + systemctl enable report_pdf.service +} +generator_enable_service +config_sudo_passwd diff --git a/reports/report-pdf.sh b/reports/report-pdf.sh new file mode 100755 index 0000000000000000000000000000000000000000..ecb0d0c1755a708ca2bdd609ac2c8a5bfba6a1be --- /dev/null +++ b/reports/report-pdf.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +checker=$1 +time_tmp=$2 +if [ ${checker} = "" ];then + echo "ERROR" + return 2 +elif [ ${time_tmp} = "" ];then + echo "ERROR" + return 2 +fi + +dir=$(echo $(realpath $0 | awk -F'reports' '{print $1}')) +dir_systemd=/usr/lib/systemd/system + +s_arch=$(uname -m) +result_file="result_${checker}_${time_tmp}.pdf" +env_file="environments-info_${time_tmp}.json" +lib_file="libchecker-output_${s_arch}_${time_tmp}.json" +cmd_file="cmd_${time_tmp}.json" +fs_file="fs_${time_tmp}.json" +service_file="service_result.json" +cmd_line="" + +function generate_reports() { + echo "生成报告:result_${checker}_${time_tmp}.pdf" + if [ -f ${dir}/Outputs/${env_file} ];then + cmd_line="${cmd_line} -e $dir/Outputs/${env_file}" + fi + + if [ -f ${dir}/Outputs/${lib_file} ];then + cmd_line="${cmd_line} -l $dir/Outputs/${lib_file}" + fi + + if [ -f ${dir}/Outputs/${cmd_file} ];then + cmd_line="${cmd_line} -c $dir/Outputs/${cmd_file}" + fi + + if [ -f ${dir}/Outputs/${fs_file} ];then + cmd_line="${cmd_line} -f $dir/Outputs/${fs_file}" + fi + + if [ "${checker}" == "all" ] || [ "${checker}" == "servicechecker" ];then + if [ -f ${dir}/Outputs/${service_file} ];then + cmd_line="${cmd_line} -s $dir/Outputs/${service_file}" + fi + fi + if [ "${cmd_line}" == "" ];then + echo "not found ${checker} output file" >> $dir/Logs/pdf_${time_tmp}.log 2>&1 + else + cd $dir/GenReport + echo "Generate reports" >> $dir/Logs/pdf_${time_tmp}.log 2>&1 + ./pdf.py -r $dir/Outputs/${result_file} ${cmd_line} >> $dir/Logs/pdf_${time_tmp}.log 2>&1 + fi +} + +function recovery_configure (){ + sed -i '/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/d' /etc/sudoers + systemctl disable report_pdf.service + rm -f ${dir_systemd}/report_pdf.service + systemctl daemon-reload + systemctl stop report_pdf.service +} + +if [ ${checker} == "libchecker" ] || [ ${checker} == "cmdchecker" ] || [ ${checker} == "fschecker" ] ;then + generate_reports +elif [ ${checker} == "servicechecker" ] || [ ${checker} == "all" ];then + while [ -e ${dir_systemd}/verify_reboot.service ] + do + str_status=$(systemctl status verify_reboot.service | grep Active | awk '{print $2}') + if [ "${str_status}" == "failed" ] || [ "${str_status}" == "inactive" ];then + break + fi + sleep 5 + done + generate_reports + recovery_configure +fi