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