]> Sergey Matveev's repositories - zdns.git/blob - rc.tcl
Null MX (RFC 7505)
[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     cd tls
63     foreach ca [lsort [glob ca/*/*]] {
64         set ca [join [lrange [split $ca /] 1 end] /]
65         set ee [file join ee $ca $dirname]
66         if {![file exists $ee]} { continue }
67         puts "[shorten $dn] CAA 0 issue \"[lindex [split $ca /] end]\""
68         puts "[shorten _$port._tcp.$dn] TLSA 3 1 1 [exec zeasypki dane $ee]"
69     }
70     cd $was
71 }
72
73 proc ssh {dn} {
74     set dn [fqdn $dn]
75     set fn ssh/[string trimright $dn .]
76     if {![file exists $fn]} { return }
77     set fd [open "|ssh-keygen -f $fn -r $dn"]
78     while {[gets $fd line] >= 0} {
79         if {[string first "SSHFP 4 2" $line] == -1} { continue }
80         puts "[shorten $dn] [lrange [split $line " "] 2 end]"
81     }
82     close $fd
83 }
84
85 proc subdomain {dn addrs {flags {}}} {
86     set short [shorten $dn]
87     foreach addr $addrs {
88         if {[string first : $addr] == -1} { set atyp A } { set atyp AAAA }
89         puts "$short $atyp $addr"
90     }
91
92     set danePort [lsearch -inline $flags dane:*]
93     if {$danePort == ""} {
94         set danePort 443
95     } {
96         set danePort [lindex [split $danePort :] end]
97     }
98     dane $dn $danePort
99     ssh $dn
100
101     global NoSPF NoMX
102     if {[lsearch $flags mailable] == -1} {
103         puts "$short TXT $NoSPF"
104         puts "$short $NoMX"
105     }
106     if {[lsearch $flags y] != -1} {
107         global Y6
108         set short [shorten y.[fqdn $dn]]
109         puts "$short AAAA $Y6"
110         puts "$short TXT $NoSPF"
111         puts "$short $NoMX"
112         ssh $short
113     }
114 }
115
116 proc pgp {keyid {uid ""}} {
117     if {$uid == ""} { set uid $keyid }
118     set fd [open "|gpg --export-options export-dane --export $keyid"]
119     while {[gets $fd line] >= 0} {
120         if {[string first $uid $line] != -1} { break }
121     }
122     puts $line
123     set line [split [gets $fd]]
124     set line [lreplace $line 0 0 "[lindex $line 0]._openpgpkey"]
125     puts [join $line]
126     while {[gets $fd line] >= 0} {
127         if {$line == ""} { break }
128         puts $line
129     }
130     catch {close $fd}
131 }