mirror of
				https://github.com/taigrr/godns
				synced 2025-01-18 04:03:25 -08:00 
			
		
		
		
	Add dreamhost handler
This commit is contained in:
		
							parent
							
								
									10e125d06d
								
							
						
					
					
						commit
						f2e9c0ab00
					
				
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							| @ -5,6 +5,7 @@ require ( | ||||
| 	github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 // indirect | ||||
| 	github.com/bogdanovich/dns_resolver v0.0.0-20170211073258-a8e42bc6a5b6 | ||||
| 	github.com/fatih/color v1.7.0 | ||||
| 	github.com/google/uuid v1.1.1 | ||||
| 	github.com/kr/pretty v0.1.0 // indirect | ||||
| 	github.com/mattn/go-colorable v0.0.9 // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.4 // indirect | ||||
|  | ||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							| @ -6,6 +6,8 @@ github.com/bogdanovich/dns_resolver v0.0.0-20170211073258-a8e42bc6a5b6 h1:oV1V+u | ||||
| github.com/bogdanovich/dns_resolver v0.0.0-20170211073258-a8e42bc6a5b6/go.mod h1:txOV61Nn+21z77KUMkNsp8lTHoOFTtqotltQAFenS9I= | ||||
| github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= | ||||
| github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= | ||||
| github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= | ||||
| github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= | ||||
| github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
|  | ||||
							
								
								
									
										124
									
								
								handler/dreamhost/dreamhost_handler.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								handler/dreamhost/dreamhost_handler.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,124 @@ | ||||
| package dreamhost | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"runtime/debug" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/TimothyYe/godns" | ||||
| 	"github.com/google/uuid" | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| 	// DreamhostURL the API address for dreamhost.com | ||||
| 	DreamhostURL = "https://api.dreamhost.com" | ||||
| ) | ||||
| 
 | ||||
| // Handler struct | ||||
| type Handler struct { | ||||
| 	Configuration *godns.Settings | ||||
| } | ||||
| 
 | ||||
| // SetConfiguration pass dns settings and store it to handler instance | ||||
| func (handler *Handler) SetConfiguration(conf *godns.Settings) { | ||||
| 	handler.Configuration = conf | ||||
| } | ||||
| 
 | ||||
| // DomainLoop the main logic loop | ||||
| func (handler *Handler) DomainLoop(domain *godns.Domain, panicChan chan<- godns.Domain) { | ||||
| 	defer func() { | ||||
| 		if err := recover(); err != nil { | ||||
| 			log.Printf("Recovered in %v: %v\n", err, debug.Stack()) | ||||
| 			panicChan <- *domain | ||||
| 		} | ||||
| 	}() | ||||
| 
 | ||||
| 	for { | ||||
| 		currentIP, err := godns.GetCurrentIP(handler.Configuration) | ||||
| 
 | ||||
| 		if err != nil { | ||||
| 			log.Println("get_currentIP:", err) | ||||
| 			continue | ||||
| 		} | ||||
| 		log.Println("currentIP is:", currentIP) | ||||
| 
 | ||||
| 		for _, subDomain := range domain.SubDomains { | ||||
| 			hostname := subDomain + "." + domain.DomainName | ||||
| 			lastIP := godns.ResolveDNS(hostname, handler.Configuration.Resolver) | ||||
| 			//check against currently known IP, if no change, skip update | ||||
| 			if currentIP == lastIP { | ||||
| 				log.Printf("IP is the same as cached one. Skip update.\n") | ||||
| 			} else { | ||||
| 				log.Printf("%s.%s Start to update record IP...\n", subDomain, domain.DomainName) | ||||
| 				handler.UpdateIP(hostname, currentIP, lastIP) | ||||
| 
 | ||||
| 				// Send notification | ||||
| 				if err := godns.SendNotify(handler.Configuration, fmt.Sprintf("%s.%s", subDomain, domain.DomainName), currentIP); err != nil { | ||||
| 					log.Println("Failed to send notification") | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// Sleep with interval | ||||
| 		log.Printf("Going to sleep, will start next checking in %d seconds...\r\n", handler.Configuration.Interval) | ||||
| 		time.Sleep(time.Second * time.Duration(handler.Configuration.Interval)) | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // UpdateIP update subdomain with current IP | ||||
| func (handler *Handler) UpdateIP(hostname, currentIP, lastIP string) { | ||||
| 
 | ||||
| 	handler.updateDNS(lastIP, currentIP, hostname, "remove") | ||||
| 	handler.updateDNS(lastIP, currentIP, hostname, "add") | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // updateDNS can add or remove DNS records. | ||||
| func (handler *Handler) updateDNS(dns, ip, hostname, action string) { | ||||
| 	// Generates UUID | ||||
| 	uid, _ := uuid.NewRandom() | ||||
| 	values := url.Values{} | ||||
| 	values.Add("record", hostname) | ||||
| 	values.Add("key", handler.Configuration.LoginToken) | ||||
| 	values.Add("type", "A") | ||||
| 	values.Add("unique_id", uid.String()) | ||||
| 	switch action { | ||||
| 	case "remove": | ||||
| 		// Build URL query (remove) | ||||
| 		values.Add("cmd", "dns-remove_record") | ||||
| 		values.Add("value", dns) | ||||
| 	case "add": | ||||
| 		// Build URL query (add) | ||||
| 		values.Add("cmd", "dns-add_record") | ||||
| 		values.Add("value", ip) | ||||
| 	default: | ||||
| 		log.Fatalf("Unknown action %s\n", action) | ||||
| 	} | ||||
| 
 | ||||
| 	client := godns.GetHttpClient(handler.Configuration) | ||||
| 	req, _ := http.NewRequest("POST", DreamhostURL, strings.NewReader(values.Encode())) | ||||
| 	req.SetBasicAuth(handler.Configuration.Email, handler.Configuration.Password) | ||||
| 
 | ||||
| 	if handler.Configuration.UserAgent != "" { | ||||
| 		req.Header.Add("User-Agent", handler.Configuration.UserAgent) | ||||
| 	} | ||||
| 
 | ||||
| 	resp, err := client.Do(req) | ||||
| 	if err != nil { | ||||
| 		log.Println("Request error...") | ||||
| 		log.Println("Err:", err.Error()) | ||||
| 	} else { | ||||
| 		body, _ := ioutil.ReadAll(resp.Body) | ||||
| 		if resp.StatusCode == http.StatusOK { | ||||
| 			log.Println("Update IP success:", string(body)) | ||||
| 		} else { | ||||
| 			log.Println("Update IP failed:", string(body)) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| @ -5,6 +5,7 @@ import ( | ||||
| 	"github.com/TimothyYe/godns/handler/alidns" | ||||
| 	"github.com/TimothyYe/godns/handler/cloudflare" | ||||
| 	"github.com/TimothyYe/godns/handler/dnspod" | ||||
| 	"github.com/TimothyYe/godns/handler/dreamhost" | ||||
| 	"github.com/TimothyYe/godns/handler/duck" | ||||
| 	"github.com/TimothyYe/godns/handler/google" | ||||
| 	"github.com/TimothyYe/godns/handler/he" | ||||
| @ -25,6 +26,8 @@ func CreateHandler(provider string) IHandler { | ||||
| 		handler = IHandler(&cloudflare.Handler{}) | ||||
| 	case godns.DNSPOD: | ||||
| 		handler = IHandler(&dnspod.Handler{}) | ||||
| 	case godns.DREAMHOST: | ||||
| 		handler = IHandler(&dreamhost.Handler{}) | ||||
| 	case godns.HE: | ||||
| 		handler = IHandler(&he.Handler{}) | ||||
| 	case godns.ALIDNS: | ||||
|  | ||||
							
								
								
									
										7
									
								
								utils.go
									
									
									
									
									
								
							
							
						
						
									
										7
									
								
								utils.go
									
									
									
									
									
								
							| @ -49,6 +49,8 @@ const ( | ||||
| 	GOOGLE = "Google" | ||||
| 	// DUCK for Duck DNS | ||||
| 	DUCK = "DuckDNS" | ||||
| 	// DREAMHOST for Dreamhost | ||||
| 	DREAMHOST = "Dreamhost" | ||||
| 	// IPV4 for IPV4 mode | ||||
| 	IPV4 = "IPV4" | ||||
| 	// IPV6 for IPV6 mode | ||||
| @ -218,6 +220,11 @@ func CheckSettings(config *Settings) error { | ||||
| 		if config.Password == "" { | ||||
| 			return errors.New("password cannot be empty") | ||||
| 		} | ||||
| 	case DREAMHOST: | ||||
| 		if config.LoginToken == "" { | ||||
| 			return errors.New("login token cannot be empty") | ||||
| 		} | ||||
| 
 | ||||
| 	default: | ||||
| 		return errors.New("please provide supported DNS provider: DNSPod/HE/AliDNS/Cloudflare/GoogleDomain/DuckDNS") | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user