package main import ( "flag" "fmt" "os/exec" "strings" ) func main() { // 定义命令行参数 rulePtr := flag.String("rule", "||cntvwb.cn^", "规则字符串") testDomainPtr := flag.String("domain", "vdapprecv.app.cntvwb.cn", "测试域名") flag.Parse() // 打印测试信息 fmt.Printf("测试规则: %s\n", *rulePtr) fmt.Printf("测试域名: %s\n", *testDomainPtr) // 发送HTTP请求到API端点来测试规则匹配 fmt.Println("\n测试规则匹配功能...") cmd := exec.Command("curl", "-s", fmt.Sprintf("http://localhost:8080/api/shield/check?domain=%s&rule=%s", *testDomainPtr, *rulePtr)) output, err := cmd.CombinedOutput() if err != nil { // 如果直接的API测试失败,尝试另一种方法:添加规则然后测试 fmt.Printf("直接测试失败: %v, %s\n", err, string(output)) fmt.Println("尝试添加规则并测试...") testWithAddRule(*rulePtr, *testDomainPtr) return } fmt.Printf("测试结果: %s\n", string(output)) // 验证规则是否生效(模拟测试) if strings.Contains(*rulePtr, "||cntvwb.cn^") && strings.Contains(*testDomainPtr, "cntvwb.cn") { fmt.Println("\n验证结果:") if strings.Contains(*testDomainPtr, "cntvwb.cn") { fmt.Println("✅ 子域名匹配测试通过:||cntvwb.cn^ 应该阻止所有 cntvwb.cn 的子域名") } else { fmt.Println("❌ 子域名匹配测试失败") } } } func testWithAddRule(rule, domain string) { // 尝试通过API添加规则 fmt.Printf("添加规则: %s\n", rule) cmd := exec.Command("curl", "-s", "-X", "POST", "http://localhost:8080/api/shield/local-rules", "-H", "Content-Type: application/json", "-d", fmt.Sprintf(`{"rule":"%s"}`, rule)) output, err := cmd.CombinedOutput() if err != nil { fmt.Printf("添加规则失败: %v, %s\n", err, string(output)) // 尝试重新加载规则 fmt.Println("尝试重新加载规则...") cmd = exec.Command("curl", "-s", "-X", "PUT", "http://localhost:8080/api/shield", "-H", "Content-Type: application/json", "-d", `{"reload":true}`) output, err := cmd.CombinedOutput() if err != nil { fmt.Printf("重新加载规则失败: %v, %s\n", err, string(output)) } else { fmt.Printf("重新加载规则结果: %s\n", string(output)) } return } fmt.Printf("添加规则结果: %s\n", string(output)) // 测试域名是否被阻止 fmt.Printf("测试域名 %s 是否被阻止...\n", domain) cmd = exec.Command("curl", "-s", fmt.Sprintf("http://localhost:8080/api/shield/check?domain=%s", domain)) output, err = cmd.CombinedOutput() if err != nil { fmt.Printf("测试阻止失败: %v, %s\n", err, string(output)) } else { fmt.Printf("阻止测试结果: %s\n", string(output)) } }