cli/cmd_rules.py — rules 命令
CLItyper规则管理
⚙️ apkid-ai-cli rules <action> 管理 YARA 规则:list 列出源文件,compile 重新编译为 rules.yarc。是规则开发与发布流程的入口。
📋 文件内容一览
| 符号 | 类型 | 说明 |
|---|---|---|
rules(action) | func | typer 命令回调,管理 YARA 规则 |
模块仅导出 rules 函数,由 app.py 注册为 rules 命令。
🖥️ 命令签名
bash
apkid-ai-cli rules <action>
apkid-ai-cli rules list
apkid-ai-cli rules compile📑 参数表
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
action | str | (必填) | 动作:list 列源文件,compile 重编译 |
无选项,仅一个位置参数。action 是自由字符串(非枚举),未知值走 error_exit。
🔧 源码要点
list 动作
python
if action == "list":
yara_files = rules_mgr._collect_yara_files()
rule_list = sorted(yara_files.keys())
typer.echo(
json.dumps(
{"rules": rule_list, "count": len(rule_list)},
ensure_ascii=False,
indent=2,
)
)要点:
_collect_yara_files():RulesManager 的私有方法(下划线开头),扫描apkid/rules/目录收集.yara源文件,返回{文件名: 路径}字典。这里取keys()并排序。- 输出文件名列表:列的是 源文件(如
compiler.yara),不是单条规则——与list-tags(列检测类别)区分。 count:源文件数量。
compile 动作
python
elif action == "compile":
try:
rules_mgr.compile()
count = rules_mgr.save()
typer.echo(
json.dumps(
{"compiled": True, "rules_count": count},
ensure_ascii=False,
indent=2,
)
)
except Exception as e:
error_exit(f"Compilation failed: {e}", type(e).__name__)要点:
- 两步:
compile()把.yara源文件编译成内存中的 YARA Rules 对象;save()序列化为rules.yarc并返回规则条数。 rules_count:save()返回值,是编译后的规则条数(不是源文件数)。- 编译失败走
error_exit:带Compilation failed:前缀,detail是异常类名。YARA 语法错误会在这里暴露。 rules.yarc是 gitignored:编译产物不入库,所以发布前/装新环境时必须跑rules compile或prep-release.py。
未知 action
python
else:
error_exit(f"Unknown action '{action}'. Use 'list' or 'compile'.")action 是自由字符串,传 list/compile 以外的值会被拒绝,带使用提示。
🔗 调用链
rules("list") → RulesManager._collect_yara_files() → sorted(keys) → typer.echo
rules("compile") → RulesManager.compile() → .save() → 写 rules.yarc → typer.echo
→ (失败) → common.error_exit()
rules(其它) → common.error_exit("Unknown action ...")🤝 与其它模块的关系
- 依赖 rules 模块:
RulesManager的_collect_yara_files/compile/save。 - 依赖 common.py:仅
error_exit(不调make_scanner/output_result)。 - 被 app.py 注册:
app.command()(cmd_rules.rules)。 - 与 cmd_info.py 互补:info 读规则元数据(哈希/数量),rules 写规则(重编译)或列源文件。
- 与 cmd_tags.py 区分:rules list 列源文件名,list-tags 列检测 tag。
- 与
prep-release.py对应:rules compile等价于prep-release.py的编译步骤,但prep-release.py还做发布打包。
📍 相关
- AI CLI · rules — 用户视角用法与示例。
- RulesManager —
compile/save/_collect_yara_files实现。 - YARA 规则开发 — 如何写新规则。
- cmd_info.py — 规则元数据查询。
- cmd_tags.py — 检测类别列表。