3
3
package main
4
4
5
5
import (
6
+ "bufio"
6
7
"fmt"
7
8
"log"
8
9
"net"
10
+ "os"
9
11
"path/filepath"
10
12
"strings"
11
13
@@ -30,6 +32,15 @@ var updateCmd = &cli.Command{
30
32
& cli.BoolFlag {Name : "remove" , Usage : "remove the A record" },
31
33
},
32
34
},
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
+ },
33
44
},
34
45
}
35
46
@@ -81,7 +92,7 @@ func updateAAction(cCtx *cli.Context) error {
81
92
return err
82
93
}
83
94
zone := soaReply .Hdr .Name
84
- fmt .Println ("SOA lookup for" , host , "found zone:" , zone )
95
+ log .Println ("-- SOA lookup for" , host , "found zone:" , zone )
85
96
86
97
dohServer , err := sig0 .FindDOHEndpoint (zone )
87
98
if err != nil {
@@ -153,3 +164,105 @@ func updateAAction(cCtx *cli.Context) error {
153
164
154
165
return nil
155
166
}
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