diff --git a/README.md b/README.md index b7235b9..7131a40 100644 --- a/README.md +++ b/README.md @@ -69,10 +69,9 @@ docker pull timothyye/godns:1.0 docker run -d --name godns --restart=always \ -e EMAIL=your_dnspod_account \ -e PASSWORD=your_dnspod_password \ --e DOMAIN=your_domain \ --e SUB_DOMAIN=your_sub_domain DOCKER_IMAGE_ID +-e DOMAINS="your_domain1,your_domain2" DOCKER_IMAGE_ID ``` -## Enjoy it! \ No newline at end of file +## Enjoy it! diff --git a/config_sample.json b/config_sample.json index 9a424ce..3e1f521 100644 --- a/config_sample.json +++ b/config_sample.json @@ -1,11 +1,17 @@ { - "email": "", - "password": "", - "login_token": "", - "domain": "", - "sub_domain": "", - "ip_url": "http://members.3322.org/dyndns/getip", - "log_path":"./godns.log", - "log_size":16, - "log_num":3 + "email": "example@gmail.com", + "password": "", + "login_token": "", + "domains": [{ + "domain_name":"example.com", + "sub_domains":["www","test"] + },{ + "domain_name":"example2.com", + "sub_domains":["www","test"] + } + ], + "ip_url": "http://members.3322.org/dyndns/getip", + "log_path":"./godns.log", + "log_size":16, + "log_num":3 } diff --git a/godns.go b/godns.go index d8aad46..07fc31d 100644 --- a/godns.go +++ b/godns.go @@ -36,13 +36,17 @@ func main() { Email: os.Getenv("EMAIL"), Password: os.Getenv("PASSWORD"), LoginToken: os.Getenv("TOKEN"), - Domain: os.Getenv("DOMAIN"), - SubDomain: os.Getenv("SUB_DOMAIN"), IPUrl: "http://members.3322.org/dyndns/getip", LogPath: "./godns.log", LogSize: 16, LogNum: 3, } + + if err := LoadDomains(os.Getenv("DOMAINS"), &configuration.Domains); err != nil { + fmt.Println(err.Error()) + log.Println(err.Error()) + os.Exit(1) + } } else { //Load settings from configurations file if err := LoadSettings(*optConf, &configuration); err != nil { @@ -53,12 +57,12 @@ func main() { } if err := checkSettings(&configuration); err != nil { - log.Println("Settings is invalid! " + err.Error()) + log.Println("Settings is invalid! ", err.Error()) os.Exit(1) } 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) } @@ -79,9 +83,18 @@ func dnsLoop() { } }() + for _, domain := range configuration.Domains { + go DomainLoop(&domain) + } + + select {} +} + +func DomainLoop(domain *Domain) { + for { - domainID := getDomain(configuration.Domain) + domainID := getDomain(domain.DomainName) if domainID == -1 { continue @@ -93,22 +106,24 @@ func dnsLoop() { log.Println("get_currentIP:", err) continue } - - subDomainID, ip := getSubDomain(domainID, configuration.SubDomain) - - if subDomainID == "" || ip == "" { - log.Println("sub_domain:", subDomainID, ip) - continue - } - log.Println("currentIp is:", currentIP) - //Continue to check the IP of sub-domain - if len(ip) > 0 && !strings.Contains(currentIP, ip) { - log.Println("Start to update record IP...") - updateIP(domainID, subDomainID, configuration.SubDomain, currentIP) - } else { - log.Println("Current IP is same as domain IP, no need to update...") + for _, subDomain := range domain.SubDomains { + + subDomainID, ip := getSubDomain(domainID, subDomain) + + if subDomainID == "" || ip == "" { + 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 diff --git a/settings.go b/settings.go index e27d510..ea5e968 100644 --- a/settings.go +++ b/settings.go @@ -4,19 +4,24 @@ import ( "encoding/json" "fmt" "io/ioutil" + "strings" ) +type Domain struct { + DomainName string `json:"domain_name"` + SubDomains []string `json:"sub_domains"` +} + //Settings struct type Settings struct { - Email string `json:"email"` - Password string `json:"password"` - LoginToken string `json:"login_token"` - Domain string `json:"domain"` - SubDomain string `json:"sub_domain"` - IPUrl string `json:"ip_url"` - LogPath string `json:"log_path"` - LogSize int `json:"log_size"` - LogNum int `json:"log_num"` + Email string `json:"email"` + Password string `json:"password"` + LoginToken string `json:"login_token"` + Domains []Domain `json:"domains"` + IPUrl string `json:"ip_url"` + LogPath string `json:"log_path"` + LogSize int `json:"log_size"` + LogNum int `json:"log_num"` } //LoadSettings -- Load settings from config file @@ -36,3 +41,35 @@ func LoadSettings(configPath string, settings *Settings) error { 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 +}