更新版本到2.0

This commit is contained in:
Alex Yang
2026-01-25 16:13:52 +08:00
parent ecbc20d89f
commit a5dc5841fb
54 changed files with 76520 additions and 2914 deletions

View File

@@ -132,6 +132,44 @@ func (m *ShieldManager) LoadRules() error {
return nil
}
// LoadLocalRulesOnly 只加载本地规则
func (m *ShieldManager) LoadLocalRulesOnly() error {
m.rulesMutex.Lock()
defer m.rulesMutex.Unlock()
// 清空现有规则
m.domainRules = make(map[string]bool)
m.domainExceptions = make(map[string]bool)
m.domainRulesIsLocal = make(map[string]bool)
m.domainExceptionsIsLocal = make(map[string]bool)
m.domainRulesSource = make(map[string]string)
m.domainExceptionsSource = make(map[string]string)
m.domainRulesOriginal = make(map[string]string)
m.domainExceptionsOriginal = make(map[string]string)
m.regexRules = []regexRule{}
m.regexExceptions = []regexRule{}
m.hostsMap = make(map[string]string)
m.localRulesCount = 0
m.remoteRulesCount = 0
// 保留计数数据,不随规则重新加载而清空
// 加载自定义规则文件
if err := m.loadLocalRules(); err != nil {
logger.Error("加载自定义规则失败", "error", err)
// 继续执行,不返回错误
}
// 加载hosts文件
if err := m.loadHosts(); err != nil {
logger.Error("加载hosts文件失败", "error", err)
// 继续执行,不返回错误
}
logger.Info(fmt.Sprintf("本地规则加载完成,域名规则: %d, 排除规则: %d, 正则规则: %d, hosts规则: %d",
len(m.domainRules), len(m.domainExceptions), len(m.regexRules), len(m.hostsMap)))
return nil
}
// loadLocalRules 加载自定义规则文件
func (m *ShieldManager) loadLocalRules() error {
file, err := os.Open("data/rules.txt")
@@ -204,21 +242,22 @@ func (m *ShieldManager) fetchRemoteRules(url string) error {
// 获取缓存文件路径
cacheFile := m.getCacheFilePath(url)
// 尝试从缓存加载
hasLoadedFromCache := false
// 检查缓存是否存在且不需要更新
if !m.shouldUpdateCache(cacheFile) {
// 从缓存加载规则
if err := m.loadCachedRules(cacheFile, url); err == nil {
logger.Info("从缓存加载远程规则", "url", url)
hasLoadedFromCache = true
return nil // 缓存有效且加载成功,直接返回
}
}
// 从远程获取规则
// 缓存不存在或需要更新,从远程获取规则
resp, err := http.Get(url)
if err != nil {
// 如果从远程获取失败,但已经从缓存加载成功则返回nil
if hasLoadedFromCache {
logger.Warn("远程规则更新失败,使用缓存版本", "url", url, "error", err)
// 如果从远程获取失败,尝试从缓存加载(即使缓存过期)
logger.Warn("远程规则获取失败,尝试使用过期缓存", "url", url, "error", err)
if err := m.loadCachedRules(cacheFile, url); err == nil {
logger.Info("从过期缓存加载远程规则", "url", url)
return nil
}
return err
@@ -226,9 +265,10 @@ func (m *ShieldManager) fetchRemoteRules(url string) error {
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
// 如果状态码不正确,但已经从缓存加载成功则返回nil
if hasLoadedFromCache {
logger.Warn("远程规则更新失败,使用缓存版本", "url", url, "statusCode", resp.StatusCode)
// 如果状态码不正确,尝试从缓存加载(即使缓存过期)
logger.Warn("远程规则获取失败,尝试使用过期缓存", "url", url, "statusCode", resp.StatusCode)
if err := m.loadCachedRules(cacheFile, url); err == nil {
logger.Info("从过期缓存加载远程规则", "url", url)
return nil
}
return fmt.Errorf("远程服务器返回错误状态码: %d", resp.StatusCode)
@@ -236,6 +276,12 @@ func (m *ShieldManager) fetchRemoteRules(url string) error {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
// 如果读取响应失败,尝试从缓存加载(即使缓存过期)
logger.Warn("远程规则读取失败,尝试使用过期缓存", "url", url, "error", err)
if err := m.loadCachedRules(cacheFile, url); err == nil {
logger.Info("从过期缓存加载远程规则", "url", url)
return nil
}
return err
}
@@ -544,6 +590,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf
"blockRule": "",
"blockRuleType": "",
"blocksource": "",
"isGFWList": false,
"excluded": false,
"excludeRule": "",
"excludeRuleType": "",
@@ -631,6 +678,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf
result["blockRule"] = m.domainRulesOriginal[domain]
result["blockRuleType"] = "exact_domain"
result["blocksource"] = m.domainRulesSource[domain]
result["isGFWList"] = m.domainRulesSource[domain] == "GFWList"
return result
}
@@ -640,6 +688,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf
result["blockRule"] = m.domainRulesOriginal[domain]
result["blockRuleType"] = "exact_domain"
result["blocksource"] = m.domainRulesSource[domain]
result["isGFWList"] = m.domainRulesSource[domain] == "GFWList"
return result
}
@@ -654,6 +703,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf
result["blockRule"] = m.domainRulesOriginal[subdomain]
result["blockRuleType"] = "subdomain"
result["blocksource"] = m.domainRulesSource[subdomain]
result["isGFWList"] = m.domainRulesSource[subdomain] == "GFWList"
return result
}
}
@@ -666,6 +716,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf
result["blockRule"] = m.domainRulesOriginal[subdomain]
result["blockRuleType"] = "subdomain"
result["blocksource"] = m.domainRulesSource[subdomain]
result["isGFWList"] = m.domainRulesSource[subdomain] == "GFWList"
return result
}
}
@@ -677,6 +728,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf
result["blockRule"] = re.original
result["blockRuleType"] = "regex"
result["blocksource"] = re.source
result["isGFWList"] = re.source == "GFWList"
return result
}
}
@@ -688,6 +740,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf
result["blockRule"] = re.original
result["blockRuleType"] = "regex"
result["blocksource"] = re.source
result["isGFWList"] = re.source == "GFWList"
return result
}
}