更新版本到2.0
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user