diff --git a/01.conf.go b/01.conf.go index 6015a91..078a33e 100644 --- a/01.conf.go +++ b/01.conf.go @@ -43,9 +43,12 @@ func init() { ZabovPort := zabov["port"].(string) ZabovType := zabov["proto"].(string) ZabovAddr := zabov["ipaddr"].(string) + DebugStr := (zabov["debug"].(string)) ZabovCacheTTL = int(zabov["cachettl"].(float64)) ZabovKillTTL = int(zabov["killfilettl"].(float64)) + ZabovDebug = DebugStr == "true" + if MyConf["configs"] == nil { log.Println("configs not set: you shall set at least 'default' config") os.Exit(1) diff --git a/README.md b/README.md index b878c37..d38b8ba 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,8 @@ Minimal config file should look like: "proto":"udp", "ipaddr":"0.0.0.0", "cachettl": 1, - "killfilettl": 12 + "killfilettl": 12, + "debug:"false" }, "configs":{ "default":{ @@ -74,6 +75,7 @@ Global zabov settings: - ipaddr is the port to listen to. Maybe empty, (which will result in listening to 0.0.0.0) to avoid issues with docker. - cachettl: amount of time the cache is kept (in hours) - killfilettl: refresh time for _killfiles_ +- debug: if set to "true" Zabov prints verbose logs, such as config selection and single DNS requests configs: - contains multiple zabov configuration dictionaries. "default" configuration name is mandatory @@ -84,7 +86,7 @@ configs: - hostsfile: path where you keep your local blacklistfile : this is in the format "singlefilter", meaning one domain per line, unlike hosts file. -Advanced configuration includes support for multiple configuration based on IP Soruce and timetables: +Advanced configuration includes support for multiple configurations based on IP Source and timetables:
{ "zabov":{ diff --git a/adlist_hosts.go b/adlist_hosts.go index eda7b21..44996cc 100644 --- a/adlist_hosts.go +++ b/adlist_hosts.go @@ -95,7 +95,7 @@ func getDoubleFilters(urls urlsMap) { func downloadDoubleThread() { fmt.Println("Starting updater of DOUBLE lists, each (hours):", ZabovKillTTL) - + time.Sleep(2 * time.Second) // wait for local DNS server up & running (may be our DNS) _urls := urlsMap{} for { diff --git a/adlist_single.go b/adlist_single.go index a7c1e7a..aeeffbf 100644 --- a/adlist_single.go +++ b/adlist_single.go @@ -93,6 +93,8 @@ func getSingleFilters(urls urlsMap) { func downloadThread() { fmt.Println("Starting updater of SINGLE lists, each (hours): ", ZabovKillTTL) + time.Sleep(2 * time.Second) // wait for local DNS server up & running (may be our DNS) + _urls := urlsMap{} for { diff --git a/dns_handler.go b/dns_handler.go index c09a046..02a0eda 100644 --- a/dns_handler.go +++ b/dns_handler.go @@ -1,6 +1,7 @@ package main import ( + "log" "net" "strings" "time" @@ -21,7 +22,9 @@ func getCurTime() (time.Time, error) { func confFromTimeTable(timetable string) string { tt := ZabovTimetables[timetable] if tt == nil { - //fmt.Println("confFromTimeTable: return default") + if ZabovDebug { + log.Println("confFromTimeTable: return default") + } return "default" } for _, ttentry := range tt.table { @@ -35,14 +38,18 @@ func confFromTimeTable(timetable string) string { if (nowHour > t.start.hour || (nowHour == t.start.hour && nowMinute >= t.start.minute)) && (nowHour < t.stop.hour || (nowHour == t.stop.hour && nowMinute <= t.stop.minute)) { go incrementStats("TIMETABLE IN: "+timetable, 1) - //fmt.Println("confFromTimeTable: return IN", tt.cfgin) + if ZabovDebug { + log.Println("confFromTimeTable: return IN", tt.cfgin) + } return tt.cfgin } } } } go incrementStats("TIMETABLE OUT: "+timetable, 1) - //fmt.Println("confFromTimeTable: return OUT", tt.cfgout) + if ZabovDebug { + log.Println("confFromTimeTable: return OUT", tt.cfgout) + } return tt.cfgout } @@ -54,12 +61,16 @@ func confFromIP(clientIP net.IP) string { if len(ipgroup.timetable) > 0 { return confFromTimeTable(ipgroup.timetable) } - //fmt.Println("confFromIP: ipgroup.cfg") + if ZabovDebug { + log.Println("confFromIP: ipgroup.cfg") + } return ipgroup.cfg } } } - //fmt.Println("confFromIP: return default") + if ZabovDebug { + log.Println("confFromIP: return default") + } return "default" } func (mydns *handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { @@ -77,6 +88,9 @@ func (mydns *handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { config := confFromIP(net.ParseIP(remIP)) + if ZabovDebug { + log.Println("REQUEST:", remIP, config) + } ZabovConfig := ZabovConfigs[config] switch r.Question[0].Qtype { case dns.TypeA: @@ -84,6 +98,10 @@ func (mydns *handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { domain := msg.Question[0].Name fqdn := strings.TrimRight(domain, ".") + if ZabovDebug { + log.Println("TypeA: fqdn:", fqdn) + } + if len(ZabovIPAliases[fqdn]) > 0 { config = "__aliases__" msg.Answer = append(msg.Answer, &dns.A{ @@ -113,6 +131,17 @@ func (mydns *handler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { ret := ForwardQuery(r, config, false) w.WriteMsg(ret) } + case dns.TypePTR: + if ZabovDebug { + log.Println("TypePTR: Name:", msg.Question[0].Name) + } + + if len(ZabovLocalResponder) > 0 { + // if set use local responder for reverse lookup (suffix ".in-addr.arpa.") + config = "__localresponder__" + } + ret := ForwardQuery(r, config, true) + w.WriteMsg(ret) default: ret := ForwardQuery(r, config, false) w.WriteMsg(ret) diff --git a/main.go b/main.go index 40837af..28ca5e9 100644 --- a/main.go +++ b/main.go @@ -16,12 +16,15 @@ var ZabovCacheTTL int //ZabovKillTTL is the amount of hours we cache the killfile (global) var ZabovKillTTL int -//ZabovLocalResponder is the default DNS server for loca domains +//ZabovLocalResponder is the default DNS server for local domains (global) var ZabovLocalResponder string -//ZabovLocalDomain is the default local domain +//ZabovLocalDomain is the default local domain (global) var ZabovLocalDomain string +//ZabovDebug activate more logging if set to true (global) +var ZabovDebug bool + type handler struct{} // ZabovConfig contains all Zabov configs