Merge pull request #7 from bigeagle/upstream
Redis option and only cache successful lookups
This commit is contained in:
		| @ -37,6 +37,7 @@ maxcount = 0 #If set zero. The Sum of cache itmes will be unlimit. | ||||
| #If set false, will not query hosts file and redis hosts record | ||||
| enable = false | ||||
| host-file = "/etc/hosts" | ||||
| redis-enable = true | ||||
| redis-key = "godns:hosts" | ||||
| ttl = 600 | ||||
|  | ||||
|  | ||||
| @ -147,7 +147,7 @@ func (h *GODNSHandler) do(Net string, w dns.ResponseWriter, req *dns.Msg) { | ||||
|  | ||||
| 	w.WriteMsg(mesg) | ||||
|  | ||||
| 	if IPQuery > 0 { | ||||
| 	if IPQuery > 0 && len(mesg.Answer) > 0 { | ||||
| 		err = h.cache.Set(key, mesg) | ||||
|  | ||||
| 		if err != nil { | ||||
|  | ||||
							
								
								
									
										20
									
								
								hosts.go
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								hosts.go
									
									
									
									
									
								
							| @ -2,6 +2,7 @@ package main | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"errors" | ||||
| 	"net" | ||||
| 	"os" | ||||
| 	"regexp" | ||||
| @ -17,8 +18,14 @@ type Hosts struct { | ||||
|  | ||||
| func NewHosts(hs HostsSettings, rs RedisSettings) Hosts { | ||||
| 	fileHosts := &FileHosts{hs.HostsFile} | ||||
| 	redis := &redis.Client{Addr: rs.Addr(), Db: rs.DB, Password: rs.Password} | ||||
| 	redisHosts := &RedisHosts{redis, hs.RedisKey} | ||||
|  | ||||
| 	var rc *redis.Client | ||||
| 	if hs.RedisEnable { | ||||
| 		rc = &redis.Client{Addr: rs.Addr(), Db: rs.DB, Password: rs.Password} | ||||
| 	} else { | ||||
| 		rc = nil | ||||
| 	} | ||||
| 	redisHosts := &RedisHosts{rc, hs.RedisKey} | ||||
|  | ||||
| 	hosts := Hosts{fileHosts.GetAll(), redisHosts} | ||||
| 	return hosts | ||||
| @ -69,17 +76,26 @@ type RedisHosts struct { | ||||
| } | ||||
|  | ||||
| func (r *RedisHosts) GetAll() map[string]string { | ||||
| 	if r.redis == nil { | ||||
| 		return map[string]string{} | ||||
| 	} | ||||
| 	var hosts = make(map[string]string) | ||||
| 	r.redis.Hgetall(r.key, hosts) | ||||
| 	return hosts | ||||
| } | ||||
|  | ||||
| func (r *RedisHosts) Get(domain string) (ip string, ok bool) { | ||||
| 	if r.redis == nil { | ||||
| 		return "", false | ||||
| 	} | ||||
| 	b, err := r.redis.Hget(r.key, domain) | ||||
| 	return string(b), err == nil | ||||
| } | ||||
|  | ||||
| func (r *RedisHosts) Set(domain, ip string) (bool, error) { | ||||
| 	if r.redis == nil { | ||||
| 		return false, errors.New("Redis not enabled") | ||||
| 	} | ||||
| 	return r.redis.Hset(r.key, domain, []byte(ip)) | ||||
| } | ||||
|  | ||||
|  | ||||
| @ -57,6 +57,7 @@ type CacheSettings struct { | ||||
| type HostsSettings struct { | ||||
| 	Enable      bool | ||||
| 	HostsFile   string `toml:"host-file"` | ||||
| 	RedisEnable bool   `toml:"redis-enable"` | ||||
| 	RedisKey    string `toml:"redis-key"` | ||||
| 	TTL         uint32 `toml:"ttl"` | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user