package main import ( "bytes" "fmt" "net" "os/exec" "strings" ) func createQuery(data userData, addr net.IP, deleteRecord bool) string { var query strings.Builder query.WriteString(fmt.Sprintf("key %s\n", data.tsigkey)) query.WriteString(fmt.Sprintf("server %s\n", data.nameserver)) query.WriteString(fmt.Sprintf("zone %s\n", data.zonename)) if deleteRecord { query.WriteString(fmt.Sprintf("update delete %s. A\n", data.hostname)) } query.WriteString(fmt.Sprintf("update add %s. A %s\n", data.hostname, addr.String())) query.WriteString("show\n") query.WriteString("send\n") return query.String() } func queryNameserver(query string) error { var ( stdout bytes.Buffer stderr bytes.Buffer ) cmd := exec.Command("knsupdate", "-v") cmd.Stdin = strings.NewReader(query) cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() fmt.Printf(stdout.String()) fmt.Printf(stderr.String()) return err } func updateNameserver(data userData, addr net.IP) (bool, error) { updateRecord := true deleteRecord := true addrs, err := net.LookupIP(data.hostname) if err != nil { deleteRecord = false } else { for _, ip := range addrs { if ip.Equal(addr) { updateRecord = false break } } } if !updateRecord { return false, nil } else { query := createQuery(data, addr, deleteRecord) err = queryNameserver(query) if err != nil { return true, err } return true, nil } }