Skip to content

Commit 706804a

Browse files
committed
add generic update RR via stdin
1 parent 5474832 commit 706804a

File tree

1 file changed

+114
-1
lines changed

1 file changed

+114
-1
lines changed

golang/cmd/sig0namectl/update.go

Lines changed: 114 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33
package main
44

55
import (
6+
"bufio"
67
"fmt"
78
"log"
89
"net"
10+
"os"
911
"path/filepath"
1012
"strings"
1113

@@ -30,6 +32,15 @@ var updateCmd = &cli.Command{
3032
&cli.BoolFlag{Name: "remove", Usage: "remove the A record"},
3133
},
3234
},
35+
36+
{
37+
Name: "rr",
38+
Usage: "update rr",
39+
Action: updateRRAction,
40+
Flags: []cli.Flag{
41+
&cli.BoolFlag{Name: "remove", Usage: "remove RRs"},
42+
},
43+
},
3344
},
3445
}
3546

@@ -81,7 +92,7 @@ func updateAAction(cCtx *cli.Context) error {
8192
return err
8293
}
8394
zone := soaReply.Hdr.Name
84-
fmt.Println("SOA lookup for", host, "found zone:", zone)
95+
log.Println("-- SOA lookup for", host, "found zone:", zone)
8596

8697
dohServer, err := sig0.FindDOHEndpoint(zone)
8798
if err != nil {
@@ -153,3 +164,105 @@ func updateAAction(cCtx *cli.Context) error {
153164

154165
return nil
155166
}
167+
168+
func updateRRAction(cCtx *cli.Context) error {
169+
host := cCtx.Args().Get(0)
170+
if host == "" {
171+
return cli.Exit("host required", 1)
172+
}
173+
if !strings.HasSuffix(host, ".") {
174+
host = host + "."
175+
}
176+
keystore := cCtx.String("keystore")
177+
178+
keys, err := sig0.ListKeysFiltered(keystore, host)
179+
if err != nil {
180+
return err
181+
}
182+
if len(keys) == 0 {
183+
return cli.Exit("no key found for host", 1)
184+
}
185+
186+
log.Println("-- Using key:", keys[0].Name)
187+
// ugh.. what? doubley .key.key
188+
keyPath := filepath.Join(keystore, keys[0].Name)
189+
keyPath = strings.TrimSuffix(keyPath, ".key")
190+
signer, err := sig0.LoadKeyFile(keyPath)
191+
if err != nil {
192+
return err
193+
}
194+
195+
soa, err := sig0.QuerySOA(host)
196+
if err != nil {
197+
return err
198+
}
199+
reply, err := sig0.SendDOHQuery(sig0.DefaultDOHResolver, soa)
200+
if err != nil {
201+
return err
202+
}
203+
soaReply, err := sig0.AnySOA(reply)
204+
if err != nil {
205+
return err
206+
}
207+
zone := soaReply.Hdr.Name
208+
log.Println("-- SOA lookup for", host, "found zone:", zone)
209+
210+
dohServer, err := sig0.FindDOHEndpoint(zone)
211+
if err != nil {
212+
return err
213+
}
214+
215+
err = signer.StartUpdate(zone)
216+
if err != nil {
217+
return err
218+
}
219+
220+
// read RRs from stdin
221+
count := 0
222+
log.Println("-- Reading RRs from stdin --")
223+
scanner := bufio.NewScanner(os.Stdin)
224+
for scanner.Scan() {
225+
rrStr := scanner.Text()
226+
if rrStr == "" {
227+
log.Println("-- Empty line, stopping --")
228+
break
229+
}
230+
rr, err := dns.NewRR(rrStr)
231+
if err != nil {
232+
return err
233+
}
234+
if cCtx.Bool("remove") {
235+
log.Println("-- Removing RR --")
236+
err = signer.RemoveRR(rr)
237+
} else {
238+
log.Println("-- Updating RR --")
239+
err = signer.UpdateRR(rr)
240+
}
241+
log.Printf("-- %+v", rr)
242+
count++
243+
if err != nil {
244+
return err
245+
}
246+
}
247+
248+
if count == 0 {
249+
return cli.Exit("no RRs to update", 0)
250+
}
251+
log.Printf("-- Updated %d RRs --", count)
252+
253+
m, err := signer.SignUpdate()
254+
if err != nil {
255+
return err
256+
}
257+
258+
log.Println("-- Configure DoH client --")
259+
respMsg, err := sig0.SendDOHQuery(dohServer.Host, m)
260+
if err != nil {
261+
return err
262+
}
263+
264+
log.Println("-- Response from DNS server --")
265+
fmt.Println(respMsg)
266+
267+
return nil
268+
}

0 commit comments

Comments
 (0)