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,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!
## Enjoy it!

View File

@ -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
}

View File

@ -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

View File

@ -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
}