chiark / gitweb /
build system: stest: Fix out-of-tree builds
[secnet.git] / stest / common.tcl
1 package require Tclx
2
3 load chiark_tcl_hbytes-1.so
4 load chiark_tcl_dgram-1.so
5
6 set netlink(inside) {
7     local-address "172.18.232.9";
8     secnet-address "172.18.232.10";
9     remote-networks "172.18.232.0/28";
10 }
11 set netlink(outside) {
12     local-address "172.18.232.1";
13     secnet-address "172.18.232.2";
14     remote-networks "172.18.232.0/28";
15 }
16
17 set ports(inside) {16913 16910}
18 set ports(outside) 16900
19
20 set extra(inside) {
21     local-mobile True;
22     mtu-target 1260;
23 }
24 set extra(outside) {}
25
26 proc mkconf {which} {
27     global tmp
28     global builddir
29     global netlink
30     global ports
31     global extra
32     global netlinkfh
33     set pipefp $tmp/$which.netlink
34     foreach tr {t r} {
35         file delete $pipefp.$tr
36         exec mkfifo -m600 $pipefp.$tr
37         set netlinkfh($which.$tr) [set fh [open $pipefp.$tr r+]]
38         fconfigure $fh -blocking 0 -buffering none -translation binary
39     }
40     fileevent $netlinkfh($which.r) readable [list netlink-readable $which]
41     set fakeuf $tmp/$which.fake-userv
42     set fakeuh [open $fakeuf w 0755]
43     puts $fakeuh "#!/bin/sh
44 set -e
45 exec 3<&0
46 cat <&3 3<&- >$pipefp.r &
47 exec 3<>$pipefp.t
48 exec <$pipefp.t
49 exec 3<&-
50 exec cat
51 "
52     close $fakeuh
53     set cfg "
54         netlink userv-ipif {
55             name \"netlink\";
56             userv-path \"$fakeuf\";
57         $netlink($which)
58             mtu 1400;
59             buffer sysbuffer(2048);
60             interface \"secnet-test-[string range $which 0 0]\";
61         };
62         comm
63 "
64     set delim {}
65     foreach port $ports($which) {
66         append cfg "$delim
67             udp {
68                 port $port;
69                 address \"::1\", \"127.0.0.1\";
70                 buffer sysbuffer(4096);
71             }
72         "
73         set delim ,
74     }
75     append cfg ";
76         local-name \"test-example/$which/$which\";
77         local-key rsa-private(\"$builddir/test-example/$which.key\");
78 "
79     append cfg $extra($which)
80     append cfg {
81         log logfile {
82             filename "/dev/tty";
83             class "info","notice","warning","error","security","fatal";
84         };
85         system {
86         };
87         resolver adns {
88         };
89         log-events "all";
90         random randomfile("/dev/urandom",no);
91         transform eax-serpent { }, serpent256-cbc { };
92     }
93
94     set f [open $builddir/test-example/sites.conf r]
95     set sites [read $f]
96     close $f
97     append cfg $sites
98     append cfg {
99         sites map(site,vpn/test-example/all-sites);
100     }
101     return $cfg
102 }
103
104 proc spawn-secnet {which} {
105     global tmp
106     global builddir
107     global netlinkfh
108     upvar #0 pids($which) pid
109     set cf $tmp/$which.conf
110     set ch [open $cf w]
111     puts $ch [mkconf $which]
112     close $ch
113     set argl [list $builddir/secnet -dvnc $cf]
114     set pid [fork]
115     if {!$pid} {
116         execl [lindex $argl 0] [lrange $argl 1 end]
117     }
118     puts -nonewline $netlinkfh($which.t) [hbytes h2raw c0]
119 }
120
121 proc netlink-readable {which} {
122     global ok
123     upvar #0 netlinkfh($which.r) fh
124     read $fh; # empty the buffer
125     switch -exact $which {
126         inside {
127             puts OK
128             set ok 1; # what a bodge
129             return
130         }
131         outside {
132             error "inside rx'd!"
133         }
134     }
135 }
136
137 proc bgerror {message} {
138     global errorInfo errorCode
139     catch {
140         puts stderr "
141 ----------------------------------------
142 $errorInfo
143
144 $errorCode
145 $message
146 ----------------------------------------
147     "
148     }
149     exit 1
150 }
151
152 proc sendpkt {} {
153     global netlinkfh
154     set p {
155         4500 0054 ed9d 4000 4001 24da ac12 e809
156         ac12 e802 0800 1de4 2d96 0001 f1d4 a05d
157         0000 0000 507f 0b00 0000 0000 1011 1213
158         1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
159         2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
160         3435 3637
161     }
162     puts -nonewline $netlinkfh(inside.t) \
163         [hbytes h2raw c0[join $p ""]c0]
164 }
165
166 if {![catch {
167     set tmp $env(AUTOPKGTEST_ARTIACTS)
168 }]} {} elseif {![catch {
169     set tmp $env(AUTOPKGTEST_TMP)
170 }]} {} elseif {[regsub {^stest/t-} $argv0 {stest/d-} tmp]} {
171     file mkdir $tmp
172 }
173 if {![catch {
174     set builddir $env(STEST_BUILDDIR)
175 }]} {} else {
176     set builddir .
177 }
178
179 set socktmp $tmp/s
180 exec mkdir -p -m700 $socktmp
181 regsub {^(?!/)} $socktmp {./} socktmp ;# dgram-socket wants ./ or /
182
183 proc prefix_preload {lib} {
184     global env
185     set l {}
186     catch { set l [split $env(PRELOAD) :] }
187     set l [concat [list $lib] $l]
188     set env(LD_PRELOAD) [join $l :]
189 }
190
191 set env(UDP_PRELOAD_DIR) $socktmp
192 prefix_preload $builddir/stest/udp-preload.so
193
194 proc udp-proxy {} {
195     global socktmp udpsock
196     set u $socktmp/udp
197     file delete $u
198     regsub {^(?!/)} $u {./} u
199     set udpsock [dgram-socket create $u]
200     dgram-socket on-receive $udpsock udp-relay
201 }
202
203 proc udp-relay {data src sock args} {
204     global udpsock socktmp
205     set headerlen [expr {52+1}]
206     set orgsrc $src
207
208     set dst [hbytes range $data 0 $headerlen]
209     regsub {(?:00)*$} $dst {} dst
210     set dst [hbytes h2raw $dst]
211
212     hbytes overwrite data 0 [hbytes zeroes $headerlen]
213     regsub {.*/} $src {} src
214     set srch [hbytes raw2h $src]
215     hbytes append srch 00
216     if {[catch {
217         if {[regexp {[^.,:0-9a-f]} $dst c]} { error "bad dst" }
218         if {[hbytes length $srch] > $headerlen} { error "src addr too long" }
219         hbytes overwrite data 0 $srch
220         dgram-socket transmit $udpsock $data $socktmp/$dst
221     } emsg]} {
222         puts stderr "$orgsrc -> $dst: $emsg"
223     }
224 }
225
226 proc test-kex {} {
227     udp-proxy
228     spawn-secnet inside
229     spawn-secnet outside
230
231     after 500 sendpkt
232     after 1000 sendpkt
233     after 5000 timed-out
234
235     vwait ok
236 }