1
0
mirror of https://github.com/taigrr/godns synced 2025-01-18 04:03:25 -08:00

Merge pull request #6 from gunsluo/master

support mutil domain
This commit is contained in:
Timothy Ye 2017-02-17 09:32:58 +08:00 committed by GitHub
commit 5f52bfb3f9
4 changed files with 97 additions and 40 deletions

View File

@ -69,8 +69,7 @@ docker pull timothyye/godns:1.0
docker run -d --name godns --restart=always \ docker run -d --name godns --restart=always \
-e EMAIL=your_dnspod_account \ -e EMAIL=your_dnspod_account \
-e PASSWORD=your_dnspod_password \ -e PASSWORD=your_dnspod_password \
-e DOMAIN=your_domain \ -e DOMAINS="your_domain1,your_domain2" DOCKER_IMAGE_ID
-e SUB_DOMAIN=your_sub_domain DOCKER_IMAGE_ID
``` ```

View File

@ -1,11 +1,17 @@
{ {
"email": "", "email": "example@gmail.com",
"password": "", "password": "",
"login_token": "", "login_token": "",
"domain": "", "domains": [{
"sub_domain": "", "domain_name":"example.com",
"ip_url": "http://members.3322.org/dyndns/getip", "sub_domains":["www","test"]
"log_path":"./godns.log", },{
"log_size":16, "domain_name":"example2.com",
"log_num":3 "sub_domains":["www","test"]
}
],
"ip_url": "http://members.3322.org/dyndns/getip",
"log_path":"./godns.log",
"log_size":16,
"log_num":3
} }

View File

@ -36,13 +36,17 @@ func main() {
Email: os.Getenv("EMAIL"), Email: os.Getenv("EMAIL"),
Password: os.Getenv("PASSWORD"), Password: os.Getenv("PASSWORD"),
LoginToken: os.Getenv("TOKEN"), LoginToken: os.Getenv("TOKEN"),
Domain: os.Getenv("DOMAIN"),
SubDomain: os.Getenv("SUB_DOMAIN"),
IPUrl: "http://members.3322.org/dyndns/getip", IPUrl: "http://members.3322.org/dyndns/getip",
LogPath: "./godns.log", LogPath: "./godns.log",
LogSize: 16, LogSize: 16,
LogNum: 3, LogNum: 3,
} }
if err := LoadDomains(os.Getenv("DOMAINS"), &configuration.Domains); err != nil {
fmt.Println(err.Error())
log.Println(err.Error())
os.Exit(1)
}
} else { } else {
//Load settings from configurations file //Load settings from configurations file
if err := LoadSettings(*optConf, &configuration); err != nil { if err := LoadSettings(*optConf, &configuration); err != nil {
@ -53,12 +57,12 @@ func main() {
} }
if err := checkSettings(&configuration); err != nil { if err := checkSettings(&configuration); err != nil {
log.Println("Settings is invalid! " + err.Error()) log.Println("Settings is invalid! ", err.Error())
os.Exit(1) os.Exit(1)
} }
if err := InitLogger(configuration.LogPath, configuration.LogSize, configuration.LogNum); err != nil { if err := InitLogger(configuration.LogPath, configuration.LogSize, configuration.LogNum); err != nil {
log.Println("InitLogger error:" + err.Error()) log.Println("InitLogger error:", err.Error())
os.Exit(1) os.Exit(1)
} }
@ -79,9 +83,18 @@ func dnsLoop() {
} }
}() }()
for _, domain := range configuration.Domains {
go DomainLoop(&domain)
}
select {}
}
func DomainLoop(domain *Domain) {
for { for {
domainID := getDomain(configuration.Domain) domainID := getDomain(domain.DomainName)
if domainID == -1 { if domainID == -1 {
continue continue
@ -93,22 +106,24 @@ func dnsLoop() {
log.Println("get_currentIP:", err) log.Println("get_currentIP:", err)
continue continue
} }
subDomainID, ip := getSubDomain(domainID, configuration.SubDomain)
if subDomainID == "" || ip == "" {
log.Println("sub_domain:", subDomainID, ip)
continue
}
log.Println("currentIp is:", currentIP) log.Println("currentIp is:", currentIP)
//Continue to check the IP of sub-domain for _, subDomain := range domain.SubDomains {
if len(ip) > 0 && !strings.Contains(currentIP, ip) {
log.Println("Start to update record IP...") subDomainID, ip := getSubDomain(domainID, subDomain)
updateIP(domainID, subDomainID, configuration.SubDomain, currentIP)
} else { if subDomainID == "" || ip == "" {
log.Println("Current IP is same as domain IP, no need to update...") log.Printf("domain: %s.%s subDomainID: %s ip: %s\n", subDomain, domain.DomainName, subDomainID, ip)
continue
}
//Continue to check the IP of sub-domain
if len(ip) > 0 && !strings.Contains(currentIP, ip) {
log.Printf("%s.%s Start to update record IP...\n", subDomain, domain.DomainName)
updateIP(domainID, subDomainID, subDomain, currentIP)
} else {
log.Printf("%s.%s Current IP is same as domain IP, no need to update...\n", subDomain, domain.DomainName)
}
} }
//Interval is 5 minutes //Interval is 5 minutes

View File

@ -4,19 +4,24 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"strings"
) )
type Domain struct {
DomainName string `json:"domain_name"`
SubDomains []string `json:"sub_domains"`
}
//Settings struct //Settings struct
type Settings struct { type Settings struct {
Email string `json:"email"` Email string `json:"email"`
Password string `json:"password"` Password string `json:"password"`
LoginToken string `json:"login_token"` LoginToken string `json:"login_token"`
Domain string `json:"domain"` Domains []Domain `json:"domains"`
SubDomain string `json:"sub_domain"` IPUrl string `json:"ip_url"`
IPUrl string `json:"ip_url"` LogPath string `json:"log_path"`
LogPath string `json:"log_path"` LogSize int `json:"log_size"`
LogSize int `json:"log_size"` LogNum int `json:"log_num"`
LogNum int `json:"log_num"`
} }
//LoadSettings -- Load settings from config file //LoadSettings -- Load settings from config file
@ -36,3 +41,35 @@ func LoadSettings(configPath string, settings *Settings) error {
return nil return nil
} }
//LoadDomains -- Load domains from domains string
func LoadDomains(domainsOrginStr string, domains *[]Domain) error {
domainsMap := make(map[string]*Domain)
domainsArray := strings.Split(domainsOrginStr, ",")
for _, host := range domainsArray {
dotCount := strings.Count(host, ".")
if dotCount < 2 {
continue
}
len := len(host)
pos := strings.Index(host, ".")
subDomain := host[0:pos]
domainName := host[pos+1 : len]
if d, exist := domainsMap[domainName]; exist {
d.SubDomains = append(d.SubDomains, subDomain)
} else {
d := new(Domain)
d.DomainName = domainName
d.SubDomains = append(d.SubDomains, subDomain)
domainsMap[domainName] = d
}
}
for _, d := range domainsMap {
*domains = append(*domains, *d)
}
return nil
}