Example #1
0
func BuildUpdateURL(user *url.Userinfo, host Host) (string, error) {
	family, err := godnsupdater.FamilyFromString(host.AddressFamily)
	if err != nil {
		return "", err
	}

	address, err := godnsupdater.GetInterfaceIP(host.Interface, family)
	if err != nil {
		return "", err
	}

	qv := url.Values{}
	qv.Set("content-type", "json")
	qv.Set("h", host.Name)
	qv.Set("ip", address)

	endpoint, err := url.Parse(familyEndpoints[family])
	if err != nil {
		return "", err
	}

	endpoint.RawQuery = qv.Encode()
	endpoint.User = user

	return endpoint.String(), nil
}
Example #2
0
func LoadConfig(path string) (*Config, error) {
	f, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	d := json.NewDecoder(f)
	cfg := new(Config)
	if err := d.Decode(cfg); err != nil {
		return nil, err
	}

	if cfg.User == "" || cfg.Password == "" {
		return nil, fmt.Errorf("Missing User or Password value.")
	}

	for _, h := range cfg.Hosts {
		if _, err := godnsupdater.FamilyFromString(h.AddressFamily); err != nil {
			return nil, err
		}
	}

	return cfg, nil
}
Example #3
0
func main() {
	flag.Parse()
	log.Println("gogogandidns - Gandi Dynamic DNS updater by Diego Elio Pettenò <*****@*****.**>")

	if *apiFilePath == "" {
		log.Fatalf("Missing value for -api_file")
	}

	if *ifaceName == "" {
		log.Fatalf("Missing value for -iface")
	}

	family, err := godnsupdater.FamilyFromString(*addrFamily)
	if err != nil {
		log.Fatalf("Invalid value for -family: %v", err)
	}

	if *zoneId == 0 {
		log.Fatalf("Missing value for -zone")
	}

	if *recordName == "" {
		log.Fatalf("Missing value for -record")
	}

	api, err := getApiKey(*apiFilePath)
	if err != nil {
		log.Fatal(err)
	}

	address, err := godnsupdater.GetInterfaceIP(*ifaceName, family)
	if err != nil {
		log.Fatal(err)
	}

	env := client.Production
	if *useTestingEnvironment {
		env = client.Testing
	}
	c := client.New(api, env)

	newVersion, err := cloneLatestZone(c, *zoneId)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("New version %v created for zone %v", newVersion, *zoneId)

	recordType := godnsupdater.DnsTypeByFamily[family]

	// Get the list of current entries, filter on the name and type of record, as delete all the records of the same type already present.
	r := record.New(c)
	rInfos, err := r.List(*zoneId, newVersion)
	if err != nil {
		log.Fatal(err)
	}
	for _, rInfo := range rInfos {
		if rInfo.Name == *recordName && rInfo.Type == recordType {
			log.Printf("Removing record \"%v\" with ID %v", rInfo.Name, rInfo.Id)
			ok, err := r.Delete(*zoneId, newVersion, rInfo.Id)
			if err != nil {
				log.Fatal(err)
			}
			if !ok {
				log.Fatalf("Deleting record failed, but no error returned.")
			}
		}
	}

	addArgs := record.RecordAdd{
		Zone:    *zoneId,
		Version: newVersion,
		Name:    *recordName,
		Type:    recordType,
		Value:   address,
		Ttl:     300,
	}
	rInfo, err := r.Add(addArgs)
	if err != nil {
		log.Fatal(err)
	}

	log.Printf("New record \"%v\" created with ID %v", rInfo.Name, rInfo.Id)

	zv := version.New(c)
	ok, err := zv.Set(*zoneId, newVersion)
	if err != nil {
		log.Fatal(err)
	}
	if !ok {
		log.Fatalf("Setting new version live failed, but no error returned.")
	}
	log.Printf("Version %v set live for zone %v", newVersion, *zoneId)
}