FlyingRome a8c902401c feat(web-modules): manage WeCom robot key via {\} macro; adopt v2 markdown alerts + recovery 4 dní pred
..
WecomCenter a8c902401c feat(web-modules): manage WeCom robot key via {\} macro; adopt v2 markdown alerts + recovery 4 dní pred
README.md a8c902401c feat(web-modules): manage WeCom robot key via {\} macro; adopt v2 markdown alerts + recovery 4 dní pred

README.md

WeCom Center — 可移植 Zabbix 前端模块

一个自包含、多语言的 Zabbix 7.4 前端模块(custom module / plugin)。加载后会在 Administration → WeCom Center 增加一个定制页面,集中处理:

  • 告警优化(核心):以勾选方式一键切换“是否告警”与通知严重度;内置 5 套告警方案(标准 / 警告以上 / 全部 / 仅灾难 / 关闭),点一下立即生效。
  • 触发器告警开关:按名称搜索触发器,勾选 = 启用告警、取消勾选 = 停用该触发器(写 trigger.status,0 启用 / 1 停用)。由于单套环境常有数万个触发器,需先输入关键字搜索(最多显示 200 条)。
  • 机器人与账号:在同一页编辑企业微信 Webhook 地址 / 机器人 key、机器人账号、接收目标,并可“发送测试”验证(直接调用企微接口,返回 errcode)。
  • 模板导入:把放在 templates/ 目录里的模板文件(yaml/xml/json)一键导入 Zabbix。
  • 地图坐标:批量/单个设置主机的 location_lat / location_lon(主机资产清单)。

所有改动都通过 Zabbix 官方 API 写入数据库,因此:换机器、重建容器、升级镜像后设置都在;只要“加载插件”即可复用。

目录结构

WecomCenter/
├── manifest.json                 # 模块清单(v2.0),注册 2 个 action
├── Module.php                    # 模块入口:注册视图目录、初始化 i18n、注入左侧菜单
├── actions/
│   ├── WecomCenterView.php       # GET 控制器,渲染页面
│   └── WecomCenterSave.php       # POST 控制器,分发一键方案/保存/测试/导入/地图
├── views/
│   └── wecom.center.view.php     # 页面模板(Zabbix 原生 UI 组件)
├── lib/
│   ├── I18n.php                  # 极简多语言层(按当前语言加载,缺省回退英文)
│   └── Helper.php                # 业务逻辑:媒介/账号/key、方案预设、导入、坐标、测试
├── locale/                       # 35 个语言文件(见“多语言”)
├── templates/demo.yaml           # 示例模板(演示一键导入)
└── assets/wecom.center.css

安装(可移植方式)

  1. 持久化模块目录:在 docker-compose.yaml 的 web 服务下挂载宿主目录:

    zabbix-web-nginx-mysql:
     volumes:
       - /opt/zabbix/zabbix-server/web-modules:/usr/share/zabbix/modules
    
  2. 把本 WecomCenter/ 目录整体放到宿主 /opt/zabbix/zabbix-server/web-modules/WecomCenter/,然后 docker compose up -d 重建一次 web 容器使挂载生效(数据不动,仅 web 短暂重启)。

  3. 启用模块(写入 module 表,status=1 为启用):

    INSERT INTO module(moduleid,id,relative_path,status,config)
    SELECT 1001,'wecom_center','modules/WecomCenter',1,'[]'
    WHERE NOT EXISTS (SELECT 1 FROM module WHERE id='wecom_center');
    

(也可在 Administration → General → Modules 里点“启用”。)

  1. 刷新网页,左侧 Administration → WeCom Center 即可进入。

换环境:重复 1–3 即可。模块代码放在 git 里,web-modules/ 随仓库走;MySQL 卷里保存着 module 启用记录,二者都在 → 插件始终在线。

多语言

  • 共 35 个语言文件,覆盖 Zabbix 全部 36 个 locale(en_GB/en_US 共用英文)。
  • 已人工翻译:zh_CN、zh_TW、ja_JP、ko_KR、ru_RU、de_DE、fr_FR、es_ES、pt_BR、it_IT、pl_PL、tr_TR。
  • 其余语言文件存在但暂未翻译,运行时自动回退英文(页面照常工作,不会报错)。
  • 增加/完善语言:复制 locale/en.php 为 locale/<lang>.php 并翻译 value 即可,键名保持不变。模块会读取当前用户语言(CWebUser::$data['lang'])自动切换。

设计要点(适配 Zabbix 7.4)

  • manifest.json 用 manifest_version: 2.0;action 的控制器类位于 actions/(自动加载器会把子命名空间段转小写)。
  • 视图目录必须在 Module::init() 里 CView::registerDirectory($this->getRelativePath().'/views')。
  • 菜单注入:APP::Component()->get('menu.main')->findOrAdd(_('Administration'))->getSubmenu()->add(...)。
  • 关键 API 注意:mediatype.get 不支持 sortfield=name(会整体返回 false);configuration.import 的规则键是复数 templates(不是 template);trigger.update 不接受 triggers 数组,只能逐条用 triggerid 更新。
  • 告警“开关”落在用户媒介的 active 字段:0=启用、1=停用;严重度为位掩码(未分类=1…灾难=32)。触发器“是否告警”落在 trigger.status:0=启用、1=停用。

告警媒介说明(key 已迁到全局宏)

页面基于“Webhook 类型(type=4)的媒介 + 一个机器人账号(默认用户名 wecomrobot)的媒介记录”工作。

  • 机器人 key 存于全局宏 {$WECOM_KEY}(Administration → Macros),页面“机器人 key”字段直接读取/写入该宏——key 不再散落在一长串 webhook_url 里。换机器人只改这一格。
  • 媒介 102 的固定参数:key = {$WECOM_KEY}、message = {ALERT.MESSAGE}。
  • Webhook 脚本按 https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key= + params.key 拼 URL,用 markdown 发送(失败自动回退 text)。
  • 一键方案 / 勾选保存 → 修改该账号对应媒介的 severity / active。
  • 发送测试 → 用 base + {$WECOM_KEY} 拼 URL 直接 POST,检查返回 errcode:0。

配套告警链路(告警方案 v2,已按预期配置)

  • 动作 7「Send alarm by Wecom Robot」:问题消息改为 markdown 红字(<font color="warning">),并新增恢复操作发绿字(<font color="info">),两者均带前端直达链接 {$ZBX_URL}/tr_events.php?triggerid={TRIGGER.ID}&eventid={EVENT.ID}。
  • 全局宏:{$WECOM_KEY}(机器人 key)、{$ZBX_URL}(前端地址,默认 http://192.168.87.20:8080)。
  • 收件人:统一为机器人账号 wecomrobot(uid 6)的媒介 102,不再指向真人账号。
  • 备份与回滚:改动前已导出 /opt/zabbix/backup/wecom-config-backup-*.json(含媒介 102、动作 7、全局宏),可用对应 API 还原。

若环境中没有 Webhook 媒介类型,页面会提示“未找到 webhook 媒介类型”。