intial import

This commit is contained in:
Thomas Preisner 2018-09-09 21:38:37 +02:00
commit 2e90d32ce2
5 changed files with 264 additions and 0 deletions

70
nameserver.go Normal file
View file

@ -0,0 +1,70 @@
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
}
}