Wazuh DBSync 冒烟测试实战指南:用 dbsync_test_tool 端到端验证数据库同步引擎

发布时间:2026/9/14 18:11:22
Wazuh DBSync 冒烟测试实战指南:用 dbsync_test_tool 端到端验证数据库同步引擎
Wazuh DBSync 冒烟测试实战指南用 dbsync_test_tool 端到端验证数据库同步引擎【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuh本文档以 Wazuh 仓库中的 DBSync Smoke Tests 为主体见 src/shared_modules/dbsync/smokeTests/Readme.md深入讲解如何通过dbsync_test_tool黑盒工具触发 DBSync 库的全部公开 API覆盖增删改查、快照同步、触发器动作与事务操作四大典型场景。读完本文你将掌握 DBSync 冒烟测试的目录组织方式、配置文件与动作 JSON 的字段含义、每个用例的执行命令与预期行为并能对照 dbsync.h 与 action.h 理解工具与底层 C API 的调用关系。什么是 DBSync Smoke TestsDBSync 是 Wazuh 开源安全平台中负责本地数据库同步的共享模块位于 src/shared_modules/dbsync它基于 SQLite3 为 syscollector、sca、inventory-sync 等模块提供统一的数据库抽象、行级增量同步与快照更新能力。DBSync Smoke Tests 的定位正如其文档所言stimulate the entire DBSync library APIs through the DBSync Tool——即通过dbsync_test_tool依次调用 DBSync 库的整套 API以端到端的方式验证核心功能链路是否按预期工作。它属于黑盒验证工具接收配置与动作文件执行后产出增量数据文件测试人员据此分析结果。冒烟测试与仓库内的其他测试互补单元测试src/shared_modules/dbsync/tests针对 dbengine、sqlite 封装、接口层与 pipelineFactory 做细粒度验证集成测试src/shared_modules/dbsync/integrationTests验证模块在具体业务场景如 FIM中的联动冒烟测试src/shared_modules/dbsync/smokeTests则站在用户视角用一组可读的 JSON 动作文件把最常用的 API 组合跑通一遍。测试工具 dbsync_test_tool 概览dbsync_test_tool是为测试和验证 dbsync 模块而专门创建的命令行工具其完整说明见 testtool/Readme.md。它作为一个黑盒运行用户传入配置文件和一组动作 JSON工具按顺序执行并把每一步产生的 diff 快照输出到指定目录。工具的架构关系如下图所示从源码结构看testtool/main.cpp、testtool/action.h、testtool/factoryAction.h工具内部采用动作工厂 参数解析模式命令行参数-c指定配置、-a指定动作文件列表逗号分隔、-o指定输出目录每个动作 JSON 的action字段决定调用哪个 DBSync API。编译构建要运行冒烟测试首先需要构建出dbsync_test_tool二进制。按 testtool/Readme.md 的说明在仓库根目录执行make TARGETserver|agent DEBUG1TARGET指定构建目标server或agentDEBUG1可选用于生成带调试信息的构建便于后续单步排查。构建成功后dbsync_test_tool会随目标产物生成其 CMake 目标定义见 testtool/CMakeLists.txt。配置文件与动作文件的格式约定冒烟测试的全部用例都遵循一个 config.json 若干动作 JSON的组织方式。config.json数据库初始化配置冒烟测试共享的配置文件位于 src/shared_modules/dbsync/smokeTests/config.json其字段与 testtool/input/config_template.json 模板一一对应字段含义取值说明db_name数据库名称/文件路径如temp.db决定数据库落盘位置db_type数据库类型当前仅支持 SQLITE3取值为1host_type运行方类型0Agent或1Manager影响路径与运行环境相关行为persistance持久化类型冒烟测试中为空字符串sql_statement建表 SQL 语句多条 SQL 可用分号连接动作文件中的表结构必须与之一致冒烟测试的sql_statement创建了两张表CREATE TABLE processes( pid BIGINT, name TEXT, path TEXT, cmdline TEXT, state TEXT, cwd TEXT, root TEXT, uid BIGINT, gid BIGINT, euid BIGINT, egid BIGINT, suid BIGINT, sgid BIGINT, on_disk INTEGER, wired_size BIGINT, resident_size BIGINT, total_size BIGINT, user_time BIGINT, system_time BIGINT, disk_bytes_read BIGINT, disk_bytes_written BIGINT, start_time BIGINT, parent BIGINT, pgroup BIGINT, threads INTEGER, nice INTEGER, is_elevated_token INTEGER, elapsed_time BIGINT, handle_count BIGINT, percent_processor_time BIGINT, upid BIGINT HIDDEN, uppid BIGINT HIDDEN, cpu_type INTEGER HIDDEN, cpu_subtype INTEGER HIDDEN, phys_footprint BIGINT HIDDEN, PRIMARY KEY (pid)) WITHOUT ROWID; CREATE TABLE processes_sockets( socket_id BIGINT, pid BIGINT, PRIMARY KEY (socket_id)) WITHOUT ROWID;这是模拟 syscollector 进程与 socket 信息的典型表结构processes以pid为主键processes_sockets以socket_id为主键并通过pid关联到进程。动作 JSON一次 API 调用动作文件的顶层结构为{action: API 名称, body: {...}}body随动作类型不同而不同。冒烟测试覆盖的动作与底层 C API 的映射关系对应 dbsync.h 中的导出函数如下动作名action底层 APIbody 关键字段dbsync_sync_rowdbsync_sync_row/dbsync_sync_txn_rowtable、data行数组dbsync_insert_datadbsync_insert_datatable、datadbsync_delete_rowsdbsync_delete_rowstable、query.data、query.row_filter_opt/where_filter_optdbsync_select_rowsdbsync_select_rowstable、query.column_list、row_filter、distinct_opt、order_by_opt、count_optdbsync_create_txndbsync_create_txntables事务涉及的表列表dbsync_close_txndbsync_close_txn无dbsync_get_deleted_rowsdbsync_get_deleted_rows无行为由工具参数或测试上下文决定dbsync_add_table_relationshipdbsync_add_table_relationshipbase_table、relationed_tables含table与field_matchdbsync_update_with_snapshotdbsync_update_with_snapshottable、data快照数据工具在 action.h 中为每个动作实现了一个执行分支执行结果如{dbsync_insert_data: retVal}会回写到输出目录。目录结构与用例总览冒烟测试目录按一个文件夹一个用例组织见 src/shared_modules/dbsync/smokeTests每个用例目录内包含本用例所需的动作 JSON以及一份Readme.md说明该场景的步骤与预期结果smokeTests/ ├── config.json # 共享数据库配置 ├── InsertionUpdateDeleteSelect/ # 增删改查完整链路 ├── snapshotsUpdate/ # 快照更新 ├── triggerActions/ # 表关系与级联删除触发器 └── txnOperation/ # 事务操作通用执行模板为来自 testtool/Readme.md./dbsync_test_tool -c config.json -a input1.json,input2.json,input3.json -o ./output执行后所有 diff 快照会按动作顺序输出到./output目录文件命名为action_1.json、action_2.json……action_n.json其中n等于-a参数传入的动作文件数量。用例一InsertionUpdateDeleteSelect增删改查全链路该用例位于 InsertionUpdateDeleteSelect模拟最典型的数据库操作顺序其 Readme 定义的步骤为依据config.json中的sql_statement创建数据库将inputSyncRowInsert.json的数据插入数据库用inputSyncRowModified.json的数据更新数据库依据deleteRows.json删除部分数据依据inputSelectRows.json查询数据。执行命令$ ./dbsync_test_tool -c config.json -a inputSyncRowInsert.json,inputSyncRowModified.json,deleteRows.json,inputSelectRows.json -o ./output各动作文件要点如下inputSyncRowInsert.json动作dbsync_sync_row一次插入 4 行processes数据pid 4/5/6/7字段模拟真实进程信息未提供的列用-1或空串占位is_elevated_token使用布尔falseinputSyncRowModified.json动作dbsync_sync_row对pid4的行做修改name 改为User、cmdline 改为Guake、parent 改为 1验证同一主键再次 sync 即更新的语义deleteRows.json动作dbsync_delete_rowsquery中给出待删除行的完整数据pid 4 与 pid 6 两行并附带row_filter_opt:pid4作为行过滤条件说明删除既可按主键精确匹配也可叠加过滤表达式inputSelectRows.json动作dbsync_select_rowsquery中指定column_list仅取 pid、name、path、cmdline 四列、row_filterWHERE pid5、distinct_optfalse、order_by_opt为空、count_opt100验证带投影、过滤与条数限制的查询。该用例完整覆盖了dbsync_sync_row对应 API dbsync_sync_row、dbsync_delete_rowsdbsync.h与dbsync_select_rowsdbsync.h三条核心 API 的调用链。用例二snapshotsUpdate快照更新该用例位于 snapshotsUpdate用于验证以完整快照驱动增量更新的场景其步骤为依据config.json创建数据库将insertData.json的数据插入数据库用updateWithSnapshot.json的快照数据更新数据库dbsync_update_with_snapshot关闭事务。执行命令$ ./dbsync_test_tool -c config.json -a insertData.json,updateWithSnapshot.json -o ./outputinsertData.json动作dbsync_insert_data先把若干行进程数据写入库中updateWithSnapshot.json动作dbsync_update_with_snapshotbody 携带table与一份完整快照data。底层 API dbsync_update_with_snapshot 会以快照为准对目标表做比对生成并返回 diff新增/删除/变更行这正是 syscollector 周期性向中心同步清单数据所用的机制。该 API 还提供带回调的变体dbsync_update_with_snapshot_cbdbsync.h可在每次 diff 产生时实时回调处理。用例三triggerActions表关系与级联删除该用例位于 triggerActions验证 DBSync 的表关系 隐式级联删除能力其步骤为依据config.json创建数据库将insertDataProcesses.json的数据插入processes表将insertDataSocket.json的数据插入processes_sockets表依据addTableRelationship.json为两表建立关系依据deleteRows.json删除processes表中的数据应隐式删除processes_sockets表中关联的数据。执行命令$ ./dbsync_test_tool -c config.json -a insertDataProcesses.json,insertDataSocket.json,addTableRelationship.json,deleteRows.json -o ./output各动作要点insertDataProcesses.json动作dbsync_insert_data插入一条pid4的进程insertDataSocket.json动作dbsync_insert_data插入一条pid4, socket_id1的 socket 记录与进程建立外键语义上的关联addTableRelationship.json动作dbsync_add_table_relationshipbody 为base_table: processesrelationed_tables中声明processes_sockets通过field_match: {pid: pid}关联到基表。底层 API dbsync_add_table_relationship 会在引擎内部登记这一关系deleteRows.json动作dbsync_delete_rows仅凭{pid:4}where_filter_opt为空删除基表进程行。预期结果是删除processes中 pid4 的行时processes_sockets中 pid4 的 socket 记录被隐式删除验证触发器TRIGGER级别的级联行为。这一机制在 DBSync 中被 syscollector 等模块用于保证父子表数据一致性。用例四txnOperation事务操作该用例位于 txnOperation验证 DBSync 的事务化同步能力其步骤为依据config.json创建数据库创建事务createTxn.json将inputSyncRowInsertTxn.json的数据插入数据库获取删除行信息pksGetDeletedRows.json与fullyGetDeletedRows.json决定信息详细程度用inputSyncRowModifiedTxn.json更新数据库关闭事务。执行命令注意-a中带子目录前缀$ ./dbsync_test_tool -c config.json -a txnOperation/createTxn.json,txnOperation/inputSyncRowInsertTxn.json,txnOperation/pksGetDeletedRows.json,txnOperation/inputSyncRowModifiedTxn.json,txnOperation/closeTxn.json -o ./output各动作要点createTxn.json动作dbsync_create_txnbody 为{tables: [processes]}声明事务涉及的表。底层 API dbsync_create_txn 返回一个事务句柄TXN_HANDLE后续操作都通过该句柄执行如dbsync_sync_txn_rowinputSyncRowInsertTxn.json在事务内插入数据对应事务内 APIdbsync_sync_txn_row见 action.hpksGetDeletedRows.json/fullyGetDeletedRows.json均为动作dbsync_get_deleted_rows。从命名可以推断前者用于只取删除行的主键PKs后者用于取完整删除行信息二者对应的 API 是 dbsync_get_deleted_rows工具在执行时会按测试上下文向事务查询待删除数据inputSyncRowModifiedTxn.json在事务内更新数据closeTxn.json动作dbsync_close_txn关闭事务并落库对应 dbsync_close_txn。该用例完整展示了创建事务 → 事务内增改 → 查询待删除行 → 关闭事务的典型流程这也是 Wazuh 中需要原子性批量同步数据的业务场景所依赖的能力。输出与验证方式所有用例执行完成后./output目录中的action_N.json即为每个动作的 diff 快照或返回值封装。验证步骤建议如下检查是否生成了与-a参数等量的action_*.json文件逐个核对每个动作的返回值成功路径下dbsync_insert_data、dbsync_delete_rows等应返回 0对dbsync_update_with_snapshot与dbsync_get_deleted_rows重点核对 diff 内容是否符合用例 Readme 描述的预期如 triggerActions 中删除进程后 socket 记录同步消失如需进一步确认库内数据可直接用 SQLite3 客户端打开db_name指定的数据库文件如temp.db做终态校验。扩展阅读与源码索引工具使用细节与架构说明src/shared_modules/dbsync/testtool/Readme.md动作执行实现各 action 分支与返回值封装src/shared_modules/dbsync/testtool/action.h命令行参数解析与上下文管理src/shared_modules/dbsync/testtool/cmdArgsHelper.h、src/shared_modules/dbsync/testtool/testContext.h全部导出 API 声明src/shared_modules/dbsync/include/dbsync.h底层 SQLite3 引擎实现src/shared_modules/dbsync/src/sqlite/sqlite_dbengine.cpp单元测试dbengine / interface / pipelineFactory / sqlitesrc/shared_modules/dbsync/tests集成测试FIM 场景src/shared_modules/dbsync/integrationTests通过上述四个用例你可以从零开始跑通 DBSync 的增删改查、快照更新、级联删除与事务四类核心能力并把冒烟测试作为 DBSync 改动后的快速回归手段。【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuh创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考