Merge pull request #7 from bigeagle/upstream
Redis option and only cache successful lookups
This commit is contained in:
commit
e145ef8873
@ -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))
|
||||
}
|
||||
|
||||
|
@ -55,10 +55,11 @@ type CacheSettings struct {
|
||||
}
|
||||
|
||||
type HostsSettings struct {
|
||||
Enable bool
|
||||
HostsFile string `toml:"host-file"`
|
||||
RedisKey string `toml:"redis-key"`
|
||||
TTL uint32 `toml:"ttl"`
|
||||
Enable bool
|
||||
HostsFile string `toml:"host-file"`
|
||||
RedisEnable bool `toml:"redis-enable"`
|
||||
RedisKey string `toml:"redis-key"`
|
||||
TTL uint32 `toml:"ttl"`
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
Loading…
Reference in New Issue
Block a user