package cmd import ( "bufio" "os" "strings" "github.com/evil7/hostsync/core" "github.com/evil7/hostsync/utils" "github.com/spf13/cobra" ) var ( skipConfirmation bool ) // removeCmd 删除命令 var removeCmd = &cobra.Command{ Use: "remove [domain]", Short: "删除域名记录或整个块", Long: `从指定块中删除域名记录,或删除整个块。 示例: hostsync remove github github.com # 删除指定域名记录 hostsync remove github # 删除整个块 hostsync remove github --yes # 删除整个块,跳过确认`, Args: cobra.RangeArgs(1, 2), Run: runRemove, } func init() { removeCmd.Flags().BoolVarP(&skipConfirmation, "yes", "y", false, "跳过确认提示") } func runRemove(cmd *cobra.Command, args []string) { utils.CheckAdmin() blockName := args[0] if !utils.ValidateBlockName(blockName) { utils.LogError("无效的块名称: %s", blockName) utils.LogInfo("块名称只能包含字母、数字、下划线和连字符") os.Exit(1) } hm := core.NewHostsManager() if err := hm.Load(); err != nil { utils.LogError("加载hosts文件失败: %v", err) os.Exit(1) } // 检查块是否存在 block := hm.GetBlock(blockName) if block == nil { utils.LogError("块不存在: %s", blockName) os.Exit(1) } if len(args) == 2 { // 删除单个域名记录 domain := args[1] removeDomainEntry(hm, blockName, domain) } else { // 删除整个块 removeEntireBlock(hm, blockName, block) } } func removeDomainEntry(hm *core.HostsManager, blockName, domain string) { if err := hm.RemoveEntry(blockName, domain); err != nil { utils.LogError("删除记录失败: %v", err) os.Exit(1) } utils.LogSuccess("已删除记录: %s (块: %s)", domain, blockName) } func removeEntireBlock(hm *core.HostsManager, blockName string, block *core.HostBlock) { entryCount := len(block.Entries) // 显示要删除的块信息 utils.LogInfo("准备删除块: %s", blockName) utils.LogInfo(" 包含域名记录: %d 个", entryCount) if block.DNS != "" { utils.LogInfo(" DNS配置: %s", block.DNS) } if block.DoH != "" { utils.LogInfo(" DoH配置: %s", block.DoH) } if block.Server != "" { utils.LogInfo(" 预设服务器: %s", block.Server) } if block.CronJob != "" { utils.LogInfo(" 定时任务: %s", block.CronJob) } utils.LogInfo("") // 如果没有跳过确认,则要求用户确认 if !skipConfirmation { if !confirmDeletion(blockName, entryCount) { utils.LogInfo("操作已取消") os.Exit(0) } } // 执行删除操作 if err := hm.DeleteBlock(blockName); err != nil { utils.LogError("删除块失败: %v", err) os.Exit(1) } // 保存文件 if err := hm.Save(); err != nil { utils.LogError("保存失败: %v", err) os.Exit(1) } utils.LogSuccess("已删除块: %s (包含 %d 个域名记录)", blockName, entryCount) } func confirmDeletion(blockName string, entryCount int) bool { utils.LogWarning("警告: 此操作将永久删除块 '%s' 及其所有 %d 个域名记录!", blockName, entryCount) utils.LogResult("请输入 'yes' 确认删除,或按 Enter 取消: ") scanner := bufio.NewScanner(os.Stdin) if scanner.Scan() { input := strings.TrimSpace(scanner.Text()) return strings.ToLower(input) == "yes" } return false }