RC-0.3.0 (3)
All checks were successful
release-tag / release-image (push) Successful in 2m1s

This commit is contained in:
2025-06-17 18:07:38 +02:00
parent e074327e49
commit 3e57aaa098

32
main.go
View File

@@ -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)
if err != nil {
fmt.Printf("⚠️ Ungültiger Redis-Prefix %s: %s\n", cat, k)
continue
}
_ = r.Insert(cidranger.NewBasicRangerEntry(*ipNet)) _ = 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")