Files
admin ddc893c030 feat: 功能完善 + 开源准备
- 新增 destroy/reset 命令(隧道删除+完全重置)
- 新增 version/update 命令(版本管理+自更新)
- 新增 selfupdate 模块(GitHub Releases 自动更新)
- 新增 goreleaser + release workflow(tag 自动发版)
- 新增 Makefile(版本号注入构建)
- 新增 Claude Code / OpenClaw Skills
- 脱敏: 示例域名改为 example.com
- 修正 init 权限引导(DNS 而非 DNS 设置)
2026-02-22 22:05:20 +08:00

82 lines
1.9 KiB
Go

package cmd
import (
"bufio"
"context"
"fmt"
"os"
"strings"
"github.com/qingchencloud/cftunnel/internal/cfapi"
"github.com/qingchencloud/cftunnel/internal/config"
"github.com/qingchencloud/cftunnel/internal/daemon"
"github.com/spf13/cobra"
)
var destroyForce bool
func init() {
destroyCmd.Flags().BoolVar(&destroyForce, "force", false, "跳过确认")
rootCmd.AddCommand(destroyCmd)
}
var destroyCmd = &cobra.Command{
Use: "destroy",
Short: "删除隧道(清理所有 DNS 记录 + 删除 CF 隧道)",
RunE: func(cmd *cobra.Command, args []string) error {
cfg, err := config.Load()
if err != nil {
return err
}
if cfg.Tunnel.ID == "" {
return fmt.Errorf("未初始化,无隧道可删除")
}
if !destroyForce {
fmt.Printf("即将删除隧道 %s (%s) 及其 %d 条路由,此操作不可恢复!\n", cfg.Tunnel.Name, cfg.Tunnel.ID, len(cfg.Routes))
fmt.Print("确认删除?(y/N): ")
reader := bufio.NewReader(os.Stdin)
input, _ := reader.ReadString('\n')
if strings.TrimSpace(strings.ToLower(input)) != "y" {
fmt.Println("已取消")
return nil
}
}
// 停止运行中的进程
if daemon.Running() {
fmt.Println("正在停止隧道...")
daemon.Stop()
}
client := cfapi.New(cfg.Auth.APIToken, cfg.Auth.AccountID)
ctx := context.Background()
// 删除所有 DNS 记录
for _, r := range cfg.Routes {
if r.DNSRecordID != "" && r.ZoneID != "" {
fmt.Printf("删除 DNS: %s\n", r.Hostname)
if err := client.DeleteDNSRecord(ctx, r.ZoneID, r.DNSRecordID); err != nil {
fmt.Printf(" 警告: %v\n", err)
}
}
}
// 删除隧道
fmt.Println("删除隧道...")
if err := client.DeleteTunnel(ctx, cfg.Tunnel.ID); err != nil {
fmt.Printf("警告: %v\n", err)
}
// 清空配置
cfg.Tunnel = config.TunnelConfig{}
cfg.Routes = nil
if err := cfg.Save(); err != nil {
return err
}
fmt.Println("隧道已删除,配置已清空")
return nil
},
}