initial commit
This commit is contained in:
		
						commit
						482958a85e
					
				|  | @ -0,0 +1,2 @@ | |||
| nc.conf | ||||
| ncddns | ||||
|  | @ -0,0 +1,113 @@ | |||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"flag" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	baseURL = "https://dynamicdns.park-your-domain.com/update?" | ||||
| ) | ||||
| 
 | ||||
| type DomainTuple struct { | ||||
| 	Domain   string | ||||
| 	Password string | ||||
| } | ||||
| 
 | ||||
| func Config(path string) ([]DomainTuple, error) { | ||||
| 	conf, err := ioutil.ReadFile(path) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("read conf: %w", err) | ||||
| 	} | ||||
| 	tuples := []DomainTuple{} | ||||
| 	for _, line := range strings.Split(string(conf), "\n") { | ||||
| 		line := strings.TrimSpace(line) | ||||
| 		if !strings.Contains(line, "=") { | ||||
| 			continue | ||||
| 		} | ||||
| 		parts := strings.SplitN(line, "=", 2) | ||||
| 		if len(parts) != 2 { | ||||
| 			continue | ||||
| 		} | ||||
| 		tuples = append(tuples, DomainTuple{ | ||||
| 			Domain:   parts[0], | ||||
| 			Password: parts[1], | ||||
| 		}) | ||||
| 	} | ||||
| 	return tuples, nil | ||||
| } | ||||
| 
 | ||||
| func fatal(name string, err error) { | ||||
| 	if err != nil { | ||||
| 		fmt.Fprintln(os.Stderr, name, err.Error()) | ||||
| 		os.Exit(1) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	cfgPath := flag.String("config", "nc.conf", "config file path") | ||||
| 	flag.Parse() | ||||
| 
 | ||||
| 	ip, err := IP() | ||||
| 	if err != nil { | ||||
| 		fatal("ip", err) | ||||
| 	} | ||||
| 	cfg, err := Config(*cfgPath) | ||||
| 	if err != nil { | ||||
| 		fatal("config", err) | ||||
| 	} | ||||
| 	for _, cfgEntry := range cfg { | ||||
| 		fmt.Println(cfgEntry.Domain) | ||||
| 		if err := Set(ip, cfgEntry.Domain, cfgEntry.Password, "*"); err != nil { | ||||
| 			fatal(cfgEntry.Domain, err) | ||||
| 		} | ||||
| 		if err := Set(ip, cfgEntry.Domain, cfgEntry.Password, "@"); err != nil { | ||||
| 			fatal(cfgEntry.Domain, err) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func IP() (string, error) { | ||||
| 	resp, err := http.Get("https://ipv4.icanhazip.com") | ||||
| 	if err != nil { | ||||
| 		return "", fmt.Errorf("get ip: %w", err) | ||||
| 	} | ||||
| 	defer resp.Body.Close() | ||||
| 
 | ||||
| 	body, err := io.ReadAll(resp.Body) | ||||
| 	if err != nil { | ||||
| 		return "", fmt.Errorf("read body: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	return string(body), nil | ||||
| } | ||||
| 
 | ||||
| func Set(ip, domain, password, host string) error { | ||||
| 	params := url.Values{} | ||||
| 	params.Add("host", host) | ||||
| 	params.Add("domain", domain) | ||||
| 	params.Add("password", password) | ||||
| 	params.Add("ip", ip) | ||||
| 
 | ||||
| 	resp, err := http.Get(fmt.Sprintf("%s%s", baseURL, params.Encode())) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("request: %w", err) | ||||
| 	} | ||||
| 	defer resp.Body.Close() | ||||
| 
 | ||||
| 	data, err := io.ReadAll(resp.Body) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("read body: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if resp.StatusCode != http.StatusOK { | ||||
| 		fmt.Fprintf(os.Stderr, "got status [%d]: %s\n", resp.StatusCode, string(data)) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
		Loading…
	
		Reference in New Issue