Only redis-backend hosts support wildcard

I don't break the `/etc/hosts` standard that defined in man pages.
This commit is contained in:
kenshinx 2015-10-15 00:40:34 +08:00
parent 44a3923878
commit dcf31e1b22

View File

@ -17,12 +17,12 @@ type Hosts struct {
} }
func NewHosts(hs HostsSettings, rs RedisSettings) Hosts { func NewHosts(hs HostsSettings, rs RedisSettings) Hosts {
fileHosts := &FileHosts{BaseHosts{make(map[string]string)}, hs.HostsFile} fileHosts := &FileHosts{hs.HostsFile, make(map[string]string)}
var redisHosts *RedisHosts var redisHosts *RedisHosts
if hs.RedisEnable { if hs.RedisEnable {
rc := &redis.Client{Addr: rs.Addr(), Db: rs.DB, Password: rs.Password} rc := &redis.Client{Addr: rs.Addr(), Db: rs.DB, Password: rs.Password}
redisHosts = &RedisHosts{BaseHosts{make(map[string]string)}, rc, hs.RedisKey} redisHosts = &RedisHosts{rc, hs.RedisKey, make(map[string]string)}
} }
hosts := Hosts{fileHosts, redisHosts} hosts := Hosts{fileHosts, redisHosts}
@ -79,13 +79,19 @@ type BaseHosts struct {
hosts map[string]string hosts map[string]string
} }
func (h *BaseHosts) Get(domain string) (ip string, ok bool) { type RedisHosts struct {
ip, ok = h.hosts[domain] redis *redis.Client
key string
hosts map[string]string
}
func (r *RedisHosts) Get(domain string) (ip string, ok bool) {
ip, ok = r.hosts[domain]
if ok { if ok {
return return
} }
for host, ip := range h.hosts { for host, ip := range r.hosts {
if strings.HasPrefix(host, "*.") { if strings.HasPrefix(host, "*.") {
upperLevelDomain := strings.Split(host, "*.")[1] upperLevelDomain := strings.Split(host, "*.")[1]
if strings.HasSuffix(domain, upperLevelDomain) { if strings.HasSuffix(domain, upperLevelDomain) {
@ -93,16 +99,9 @@ func (h *BaseHosts) Get(domain string) (ip string, ok bool) {
} }
} }
} }
return return
} }
type RedisHosts struct {
BaseHosts
redis *redis.Client
key string
}
func (r *RedisHosts) Set(domain, ip string) (bool, error) { func (r *RedisHosts) Set(domain, ip string) (bool, error) {
return r.redis.Hset(r.key, domain, []byte(ip)) return r.redis.Hset(r.key, domain, []byte(ip))
} }
@ -117,8 +116,13 @@ func (r *RedisHosts) Refresh() {
} }
type FileHosts struct { type FileHosts struct {
BaseHosts
file string file string
hosts map[string]string
}
func (f *FileHosts) Get(domain string) (ip string, ok bool) {
ip, ok = f.hosts[domain]
return
} }
func (f *FileHosts) Refresh() { func (f *FileHosts) Refresh() {