aboutsummaryrefslogtreecommitdiff
path: root/pdnsutil.fish
blob: 0c4c7f93d89a5b6ead899b670396466d0e4d7dac (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
complete -c pdnsutil -f

complete -c pdnsutil -s h -l help
complete -c pdnsutil -l version
complete -c pdnsutil -s v -l verbose
complete -c pdnsutil -l config-name -r
complete -c pdnsutil -l config-dir -F -r
complete -c pdnsutil -l no-colors

# up to date as of 4.8.4
# the --help format is not very useful for programmatic access
set -l commands \
	activate-zone-key add-zone-key create-bind-db deactivate-zone-key \
	disable-dnssec export-zone-dnskey export-zone-ds export-zone-key \
	export-zone-key-pem generate-zone-key import-zone-key \
	import-zone-key-pem publish-zone-key remove-zone-key set-nsec3 \
	unpublish-zone-key unset-nsec3 set-publish-cds set-publish-cdnskey \
	unset-publish-cds unset-publush-cdnskey \
	\
	activate-tsig-key deactivate-tsig-key delete-tsig-key \
	generate-tsig-key import-tsig-key list-tsig-keys \
	\
	add-record add-autoprimary remove-autoprimary list-autoprimaries \
	create-zone create-secondary-zone change-secondary-zone-primary \
	check-all-zones check-zone clear-zone delete-rrset delete-zone \
	edit-zone get-meta hash-password hash-zone-record increase-serial \
	list-keys list-all-zones list-member-zones list-zone load-zone \
	rectify-zone rectify-all-zones replace-rrset secure-zone \
	secure-all-zones set-kind set-options-json set-option set-catalog \
	set-account add-meta set-meta set-presigned show-zone test-schema \
	unset-presigned raw-lua-from-content zonemd-verify-file \
	\
	backend-cmd bench-db \
	b2b-migrate ipencrypt ipdecrypt

function __fish_pdnsutil_using_command
	set -l cmd (commandline -pc)
	test -z "$cmd"
	and return 1
	contains -- $cmd $argv
	and return 0
end

# for example, activate-zone-key needs 2 arguments after "activate-zone-key"
# we presume that all the arguments after the command are its arguments
# we can get the amount of arguments using this formula:
# cmdlen - commandidx

function __fish_pdnsutil_argumentn -a cmd
	# TODO: move to -x once ready
	set -l line (commandline -opc)
	set -l cmdidx (contains -i "$cmd" $line)
	or begin echo -1; return 1; end
	math (count $line) - $cmdidx
end

function __fish_pdnsutil_on_argument -a cmd num
	test (__fish_pdnsutil_argumentn $cmd) -eq $num
end

function __fish_pdnsutil_zones
	pdnsutil list-all-zones
end

# == Subcommands
# = DNSSEC Related Commands
set -l dnssec_algs \
	rsasha1 rsasha1-nsec3-sha1 \
	rsasha256 rsasha512 \
	ecdsa256 ecdsa384 \
	ed25519 ed448

# activate-zone-key ZONE KEY-ID
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a activate-zone-key -d 'Activate a DNSSEC key'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument activate-zone-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument activate-zone-key 1' \
	-r # TODO: list zone keys for this zone

# add-zone-key ZONE [KSK,ZSK] [active,inactive] [published,unpublished] KEYBITS ALGORITHM
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a add-zone-key -d 'Create a new DNSSEC key'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument add-zone-key 0' \
	-ra '(__fish_pdnsutil_zones)'
# TODO: do this "correctly"
complete -c pdnsutil -n 'test (__fish_pdnsutil_argumentn add-zone-key) -gt 0' \
	-a 'KSK ZSK active inactive published unpublished'

# create-bind-db FILE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a create-bind-db -d 'Create a DNSSEC database for the BIND backend'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument create-bind-db 0' \
	-Fr

# deactive-zone-key ZONE KEY-ID
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a deactivate-zone-key -d 'Deactivate a DNSSEC key'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument deactivate-zone-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument deactivate-zone-key 1' \
	-r # TODO: list zone keys for this zone

# disable-dnssec ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a disable-dnssec -d 'Deactivates all keys and presigning for a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument disable-dnssec 0' \
	-ra '(__fish_pdnsutil_zones)'

# export-zone-dnskey ZONE KEY-ID
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a export-zone-dnskey -d 'Prints DNSKEY and DS of a DNSSEC key'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument export-zone-dnskey 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument export-zone-dnskey 1' \
	-r # TODO: list-zone-keys for this zone

# export-zone-ds ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a export-zone-ds -d 'Prints all KSK DS records for a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument export-zone-ds 0' \
	-ra '(__fish_pdnsutil_zones)'

# export-zone-key ZONE KEY-ID
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a export-zone-key -d 'Prints the full private key of a DNSSEC key in BIND format'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument export-zone-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument export-zone-key 1' \
	-r # TODO: list-zone-keys for this zone

# export-zone-key-pem ZONE KEY-ID
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a export-zone-key-pem -d 'Prints the full private key of a DNSSEC key in PEM format'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument export-zone-key-pem 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument export-zone-key-pem 1' \
	-r # TODO: list-zone-keys for this zone

# generate-zone-key {ZSK,PSK} [ALGORITHM] [KEYBITS]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a generate-zone-key -d 'Generate and print a ZSK or KSK'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument generate-zone-key 0' \
	-ra 'ZSK PSK'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument generate-zone-key 1' \
	-ra "$dnssec_algs"
# keybits omitted

# import-zone-key ZONE FILE {KSK,ZSK}
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a import-zone-key -d 'Import a private DNSSEC key from a file in BIND format'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument import-zone-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument import-zone-key 1' \
	-Fr
complete -c pdnsutil -n '__fish_pdnsutil_on_argument import-zone-key 2' \
	-ra 'ZSK PSK'

# import-zone-key-pem ZONE FILE ALGORITHM {KSK,ZSK}
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a import-zone-key-pem -d 'Import a private DNSSEC key from a file in PEM format'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument import-zone-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument import-zone-key 1' \
	-Fr
complete -c pdnsutil -n '__fish_pdnsutil_on_argument import-zone-key 2' \
	-ra "$dnssec_algs"
complete -c pdnsutil -n '__fish_pdnsutil_on_argument import-zone-key 3' \
	-ra 'ZSK PSK'

# publish-zone-key ZONE KEY-ID
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a publish-zone-key -d 'Publish a DNSSEC key in a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument publish-zone-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument publish-zone-key 1' \
	-r # TODO: list-zone-keys for this zone

# remove-zone-key ZONE KEY-ID
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a remove-zone-key -d 'Remove a DNSSEC key from a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument remove-zone-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument remove-zone-key 1' \
	-r # TODO: list-zone-keys for this zone

# set-nsec3 ZONE [’HASH-ALGORITHM FLAGS ITERATIONS SALT’] [narrow]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-nsec3 -d 'Set NSEC3 parameters for a zone'
# TODO: complete things other than zone
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-nsec3 0' \
	-ra '(__fish_pdnsutil_zones)'

# unpublish-zone-key ZONE KEY-ID
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a unpublish-zone-key -d 'Unpublish a DNSSEC key from a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument unpublish-zone-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument unpublish-zone-key 1' \
	-r # TODO: list-zone-keys for this zone

# unset-nsec3 ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a unset-nsec3 -d 'Convert a zone from NSEC3 to NSEC'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument unset-nsec3 0' \
	-ra '(__fish_pdnsutil_zones)'

# set-publish-cds ZONE [DIGESTALGOS]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-publish-cds -d 'Make a zone respond to queries for its CDS records'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-publish-cds 0' \
	-ra '(__fish_pdnsutil_zones)'

# set-publish-cdnskey ZONE [delete]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-publish-cdnskey -d 'Make a zone publish its CDNSKEY records'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-publish-cdnskey 0' \
	-ra '(__fish_pdnsutil_zones)'

# unset-publish-cds ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a unset-publish-cds -d 'Make a zone stop responding to queries for its CDS records'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument unset-publish-cds 0' \
	-ra '(__fish_pdnsutil_zones)'

# unset-publish-cdnskey ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a unset-publish-cdnskey -d 'Make a zone stop publishing its CDNSKEY records'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument unset-publish-cdnskey 0' \
	-ra '(__fish_pdnsutil_zones)'

# = TSIG Related Commands
set -l tsig_algos hmac-md5 hmac-sha1 \
	hmac-sha224 hmac-sha256 hmac-sha384 hmac-sha512

# activate-tsig-key ZONE NAME {primary,secondary,producer,consumer}
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a activate-tsig-key -d 'Enable TSIG authenticated AXFR'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument activate-tsig-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument activate-tsig-key 1' \
	-r # TODO: tsig keys
complete -c pdnsutil -n '__fish_pdnsutil_on_argument activate-tsig-key 2' \
	-ra 'primary secondary producer consumer'

# deactivate-tsig-key ZONE NAME {primary,secondary,producer,consumer}
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a deactivate-tsig-key -d 'Disable TSIG authenticated AXFR'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument deactivate-tsig-key 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument deactivate-tsig-key 1' \
	-r # TODO: tsig keys
complete -c pdnsutil -n '__fish_pdnsutil_on_argument deactivate-tsig-key 2' \
	-ra 'primary secondary producer consumer'

# delete-tsig-key NAME
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a delete-tsig-key -d 'Delete a TSIG key'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument delete-tsig-key 0' \
	-r # TODO: tsig keys

# generate-tsig-key NAME ALGORITHM
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a generate-tsig-key -d 'Generate a new TSIG key'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument generate-tsig-key 1' \
	-ra "$tsig_algos"

# import-tsig-key NAME ALGORITHM KEY
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a import-tsig-key -d 'Import a TSIG key'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument import-tsig-key 1' \
	-ra "$tsig_algos"

# list-tsig-keys
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a list-tsig-keys -d 'List all configured TSIG keys'

# = Zone Manipulation Commands
# add-record ZONE NAME TYPE [TTL] CONTENT
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a add-record -d 'Add new records'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument add-record 0' \
	-ra '(__fish_pdnsutil_zones)'
# TODO: hints for the other arguments??

# add-autoprimary IP NAMESERVER [ACCOUNT]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a add-autoprimary -d 'Add a new autoprimary'

# remove-autoprimary IP NAMESERVER
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a remove-autoprimary -d 'Remove an autoprimary'

# list-autoprimaries
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a list-autoprimaries -d 'List all autoprimaries'

# create-zone ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a create-zone -d 'Create a new primary zone'

# create-secondary-zone ZONE PRIMARY [PRIMARY…]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a create-secondary-zone -d 'Create a new secondary zone'

# change-secondary-zone-primary ZONE PRIMARY [PRIMARY…]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a change-secondary-zone-primary -d 'Change the primaries for a secondary zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument change-secondary-zone-primary 0' \
	-ra '(__fish_pdnsutil_zones)'

# check-all-zones
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a check-all-zones -d 'Check all zones for correctness'

# check-zone ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a check-zone -d 'Check a zone for correctness'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument check-zone 0' \
	-ra '(__fish_pdnsutil_zones)'

# clear-zone ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a clear-zone -d 'Remove all records from a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument clear-zone 0' \
	-ra '(__fish_pdnsutil_zones)'

# delete-rrset ZONE NAME TYPE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a delete-rrset -d 'Delete a named RRSET from a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument delete-rrset 0' \
	-ra '(__fish_pdnsutil_zones)'
# TODO: list rrsets in the selected zone?

# delete-zone ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a delete-zone -d 'Delete a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument delete-zone 0' \
	-ra '(__fish_pdnsutil_zones)'

# edit-zone ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a edit-zone -d 'Edit a zone in BIND format in your EDITOR'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument edit-zone 0' \
	-ra '(__fish_pdnsutil_zones)'

# get-meta ZONE [ATTRIBUTE…]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a get-meta -d "Get some or all of a zone's metadata"
complete -c pdnsutil -n '__fish_pdnsutil_on_argument get-meta 0' \
	-ra '(__fish_pdnsutil_zones)'

# hash-password [WORK-FACTOR]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a hash-password -d 'Print a salted and hashed version of a password'

# hash-zone-record ZONE RNAME
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a hash-zone-record -d 'Print a hash of an RNAME for an NSEC3 zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument hash-zone-record 0' \
	-ra '(__fish_pdnsutil_zones)'
# TODO: RNAME

# increase-serial ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a increase-serial -d 'Increase the SOA serial for a zone by 1'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument increase-serial 0' \
	-ra '(__fish_pdnsutil_zones)'

# list-keys [ZONE]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a list-keys -d 'List DNSSEC keys'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument list-keys 0' \
	-a '(__fish_pdnsutil_zones)'

# list-all-zones
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a list-all-zones -d 'List all active zone names'
complete -c pdnsutil -n '__fish_seen_subcommand_from list-all-zones' \
	-s v -l verbose -d 'Even list the inactive zone names'

# list-member-zones CATALOG
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a list-member-zones -d 'List all zones in CATALOG'
# TODO: list catalogs?

# list-zone ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a list-zone -d 'Show all records in a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument list-zone 0' \
	-ra '(__fish_pdnsutil_zones)'

# load-zone ZONE FILE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a load-zone -d 'Create or overwrite a zone from a file'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument list-zone 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument list-zone 1' \
	-rF

# rectify-zone ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a recrify-zone -d 'Fix up ordername and auth fields in a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument rectify-zone 0' \
	-ra '(__fish_pdnsutil_zones)'

# rectify-all-zones
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a recrify-all-zones -d 'Run rectify-zone on all zones'

# replace-rrset ZONE NAME TYPE [TTL] CONTENT [CONTENT…]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a replace-rrset -d 'Replace an existing NAME in a zone with a new set'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument replace-rrset 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument replace-rrset 1' \
	-r # TODO: existing RRs?
# TODO: types for the rest?

# secure-zone ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a secure-zone -d 'Apply reasonable DNSSEC defaults to ZONE'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument secure-zone 0' \
	-ra '(__fish_pdnsutil_zones)'

# secure-all-zones [increase-serial]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a secure-all-zones -d 'Run secure-zone on all currently unsigned zones'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument secure-zone 0' \
	-a increase-serial

# set-kind ZONE KIND
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-kind -d 'Change the kind of ZONE to KIND'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-kind 0' \
	-ra '(__fish_pdnsutil_zones)'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-kind 1' \
	-ra 'primary secondary native producer consumer'

# set-options-json ZONE JSON
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-options-json -d 'Change the options of ZONE to JSON'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-options-json 0' \
	-ra '(__fish_pdnsutil_zones)'
# TODO: JSON?

# set-option ZONE [producer*|*consumer] [coo*|*unique*|*group] VALUE [VALUE…]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-option -d 'Set or remove an option for zone'
# TODO: I'm honestly not sure how this one works

# set-catalog ZONE CATALOG
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-catalog -d "Change or unset a zone's catalog"
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-catalog 0' \
	-ra '(__fish_pdnsutil_zones)'
# TODO: catalog?

# set-account ZONE ACCOUNT
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-account -d 'Change the account (owner) of a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-account 0' \
	-ra '(__fish_pdnsutil_zones)'
# TODO: account?

# add-meta ZONE ATTRIBUTE [VALUE…]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a add-meta -d 'Append values to an existing metadata attribute of a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument add-meta 0' \
	-ra '(__fish_pdnsutil_zones)'
# TODO: attributes?

# set-meta ZONE ATTRIBUTE [VALUE…]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-meta -d "Set a zone's metadata"
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-meta 0' \
	-ra '(__fish_pdnsutil_zones)'
# TODO: attributes?

# set-presigned ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a set-presigned -d 'Switch a zone to presigned DNSSEC operation'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument set-presigned 0' \
	-ra '(__fish_pdnsutil_zones)'

# show-zone ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a show-zone -d 'Show all DNSSEC related settings of a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument show-zone 0' \
	-ra '(__fish_pdnsutil_zones)'

# test-schema ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a test-schema -d "Test the database's schema by creating a zone"
# ZONE is to be created here

# unset-presigned ZONE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a unset-presigned -d 'Disable presigned DNSSEC operation for a zone'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument unset-presigned 0' \
	-ra '(__fish_pdnsutil_zones)'

# raw-lua-from-content TYPE CONTENT
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a raw-lua-from-content -d 'Print a record in dnsdist format'
# TODO: rest

# zonemd-verify-file ZONE FILE
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a zonemd-verify-file -d 'Validate ZONEMD for a zone read from a file'
# TODO: rest

# = Debugging Tools
# backend-cmd BACKEND CMD [CMD…]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a backend-cmd -d 'Send a command to a backend for execution'
# TODO: rest

# bench-db [FILE]
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a bench-db -d 'Perform a benchmark of the backend database'
complete -c pdnsutil -n '__fish_pdnsutil_on_argument bench-db 0' \
	-rF

# = Other Tools
# b2b-migrate OLD NEW
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a b2b-migrate -d 'Migrate data from one backend to another'

# ipencrypt IP-ADDRESS password
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a ipencrypt -d 'Encrypt an IP address using ipcipher'

# ipdecrypt IP-ADDRESS password
complete -c pdnsutil -n "not __fish_seen_subcommand_from $commands" \
	-a ipdecrypt -d 'Decrypt an IP address using ipcipher'