diff --git a/ServiceChecker/config/verify_result.json b/ServiceChecker/config/verify_result.json index 6101329853902d3c9e8a36e6c6ec1c00f70b6a6d..faddf0a8f3d226071f5e8b7c58da4426cccdaf30 100644 --- a/ServiceChecker/config/verify_result.json +++ b/ServiceChecker/config/verify_result.json @@ -1,34 +1,30 @@ { - "start": { "Path Unit": { - "test": "journalctl -u service_verify_path.service", - "str": "Deactivated successfully" + "test": "/opt/tem_monitor/test_path.log", + "verify": true }, "Socket Unit": { "test": "journalctl -u service_verify_server.service", - "str": "Verify socket client" + "verify": "Verify socket client" }, "Timer Unit": { - "test": "journalctl -u service_verify_timer.service", - "str": "Deactivated successfully" + "test": "/opt/tem_monitor/test_timer.log", + "verify": true }, "Swap Unit": { - "test": "journalctl -u swapfile.swap", - "str": "Activated swap /swapfile" + "test": "journalctl -u swapfile_service.swap", + "verify": "Activated swap /swapfile_service" }, "Target Unit": { "test": "runlevel", - "str": "3 1" - } - }, - "reboot": { + "verify": "" + }, "Service enable": { "test": "systemctl list-unit-files --type=service |grep verify_reboot.service", - "str": "enabled" + "verify": "enabled" }, "Service disable": { "test": "systemctl list-unit-files --type=service |grep service_verify_disable.service", - "str": "disabled" + "verify": "disabled" } - } } \ No newline at end of file diff --git a/ServiceChecker/constants.py b/ServiceChecker/constants.py new file mode 100644 index 0000000000000000000000000000000000000000..ec2ad4034754c10dcf9e309769cee2def955ec35 --- /dev/null +++ b/ServiceChecker/constants.py @@ -0,0 +1,27 @@ +# UNIT TYPE +PATH_UNIT = "Path Unit" +SOCKET_UNIT = "Socket Unit" +TIMER_UNIT = "Timer Unit" +SWAP_UNIT = "Swap Unit" +TARGET_UNIT = "Target Unit" +ENABLE_UNIT = "Service enable" +DISABLE_UNIT = "Service disable" + +# VERIFY_TYPE +VERIFY_PATH_TYPE = [PATH_UNIT, TIMER_UNIT] +VERIFY_LOG_TYPE = [SOCKET_UNIT, SWAP_UNIT, ENABLE_UNIT, DISABLE_UNIT] +START_MODEL_TYPE = [PATH_UNIT, SOCKET_UNIT, TIMER_UNIT, SWAP_UNIT, TARGET_UNIT] +REBOOT_MODEL_TYPE = [ENABLE_UNIT, DISABLE_UNIT] + +# CONFIG FILE KEY +K_TEST = "test" +k_VERIFY = "verify" + +# CHECK RESULT +CHECK_RESULT = "Check result" +PASS = "PASS" +FAIL = "FAIL" + +# VERIFY_MODEL_TYPE +MODEL_START = "start" +MODEL_REBOOT = "reboot" diff --git a/ServiceChecker/service_checker.py b/ServiceChecker/service_checker.py index 200514d2c93285f0e6308f8643f3c06b47171fd6..41b4950a8955cc60bca5502d7e807d4570ebf704 100644 --- a/ServiceChecker/service_checker.py +++ b/ServiceChecker/service_checker.py @@ -1,7 +1,6 @@ import json import logging import os -import re import stat import sys import argparse @@ -9,6 +8,8 @@ import argparse sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from ServiceChecker.utils.shell import shell_cmd from ServiceChecker.utils.logger import init_logger +from ServiceChecker.constants import K_TEST, k_VERIFY, VERIFY_PATH_TYPE, PASS, CHECK_RESULT, FAIL, TARGET_UNIT, \ + START_MODEL_TYPE, REBOOT_MODEL_TYPE, MODEL_REBOOT, MODEL_START logger = logging.getLogger('OSAPIChecker') @@ -50,19 +51,34 @@ class ServiceChecker(object): with open(path, "w", encoding='utf-8') as f: json.dump(result, f, indent=4) + @staticmethod + def verift_cmd_unit(cmd, result, unit, target_result): + ret, out, err = shell_cmd(cmd.split()) + if not ret: + if out: + if unit == TARGET_UNIT: + result.get(unit)[CHECK_RESULT] = PASS + elif target_result in out: + result.get(unit)[CHECK_RESULT] = PASS + else: + logger.debug(f"验证检测单元{unit}输出信息错误:{err}") + def service_register_check(self, model='start'): result_path = os.path.join(os.path.dirname(self.dir_path), 'Outputs/service_result.json') os.chmod(self.sh_path, stat.S_IXUSR) try: os.system(f"/bin/bash {self.sh_path} {model} 2>&1 | tee -a {self.log_path}") - if model == "start": + if model == MODEL_START: result = {} start_result = self.verify_all_item(model, result) self.export_verify_result(result_path, start_result) - elif model == "reboot": + # 重启系统 + os.system("reboot") + + elif model == MODEL_REBOOT: logger.info("service_checker 检测完成!") with open(result_path, "r") as f: start_result = json.load(f) @@ -98,31 +114,22 @@ class ServiceChecker(object): @return: 检测结果 """ v_config = self.get_verify_result_config() - verify_item = v_config.get(model) - result_str = "Check result" - for unit, test_config in verify_item.items(): - result.setdefault(unit, {}) - verify_shell = test_config.get('test') - verify_str = test_config.get('str') - ret, out, err = shell_cmd(verify_shell.split()) - if not ret and out: - unit_result = result.get(unit) - if model == 'reboot': - status_row = out.split('\n')[1] - status = status_row.split()[1] - if status == verify_str: - unit_result.setdefault(result_str, 'pass') - else: - unit_result.setdefault(result_str, 'fail') + for unit, verify_content in v_config.items(): + verify_cmd = verify_content.get(K_TEST) + target_result = verify_content.get(k_VERIFY) + if model == MODEL_START: + result.setdefault(unit, {CHECK_RESULT: FAIL}) + if unit not in START_MODEL_TYPE: + continue + elif unit in VERIFY_PATH_TYPE: + if os.path.exists(verify_cmd): + result.get(unit)[CHECK_RESULT] = PASS else: - match = re.search(verify_str, out) - if match: - unit_result.setdefault(result_str, 'pass') - else: - unit_result.setdefault(result_str, 'fail') - else: - result.get(unit).setdefault(result_str, 'fail') - logger.debug(f"验证检测单元输出信息错误:{err}") + self.verift_cmd_unit(verify_cmd, result, unit, target_result) + elif model == MODEL_REBOOT: + if unit not in REBOOT_MODEL_TYPE: + continue + self.verift_cmd_unit(verify_cmd, result, unit, target_result) return result @@ -154,7 +161,7 @@ if __name__ == "__main__": service_checker.verify_service() service_checker.service_register_check() # 系统重启后检测待测功能 - elif args.verify_model == "reboot": + elif args.verify_model == MODEL_REBOOT: service_checker.service_register_check(model=args.verify_model) else: logger.error("参数输入有误。") diff --git a/ServiceChecker/service_verify.sh b/ServiceChecker/service_verify.sh index 2e93c30ae9ad2569f668c65a8cad3d92ee8f2ca9..cda02ab418e6ca2671ba182c722e07dfcda24d12 100644 --- a/ServiceChecker/service_verify.sh +++ b/ServiceChecker/service_verify.sh @@ -24,7 +24,7 @@ ExecStart=python3 ${dir_path}/service_checker.py -m reboot ExecStop=/bin/bash -c "echo Stop verify_reboot.servic" [Install] -WantedBy=multi-user.target" >${dir_systemd}/verify_reboot.service +WantedBy=`systemctl get-default`" >${dir_systemd}/verify_reboot.service } @@ -67,7 +67,7 @@ function mv_register_file() { fi if [[ -d ${swap_file} ]]; then - cp ${swap_file}/swapfile.swap ${dir_systemd} + cp ${swap_file}/swapfile_service.swap ${dir_systemd} else log_warn "Service swap file directory not exist, can not copy register file." fi @@ -77,21 +77,27 @@ function mv_register_file() { log_info "正在安装golang,请等待..." sudo yum install -y golang >/dev/null 2>&1 if [ $? -ne 0 ]; then - log_error "自动安装失败,请先安装golang。" + sudo apt install golang >/dev/null 2>&1 + if [ $? -ne 0 ]; then + log_error "自动安装失败,请先安装golang。" + else + log_info "golang 安装完成!" + fi + else + log_info "golang 安装完成!" fi - log_info "golang 安装完成!" fi - cd ${socket_file} # install go-systemd库 activation - export GO111MODULE=auto - # git clone https://github.com/coreos/go-systemd.git ~/go/src/github.com/coreos/go-systemd +# go env -w GOPRIVATE=git.mycompany.com,github.com/my/private + cd ${socket_file} + go env -w GO111MODULE=on + go env -w GOPROXY=https://goproxy.cn,direct + go mod init service_checker + log_info "正在安装go-systemd activation库..." go get github.com/coreos/go-systemd/activation >/dev/null 2>&1 if [ $? -ne 0 ]; then - go env -w GOPROXY=https://goproxy.cn,direct - go env -w GOPRIVATE=git.mycompany.com,github.com/my/private - - go get github.com/coreos/go-systemd/activation >/dev/null 2>&1 + log_error "获取go-systemd activation库失败,可能导致socket单元检测失败。" fi go build service_client.go @@ -154,7 +160,7 @@ function verify_path() { else log_warn "***** path单元功能验证失败 *****\n" fi - log_info "***** path单元功能验证成功 *****\n" + log_info "***** path单元功能验证完成 *****\n" # 验证socket服务功能 verify_socket @@ -178,7 +184,7 @@ function verify_socket() { journalctl -u service_verify_client.service -n 5 | grep "Verify socket server" >/dev/null 2>&1 && journalctl -u service_verify_server.service -n 3 | grep "Verify socket client" >/dev/null 2>&1 if [ $? -eq 0 ]; then - log_info "***** socket单元功能验证成功 *****\n" + log_info "***** socket单元功能验证完成 *****\n" else log_warn "***** socket单元功能验证失败 *****\n" fi @@ -191,6 +197,10 @@ function verify_timer() { # 启动timer定时单元 log_info "***** 启动service_verify_timer单元 *****" + cd $monitor_path + if [[ -f test_timer.log ]]; then + rm -f test_timer.log + fi systemctl start service_verify_timer.timer if [ $? -eq 0 ]; then @@ -204,7 +214,7 @@ function verify_timer() { sleep 70 if [[ -f ${monitor_path}/test_timer.log ]]; then log_info "service_verify_timer.service服务启动输出为:\n$(cat ${monitor_path}/test_timer.log)" - log_info "***** timer单元功能验证成功 *****\n" + log_info "***** timer单元功能验证完成 *****\n" else log_warn "***** timer单元功能验证失败 *****\n" fi @@ -217,31 +227,30 @@ function verify_timer() { function verify_swap() { log_info "***** 验证swap单元 *****" - log_info "创建一个交换文件(swapfile):" - dd if=/dev/zero of=/swapfile bs=1M count=512 status=progress + log_info "创建一个交换文件(swapfile_service):" + dd if=/dev/zero of=/swapfile_service bs=1M count=512 status=progress if [ $? -ne 0 ]; then log_warn "创建交换文件失败。" fi # 防止交换文件全局可读 - chmod 600 /swapfile + chmod 600 /swapfile_service - mkswap /swapfile - # 重启后会启动/swapfile交换分区 + mkswap /swapfile_service + # 重启后会启动/swapfile_service交换分区 # sed -i '$ a\# /etc/fstab\n/swapfile none swap defaults 0 0' /etc/fstab - systemctl start swapfile.swap + systemctl start swapfile_service.swap if [ $? -eq 0 ]; then log_info "成功启动swap单元。" else log_warn "启动swap单元失败" fi - log_info "查看swap单元服务状态:\n`systemctl status swapfile.swap`" - log_info "查看交换空间使用详细信息:" swapon --show if [ $? -eq 0 ]; then - log_info "***** swap单元功能验证成功 *****\n" + log_info "查看swap单元服务状态:\n`journalctl -u swapfile_service.swap`" + log_info "***** swap单元功能验证完成 *****\n" else log_warn "***** swap单元功能验证失败 *****\n" fi @@ -254,22 +263,24 @@ function verify_target() { log_info "***** 开始验证target单元 *****" log_info "查询所有运行级别传统runlevel与对应target信息如下:\n $(ls -al ${dir_systemd}/runlevel*.target | awk -F " " '{print $9 $10 $11}')" - log_info "查看当前系统默认target为: $(systemctl get-default)" - - systemctl isolate rescue.target - if [ $? -eq 0 ]; then - sleep 2 - log_info "切换当前运行级别至单用户模式(rescue.target)成功,runlevel信息为:`runlevel`" - log_info "***** target单元功能验证成功 *****" - else - log_warn "切换至单用户级别失败" - log_warn "***** target单元功能验证失败 *****" + default_runlevel=`systemctl get-default` + log_info "查看当前系统默认target为: $default_runlevel" + if [ "$default_runlevel" = "graphical.target" ]; then + log_info "检测目标为桌面版操作系统,当前运行级别为多用户模式($default_runlevel),runlevel信息为:`runlevel`" + elif [ "$default_runlevel" = "multi-user.target" ]; then + systemctl isolate rescue.target + if [ $? -eq 0 ]; then + sleep 2 + log_info "检测目标为服务器操作系统,切换当前运行级别至单用户模式(rescue.target)成功,runlevel信息为:`runlevel`" + else + log_warn "切换系统运行模式至单用户级别失败" + fi fi - + log_info "***** target单元功能验证完成 *****" # 重启系统 log_info "请等待3秒后将重启系统...\n" sleep 3 - reboot + } @@ -289,7 +300,7 @@ function verify_reboot_service() { function clear_environment() { - systemctl stop swapfile.swap + systemctl stop swapfile_service.swap systemctl stop service_verify_server.socket systemctl stop service_verify_server.service systemctl stop service_verify_timer.timer @@ -297,7 +308,7 @@ function clear_environment() { systemctl stop service_verify_disable.service # 删除交换文件 - rm -f /swapfile + rm -f /swapfile_service rm -rf ${monitor_path} rm -rf ${apply_path} @@ -305,9 +316,11 @@ function clear_environment() { rm -f ${socket_file}/service_client rm -f ${socket_file}/service_server find ${dir_systemd} -name "service_verify*" | xargs rm -f - rm -f ${dir_systemd}/swapfile.swap + rm -f ${dir_systemd}/swapfile_service.swap export GO111MODULE="" + rm -f ${socket_file}/go.mod && + rm -f ${socket_file}/go.sum systemctl stop verify_reboot.service && rm -f ${dir_systemd}/verify_reboot.service diff --git a/ServiceChecker/swap/swapfile.swap b/ServiceChecker/swap/swapfile_service.swap similarity index 82% rename from ServiceChecker/swap/swapfile.swap rename to ServiceChecker/swap/swapfile_service.swap index 8d0eea4c0c47fa072413d6bf5953aee5043bb550..ca42a36a5d1efffcb8aa86e446188cf03cb4739c 100644 --- a/ServiceChecker/swap/swapfile.swap +++ b/ServiceChecker/swap/swapfile_service.swap @@ -3,5 +3,5 @@ Documentation=man:fstab(5) man:systemd-fstab-generator(8) SourcePath=/etc/fstab [Swap] -What=/swapfile +What=/swapfile_service TimeoutSec=2min \ No newline at end of file