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