Files
Xiaji-go/internal/module/cf/commands.go

255 lines
8.2 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 cf
import (
"fmt"
"strings"
"ops-assistant/internal/core/ecode"
coremodule "ops-assistant/internal/core/module"
)
func commandSpecs() []coremodule.CommandSpec {
return []coremodule.CommandSpec{
{
Prefixes: []string{"/cf status"},
Template: coremodule.CommandTemplate{
RunbookName: "cf_status",
Gate: coremodule.Gate{
NeedFlag: "enable_module_cf",
AllowDryRun: true,
},
DryRunMsg: "🧪 dry-run: 将执行 /cf status未实际执行",
SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf status 已执行job=%d", jobID) },
},
ErrPrefix: "/cf status 执行失败: ",
},
{
Prefixes: []string{"/cf zones"},
Template: coremodule.CommandTemplate{
RunbookName: "cf_zones",
Gate: coremodule.Gate{
NeedFlag: "enable_module_cf",
AllowDryRun: true,
},
DryRunMsg: "🧪 dry-run: 将执行 /cf zones未实际执行",
SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf zones 已执行job=%d", jobID) },
},
ErrPrefix: "/cf zones 执行失败: ",
},
{
Prefixes: []string{"/cf dns list"},
Template: coremodule.CommandTemplate{
RunbookName: "cf_dns_list",
InputsFn: func(_ string, parts []string) (map[string]string, error) {
if len(parts) < 4 {
return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足,示例:/cf dns list <zone_id>"))
}
return map[string]string{"zone_id": parts[3]}, nil
},
Gate: coremodule.Gate{
NeedFlag: "enable_module_cf",
AllowDryRun: true,
},
DryRunMsg: "🧪 dry-run: 将执行 /cf dns list <zone_id>(未实际执行)",
SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dns list 已执行job=%d", jobID) },
},
ErrPrefix: "/cf dns list 执行失败: ",
ErrHint: "/cf dns list <zone_id>",
},
{
Prefixes: []string{"/cf dns update"},
Template: coremodule.CommandTemplate{
RunbookName: "cf_dns_update",
InputsFn: func(_ string, parts []string) (map[string]string, error) {
if len(parts) < 8 {
return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足,示例:/cf dns update <zone_id> <record_id> <type> <name> <content> [ttl] [proxied]"))
}
inputs := map[string]string{
"zone_id": parts[3],
"record_id": parts[4],
"type": parts[5],
"name": parts[6],
"content": parts[7],
}
if len(parts) >= 9 {
inputs["ttl"] = parts[8]
}
if len(parts) >= 10 {
inputs["proxied"] = parts[9]
}
return inputs, nil
},
Gate: coremodule.Gate{
NeedFlag: "enable_module_cf",
AllowDryRun: true,
},
DryRunMsg: "🧪 dry-run: 将执行 /cf dns update未实际执行",
SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dns update 已执行job=%d", jobID) },
},
ErrPrefix: "/cf dns update 执行失败: ",
ErrHint: "/cf dns update <zone_id> <record_id> <type> <name> <content> [ttl] [proxied:true|false]",
},
{
Prefixes: []string{"/cf dnsadd"},
Template: coremodule.CommandTemplate{
RunbookName: "cf_dns_add",
InputsFn: func(_ string, parts []string) (map[string]string, error) {
if len(parts) < 4 {
return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足,示例:/cf dnsadd <name> <content> [on|off] [type]"))
}
name := parts[2]
content := parts[3]
proxied := "false"
recType := "A"
if len(parts) >= 5 {
switch strings.ToLower(parts[4]) {
case "on":
proxied = "true"
if len(parts) >= 6 {
recType = parts[5]
}
case "off":
proxied = "false"
if len(parts) >= 6 {
recType = parts[5]
}
case "true":
proxied = "true"
if len(parts) >= 6 {
recType = parts[5]
}
case "false":
proxied = "false"
if len(parts) >= 6 {
recType = parts[5]
}
default:
// treat as type when no on/off provided
recType = parts[4]
}
}
inputs := map[string]string{
"name": name,
"content": content,
"type": strings.ToUpper(recType),
"proxied": strings.ToLower(proxied),
}
return inputs, nil
},
Gate: coremodule.Gate{
NeedFlag: "enable_module_cf",
AllowDryRun: true,
},
DryRunMsg: "🧪 dry-run: 将执行 /cf dnsadd未实际执行",
SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dnsadd 已执行job=%d", jobID) },
},
ErrPrefix: "/cf dnsadd 执行失败: ",
ErrHint: "/cf dnsadd <name> <content> [on|off] [type]",
},
{
Prefixes: []string{"/cf dnsset"},
Template: coremodule.CommandTemplate{
RunbookName: "cf_dns_set",
InputsFn: func(_ string, parts []string) (map[string]string, error) {
if len(parts) < 4 {
return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足,示例:/cf dnsset <record_id> <content> [true]"))
}
proxied := "false"
if len(parts) >= 5 && strings.EqualFold(parts[4], "true") {
proxied = "true"
}
return map[string]string{
"record_id": parts[2],
"content": parts[3],
"proxied": strings.ToLower(proxied),
}, nil
},
Gate: coremodule.Gate{
NeedFlag: "enable_module_cf",
AllowDryRun: true,
},
DryRunMsg: "🧪 dry-run: 将执行 /cf dnsset未实际执行",
SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dnsset 已执行job=%d", jobID) },
},
ErrPrefix: "/cf dnsset 执行失败: ",
ErrHint: "/cf dnsset <record_id> <content> [true]",
},
{
Prefixes: []string{"/cf dnsdel"},
Template: coremodule.CommandTemplate{
RunbookName: "cf_dns_del",
InputsFn: func(_ string, parts []string) (map[string]string, error) {
if len(parts) < 4 {
return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足,示例:/cf dnsdel <record_id> YES"))
}
if len(parts) < 4 || !strings.EqualFold(parts[3], "YES") {
return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "缺少确认词 YES示例/cf dnsdel <record_id> YES"))
}
return map[string]string{
"record_id": parts[2],
}, nil
},
Gate: coremodule.Gate{
NeedFlag: "enable_module_cf",
AllowDryRun: false,
},
SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dnsdel 已执行job=%d", jobID) },
},
ErrPrefix: "/cf dnsdel 执行失败: ",
ErrHint: "/cf dnsdel <record_id> YES",
},
{
Prefixes: []string{"/cf dnsproxy"},
Template: coremodule.CommandTemplate{
RunbookName: "cf_dns_proxy",
InputsFn: func(_ string, parts []string) (map[string]string, error) {
if len(parts) < 4 {
return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数不足,示例:/cf dnsproxy <record_id|name> on|off"))
}
mode := strings.ToLower(parts[3])
if mode != "on" && mode != "off" {
return nil, fmt.Errorf(ecode.Tag(ecode.ErrStepFailed, "参数无效,示例:/cf dnsproxy <record_id|name> on|off"))
}
proxied := "false"
if mode == "on" {
proxied = "true"
}
inputs := map[string]string{
"proxied": proxied,
"record_id": "__empty__",
"name": "__empty__",
}
target := parts[2]
if strings.Contains(target, ".") {
inputs["name"] = target
} else {
inputs["record_id"] = target
}
return inputs, nil
},
Gate: coremodule.Gate{
NeedFlag: "enable_module_cf",
AllowDryRun: true,
},
DryRunMsg: "🧪 dry-run: 将执行 /cf dnsproxy未实际执行",
SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf dnsproxy 已执行job=%d", jobID) },
},
ErrPrefix: "/cf dnsproxy 执行失败: ",
ErrHint: "/cf dnsproxy <record_id|name> on|off",
},
{
Prefixes: []string{"/cf workers list"},
Template: coremodule.CommandTemplate{
RunbookName: "cf_workers_list",
Gate: coremodule.Gate{
NeedFlag: "enable_module_cf",
AllowDryRun: true,
},
DryRunMsg: "🧪 dry-run: 将执行 /cf workers list未实际执行",
SuccessMsg: func(jobID uint) string { return fmt.Sprintf("✅ /cf workers list 已执行job=%d", jobID) },
},
ErrPrefix: "/cf workers list 执行失败: ",
},
}
}