Files
kenaito-kopsc/internal/registry/builtin.go
T
odboy 400812d114 feat: 新增 file/svc/archive/sys/log/fw 分组并扩充 net、proc
- file:findbig 按大小、findrecent 按修改时间、findname 按名称查找文件
- svc:systemctl / launchctl / sc 统一接口,status、enable、disable、logs
- archive:按扩展名自动识别格式并解压,支持 tar.gz/tgz/tar.bz2/tar.xz/tar/zip/gz
- sysinfo:OS、CPU、内存、磁盘一览
- log:journalctl / log show / wevtutil 搜索关键字与查看最近日志
- fw:ufw / firewalld / iptables / ALF / netsh 统一接口,status、allow、deny
- net 新增 ping、trace(mtr 优先)、dns(dig 优先)、curl HTTP 诊断
- proc 新增 topmem、topcpu、killname
- 危险操作(svc enable/disable、proc killname、fw allow/deny)需 --yes 确认
- 注册表、executor 派发表、cli 分组说明与 README 同步更新
2026-11-02 22:42:18 +08:00

891 lines
32 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package registry
// Builtin returns the registry compiled into kopsc. Every variant is explicit
// about the platform it targets; resolution picks the most specific match.
func Builtin() *Registry {
return &Registry{Commands: []Command{
// ----- read-only -----
{
ID: "docker.ps",
Group: "docker",
Summary: "列出运行中的容器",
Action: "只读:等价 docker ps,参数可透传(如 --format、--filter)",
Variants: runtimeVariants("ps"),
},
{
ID: "docker.psall",
Group: "docker",
Summary: "列出全部容器(含已停止)",
Action: "只读:等价 docker ps -a",
Variants: runtimeVariants("ps", "-a"),
},
{
ID: "docker.images",
Group: "docker",
Summary: "列出本地镜像",
Action: "只读:等价 docker images",
Variants: runtimeVariants("images"),
},
{
ID: "docker.stats",
Group: "docker",
Summary: "一次性查看容器 CPU/内存/IO 占用",
Action: "只读:等价 docker stats --no-stream,输出一次后退出;不给容器名时自动统计全部运行中的容器," +
"给了名称或 ID 时只统计这些(需正在运行);--format 等选项可透传",
Usage: "[容器...]",
Variants: runtimeBuiltinVariants("stats"),
},
{
ID: "docker.df",
Group: "docker",
Summary: "磁盘占用排行(镜像/容器/卷/构建缓存)",
Action: "只读:在 docker system df 之上按占用大小降序排列,输出「类型 / 项 / 可清理 / 大小 / 可回收」," +
"并给出总计与一句可回收空间提示",
Variants: runtimeBuiltinVariants("df"),
},
{
ID: "docker.info",
Group: "docker",
Summary: "查看容器运行时与主机环境信息",
Action: "只读:等价 docker info",
Variants: runtimeVariants("info"),
},
{
ID: "docker.version",
Group: "docker",
Summary: "查看容器运行时版本",
Action: "只读:等价 docker version",
Variants: runtimeVariants("version"),
},
{
ID: "docker.logs",
Group: "docker",
Summary: "查看容器日志(可过滤、可落盘)",
Action: "等价 docker logs <容器>,并增加 kopsc 选项:--since 只看某时间段、--grep 只显示匹配行、--save 把显示的日志追加写入文件;" +
"--since/--grep/--save 必须写在容器名之前,容器名之后的 -f、--tail 等原样交给 docker",
Usage: "<容器> [选项...]",
MinArgs: 1,
Variants: runtimeBuiltinVariants("logs"),
},
{
ID: "docker.inspect",
Group: "docker",
Summary: "查看容器/镜像/网络/卷的详细信息",
Action: "只读:等价 docker inspect <对象>",
Usage: "<对象>",
MinArgs: 1,
Variants: runtimeVariants("inspect"),
},
{
ID: "docker.networks",
Group: "docker",
Summary: "列出容器网络",
Action: "只读:等价 docker network ls",
Variants: runtimeVariants("network", "ls"),
},
{
ID: "docker.volumes",
Group: "docker",
Summary: "列出数据卷",
Action: "只读:等价 docker volume ls",
Variants: runtimeVariants("volume", "ls"),
},
// ----- lifecycle -----
{
ID: "docker.start",
Group: "docker",
Summary: "启动已停止的容器",
Action: "启动一个或多个已存在的容器,不创建新容器",
Usage: "<容器>",
MinArgs: 1,
Variants: runtimeVariants("start"),
},
{
ID: "docker.stop",
Group: "docker",
Summary: "停止运行中的容器(按名称或 ID)",
Action: "等价 docker stop:容器按名称、ID 或唯一 ID 前缀解析,一次可停多个;" +
"先发送 SIGTERM,超时后由 docker 强制结束。-t/--time、-s/--signal 可透传",
Usage: "<容器>...",
MinArgs: 1,
Variants: runtimeBuiltinVariants("stop"),
},
{
ID: "docker.restart",
Group: "docker",
Summary: "重启容器(按名称或 ID)",
Action: "等价 docker restart:容器按名称、ID 或唯一 ID 前缀解析,一次可重启多个;" +
"-t/--time、-s/--signal 可透传",
Usage: "<容器>...",
MinArgs: 1,
Variants: runtimeBuiltinVariants("restart"),
},
{
ID: "docker.rm",
Group: "docker",
Summary: "删除容器(按名称或 ID)",
Action: "等价 docker rm:容器按名称、ID 或唯一 ID 前缀解析,一次可删多个;" +
"运行中的容器不会被强制删除,需先 kopsc docker stop。不再接受 -f,需要强删请用 --yes 确认",
Usage: "<容器>...",
MinArgs: 1,
RequiresYes: true,
ConfirmBuiltin: "docker.rm.preview",
Variants: runtimeBuiltinVariants("rm"),
},
{
ID: "docker.rmi",
Group: "docker",
Summary: "删除本地镜像(按名称或 ID)",
Action: "等价 docker rmi:镜像按名称、ID、sha256:ID 或唯一 ID 前缀解析,一次可删多个;" +
"未打标签的悬空镜像按 ID 删除。不再接受 -f,需要强删请用 --yes 确认",
Usage: "<镜像名|镜像ID>...",
MinArgs: 1,
RequiresYes: true,
ConfirmBuiltin: "docker.rmi.preview",
Variants: runtimeBuiltinVariants("rmi"),
},
{
ID: "docker.exec",
Group: "docker",
Summary: "在运行中的容器内执行命令(默认交互)",
Action: "等价 docker exec -it <容器> -- <命令...>:默认就是交互模式,无需再写 -it(显式传 -i/-t/-it 会报错);" +
"容器名之后的参数一律作为在容器内执行的命令,其中的 -i、-p 等不会被当成 docker 选项;" +
"容器名之前的选项(如 -u、-w、-e)原样透传给 docker",
Usage: "<容器> <命令...>",
MinArgs: 1,
Variants: runtimeBuiltinVariants("exec"),
},
{
ID: "docker.pull",
Group: "docker",
Summary: "拉取镜像",
Action: "从镜像仓库拉取指定镜像",
Usage: "<镜像>",
MinArgs: 1,
Variants: runtimeVariants("pull"),
},
{
ID: "docker.tag",
Group: "docker",
Summary: "给镜像打标签",
Action: "把已有镜像标记为新的名称与标签",
Usage: "<源镜像> <目标镜像>",
MinArgs: 2,
Variants: runtimeVariants("tag"),
},
{
ID: "docker.save",
Group: "docker",
Summary: "把镜像导出为 <镜像名>.tar",
Action: "等价 docker save <镜像> -o <镜像名>.tar:归档文件按镜像的仓库名与标签命名," +
"标签的冒号改写为下划线(alpine:3.20 → alpine_3.20.tar,registry:5000/team/app:1.0 → registry_5000_team_app_1.0.tar);" +
"传入镜像 ID 时先解析出它对应的镜像名称,再据此命名;未打标签的镜像直接报错。" +
"--platform 等选项原样透传给底层运行时",
Usage: "<镜像名|镜像ID>",
MinArgs: 1,
Variants: runtimeBuiltinVariants("save"),
},
{
ID: "docker.load",
Group: "docker",
Summary: "从 <归档.tar> 导入镜像",
Action: "等价 docker load -i <归档.tar>:归档文件作为位置参数(对应原本的 docker load < xxx.tar)," +
"可一次给出多个;仍可用 -i/--input 指定,或传 - 表示从标准输入读取",
Usage: "<归档.tar>...",
MinArgs: 1,
Variants: runtimeBuiltinVariants("load"),
},
{
ID: "docker.cp",
Group: "docker",
Summary: "在容器与主机之间复制文件",
Action: "等价 docker cp <源> <目标>,任一方向均可",
Usage: "<源> <目标>",
MinArgs: 2,
Variants: runtimeVariants("cp"),
},
// ----- cleanup -----
{
ID: "docker.clearsafe",
Aliases: []string{"docker.prunesafe"},
Group: "docker",
Summary: "安全清理未使用的容器、网络与构建缓存",
Action: "执行容器运行时的默认清理作用域:不清理全部未使用镜像(-a),不删除卷(--volumes),仅移除停止的容器、未使用的网络和悬空镜像",
Variants: runtimeVariants("system", "prune", "-f"),
},
{
ID: "docker.pruneimages",
Group: "docker",
Summary: "清理悬空镜像(dangling)",
Action: "等价 docker image prune -f,只删除没有标签且未被引用的悬空镜像",
Variants: runtimeVariants("image", "prune", "-f"),
},
{
ID: "docker.prunecontainers",
Group: "docker",
Summary: "清理已停止的容器",
Action: "等价 docker container prune -f,删除所有已停止的容器",
Variants: runtimeVariants("container", "prune", "-f"),
},
{
ID: "docker.prunenets",
Group: "docker",
Summary: "清理未使用的网络",
Action: "等价 docker network prune -f,删除未被容器使用的网络",
Variants: runtimeVariants("network", "prune", "-f"),
},
{
ID: "docker.prunebuilder",
Group: "docker",
Summary: "清理构建缓存",
Action: "等价 docker builder prune -f,删除未被使用的构建缓存",
Variants: runtimeVariants("builder", "prune", "-f"),
},
{
ID: "docker.prunevolumes",
Group: "docker",
Summary: "清理未使用的数据卷(破坏性)",
Action: "等价 docker volume prune -f:删除所有未被容器使用的卷,卷内数据不可恢复;必须显式加 --yes 才会执行",
RequiresYes: true,
Variants: runtimeVariants("volume", "prune", "-f"),
},
{
ID: "docker.clearall",
Group: "docker",
Summary: "深度清理全部未使用镜像与资源(破坏性)",
Action: "等价 docker system prune -a -f:删除所有未使用镜像(含已打标签但未被容器引用的镜像)、停止的容器、未使用网络与构建缓存,但不删除卷;必须显式加 --yes 才会执行",
RequiresYes: true,
Variants: runtimeVariants("system", "prune", "-a", "-f"),
},
// ----- compose -----
{
ID: "docker.compose.up",
Group: "docker",
Summary: "以守护方式启动 Compose 服务",
Action: "等价 docker compose up -d;服务名可透传指定",
Variants: runtimeVariants("compose", "up", "-d"),
},
{
ID: "docker.compose.down",
Group: "docker",
Summary: "停止并移除 Compose 服务与网络",
Action: "等价 docker compose down;默认保留卷,删除卷需自行透传 -v",
Variants: runtimeVariants("compose", "down"),
},
{
ID: "docker.compose.ps",
Group: "docker",
Summary: "列出 Compose 服务状态",
Action: "只读:等价 docker compose ps",
Variants: runtimeVariants("compose", "ps"),
},
{
ID: "docker.compose.logs",
Group: "docker",
Summary: "查看 Compose 服务日志",
Action: "只读:等价 docker compose logs;-f、服务名可透传",
Variants: runtimeVariants("compose", "logs"),
},
// ----- cross-runtime diagnosis -----
{
ID: "diagnose",
Group: "diagnose",
Summary: "诊断容器或 Pod 当前状态的根因",
Action: "自动识别 Docker 容器或 Kubernetes Pod,采集状态、最近日志与事件,给出原因、依据与建议;只读,不修改任何对象。--kind 可强制来源,K8s 下 -n/--namespace 指定命名空间",
Usage: "<容器名或 Pod 名>",
MinArgs: 1,
Namespaced: true,
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "diagnose",
Note: "Linux 内置诊断(docker 与 kubectl 自动识别)",
},
{
Match: Match{OS: "darwin"},
Builtin: "diagnose",
Note: "macOS 内置诊断(Docker Desktop 与 kubectl)",
},
{
Match: Match{OS: "windows"},
Builtin: "diagnose",
Note: "Windows 内置诊断(Docker Desktop 与 kubectl)",
},
},
},
// ----- non-container examples -----
{
ID: "disk.usage",
Aliases: []string{"disk.du"},
Group: "disk",
Summary: "看哪个目录或文件最占空间(按大小从大到小排)",
Action: "等价于 du -x --max-depth=1 -h <路径> | sort -hr:统计每个直接子项(文件或目录递归)的占用," +
"不跨越文件系统边界,末尾输出该路径的合计。路径可省略(默认当前目录),也可作位置参数或用 --path 指定;" +
"由于 Windows 没有等价的 du/sort,这里使用 kopsc 内置实现以保证三平台输出一致",
Usage: "[路径]",
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "disk.usage",
Note: "Linux 内置实现(等价 du -x -d 1 -h | sort -hr)",
},
{
Match: Match{OS: "darwin"},
Builtin: "disk.usage",
Note: "macOS 内置实现(BSD du 不支持 --max-depth)",
},
{
Match: Match{OS: "windows"},
Builtin: "disk.usage",
Note: "Windows 内置实现(系统没有 du/sort)",
},
},
},
{
ID: "net.pids",
Group: "net",
Summary: "查找占用指定端口的进程 PID",
Action: "等价 lsof -ti:<端口>:每行输出一个占用该端口的进程 PID。Linux/macOS 调用 lsof,Windows 解析 netstat -ano;无进程占用时无输出",
Usage: "<端口>",
MinArgs: 1,
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "net.pids",
Note: "Linux 使用 lsof -ti",
},
{
Match: Match{OS: "darwin"},
Builtin: "net.pids",
Note: "macOS 使用 lsof -ti",
},
{
Match: Match{OS: "windows"},
Builtin: "net.pids",
Note: "Windows 解析 netstat -ano",
},
},
},
{
ID: "net.ports",
Group: "net",
Summary: "列出本机正在监听的端口(表格)",
Action: "只读:输出「端口 / 协议 / 地址 / PID / 进程」,按端口升序,三个平台格式一致;" +
"--raw 保留平台原生命令(Linux ss -tulnp、macOS lsof、Windows netstat -ano)的原始输出",
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "net.ports",
Note: "Linux 内置实现(ss -tulnp 解析为表格)",
},
{
Match: Match{OS: "darwin"},
Builtin: "net.ports",
Note: "macOS 内置实现(lsof 解析为表格)",
},
{
Match: Match{OS: "windows"},
Builtin: "net.ports",
Note: "Windows 内置实现(netstat -ano 解析为表格)",
},
},
},
{
ID: "proc.nohup",
Group: "proc",
Summary: "在后台运行命令,输出写入日志(等价 nohup <命令> > output.log 2>&1 &)",
Action: "启动一个与当前终端脱离的命令并立即返回:标准输入接到空设备," +
"标准输出与标准错误都追加写入日志文件(默认 <程序名>.out,可用 -o 指定)," +
"Unix 下进入新会话、无控制终端,Windows 下以 DETACHED_PROCESS 启动,关闭终端不会终止它。" +
"选项在命令之前解析,命令之后的参数(含 -i 之类)原样透传,不加 shell;" +
"命令自身的 -n/--dry-run 不会被 kopsc 截获;kopsc 自身的预览等选项写在命令之前或用 -- 分隔",
Usage: "<命令> [参数...]",
MinArgs: 1,
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "proc.nohup",
Note: "Linux 内置实现(setsid 新会话 + 日志追加)",
},
{
Match: Match{OS: "darwin"},
Builtin: "proc.nohup",
Note: "macOS 内置实现(setsid 新会话 + 日志追加)",
},
{
Match: Match{OS: "windows"},
Builtin: "proc.nohup",
Note: "Windows 内置实现(DETACHED_PROCESS + 日志追加)",
},
},
},
{
ID: "proc.wait",
Group: "proc",
Summary: "等待进程退出(关键字可多个,逻辑与;也可按 PID)",
Action: "每秒检查一次目标进程是否还在:存在就继续等,直到它消失为止。" +
"关键字在进程名与命令行中匹配(忽略大小写),多个关键字需全部命中(逻辑与);" +
"--pid 可直接指定进程 ID(逗号分隔可多个),与关键字同时给出时任一方仍存在都会继续等待。" +
"默认一直等到进程退出;--timeout 可限时,超时以退出码 2 结束;--once 只检查一次不等待。" +
"只读,不修改任何进程",
Usage: "<关键字>... [--pid PID]...",
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "proc.wait",
Note: "Linux 内置实现(读 /proc,回退 ps)",
},
{
Match: Match{OS: "darwin"},
Builtin: "proc.wait",
Note: "macOS 内置实现(ps -eo pid=,args=)",
},
{
Match: Match{OS: "windows"},
Builtin: "proc.wait",
Note: "Windows 内置实现(tasklist,关键字只能匹配进程名)",
},
},
},
{
ID: "java.run",
Group: "java",
Summary: "按 JDK 版本套用调优参数并前台运行 Java 应用",
Action: "以 kopsc 内置的业界常用调优参数启动 Spring 风格应用:自动识别宿主机的 CPU 与可用内存" +
"(容器内以 cgroup 限额为准),堆大小默认取可用内存的 50%;按检测到的 JDK 版本套用对应参数," +
"JDK 8 使用 -Xloggc 组,JDK 9+ 使用 -Xlog: 组;应用参数写在 jar 之后,或用 -- 分隔。" +
"前台运行,Ctrl+C 可停止,退出码透传",
Usage: "<app.jar> [-- 应用参数...]",
MinArgs: 1,
ConfirmBuiltin: "java.run.preview",
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "java.run",
Note: "Linux 内置实现(/proc 与 cgroup 探测资源)",
},
{
Match: Match{OS: "darwin"},
Builtin: "java.run",
Note: "macOS 内置实现(sysctl 探测内存)",
},
{
Match: Match{OS: "windows"},
Builtin: "java.run",
Note: "Windows 内置实现(wmic 探测内存)",
},
},
},
{
ID: "git.retime",
Group: "git",
Summary: "把指定日期范围的提交时间改到 21:00-23:00 并强推",
Action: "读取本地分支在给定日期范围内(含两端)的提交,保留各自的原日期," +
"把时分秒重排到 21:00-23:00 之间:同一日期内相邻提交严格递增,间隔取 5-40 分钟的随机值(秒位随机)," +
"也可用 --interval match-remote 参照远程分支的间隔;加 --start-date 时改为按顺序重排日期," +
"均匀铺在 [--start-date, --end-date] 之间。随后重建这段历史并以 --force-with-lease 强推。" +
"改动前自动创建 refs/kopsc-backup/<分支>-<时间戳> 备份引用,工作区有未提交改动时拒绝执行;" +
"默认只打印预览表并以退出码 2 结束,必须显式加 --yes 才会改写并推送",
Usage: "<开始日期> <结束日期> [选项]",
MinArgs: 2,
RequiresYes: true,
ConfirmBuiltin: "git.retime.preview",
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "git.retime",
Note: "Linux 内置实现(调用本机 git)",
},
{
Match: Match{OS: "darwin"},
Builtin: "git.retime",
Note: "macOS 内置实现(调用本机 git)",
},
{
Match: Match{OS: "windows"},
Builtin: "git.retime",
Note: "Windows 内置实现(调用本机 git)",
},
},
},
{
ID: "pkg.refreshindex",
Group: "pkg",
Summary: "刷新系统包管理器的软件源索引",
Action: "只更新元数据索引,不升级或安装任何软件包",
Variants: []Variant{
{
Match: Match{OS: "linux", Distro: "centos"},
Argv: []string{"dnf", "makecache"},
Note: "CentOS 使用 dnf",
},
{
Match: Match{OS: "linux", DistroLike: []string{"rhel", "fedora"}},
Argv: []string{"dnf", "makecache"},
Note: "RHEL/Fedora 系发行版使用 dnf",
},
{
Match: Match{OS: "linux", DistroLike: []string{"debian", "ubuntu"}},
Argv: []string{"apt-get", "update"},
Note: "Debian/Ubuntu 系发行版使用 apt-get",
},
{
Match: Match{OS: "linux", Distro: "alpine"},
Argv: []string{"apk", "update"},
Note: "Alpine 使用 apk",
},
{
Match: Match{OS: "darwin"},
Argv: []string{"brew", "update"},
Note: "macOS 使用 Homebrew",
},
{
Match: Match{OS: "windows"},
Argv: []string{"winget", "source", "update"},
Note: "Windows 使用 winget",
},
},
},
{
ID: "user.grant",
Group: "user",
Summary: "授予用户 root/sudo 权限",
Action: "将指定用户添加到系统的管理员组,使其获得 root/sudo 权限。" +
"Linux: 添加到 wheel(CentOS/RHEL)或 sudo(Debian/Ubuntu)组;" +
"macOS: 添加到 admin 组;Windows: 添加到 Administrators 组。" +
"需要当前用户已有 sudo/管理员权限;执行后用户需重新登录才能生效",
Usage: "<用户名>",
MinArgs: 1,
RequiresYes: true,
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "user.grant",
Note: "Linux 内置实现(usermod -aG wheel/sudo)",
},
{
Match: Match{OS: "darwin"},
Builtin: "user.grant",
Note: "macOS 内置实现(dseditgroup -a admin)",
},
{
Match: Match{OS: "windows"},
Builtin: "user.grant",
Note: "Windows 内置实现(net localgroup Administrators /add)",
},
},
},
{
ID: "user.revoke",
Group: "user",
Summary: "移除用户的 root/sudo 权限",
Action: "将指定用户从系统的管理员组移除,取消其 root/sudo 权限。" +
"Linux: 从 wheel(CentOS/RHEL)或 sudo(Debian/Ubuntu)组移除;" +
"macOS: 从 admin 组移除;Windows: 从 Administrators 组移除。" +
"需要当前用户已有 sudo/管理员权限;执行后用户需重新登录才能生效",
Usage: "<用户名>",
MinArgs: 1,
RequiresYes: true,
Variants: []Variant{
{
Match: Match{OS: "linux"},
Builtin: "user.revoke",
Note: "Linux 内置实现(gpasswd -d wheel/sudo)",
},
{
Match: Match{OS: "darwin"},
Builtin: "user.revoke",
Note: "macOS 内置实现(dseditgroup -d admin)",
},
{
Match: Match{OS: "windows"},
Builtin: "user.revoke",
Note: "Windows 内置实现(net localgroup Administrators /delete)",
},
},
},
// ----- file -----
{
ID: "file.findbig",
Group: "file",
Summary: "查找大于指定阈值的文件(按大小排序)",
Action: "递归扫描目录,找出所有大于阈值的常规文件,按大小从大到小排序输出。" +
"默认阈值 100M,默认路径当前目录;--threshold 可指定大小(支持 K/M/G/T 后缀)",
Usage: "[路径] [--threshold 大小]",
Variants: threePlatformBuiltins("file.findbig"),
},
{
ID: "file.findrecent",
Group: "file",
Summary: "查找最近 N 天内修改过的文件",
Action: "递归扫描目录,找出最近 N 天内修改过的常规文件,按修改时间从新到旧排序输出。" +
"默认 7 天,默认路径当前目录;--days 可指定天数",
Usage: "[路径] [--days 天数]",
Variants: threePlatformBuiltins("file.findrecent"),
},
{
ID: "file.findname",
Group: "file",
Summary: "按文件名查找文件(忽略大小写)",
Action: "递归扫描目录,按文件名模式匹配(支持通配符 * 和 ?,忽略大小写)。" +
"默认路径当前目录",
Usage: "<模式> [路径]",
MinArgs: 1,
Variants: threePlatformBuiltins("file.findname"),
},
// ----- svc -----
{
ID: "svc.status",
Group: "svc",
Summary: "查看服务状态与最近日志",
Action: "一步查看服务运行状态和最近 20 行日志。" +
"Linux: systemctl status + journalctl;macOS: launchctl list + log show;" +
"Windows: sc query",
Usage: "<服务名>",
MinArgs: 1,
Variants: threePlatformBuiltins("svc.status"),
},
{
ID: "svc.enable",
Group: "svc",
Summary: "启用并启动服务(开机自启 + 立即启动)",
Action: "将服务设为开机自启并立即启动。" +
"Linux: systemctl enable + start;macOS: launchctl load -w;" +
"Windows: sc config start=auto + sc start",
Usage: "<服务名>",
MinArgs: 1,
RequiresYes: true,
Variants: threePlatformBuiltins("svc.enable"),
},
{
ID: "svc.disable",
Group: "svc",
Summary: "禁用并停止服务",
Action: "停止服务并取消开机自启。" +
"Linux: systemctl stop + disable;macOS: launchctl unload -w;" +
"Windows: sc stop + sc config start=disabled",
Usage: "<服务名>",
MinArgs: 1,
RequiresYes: true,
Variants: threePlatformBuiltins("svc.disable"),
},
{
ID: "svc.logs",
Group: "svc",
Summary: "查看服务日志(支持跟踪)",
Action: "查看指定服务的日志。-f 可实时跟踪新日志,-n 指定行数(默认 50)。" +
"Linux: journalctl -u;macOS: log show;Windows: wevtutil",
Usage: "<服务名> [-f] [-n 行数]",
MinArgs: 1,
Variants: threePlatformBuiltins("svc.logs"),
},
// ----- archive -----
{
ID: "archive.extract",
Aliases: []string{"archive.unzip", "archive.untar"},
Group: "archive",
Summary: "自动识别格式并解压压缩文件",
Action: "根据文件扩展名自动选择解压方式:支持 .tar.gz / .tgz / .tar.bz2 / .tar.xz / .tar / .zip / .gz。" +
"默认解压到当前目录,--dir 可指定目标目录",
Usage: "<文件> [--dir 目录]",
MinArgs: 1,
Variants: threePlatformBuiltins("archive.extract"),
},
// ----- sysinfo -----
{
ID: "sysinfo",
Group: "sys",
Summary: "显示系统信息一览(OS、CPU、内存、磁盘)",
Action: "一次性输出操作系统、CPU 型号与核心数、内存总量与可用量、磁盘使用情况。" +
"Linux 读取 /proc 与 cgroup,macOS 使用 sysctl,Windows 使用 wmic",
Variants: threePlatformBuiltins("sysinfo"),
},
// ----- proc additions -----
{
ID: "proc.topmem",
Group: "proc",
Summary: "按内存占用排序显示进程(默认前 10)",
Action: "列出内存占用最高的 N 个进程,按 RSS 降序排列。默认显示前 10,-n 可指定数量",
Usage: "[数量]",
Variants: threePlatformBuiltins("proc.topmem"),
},
{
ID: "proc.topcpu",
Group: "proc",
Summary: "按 CPU 占用排序显示进程(默认前 10)",
Action: "列出 CPU 占用最高的 N 个进程,按 %CPU 降序排列。默认显示前 10,-n 可指定数量。" +
"Windows 不支持(tasklist 不报告 CPU 使用率)",
Usage: "[数量]",
Variants: threePlatformBuiltins("proc.topcpu"),
},
{
ID: "proc.killname",
Group: "proc",
Summary: "按进程名终止进程",
Action: "查找名称或命令行中包含指定关键字的所有进程并终止它们。" +
"默认只列出匹配进程,需加 --yes 确认终止",
Usage: "<进程名>",
MinArgs: 1,
RequiresYes: true,
Variants: threePlatformBuiltins("proc.killname"),
},
// ----- net additions -----
{
ID: "net.ping",
Group: "net",
Summary: "测试与目标主机的连通性",
Action: "向目标主机发送 ICMP 回显请求,检测网络连通性与延迟。" +
"默认发送 4 个包,-c 可指定数量",
Usage: "<主机> [-c 次数]",
MinArgs: 1,
Variants: threePlatformBuiltins("net.ping"),
},
{
ID: "net.trace",
Group: "net",
Summary: "路由追踪(显示数据包经过的每一跳)",
Action: "追踪到达目标主机经过的每一跳路由。优先使用 mtr(最佳输出)," +
"回退到 traceroute(Linux/macOS)或 tracert(Windows)",
Usage: "<主机>",
MinArgs: 1,
Variants: threePlatformBuiltins("net.trace"),
},
{
ID: "net.dns",
Group: "net",
Summary: "DNS 查询(解析域名)",
Action: "查询域名的 DNS 记录。优先使用 dig,回退到 nslookup 或 host。" +
"-t 指定记录类型(A/AAAA/MX/CNAME 等),-s 指定 DNS 服务器",
Usage: "<域名> [-t 类型] [-s 服务器]",
MinArgs: 1,
Variants: threePlatformBuiltins("net.dns"),
},
{
ID: "net.curl",
Group: "net",
Summary: "HTTP 诊断(状态码、耗时、重定向链)",
Action: "发送 HTTP 请求并显示诊断信息:状态码、DNS 解析耗时、TCP 连接耗时、TLS 握手耗时、" +
"首字节耗时、总耗时、下载大小与速度。-L 跟随重定向,-X 指定方法,-H 添加 header",
Usage: "<URL> [-L] [-X 方法] [-H header]",
MinArgs: 1,
Variants: threePlatformBuiltins("net.curl"),
},
// ----- log -----
{
ID: "log.search",
Group: "log",
Summary: "在系统日志中搜索关键字",
Action: "在系统日志中搜索包含指定关键字的条目。" +
"Linux: journalctl --grep;macOS: log show --predicate;Windows: wevtutil。" +
"--since 限定时间范围(如 1h、30m),-u 限定服务,-n 限定行数",
Usage: "<关键字> [--since 时长] [-u 服务] [-n 行数]",
MinArgs: 1,
Variants: threePlatformBuiltins("log.search"),
},
{
ID: "log.last",
Group: "log",
Summary: "查看最近的系统日志",
Action: "显示最近的系统日志条目。默认 50 行,-n 可指定行数,-u 可限定服务。" +
"Linux: journalctl;macOS: log show;Windows: wevtutil",
Usage: "[行数] [-u 服务]",
Variants: threePlatformBuiltins("log.last"),
},
// ----- fw -----
{
ID: "fw.status",
Group: "fw",
Summary: "查看防火墙状态与规则",
Action: "显示当前防火墙状态与规则列表。" +
"Linux: 自动检测 ufw / firewalld / iptables;macOS: ALF(应用防火墙);" +
"Windows: netsh advfirewall",
Variants: threePlatformBuiltins("fw.status"),
},
{
ID: "fw.allow",
Group: "fw",
Summary: "开放防火墙端口",
Action: "在防火墙中开放指定端口。支持 8080/tcp 或 8080/udp 形式,默认 tcp。" +
"Linux: ufw allow / firewall-cmd --add-port;Windows: netsh advfirewall add rule",
Usage: "<端口>[/<协议>]",
MinArgs: 1,
RequiresYes: true,
Variants: threePlatformBuiltins("fw.allow"),
},
{
ID: "fw.deny",
Group: "fw",
Summary: "关闭防火墙端口",
Action: "在防火墙中关闭指定端口。支持 8080/tcp 或 8080/udp 形式,默认 tcp。" +
"Linux: ufw deny / firewall-cmd --remove-port;Windows: netsh advfirewall delete rule",
Usage: "<端口>[/<协议>]",
MinArgs: 1,
RequiresYes: true,
Variants: threePlatformBuiltins("fw.deny"),
},
}}
}
// threePlatformBuiltins builds the platform matrix for a command that kopsc
// implements itself on all three platforms.
func threePlatformBuiltins(name string) []Variant {
return []Variant{
{Match: Match{OS: "linux"}, Builtin: name, Note: "Linux 内置实现"},
{Match: Match{OS: "darwin"}, Builtin: name, Note: "macOS 内置实现"},
{Match: Match{OS: "windows"}, Builtin: name, Note: "Windows 内置实现"},
}
}
// runtimeBuiltinVariants builds the platform matrix for a container command
// that kopsc implements itself. Builtin variants carry no argv; the builtin
// learns the runtime's program name from Variant.Runtime instead.
func runtimeBuiltinVariants(name string) []Variant {
makeVariant := func(osName, note string) Variant {
return Variant{
Match: Match{OS: osName, Runtime: "docker"},
Builtin: "docker." + name,
Runtime: "docker",
Note: note,
}
}
return []Variant{
makeVariant("linux", "Linux 上的 Docker 运行时,由 kopsc 内置实现"),
makeVariant("darwin", "macOS 上的 Docker Desktop 运行时,由 kopsc 内置实现"),
makeVariant("windows", "Windows 上的 Docker Desktop 运行时,由 kopsc 内置实现"),
}
}
// runtimeVariants builds the platform matrix for a container command: docker
// on every platform (Docker Desktop on macOS and Windows).
func runtimeVariants(args ...string) []Variant {
makeVariant := func(osName, note string) Variant {
argv := make([]string, 0, 1+len(args))
argv = append(argv, "docker")
argv = append(argv, args...)
return Variant{
Match: Match{OS: osName, Runtime: "docker"},
Argv: argv,
Note: note,
}
}
return []Variant{
makeVariant("linux", "Linux 上的 Docker 运行时"),
makeVariant("darwin", "macOS 上的 Docker Desktop 运行时"),
makeVariant("windows", "Windows 上的 Docker Desktop 运行时"),
}
}