From 63f39bad943e9326ee83661cf48fae4e697f3019 Mon Sep 17 00:00:00 2001 From: jerrylou Date: Wed, 15 Feb 2017 19:12:09 +0800 Subject: [PATCH] muti domain support Signed-off-by: jerrylou --- config_sample.json | 24 ++++++++++++++--------- godns.go | 49 ++++++++++++++++++++++++++++++---------------- settings.go | 34 +++++++++++++++++++++++--------- 3 files changed, 72 insertions(+), 35 deletions(-) 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..2214867 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 { @@ -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.Println("%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..ba7279e 100644 --- a/settings.go +++ b/settings.go @@ -6,17 +6,21 @@ import ( "io/ioutil" ) +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 +40,15 @@ func LoadSettings(configPath string, settings *Settings) error { return nil } + +//LoadDomains -- Load domains from domains json +func LoadDomains(domainsJson string, domains *[]Domain) error { + + err := json.Unmarshal([]byte(domainsJson), domains) + if err != nil { + fmt.Println("Error occurs while unmarshal domains json, please make sure domains json config correct!") + return err + } + + return nil +}