news 2026/6/30 10:03:09

env_check扩展开发实战:创建自定义系统命令检查actor的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
env_check扩展开发实战:创建自定义系统命令检查actor的完整指南

env_check扩展开发实战:创建自定义系统命令检查actor的完整指南

【免费下载链接】env_checkA tool for "health checking" after operating system upgrade项目地址: https://gitcode.com/openeuler/env_check

前往项目官网免费下载:https://ar.openeuler.org/ar/

env_check是openEuler社区开发的一款系统健康检查工具,专门用于操作系统升级后的环境验证。本文将详细介绍如何为env_check创建自定义系统命令检查actor,帮助开发者快速上手扩展开发。😊

什么是env_check?

env_check是一个强大的系统健康检查框架,它通过actor模式来执行各种系统命令和配置检查。在操作系统升级后,使用env_check可以快速验证系统功能是否正常,确保升级过程的可靠性。

该工具的核心思想是将每个检查任务封装为一个独立的actor,每个actor负责特定的系统命令或功能验证。这种模块化设计使得扩展非常灵活,开发者可以根据需要轻松添加新的检查项。

env_check架构解析

env_check采用分层架构设计,主要包含以下几个核心部分:

1. 基础actor类

所有检查actor都继承自基础类BaseCheckActor,位于sut/env_check/check_actor/base_check_actor.py。这个基类定义了actor的基本属性和接口:

class BaseCheckActor(object): SUCCESS = True FAIL = False task_type = TaskType name = "" description = "" level = "" priority = "" @staticmethod def run(node): result = ReturnMessage(result=True, solution="", message={}, failed_reason="") return result

2. 系统命令检查基类

对于系统命令检查,env_check提供了专门的基类OeBaseActor,位于sut/env_check/check_actor/oe_base_actor.py。这个类封装了执行Shell脚本的标准流程:

class OeBaseActor(BaseCheckActor): name = "OeBaseActor" description = "this is openEuler base test actor." level = "low" priority = "unnecessary" task_type = (BaseCheckActor.task_type.SYSTEM_UPGRADE,) sh_dir = os.path.join(os.path.abspath(os.path.dirname( os.path.dirname(os.path.abspath(__file__)))), 'smoke_test/local_sh') sh_file = ''

3. 测试脚本目录

所有的系统命令测试脚本都位于sut/env_check/smoke_test/local_sh/目录下,按功能分类组织。

创建自定义系统命令检查actor的步骤

步骤1:创建测试脚本

首先,在相应的测试脚本目录中创建Shell测试脚本。以创建一个检查ls命令的actor为例:

#!/usr/bin/bash -x # Create: 2024-01-01 OET_PATH=$( cd "$(dirname "$0")" || exit 1 pwd ) source "$OET_PATH/../../common/common_lib.sh" # 环境准备 function pre_test() { LOG_INFO "开始准备测试环境" OLD_LANG=$LANG export LANG=en_US.UTF-8 LOG_INFO "测试环境准备完成" } # 用例执行 function run_test() { LOG_INFO "开始测试ls命令..." # 测试基本ls功能 ls /tmp CHECK_RESULT $? # 测试长格式显示 ls -l /tmp CHECK_RESULT $? # 测试显示隐藏文件 ls -a /tmp CHECK_RESULT $? # 测试帮助信息 ls --help | grep -E "Usage|用法" CHECK_RESULT $? LOG_INFO "ls命令测试完成!" } # 环境清理 function post_test() { LOG_INFO "开始恢复测试环境" export LANG=${OLD_LANG} LOG_INFO "测试环境恢复完成" } main $@

将脚本保存为sut/env_check/smoke_test/local_sh/01_files_directories/oe_test_ls.sh

步骤2:创建对应的actor类

sut/env_check/check_actor/目录下创建新的actor文件,或者添加到现有的actor文件中。以添加到basic_commands_actor.py为例:

# -*- coding: utf-8 -*- from sut.env_check.check_actor.oe_base_actor import OeBaseActor class OeLsActor(OeBaseActor): name = "OeLsActor" description = "检查ls命令功能是否正常" level = "High" priority = "mandatory" task_type = (OeBaseActor.task_type.SYSTEM_UPGRADE,) sh_file = '01_files_directories/oe_test_ls.sh'

步骤3:理解actor属性配置

每个actor需要配置以下关键属性:

  • name: actor的唯一标识符,建议使用描述性名称
  • description: actor的功能描述,会在检查结果中显示
  • level: 检查级别,可以是High/Medium/Low
  • priority: 优先级,mandatory表示必须通过,optional表示可选
  • task_type: 任务类型,可以是系统升级、配置迁移等
  • sh_file: 对应的测试脚本路径(相对于smoke_test/local_sh)

步骤4:测试脚本编写规范

测试脚本需要遵循统一的格式:

  1. 环境准备函数 (pre_test): 设置测试环境,如语言环境、临时文件等
  2. 测试执行函数 (run_test): 执行具体的命令测试
  3. 环境清理函数 (post_test): 恢复测试环境
  4. 结果检查: 使用CHECK_RESULT $?检查命令执行结果

实战案例:创建网络配置检查actor

让我们通过一个实际案例来演示如何创建一个检查网络配置的actor。

1. 创建网络测试脚本

sut/env_check/smoke_test/local_sh/04_network/目录下创建oe_test_network_config.sh

#!/usr/bin/bash -x # Create: 2024-01-01 OET_PATH=$( cd "$(dirname "$0")" || exit 1 pwd ) source "$OET_PATH/../../common/common_lib.sh" # 环境准备 function pre_test() { LOG_INFO "开始准备网络测试环境" OLD_LANG=$LANG export LANG=en_US.UTF-8 LOG_INFO "网络测试环境准备完成" } # 用例执行 function run_test() { LOG_INFO "开始网络配置检查..." # 检查网络接口 ip link show CHECK_RESULT $? # 检查IP地址配置 ip addr show CHECK_RESULT $? # 检查路由表 ip route show CHECK_RESULT $? # 检查DNS配置 cat /etc/resolv.conf CHECK_RESULT $? # 测试网络连通性 ping -c 3 8.8.8.8 CHECK_RESULT $? LOG_INFO "网络配置检查完成!" } # 环境清理 function post_test() { LOG_INFO "开始恢复测试环境" export LANG=${OLD_LANG} LOG_INFO "测试环境恢复完成" } main $@

2. 创建网络检查actor

sut/env_check/check_actor/目录下创建network_config_actor.py

# -*- coding: utf-8 -*- from sut.env_check.check_actor.oe_base_actor import OeBaseActor class OeNetworkConfigActor(OeBaseActor): name = "OeNetworkConfigActor" description = "检查系统网络配置是否正常" level = "High" priority = "mandatory" task_type = (OeBaseActor.task_type.SYSTEM_UPGRADE,) sh_file = '04_network/oe_test_network_config.sh' class OePingActor(OeBaseActor): name = "OePingActor" description = "检查ping命令和网络连通性" level = "Medium" priority = "mandatory" task_type = (OeBaseActor.task_type.SYSTEM_UPGRADE,) sh_file = '04_network/oe_test_ping.sh' class OeNetstatActor(OeBaseActor): name = "OeNetstatActor" description = "检查网络连接状态" level = "Medium" priority = "optional" task_type = (OeBaseActor.task_type.SYSTEM_UPGRADE,) sh_file = '04_network/oe_test_netstat.sh'

高级扩展技巧

1. 自定义检查逻辑

如果需要更复杂的检查逻辑,可以直接继承BaseCheckActor而不是OeBaseActor

# -*- coding: utf-8 -*- import subprocess import json from sut.env_check.check_actor.base_check_actor import BaseCheckActor, ReturnMessage class CustomServiceActor(BaseCheckActor): name = "CustomServiceActor" description = "自定义服务状态检查" level = "High" priority = "mandatory" task_type = (BaseCheckActor.task_type.SYSTEM_UPGRADE,) @staticmethod def run(node): solution = "" message = {} failed_reason = "" try: # 检查系统服务状态 result = subprocess.run(['systemctl', 'is-active', 'sshd'], capture_output=True, text=True) if result.returncode == 0 and result.stdout.strip() == 'active': message['sshd_status'] = 'active' return ReturnMessage(BaseCheckActor.SUCCESS, solution, message, failed_reason) else: failed_reason = f"SSH服务状态异常: {result.stdout.strip()}" solution = "请检查sshd服务配置并重启服务" return ReturnMessage(BaseCheckActor.FAIL, solution, message, failed_reason) except Exception as e: failed_reason = f"检查服务状态时发生异常: {str(e)}" solution = "请检查系统服务管理工具是否可用" return ReturnMessage(BaseCheckActor.FAIL, solution, message, failed_reason)

2. 参数化检查

可以通过node参数传递配置信息,实现参数化检查:

class ParametricCheckActor(BaseCheckActor): name = "ParametricCheckActor" description = "参数化系统检查" level = "Medium" priority = "mandatory" task_type = (BaseCheckActor.task_type.SYSTEM_UPGRADE,) @staticmethod def run(node): solution = "" message = {} failed_reason = "" # 从node参数获取配置 check_items = node.get('check_items', []) threshold = node.get('threshold', 80) for item in check_items: # 根据配置执行相应的检查 pass return ReturnMessage(BaseCheckActor.SUCCESS, solution, message, failed_reason)

3. 批量检查多个命令

可以创建一个actor来批量检查多个相关命令:

class MultipleCommandsActor(BaseCheckActor): name = "MultipleCommandsActor" description = "批量检查文件操作命令" level = "Medium" priority = "mandatory" task_type = (BaseCheckActor.task_type.SYSTEM_UPGRADE,) @staticmethod def run(node): solution = "" message = {} failed_commands = [] commands_to_check = ['ls', 'cp', 'mv', 'rm', 'mkdir'] for cmd in commands_to_check: try: result = subprocess.run(['which', cmd], capture_output=True, text=True) if result.returncode != 0: failed_commands.append(cmd) message[f'{cmd}_status'] = 'not found' else: message[f'{cmd}_status'] = 'available' message[f'{cmd}_path'] = result.stdout.strip() except Exception as e: failed_commands.append(cmd) message[f'{cmd}_status'] = 'error' if failed_commands: failed_reason = f"以下命令检查失败: {', '.join(failed_commands)}" solution = "请安装缺失的命令或检查PATH环境变量" return ReturnMessage(BaseCheckActor.FAIL, solution, message, failed_reason) else: return ReturnMessage(BaseCheckActor.SUCCESS, solution, message, "")

调试和测试技巧

1. 本地测试actor

在开发过程中,可以单独测试actor的功能:

# test_actor.py import sys sys.path.append('/path/to/env_check') from sut.env_check.check_actor.your_new_actor import YourNewActor # 创建测试节点 test_node = { 'hostname': 'test-host', 'config': {} } # 执行检查 result = YourNewActor.run(test_node) print(f"检查结果: {result.result}") print(f"解决方案: {result.solution}") print(f"失败原因: {result.failed_reason}") print(f"详细信息: {result.message}")

2. 查看执行日志

env_check会生成详细的执行日志,位于当前目录的env_check.log文件中。通过查看日志可以了解actor的执行过程和问题:

# 查看最近的日志 tail -f env_check.log # 查看特定actor的日志 grep "OeLsActor" env_check.log

3. 验证测试脚本

在集成到actor之前,先单独运行测试脚本:

# 给脚本添加执行权限 chmod +x sut/env_check/smoke_test/local_sh/01_files_directories/oe_test_ls.sh # 执行测试脚本 bash -x sut/env_check/smoke_test/local_sh/01_files_directories/oe_test_ls.sh

最佳实践建议

1. 命名规范

  • actor类名使用Oe[功能]Actor格式
  • 测试脚本使用oe_test_[功能].sh格式
  • 保持命名一致性和可读性

2. 错误处理

  • 在测试脚本中做好错误检查和清理
  • 在actor中捕获异常并提供有意义的错误信息
  • 区分警告和错误,合理设置priority

3. 性能考虑

  • 避免长时间运行的检查
  • 对于耗时操作,考虑设置超时机制
  • 合理使用缓存,避免重复检查

4. 文档化

  • 为每个actor编写清晰的描述
  • 在测试脚本中添加必要的注释
  • 记录检查项的预期行为和失败处理方案

总结

通过env_check的actor扩展机制,我们可以轻松地为系统健康检查添加新的检查项。无论是简单的命令检查还是复杂的配置验证,都可以通过创建相应的actor来实现。

关键要点:

  1. 继承合适的基类:系统命令检查使用OeBaseActor,复杂逻辑使用BaseCheckActor
  2. 遵循测试脚本规范:统一的三段式结构(准备-执行-清理)
  3. 合理配置actor属性:正确设置name、description、level和priority
  4. 完善的错误处理:提供清晰的错误信息和解决方案
  5. 充分的测试验证:在集成前充分测试actor和测试脚本

env_check的扩展开发不仅简单高效,而且具有良好的可维护性。通过模块化的设计,我们可以持续为系统健康检查添加新的能力,确保openEuler系统升级后的稳定性和可靠性。

现在,你已经掌握了env_check扩展开发的核心技能,可以开始创建自己的自定义检查actor了!🚀

【免费下载链接】env_checkA tool for "health checking" after operating system upgrade项目地址: https://gitcode.com/openeuler/env_check

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/30 10:03:02

DLSS Swapper终极指南:简单三步管理游戏DLSS/FSR/XeSS文件

DLSS Swapper终极指南:简单三步管理游戏DLSS/FSR/XeSS文件 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款免费的Windows工具,让你轻松下载、管理和切换游戏中的DLSS、FSR和X…

作者头像 李华
网站建设 2026/6/30 10:00:35

深入解析TI DAC34H84:FIFO配置与时钟管理实战指南

1. 项目概述与核心价值 在无线通信、雷达、高端仪器仪表这些对信号纯度与实时性要求极高的领域,高速、高精度、多通道的数字模拟转换器(DAC)是系统性能的基石。它不仅仅是完成数模转换的“翻译官”,更是决定最终信号质量、系统带宽…

作者头像 李华
网站建设 2026/6/30 9:59:26

MSP430x461x混合信号MCU引脚配置与低功耗设计实战指南

1. 项目概述与核心价值在嵌入式系统开发领域,尤其是对功耗和集成度有严苛要求的应用中,选择一颗合适的微控制器往往是项目成败的关键。我接触过不少项目,从早期的8位机到后来的ARM Cortex-M系列,最终在需要极致低功耗和模拟集成度…

作者头像 李华
网站建设 2026/6/30 9:58:28

Burp Suite渗透测试实战:从零掌握Web安全核心工具

1. 项目概述:为什么说Burp Suite是渗透测试的“瑞士军刀”?如果你刚接触网络安全,尤其是Web安全测试,那么“Burp Suite”这个名字你肯定绕不过去。它不是什么新潮的词汇,但在渗透测试工程师和漏洞挖掘者的工具箱里&…

作者头像 李华
网站建设 2026/6/30 9:57:14

MSP430F41x2超低功耗混合信号MCU开发实战与设计要点

1. 项目概述:为什么选择MSP430F41x2这颗“瑞士军刀”在嵌入式开发领域,尤其是对功耗和成本都极其敏感的电池供电设备中,选型往往是决定项目成败的第一步。我经手过不少便携式医疗设备、无线传感器节点和手持仪表项目,在这些场景里…

作者头像 李华