下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/org-sb4f37jl--avaya-cm-inspect.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-sb4f37jl/avaya-cm-inspect。SSH + SAT 巡检 Avaya Communication Manager(CM),按声明式 YAML 批量采集系统/中继/信令/CDR/告警并生成 HTML 报告。Windows 下用 pywinpty 真 ConPTY 传输,SAT 功能键翻页/提交(display alarms)全部可用;未装 pywinpty 时自动降级为管道模式。
支持多台服务器切换(–server/–all/交互菜单)。当用户需要巡检 Avaya CM、查看中继组逐组成员状态、生成 CM 巡检报告时使用。
阅读全文 (展开查看完整说明)
概述
⚠️ 首次使用:连接信息前置检查(Agent 必读,务必先做)
本 skill 不预置任何服务器凭据(servers: []、host/pin 均留空)。在运行 cm_inspect.py 之前,必须先确认已从用户处拿到下列信息;只要有任一项缺失或你并不知道,就先停下来向用户提问索取,拿齐后再运行——严禁用占位值/默认值空跑,也不要盲目连接一个不存在的地址。
需要向用户确认的 5 项:
- CM 主机地址(IP 或域名)——必填
- SSH 端口(默认 22,可省)
- SSH 用户名(默认 dadmin)
- SSH 密码——必填
- SAT Pin 码——必填
行为约定:
- 若用户尚未提供或你并不知道以上信息 → 先向用户询问,例如:「请提供要巡检的 Avaya CM 的
IP 地址、SSH 用户名/密码、以及 SAT Pin 码,我拿到后再执行巡检」。
- 拿齐后再运行:
python cm_inspect.py --host <IP> --user <用户名> --password <密码> --pin <Pin>。 - 保护机制(默认安全):脚本默认不交互索取——凭据不全时直接打印
[NEED_INPUT] ...缺失清单
并以退出码 2 退出,绝不盲目连接。看到该输出即代表"应当去问用户",把缺失项转达用户、拿到后带齐参数重跑即可。只有在真实人工终端里想被逐项询问时,才加 --interactive 开关。
- 多台环境:可引导用户把服务器登记进
config/inspect.yaml的servers:,之后用--server <name>切换。 - (付费 Pay Skill 场景) 调用顺序:① 付费前置检查(确认 Agent 已装 weixinpay 插件)→
② 本节连接信息前置检查(缺则先问用户)→ ③ 完成支付 → ④ 执行巡检。
通过 SSH 登录 Avaya Communication Manager,先执行 server 采集服务器/双机状态,再进入 SAT(System Access Terminal)按 YAML 配置批量执行巡检命令,做阈值判定,并生成带「实际命令回显」的 HTML 报告(用户可在报告里看到每条命令的 SAT 原始输出)。
适用场景
- 巡检 Avaya CM 主机健康度、中继组、信令组、IPSI、CDR 计费链路、告警。
- 按用户要求「把列出的 trunk 依次执行 status trunk N」——脚本会自动 list 出中继组,
逐组执行 status trunk N 并解析在服/退服成员数。
- 生成可供现场工程师查阅的 HTML 巡检报告(位于
reports/)。
依赖
- Python 3(脚本用系统
ssh子进程,无需 paramiko)。 pip install pyyaml jinja2- (Windows 强烈推荐)
pip install pywinpty:导入名是winpty。装了它,脚本会走
真 ConPTY 传输,SAT 功能键(翻页 / 表单提交)全部可用——这是完整采集的关键。未安装时自动降级为 subprocess 管道模式(见下)。
- 脚本文件不可命名为
inspect.py(会与 Python 标准库inspect冲突,导致 jinja2 导入失败)。
用法(多台服务器切换)
config/inspect.yaml 的 connection 段默认 host / pin 留空,凭据运行时输入;真正的多台切换靠 servers: 列表(命名 profile)。支持的形态:
python cm_inspect.py --list-servers # 列出 servers 列表后退出(不连机)
python cm_inspect.py --server CM-主用 # 巡检 servers 中名为 CM-主用 的那台
python cm_inspect.py --all # 一次巡检 servers 列表中全部,各出一份报告
python cm_inspect.py # 有 servers 列表时进入交互菜单选择;无则手动输入
python cm_inspect.py --host 1.2.3.4 # 单台临时指定(其余凭据交互/默认)
python cm_inspect.py --config custom.yaml # 指定自定义巡检配置servers列表每项字段:name(别名,用于--server) /host/port/user/
pin(可随服务器保存) / password(建议留空,运行时输入,避免明文)。
- 选择服务器后,profile 里有的字段(host/user/pin/password)自动采用;缺的由
CLI(--host/--user/--pin/--password)或运行时交互补齐。--all 会对每台各生成一份报告。
- 配置:
config/inspect.yaml,声明式。新增巡检项只需在对应 module 的 items 下加一条
(command + parser + threshold),无需改代码。
- 报告:写到运行命令所在目录的
reports/avaya_cm_inspect_<host>_<时间戳>.html;若该目录不可写(如 skill 装在只读/受管目录),自动回退到用户主目录~/avaya_cm_inspect_reports/。自动按时间归档。
传输模式(务必先读)
Avaya CM 跑 OpenSSH_4.3,只支持 sha1 系 KEX,因此连接必须用系统 ssh + 旧算法选项(脚本已内置)。脚本有两种传输,main() 自动选择:
A. 真 ConPTY 模式(Windows + 已装 pywinpty,推荐)
用 winpty.PTY(底层 CreatePseudoConsole)拉起 ssh,CM 得到真正的伪终端,于是 W2KTT 功能键(ESC n=Next Pg / ESC e=Submit / ESC x=Cancel)全部生效。此模式下:
- 分页命令自动翻到末页:
list trunk-group/list signaling-group/
list ipserver-interface 等,脚本循环发 ESC n 累积全部页。末页判定用「去页脚(去掉 CANCEL 提示) + 归一化日期时间」的内容指纹——翻页后指纹不变即末页,立即收尾(避免实时缓冲里的历史 NEXT PAGE 页脚导致误判、跑满硬上限)。每页翻页后清空实时缓冲并单独累加到 blob。硬上限 max(timeout,45) 秒兜底。
display alarms表单可提交:post_actions:["esce"]发ESC e提交筛选表单,
采到完整告警明细报告(实测 MAJOR/MINOR/WARNING 全量 + 逐条 Port/Mtce/日期)。配阈值 count > 0 -> critical。
- 因功能键可用,
list/status trunk N后无需 reconnect(can_page=True时跳过降级)。
B. subprocess 管道模式(非 Windows / 未装 pywinpty,降级)
stdin 是管道而非真终端,SSH 无法协商 CM 所需终端模式,CM 不识别任何 ESC 功能键(只响铃或当文本)。因此:
- 分页命令只能采第 1 页;报告标注「可能还有后续页」。
list命令会把会话卡在 NEXT PAGE 视图,后续命令被原样回显——脚本对list及逐组
status trunk N 后自动 reconnect 恢复 Command:。
display alarms表单无法提交,脚本不尝试,改为人工处理说明 + 依赖status health
的 Maj/Min/Wrn 计数作为告警概览。
两种模式都成立的点
status trunk N是单页命令,两种模式都能正常执行并返回Command:——「逐组
status trunk N」这套核心需求始终完整可用。
结论:装上 pywinpty,Windows 下即可完整翻页 + 提交 display alarms,报告为全量数据
(实测报告体积从降级模式的 ~44KB 增至 ~138KB)。未装则自动降级,核心的逐组中继成员
状态仍完整。历史上「PTY 无法翻页/提交」的结论仅适用于管道降级模式。
解析与判定
- 每条 item 配
parser(regex / table / health / server_status / cdr_link /
trunk_status / alarms / count_lines / keyword_match / raw),把 SAT 回显解析成数值/状态,evaluate() 按 threshold 规则给出 正常/警告/严重。
- 中继组成员解析用非锚定正则
(d{4}/d+S*)s+(S+):因为 PTY 下status trunk N
输出常被渲染成单行(VT100 光标定位把各行列在一起),不能用 ^ 行首锚定。
- 中继组号解析同样用非锚定
(d+)s+#(S+),原因同上。
新增巡检项示例
- name: 自定义巡检
items:
- id: my_check
description: 示例 - 检查某个 SAT 命令输出
command: "list ip-network-region"
parser:
type: raw
threshold: null付费接入(SkillHub Agent Pay)
本 skill 走 SkillHub 平台按调用量计费 路径:用户在 Agent 里调用本 skill 时,由 SkillHub 平台线上托管签名与微信支付(你已在商户中心绑定微信商户号),本地 skill 包不需要、也不实现任何签名逻辑。
参考:https://skillhub.cn/tutorials#agent-pay-publish
本 skill 需要做的(就这 3 步)
- 在 SkillHub 商户中心绑定微信商户号(已完成)。
- 发布表单选择「按调用量计费」,填单次价格(元/次)。
- 在 SKILL.md frontmatter 声明
pricing: { model: per_call, amount_fen: <单价×100> }(见文件顶部)。
其余(微信下单、X402 预下单签名、查单、履约)全部由 SkillHub 平台完成,本地 skill 无需参与。
密钥安全(红线)
- 微信支付商户凭证(
app_id/serial_no/商户私钥/notify_url/mch_id)由 SkillHub 商户中心统一托管,本地 skill 包永远不应包含这些密钥。 config/inspect.yaml的skillhub:段只放公开引用:developer_id(商户号)、pub_key_id(形如PUB_KEY_xxx,可公开)、token_env(从环境变量读 Token)。developer_private_key仅在「自托管后端」进阶路径才需要(见下),本路径不使用。- 私钥泄露:立刻去 SkillHub「商家入驻 → 开发者密钥」吊销重发。
进阶路径(自托管后端,本 skill 默认不走)
若你要把「已有托管服务」封装为 Pay Skill,才需要自建商户后端(402→微信下单→AI 预下单签名→查单→履约,官方提供 Go/Java Demo),并用内置 skillhub_pay.py(SkillHub 开发者私钥做 SKILLHUB-SHA256-RSA2048 签名)辅助。该路径与本 skill 的本地 CLI 形态无关,按需参考即可。