70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
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
|
|
}
|
|
}
|