From ce90fe41efa90e67433142209d0064ea232e1df8 Mon Sep 17 00:00:00 2001 From: Timothy Date: Mon, 9 Oct 2017 17:01:39 +0800 Subject: [PATCH] implement HE dns handler --- he_handler.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/he_handler.go b/he_handler.go index f27e357..0d13e8e 100644 --- a/he_handler.go +++ b/he_handler.go @@ -1,6 +1,72 @@ package main +import ( + "fmt" + "log" + "net/http" + "os" + "runtime/debug" + "time" + + "github.com/parnurzeal/gorequest" +) + +var ( + HEUrl = "https://dyn.dns.he.net/nic/update?hostname=%s.%s&password=%s&myip=%s" +) + type HEHandler struct{} func (handler *HEHandler) DomainLoop(domain *Domain) { + defer func() { + if err := recover(); err != nil { + panicCount++ + log.Printf("Recovered in %v: %v\n", err, debug.Stack()) + fmt.Println(identifyPanic()) + log.Print(identifyPanic()) + if panicCount < PANIC_MAX { + log.Println("Got panic in goroutine, will start a new one... :", panicCount) + go handler.DomainLoop(domain) + } else { + os.Exit(1) + } + } + }() + + for { + currentIP, err := getCurrentIP(configuration.IPUrl) + + if err != nil { + log.Println("get_currentIP:", err) + continue + } + log.Println("currentIp is:", currentIP) + + for _, subDomain := range domain.SubDomains { + log.Printf("%s.%s Start to update record IP...\n", subDomain, domain.DomainName) + handler.UpdateIP(domain.DomainName, subDomain, currentIP) + } + + //Interval is 5 minutes + time.Sleep(time.Minute * INTERVAL) + } +} + +func (handler *HEHandler) UpdateIP(domain, subDomain, currentIP string) { + request := gorequest.New() + resp, body, errs := request.Get(fmt.Sprintf(HEUrl, subDomain, domain, configuration.Password, currentIP)).End() + + if len(errs) > 0 { + log.Println("Request error...") + + for _, err := range errs { + log.Println("Err:", err.Error()) + } + } else { + if resp.StatusCode == http.StatusOK { + log.Println("Update IP success:", body) + } else { + log.Println("Update IP failed:", body) + } + } }