This commit is contained in:
32
main.go
32
main.go
@@ -38,32 +38,28 @@ var (
|
|||||||
// buildCategoryRanger holt alle CIDRs aus Redis, baut einen PCTrie
|
// buildCategoryRanger holt alle CIDRs aus Redis, baut einen PCTrie
|
||||||
// und legt ihn 10 Minuten im Cache ab.
|
// und legt ihn 10 Minuten im Cache ab.
|
||||||
func buildCategoryRanger(cat string) (cidranger.Ranger, error) {
|
func buildCategoryRanger(cat string) (cidranger.Ranger, error) {
|
||||||
rangerCacheMu.Lock()
|
// --------- 1) Leser-Lock: schneller Cache-Hit
|
||||||
// Cache-Hit?
|
rangerCacheMu.RLock()
|
||||||
if e, ok := rangerCache[cat]; ok && time.Now().Before(e.expireAt) {
|
if e, ok := rangerCache[cat]; ok && time.Now().Before(e.expireAt) {
|
||||||
rangerCacheMu.Unlock()
|
rangerCacheMu.RUnlock()
|
||||||
return e.ranger, nil
|
return e.ranger, nil
|
||||||
}
|
}
|
||||||
rangerCacheMu.Unlock()
|
rangerCacheMu.RUnlock()
|
||||||
|
|
||||||
// Redis auslesen
|
// --------- 2) Daten aus Redis ziehen
|
||||||
keys, err := rdb.HKeys(ctx, "bl:"+cat).Result()
|
keys, err := rdb.HKeys(ctx, "bl:"+cat).Result()
|
||||||
|
log.Printf("Building ranger for %s - keys: %d", cat, len(keys))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
r := cidranger.NewPCTrieRanger()
|
r := cidranger.NewPCTrieRanger()
|
||||||
for _, k := range keys {
|
for _, k := range keys {
|
||||||
k = strings.TrimSpace(k)
|
if _, ipNet, err := net.ParseCIDR(strings.TrimSpace(k)); err == nil {
|
||||||
_, ipNet, err := net.ParseCIDR(k)
|
_ = r.Insert(cidranger.NewBasicRangerEntry(*ipNet))
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("⚠️ Ungültiger Redis-Prefix %s: %s\n", cat, k)
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
_ = r.Insert(cidranger.NewBasicRangerEntry(*ipNet))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cache aktualisieren
|
// --------- 3) Schreiber-Lock: Cache aktualisieren
|
||||||
rangerCacheMu.Lock()
|
rangerCacheMu.Lock()
|
||||||
rangerCache[cat] = rangerCacheEntry{
|
rangerCache[cat] = rangerCacheEntry{
|
||||||
ranger: r,
|
ranger: r,
|
||||||
@@ -149,6 +145,8 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
warmUpRangers()
|
||||||
|
|
||||||
// Server
|
// Server
|
||||||
http.HandleFunc("/", handleGUI)
|
http.HandleFunc("/", handleGUI)
|
||||||
http.HandleFunc("/download/", handleDownload)
|
http.HandleFunc("/download/", handleDownload)
|
||||||
@@ -466,6 +464,14 @@ func checkIP(ip netip.Addr, cats []string) ([]string, error) {
|
|||||||
return matches, nil
|
return matches, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func warmUpRangers() {
|
||||||
|
for cat := range blocklistURLs {
|
||||||
|
if _, err := buildCategoryRanger(cat); err != nil {
|
||||||
|
log.Printf("warm-up error for %s: %v", cat, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// JSON-Helfer
|
// JSON-Helfer
|
||||||
func writeJSON(w http.ResponseWriter, v any) {
|
func writeJSON(w http.ResponseWriter, v any) {
|
||||||
w.Header().Set("Content-Type", "application/json")
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
Reference in New Issue
Block a user