Files
admin 21244ac083 refactor: 拆分 init/create 命令,init 只配置认证,create 独立创建隧道
- init 不再创建隧道,只保存 API Token + Account ID
- 新增 create 命令专门创建隧道
- init 引导添加 CF 控制台直达链接
- 更新所有命令提示文字、README、skills 文档
2026-02-22 22:47:41 +08:00

77 lines
2.9 KiB
Go

package cmd
import (
"fmt"
"strings"
"github.com/charmbracelet/huh"
"github.com/qingchencloud/cftunnel/internal/config"
"github.com/spf13/cobra"
)
var initToken, initAccountID string
func init() {
initCmd.Flags().StringVar(&initToken, "token", "", "API 令牌")
initCmd.Flags().StringVar(&initAccountID, "account", "", "账户 ID")
rootCmd.AddCommand(initCmd)
}
var initCmd = &cobra.Command{
Use: "init",
Short: "配置 Cloudflare API 认证信息",
RunE: func(cmd *cobra.Command, args []string) error {
fmt.Println("=== Cloudflare Tunnel 初始化 ===")
fmt.Println()
fmt.Println(" 1. 创建 API 令牌:")
fmt.Println(" https://dash.cloudflare.com/profile/api-tokens → 创建令牌")
fmt.Println(" 选择「创建自定义令牌」→「开始使用」")
fmt.Println()
fmt.Println(" 添加 3 条权限(点「+ 添加更多」逐条添加):")
fmt.Println(" ┌──────────────────────────────────────────────────┐")
fmt.Println(" │ 第 1 行: 帐户 │ Cloudflare Tunnel │ 编辑 │")
fmt.Println(" │ 第 2 行: 区域 │ DNS │ 编辑 │")
fmt.Println(" │ 第 3 行: 区域 │ 区域设置 │ 读取 │")
fmt.Println(" └──────────────────────────────────────────────────┘")
fmt.Println(" 提示: 第 2、3 行需先将左侧「帐户」切换为「区域」")
fmt.Println(" 区域资源 → 包括 → 特定区域 → 选择你的域名")
fmt.Println()
fmt.Println(" 2. 获取账户 ID(任选其一):")
fmt.Println(" 方式 A: https://dash.cloudflare.com → 点击域名 → 右下角「API」区域")
fmt.Println(" 方式 B: 首页 → 账户名称旁「⋯」→ 复制账户 ID")
fmt.Println()
apiToken := strings.TrimSpace(initToken)
accountID := strings.TrimSpace(initAccountID)
if apiToken == "" || accountID == "" {
err := huh.NewForm(
huh.NewGroup(
huh.NewInput().Title("API 令牌 (API Token)").Value(&apiToken).
Placeholder("在上方链接创建"),
huh.NewInput().Title("账户 ID (Account ID)").Value(&accountID).
Placeholder("32 位十六进制字符串"),
),
).Run()
if err != nil {
return err
}
apiToken = strings.TrimSpace(apiToken)
accountID = strings.TrimSpace(accountID)
}
if apiToken == "" || accountID == "" {
return fmt.Errorf("API 令牌和账户 ID 不能为空")
}
cfg, _ := config.Load()
cfg.Auth = config.AuthConfig{APIToken: apiToken, AccountID: accountID}
if err := cfg.Save(); err != nil {
return err
}
fmt.Printf("认证信息已保存到 %s\n", config.Path())
fmt.Println("\n下一步: cftunnel create <隧道名称>")
return nil
},
}