]> Sergey Matveev's repositories - zdns.git/blob - rc.tcl
Aggregate CAAs
[zdns.git] / rc.tcl
1 set GW4 91.211.5.21
2 set GW6 2a03:e2c0:2663:1::1
3
4 set VPS4 45.10.110.72
5 set VPS6 2a04:ac00:a:146::25
6
7 set Y6 21a:af91:8d0e:b05:9645:e4e9:12be:3c39
8
9 set NS1 uz544mqwggqbf3z4utlhfqn45vpbpq78nc63hpg5u2ut29stkt0pkr.ns7.stargrave.org.
10 set NS2 uz5nulnd504gp3s7sdmdl5l2gxc762hpw926t90k39ltxp67flbccn.ns5.stargrave.org.
11
12 set NoSPF {"v=spf1 -all"}
13 set NoMX "MX 0 ."
14 set ReSPF {"v=spf1 redirect=_spf.stargrave.org"}
15
16 proc zone {serial} {
17     global DOMAIN NS1 NS2
18     puts "\$TTL 21600
19 \$ORIGIN $DOMAIN.
20 $DOMAIN. 21600 IN SOA $NS1 admin.$DOMAIN. (
21     $serial ; Serial
22     12h ; Refresh
23     2h ; Retry
24     2w ; Expire
25     6h ; TTL
26 )"
27     puts "@ NS $NS1"
28     puts "@ NS $NS2"
29     puts {_dmarc TXT "v=DMARC1; p=none"}
30 }
31
32 proc fqdn {dn} {
33     global DOMAIN
34     switch -glob -- $dn {
35         @ { return $DOMAIN. }
36         *. { return $dn }
37         * { return $dn.$DOMAIN. }
38     }
39 }
40
41 proc shorten {dn} {
42     set dn [fqdn $dn]
43     global DOMAIN
44     if {$dn == "$DOMAIN."} { return @ }
45     set domainLen [llength [split $DOMAIN .]]
46     return [join [lrange [split $dn .] 0 end-[expr $domainLen + 1]] .]
47 }
48
49 proc mx {dn} {
50     set dn [shorten $dn]
51     puts "$dn MX 10 mailfake0.stargrave.org."
52     puts "$dn MX 20 mail2.stargrave.org."
53     puts "$dn MX 30 mailfake1.stargrave.org."
54     global ReSPF
55     puts "$dn TXT $ReSPF"
56 }
57
58 proc dane {dn {port 443}} {
59     set dn [fqdn $dn]
60     set dirname [string trimright $dn .]
61     set was [pwd]
62     set caas [list]
63     cd tls
64     foreach ca [lsort [glob ca/*/*]] {
65         set ca [join [lrange [split $ca /] 1 end] /]
66         set ee [file join ee $ca $dirname]
67         if {![file exists $ee]} { continue }
68         set caas [lappend $caas [lindex [split $ca /] end]]
69         puts "[shorten _$port._tcp.$dn] TLSA 3 1 1 [exec zeasypki dane $ee]"
70     }
71     cd $was
72     foreach ca [lsort -unique $caas] {
73         puts "[shorten $dn] CAA 0 issue \"$ca\""
74     }
75 }
76
77 proc ssh {dn} {
78     set dn [fqdn $dn]
79     set fn ssh/[string trimright $dn .]
80     if {![file exists $fn]} { return }
81     set fd [open "|ssh-keygen -f $fn -r $dn"]
82     while {[gets $fd line] >= 0} {
83         if {[string first "SSHFP 4 2" $line] == -1} { continue }
84         puts "[shorten $dn] [lrange [split $line " "] 2 end]"
85     }
86     close $fd
87 }
88
89 proc subdomain {dn addrs {flags {}}} {
90     set short [shorten $dn]
91     foreach addr $addrs {
92         if {[string first : $addr] == -1} { set atyp A } { set atyp AAAA }
93         puts "$short $atyp $addr"
94     }
95
96     set danePort [lsearch -inline $flags dane:*]
97     if {$danePort == ""} {
98         set danePort 443
99     } {
100         set danePort [lindex [split $danePort :] end]
101     }
102     dane $dn $danePort
103     ssh $dn
104
105     global NoSPF NoMX
106     if {[lsearch $flags mailable] == -1} {
107         puts "$short TXT $NoSPF"
108         puts "$short $NoMX"
109     }
110     if {[lsearch $flags y] != -1} {
111         global Y6
112         set short [shorten y.[fqdn $dn]]
113         puts "$short AAAA $Y6"
114         puts "$short TXT $NoSPF"
115         puts "$short $NoMX"
116         ssh $short
117     }
118 }
119
120 proc pgp {keyid {uid ""}} {
121     if {$uid == ""} { set uid $keyid }
122     set fd [open "|gpg --export-options export-dane --export $keyid"]
123     while {[gets $fd line] >= 0} {
124         if {[string first $uid $line] != -1} { break }
125     }
126     puts $line
127     set line [split [gets $fd]]
128     set line [lreplace $line 0 0 "[lindex $line 0]._openpgpkey"]
129     puts [join $line]
130     while {[gets $fd line] >= 0} {
131         if {$line == ""} { break }
132         puts $line
133     }
134     catch {close $fd}
135 }