hostSync/cmd/remove.go

135 lines
3.2 KiB
Go

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 <blockName> [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
}