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