VisiCore/vct-splunk-cli

GitHub: VisiCore/vct-splunk-cli

vct-splunk-cli 是一个轻量级的 Python 命令行工具,旨在通过封装 Splunk REST API 简化搜索、索引管理和健康检查等日常运维操作。

Stars: 0 | Forks: 0

# splunk 一个小巧、可脚本化的 CLI,用于通过其文档化的 REST API 读取、搜索、健康检查和安全管理 **Splunk Enterprise** —— 专为 AI CLI 代理和人类设计。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/VisiCore/vct-splunk-cli/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE) [![Python](https://img.shields.io/badge/python-3.10%E2%80%933.14-blue.svg)](https://www.python.org/) [![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) [![Checked with pyright](https://microsoft.github.io/pyright/img/pyright_badge.svg)](https://microsoft.github.io/pyright/) [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) ## 这是什么? Splunk 是一个收集和搜索机器数据(日志、指标、事件)的平台。管理它通常意味着点击其 Web UI 或手动调用其 REST API。此工具将该 API 封装在一个可预测的命令 `splunk` 中,以便人或 AI 代理可以从终端或脚本中检查 Splunk 服务器、运行搜索,并进行经过严密防护的更改。读取操作始终是安全的;任何更改服务器的操作都会先进行预览,在执行前询问,并留下审计追踪。 ## 安装 ``` uv venv uv pip install -e ".[dev]" # editable install with test deps splunk --help ``` 要求 Python 3.10+。还提供了 Nix dev shell:`nix develop`(或 `direnv allow`)会为你提供一个包含 Python、`uv` 和 `ruff` 的 shell。 ## 使用说明 使用环境变量进行身份验证(token 绝不作为标志传递): ``` export SPLUNK_URL="https://your-search-head:8089" export SPLUNK_TOKEN="" # a JWT; the primary path # 可选:也接受 Splunk session key 作为替代,即 SPLUNK_SESSION_KEY # fallback:SPLUNK_USERNAME + SPLUNK_PASSWORD 登录以获取 session key # (不推荐 —— 首选 token;由 CI 用于针对 Docker Splunk) # 可选: export SPLUNK_CA_BUNDLE="/path/to/ca.pem" # custom CA for on-prem export SPLUNK_VERIFY="true" # TLS verification (default true) ``` 你也可以使用 **session key** 而不是 token 进行身份验证(`splunk auth login` 会生成一个;设置 `SPLUNK_SESSION_KEY`),并将针对特定目标的设置保存在通过 `--profile` / `SPLUNK_PROFILE` 选择的配置文件 **profile** 中(优先级:标志 > 环境变量 > profile)。 命令(单数名词 → 动词): ``` splunk server info # connectivity, identity, version splunk api get /services/data/indexes # GET-only raw escape hatch (any read endpoint) splunk index list # list indexes splunk index get main # one index splunk search run --query 'index=_internal | stats count by sourcetype' --earliest -1h splunk search run --query 'index=main' --export --max-rows 5000 # bounded stream from the export endpoint splunk search list # running / finished search jobs splunk search get # one job by SID splunk search cancel # cancel a job (gated write) splunk saved-search list --app my_app # saved searches in an app splunk saved-search create nightly --search 'index=main | stats count' --app my_app --cron '0 2 * * *' splunk health check # native health; exits 5 if warn/fail splunk index create payments --max-gb 50 --frozen-secs 7776000 # gated write ``` 许多管理资源 —— `user`、`role`、`monitor-input`、`hec-token`、`macro`、`eventtype`、`kvstore-collection`、`app` 等 —— 都是生成的 CRUD 组。运行 `splunk --help` 列出它们,并运行 `splunk --help` 查看每个组的信息。 输出是 **TTY 自适应** 的:在终端上显示人类可读的表格,在通过管道输出或使用 `--output json` 时输出 JSON。stdout 是纯数据;诊断和提示信息会发送到 stderr,因此这是安全的: ``` splunk index list --output json | jq '.data[] | select(.disabled) | .name' ``` ### namespace(owner + app) 大多数搜索和知识对象存在于一个 namespace 中 —— 一个 **owner** 加上一个 **app** (`/servicesNS///...`)。两个通用选项可以设置它: ``` splunk saved-search list --app my_app --owner nobody # narrow a read splunk saved-search create nightly --search '...' --app my_app # writes require an app export SPLUNK_APP=my_app SPLUNK_OWNER=nobody # or set defaults once ``` 读取默认使用 `-` 通配符(每个 owner 和 app)。**写入需要明确的 app**,并且永远不会回退到默认的 `search` app,因此对象绝不会在你无意的地方创建。 ### 写入受控 每次写入 —— index 生命周期、`saved-search create`/`update`/`delete`、`search cancel` 以及所有生成的组变更 —— 默认都是安全的: ``` splunk index create payments --dry-run # preview the request; sends nothing splunk index create payments # prompts for confirmation on a TTY splunk index create payments --yes # --yes is required when non-interactive ``` 没有 `--yes` 的非交互式写入会快速失败(exit 2),而不是挂起。每次执行的写入都会追加到本地审计日志中:如果设置了 `$VCT_SPLUNK_AUDIT` 则记录到那里,否则记录到 `$XDG_STATE_HOME/vct-splunk/audit.log`,再否则记录到 `~/.local/state/vct-splunk/audit.log`。 ### 退出码 | 代码 | 含义 | | --- | --- | | 0 | 成功 | | 1 | API / 传输 / 操作错误 | | 2 | 使用或配置错误(例如没有 `--yes` 拒绝写入) | | 3 | 身份验证错误 (401/403) | | 4 | 未找到 (404) | | 5 | `health check` 成功但某些发现状态为 `warn`/`fail` | ### 契约稳定性 JSON 输出 —— 成功时为 `{"data": ..., "meta": ...}`,失败时为 `{"error": {"code", "message"}}` —— 以及上述退出码是一个 **稳定的、仅限新增的契约**:字段和代码可能会随着时间增加,但绝不重命名或删除,因此脚本、AI 代理和后端服务可以依赖它们。远程 Splunk 结果文本仅被视为数据,绝不会驱动写入。 ## 范围 主要的、认证的目标是 **Splunk Enterprise 本地部署**,使用你自己的凭据访问文档化的 REST API。它不使用、捆绑或代理任何 Splunk 分发的应用。 **透明支持 Splunk Cloud。** 当 `SPLUNK_URL` 是 `*.splunkcloud.com` 主机时,CLI 会推断出 Cloud 后端,并且 *相同的扁平命令* 会通过 Cloud ACS API 进行读取,而不是 splunkd —— 你无需选择后端。ACS 读取需要 `SPLUNK_ACS_TOKEN`(stack 从 URL 推导)。ACS 源默认为商业端点 `https://admin.splunk.com`;对于 FedRAMP stack,请设置 `SPLUNK_ACS_BASE_URL=https://admin.splunkcloudgc.com`。 Cloud 覆盖范围是 **只读的**,尚未通过在线 stack 认证,因此它无法提供的操作会以明确的 `unsupported_backend` 错误停止(exit 4),而不是进行猜测。`splunk inspect` 会报告推断出的后端及其支持的内容,供想了解的人参考。MCP wrapper 是计划中的后续工作。 ## 测试 ``` .venv/bin/python -m pytest # unit tests (mocked HTTP) SPLUNK_INTEGRATION_TEST=true .venv/bin/python -m pytest -m integration # against a live/Docker Splunk ``` CI 会在 x86 runner 上针对 Docker 化的 `splunk/splunk` 运行集成测试套件,其中 KV Store(及其捆绑的 MongoDB)原生运行。在 Apple Silicon 上,该 MongoDB 需要模拟镜像中缺失的 AVX 指令,因此在启动本地容器时需 **禁用** KV Store(通过镜像的 `default.yml` / `SPLUNK_DEFAULTS_URL` 设置 `server.conf [kvstore] disabled = true`)。除 KV Store 外的所有内容都可在本地运行;依赖 KV Store 的检查仅在 CI 中运行。 ## 贡献 该包将不依赖 Click 的核心与轻量级 CLI shell 分开: - `src/vct_splunk/core/` — 纯函数和类型化错误;从不导入 Click。 - `src/vct_splunk/commands/` — Click 适配器(每个命令组一个模块)以及共享的 `context` 和 `output` 辅助程序。 保持模块小巧且用途单一。测试在 `tests/unit/` 和 `tests/integration/` 下映射此布局。有关设置和 pre-PR 检查,请参阅 [CONTRIBUTING.md](./CONTRIBUTING.md);有关架构和约定,请参阅 [AGENTS.md](./AGENTS.md)。 ## 许可证 参见 [LICENSE](./LICENSE)。 更多内容请访问 [docs.dryvist.com](https://docs.dryvist.com)。
标签:Python, REST API, 无后门, 网络调试, 自动化, 请求拦截, 运维工具, 逆向工具