aboutsummaryrefslogtreecommitdiff
path: root/dyndns.go
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2022-10-19 22:52:35 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2022-10-19 22:52:35 +0200
commit93ff2284207bc2708a36d1681e0d8c73433adb5b (patch)
tree02110f58b4b66bb49883556e3e9993e85d21ed46 /dyndns.go
parent706fa4fbf5e0ea890061ec126edebeb48d087b42 (diff)
implement IPv6 updates
Diffstat (limited to 'dyndns.go')
-rw-r--r--dyndns.go54
1 files changed, 52 insertions, 2 deletions
diff --git a/dyndns.go b/dyndns.go
index 31a3de8..6b47117 100644
--- a/dyndns.go
+++ b/dyndns.go
@@ -3,7 +3,6 @@ package main
import (
"flag"
- "fmt"
"net"
"github.com/HimbeerserverDE/inwx"
@@ -60,5 +59,56 @@ func nsUpdate4(conf *config, addr *net.IPAddr) error {
}
func nsUpdate6(conf *config, prefix *net.IPNet) error {
- return fmt.Errorf("updating IPv6 records is not yet implemented")
+ clt, err := inwx.Login(inwx.Production, conf.User, conf.Passwd)
+ if err != nil {
+ return err
+ }
+ defer clt.Close()
+
+ for _, id := range conf.Records6 {
+ resp, err := clt.Call(&inwx.NSRecordInfoCall{
+ RecordID: id,
+ Type: "AAAA",
+ })
+ if err != nil {
+ logger.Printf("can't get info, skipping IPv6 record %d: %v", id, err)
+ continue
+ }
+
+ record := &inwx.NSRecordInfoResponse{}
+ if err := resp.Into(record); err != nil {
+ logger.Printf("IPv6 record response is invalid: %v", err)
+ continue
+ }
+
+ if len(record.Record) != 1 {
+ logger.Printf("invalid number of IPv6 records: %d != 1", len(record.Record))
+ continue
+ }
+
+ addr := net.ParseIP(record.Record[0].Content)
+ if addr == nil {
+ logger.Printf("invalid IPv6 record %d: %s", id, record.Record[0].Content)
+ continue
+ }
+
+ ifidMask := net.CIDRMask(conf.PrefixLen, 128)
+ for k, v := range ifidMask {
+ ifidMask[k] = ^v
+ }
+
+ ifid := addr.Mask(ifidMask)
+
+ newAddr := prefix.IP
+ for k, v := range newAddr {
+ newAddr[k] = v | ifid[k]
+ }
+
+ if err := updateRecords(clt, []int{id}, newAddr.String()); err != nil {
+ logger.Printf("can't update, skipping IPv6 record %d: %v", id, err)
+ continue
+ }
+ }
+
+ return nil
}