Init: Quick and dirty
This commit is contained in:
		
						commit
						62002841db
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,2 @@ | |||||||
|  | configs/* | ||||||
|  | cmd/tt/tt | ||||||
							
								
								
									
										1
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | Tiny DDNS service I wrote because I needed to move VPS  and did not want to use the old one written in Python. | ||||||
							
								
								
									
										7
									
								
								build/app/Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								build/app/Dockerfile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | |||||||
|  | FROM golang:1.16.2 | ||||||
|  | 
 | ||||||
|  | ENV GO111MODULE=off | ||||||
|  | RUN go get -u -d g.phga.de/phga/dd/... | ||||||
|  | WORKDIR /go/src/g.phga.de/phga/dd/cmd/dd | ||||||
|  | RUN go build | ||||||
|  | CMD ["./dd"] | ||||||
							
								
								
									
										12
									
								
								build/docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								build/docker-compose.yml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | |||||||
|  | version: '3' | ||||||
|  | 
 | ||||||
|  | services: | ||||||
|  |   dd: | ||||||
|  |     build: | ||||||
|  |       context: ./app | ||||||
|  |       dockerfile: Dockerfile | ||||||
|  |     restart: 'always' | ||||||
|  |     ports: | ||||||
|  |       - 8000:6969 | ||||||
|  |     volumes: | ||||||
|  |       - /srv/dd/configs:/go/src/g.phga.de/phga/dd/configs | ||||||
							
								
								
									
										34
									
								
								cmd/dd/config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								cmd/dd/config.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,34 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"log" | ||||||
|  | 	"os" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type Config struct { | ||||||
|  | 	WebPort        string                       `json:"web_port"` | ||||||
|  | 	WebDomain      string                       `json:"web_domain"` | ||||||
|  | 	WebAdmin       string                       `json:"web_admin"` | ||||||
|  | 	WebAdminPass   string                       `json:"web_admin_pass"` | ||||||
|  | 	MailUser       string                       `json:"mail_user"` | ||||||
|  | 	MailPass       string                       `json:"mail_pass"` | ||||||
|  | 	MailSmtpServer string                       `json:"mail_smtp_server"` | ||||||
|  | 	MailSmtpPort   string                       `json:"mail_smtp_port"` | ||||||
|  | 	DdUsers        map[string]map[string]string `json:"dd_users"` | ||||||
|  | 	DnsTTL         int                          `json:"dns_ttl"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var config Config | ||||||
|  | 
 | ||||||
|  | func init() { | ||||||
|  | 	f, err := os.Open("../../configs/config.json") | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatalln(err, "Could not read config file") | ||||||
|  | 	} | ||||||
|  | 	defer f.Close() | ||||||
|  | 	err = json.NewDecoder(f).Decode(&config) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatalln(err, "Could not decode config file") | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										79
									
								
								cmd/dd/dd.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								cmd/dd/dd.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,79 @@ | |||||||
|  | package main | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"io" | ||||||
|  | 	"log" | ||||||
|  | 	"net/http" | ||||||
|  | 	"os" | ||||||
|  | 	"os/exec" | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // https://dd.phga.de/dd?usr=<username>&pw=<passwd> | ||||||
|  | func main() { | ||||||
|  | 	// cheap routing | ||||||
|  | 	http.HandleFunc("/dd", handleDynamicUpdate) | ||||||
|  | 
 | ||||||
|  | 	log.Fatalln(http.ListenAndServe(":"+config.WebPort, nil)) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func handleDynamicUpdate(w http.ResponseWriter, r *http.Request) { | ||||||
|  | 	up := r.URL.Query() | ||||||
|  | 	ip := r.Header.Get("X-FORWARDED-FOR") | ||||||
|  | 
 | ||||||
|  | 	if len(ip) < 1 { | ||||||
|  | 		ip = strings.Split(r.RemoteAddr, ":")[0] | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if len(up) != 2 { | ||||||
|  | 		log.Println("Attempted update for:", ip) | ||||||
|  | 		log.Println("Not enough arguments provided:", up) | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	for k, v := range config.DdUsers { | ||||||
|  | 		if k == up["usr"][0] { | ||||||
|  | 			if v["password"] == up["pwd"][0] { | ||||||
|  | 				log.Println("Starting update for:", ip, "(", v["domain"], ")") | ||||||
|  | 				// Do the update via nsupdate | ||||||
|  | 				err := updateDnsRecord(v["domain"], ip, v["hmac"], v["keyname"], v["secret"]) | ||||||
|  | 				if err != nil { | ||||||
|  | 					log.Println("nsupdate failed:", err) | ||||||
|  | 				} else { | ||||||
|  | 					log.Println("nsupdate succeeded!") | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				log.Println("Wrong Secret provided!") | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func updateDnsRecord(domain string, ip string, hmac string, keyname string, secret string) error { | ||||||
|  | 	f, err := os.Create("/tmp/update.dns") | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	defer f.Close() | ||||||
|  | 
 | ||||||
|  | 	update := fmt.Sprintf(`server 127.0.0.1 | ||||||
|  |                            key %s:%s %s | ||||||
|  |                            update add %s %d a %s | ||||||
|  |                            send`, hmac, keyname, secret, domain, config.DnsTTL, ip) | ||||||
|  | 
 | ||||||
|  | 	_, err = io.WriteString(f, update) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	err = f.Sync() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	nsupdate := exec.Command("nsupdate", "/tmp/update.dns") | ||||||
|  | 	out, err := nsupdate.Output() | ||||||
|  | 	log.Println(string(out)) | ||||||
|  | 	return err | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 phga
						phga