1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
|
# Assumptions:
# We're not running with uid 0 or 1.
# We're not running with gid 0 or 2.
# supervise is installed.
# The DNS cache translates 127.0.0.1<->localhost.
# There is no listener for TCP port 16.
# There is no listener for TCP port 50016.
# There is no use of TCP ports 50017, 50018, 50019, 50020.
rm -rf rts-tmp
mkdir rts-tmp
cd rts-tmp
echo '#!/bin/sh
trap "" 13
echo PROTO="$PROTO"
echo TCPLOCALHOST="${TCPLOCALHOST-unset}"
echo TCPLOCALIP="${TCPLOCALIP-unset}"
echo TCPLOCALPORT="${TCPLOCALPORT-unset}"
echo TCPREMOTEHOST="${TCPREMOTEHOST-unset}"
echo TCPREMOTEIP="${TCPREMOTEIP-unset}"
echo TCPREMOTEPORT="${TCPREMOTEPORT-unset}"
echo TCPREMOTEINFO="${TCPREMOTEINFO-unset}"
' > print
chmod 755 print
mkdir 50016
echo '#!/bin/sh
exec tcpserver \
-c 2 -Bbanner -vo -D -1 -Xx rules.cdb -Rt5 -hp -l Local -b 2 \
127.0.0.1 50016 ../print
' > 50016/run
chmod 755 50016/run
supervise 50016 >log 2>&1 &
echo '--- tcpclient prints usage message without enough arguments'
tcpclient 0 0; echo $?
echo '--- tcpclient prints error message with unknown port name'
tcpclient 0 nonexistentport echo wrong; echo $?
echo '--- tcpclient prints error message when connection fails'
tcpclient 0 016 echo wrong; echo $?
echo '--- tcpclient -q does not print error message when connection fails'
tcpclient -q 0 016 echo wrong; echo $?
echo '--- tcpclient understands empty host name as synonym for 0'
tcpclient '' 016 echo wrong; echo $?
echo '--- tcpclient understands unbracketed IP address'
tcpclient '127.000.000.001' 016 echo wrong; echo $?
echo '--- tcpclient understands bracketed IP address'
tcpclient '[127.000.000.001]' 016 echo wrong; echo $?
echo '--- tcpclient prints error message with unknown host name'
tcpclient nonexistent.local. 016 echo wrong; echo $?
echo '--- tcpclient prints error message with unresolvable host name'
tcpclient thislabelistoolongbecausednshasalimitof63charactersinasinglelabel. 016 echo wrong; echo $?
echo '--- tcpserver prints usage message without enough arguments'
tcpserver 0 0; echo $?
echo '--- tcpserver -u 1 attempts to set uid to 1'
tcpserver -u 1 0 0 echo wrong; echo $?
echo '--- tcpserver -U reads $UID'
env UID=1 tcpserver -U 0 0 echo wrong; echo $?
echo '--- tcpserver -g 2 attempts to set gid to 2'
tcpserver -g 2 0 0 echo wrong; echo $?
echo '--- tcpserver -U reads $GID'
env GID=2 tcpserver -U 0 0 echo wrong; echo $?
echo '--- tcpserver prints error message with unknown port name'
tcpserver 0 nonexistentport echo wrong; echo $?
echo '--- tcpserver prints error message with unknown host name'
tcpserver nonexistent.local. 016 echo wrong; echo $?
echo '--- tcpserver prints error message with unresolvable host name'
tcpserver thislabelistoolongbecausednshasalimitof63charactersinasinglelabel. 016 echo wrong; echo $?
echo '--- tcpserver prints error message with non-local host name'
tcpserver 1.2.3.4 016 echo wrong; echo $?
echo '--- tcpserver sets basic environment variables'
tcpclient -p 50017 -R -H -T 10 -l Local 0 50016 sh -c 'cat <&6'
echo $?
echo '--- tcpclient recognizes -D, -i, -r, -h, -t'
tcpclient -Di 127.0.0.1 -p 50018 -hrt1 -l Local \
127.0.0.1 50016 sh -c 'cat <&6'
echo $?
echo '--- tcpclient sets basic environment variables'
tcpclient -p 50019 -R -H -l Local 0 50016 ./print
echo $?
echo '--- tcpclient looks up host names properly'
tcpclient -p 50020 -R 0 50016 ./print
echo $?
echo '--- tcpclient -v works'
tcpclient -v -R -H -l Local 0 50016 echo ok
echo $?
echo '--- tcpserver prints error message with used port'
tcpserver -R -H -l Local 127.0.0.1 50016 echo wrong
echo $?
echo '--- tcpcat works'
tcpcat 0 50016 | grep -v TCPREMOTEPORT
echo $?
echo '--- mconnect works'
mconnect 0 50016 </dev/null | grep -v TCPREMOTEPORT
echo $?
echo '--- tcprules prints usage message without enough arguments'
tcprules test.cdb; echo $?
echo '--- tcprules prints error message if it cannot create tmp'
echo 1.2.3.4:deny | tcprules test.cdb /dev/nonexistent/tmp; echo $?
echo '--- tcprules prints error message if it cannot move tmp to cdb'
echo 1.2.3.4:deny | tcprules /dev/nonexistent/cdb test.tmp; echo $?
echo '--- tcprules creates a cdb file'
echo 1.2.3.4:deny | tcprules test.cdb test.tmp; echo $?
echo '--- tcprulescheck sees deny'
env TCPREMOTEIP=1.2.3.4 tcprulescheck test.cdb; echo $?
echo '--- tcprulescheck does not apply deny to another host'
env TCPREMOTEIP=1.2.3.5 tcprulescheck test.cdb; echo $?
echo '--- tcprules replaces a cdb file'
echo 'joe@127.0.0.1:allow,which=/first/
18.23.0.32:allow,which="second"
127.:allow,which=+third+
:allow,which==fourth=' | tcprules test.cdb test.tmp; echo $?
echo '--- tcprulescheck finds rule with address and info'
env TCPREMOTEIP=127.0.0.1 TCPREMOTEINFO=joe tcprulescheck test.cdb; echo $?
echo '--- tcprulescheck finds rule with address'
env TCPREMOTEIP=18.23.0.32 TCPREMOTEINFO=joe tcprulescheck test.cdb; echo $?
echo '--- tcprulescheck finds one-dot wildcard'
env TCPREMOTEIP=127.0.0.1 TCPREMOTEINFO=bill tcprulescheck test.cdb; echo $?
echo '--- tcprulescheck finds zero-dot wildcard'
env TCPREMOTEIP=10.119.75.39 TCPREMOTEINFO=bill tcprulescheck test.cdb; echo $?
echo '--- tcprules handles comments, address ranges, multiple variables'
echo '127.0-5.:allow,which=/first/,where=/whatever/
# comment' | tcprules test.cdb test.tmp; echo $?
env TCPREMOTEIP=127.0.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.1.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.2.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.3.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.4.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.5.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.6.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.7.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.8.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.9.0.1 tcprulescheck test.cdb
env TCPREMOTEIP=127.10.0.1 tcprulescheck test.cdb
echo '--- tcprules handles host names'
echo '=known.edu:allow,which=/known/
=.abuser.edu:deny
:allow,which=/anybody/' | tcprules test.cdb test.tmp; echo $?
env TCPREMOTEIP=1.2.3.4 TCPREMOTEHOST=known.edu tcprulescheck test.cdb
env TCPREMOTEIP=1.2.3.4 TCPREMOTEHOST=random.edu tcprulescheck test.cdb
env TCPREMOTEIP=1.2.3.4 TCPREMOTEHOST=abuser.edu tcprulescheck test.cdb
env TCPREMOTEIP=1.2.3.4 TCPREMOTEHOST=x.abuser.edu tcprulescheck test.cdb
env TCPREMOTEIP=1.2.3.4 TCPREMOTEHOST=x.y.abuser.edu tcprulescheck test.cdb
echo '--- tcprulescheck searches for rules in the proper order'
echo 'xyz@86.75.30.9:allow,which=/first/
xyz@=one.two.three:allow,which=/second/
86.75.30.9:allow,which=/third/
=one.two.three:allow,which=/fourth/
86.75.30.:allow,which=/fifth/
86.75.:allow,which=/sixth/
86.:allow,which=/seventh/
=.two.three:allow,which=/eighth/
=.three:allow,which=/ninth/
=:allow,which=/tenth/
:allow,which=/eleventh/
' | tcprules test.cdb test.tmp; echo $?
env TCPREMOTEIP=86.75.30.9 TCPREMOTEHOST=one.two.three TCPREMOTEINFO=xyz tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.9 TCPREMOTEINFO=xyz tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.10 TCPREMOTEHOST=one.two.three TCPREMOTEINFO=xyz tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.9 TCPREMOTEHOST=one.two.three TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.9 TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.9 TCPREMOTEHOST=one.two.three tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.9 tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.10 TCPREMOTEHOST=one.two.three TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.10 TCPREMOTEHOST=one.two.three tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.10 TCPREMOTEHOST=four.two.three tcprulescheck test.cdb
env TCPREMOTEIP=86.75.30.10 tcprulescheck test.cdb
env TCPREMOTEIP=86.75.20.10 TCPREMOTEHOST=four.two.three TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=86.75.20.10 TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=86.75.20.10 TCPREMOTEHOST=four.two.three tcprulescheck test.cdb
env TCPREMOTEIP=86.75.20.10 tcprulescheck test.cdb
env TCPREMOTEIP=86.85.20.10 TCPREMOTEHOST=four.two.three TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=86.85.20.10 TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=86.85.20.10 TCPREMOTEHOST=four.two.three tcprulescheck test.cdb
env TCPREMOTEIP=86.85.20.10 tcprulescheck test.cdb
env TCPREMOTEIP=96.85.20.10 TCPREMOTEHOST=four.two.three TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=96.85.20.10 TCPREMOTEHOST=four.two.three tcprulescheck test.cdb
env TCPREMOTEIP=96.85.20.10 TCPREMOTEHOST=four.three TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=96.85.20.10 TCPREMOTEHOST=four.three tcprulescheck test.cdb
env TCPREMOTEIP=96.85.20.10 TCPREMOTEHOST=four TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=96.85.20.10 TCPREMOTEHOST=four tcprulescheck test.cdb
env TCPREMOTEIP=96.85.20.10 TCPREMOTEINFO=abc tcprulescheck test.cdb
env TCPREMOTEIP=96.85.20.10 tcprulescheck test.cdb
echo '--- addcr leaves an empty file alone'
echo '' | tr -d '\012' | addcr; echo $?
echo '--- addcr leaves a partial final line alone'
echo test | tr -d '\012' | addcr; echo $?
echo '--- addcr adds CR after the first line'
echo test | addcr; echo $?
echo '--- addcr adds CR after the second line'
( echo test; echo test2 ) | addcr; echo $?
echo '--- addcr handles nulls'
echo test | tr e '\0' | addcr; echo $?
echo '--- delcr leaves an empty file alone'
echo '' | tr -d '\012' | delcr; echo $?
echo '--- delcr leaves a non-CR line alone'
echo test | delcr; echo $?
echo '--- delcr removes CR if a line has it'
echo testx | tr x '\015' | delcr; echo $?
echo '--- delcr converts CR CR LF to CR LF'
echo testxx | tr x '\015' | delcr; echo $?
echo '--- delcr does not remove CR from a partial final line'
echo testx | tr -d '\012' | tr x '\015' | delcr; echo $?
echo '--- delcr handles a non-CR partial final line'
echo test | tr -d '\012' | delcr; echo $?
echo '--- delcr handles nulls'
echo test | tr e '\0' | delcr; echo $?
echo '--- fixcrio works'
( echo ''; echo hi; echo therex ) | tr x '\015' \
| fixcrio sh -c 'cat; echo bye' | cat
echo '--- recordio works'
( echo test; sleep 1 ) | recordio cat 2>&1 >/dev/null \
| sed 's/^[0-9]*/.../' | sed 's/$/$/'
echo '--- recordio handles multiple-line packets'
( echo 'test
test2'; sleep 1 ) | recordio cat 2>&1 >/dev/null \
| sed 's/^[0-9]*/.../' | sed 's/$/$/'
echo '--- recordio handles partial final lines'
( echo test | tr -d '\012'; sleep 1 ) | recordio cat 2>&1 >/dev/null \
| sed 's/^[0-9]*/.../' | sed 's/$/$/'
echo '--- argv0 works'
argv0 sh zero -c 'echo $0'; echo $?
echo '--- argv0 requires arguments'
argv0 sh; echo $?
echo '--- rblsmtpd does not find 127.0.0.1 on the RBL'
( echo help; echo quit ) \
| ( TCPREMOTEIP=127.0.0.1 rblsmtpd echo ok 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
echo '--- rblsmtpd finds 127.0.0.2 on the RBL'
( echo help; echo quit ) \
| ( TCPREMOTEIP=127.0.0.2 rblsmtpd echo whoops 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
echo '--- rblsmtpd -b uses a permanent error code'
( echo help; echo quit ) \
| ( TCPREMOTEIP=127.0.0.2 rblsmtpd -b echo whoops 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
echo '--- rblsmtpd quits after a timeout'
sleep 2 \
| ( TCPREMOTEIP=127.0.0.2 rblsmtpd -cBt1 echo whoops 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
echo '--- rblsmtpd prints an immediate error message with -t0'
sleep 2 \
| ( TCPREMOTEIP=127.0.0.2 rblsmtpd -Ct0 echo whoops 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
echo '--- rblsmtpd understands an empty $RBLSMTPD'
( echo help; echo quit ) \
| ( TCPREMOTEIP=127.0.0.2 RBLSMTPD= rblsmtpd echo ok 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
echo '--- rblsmtpd understands a nonempty $RBLSMTPD'
( echo help; echo quit ) \
| ( TCPREMOTEIP=127.0.0.2 RBLSMTPD=Error rblsmtpd echo whoops 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
echo '--- rblsmtpd understands a permanent $RBLSMTPD'
( echo help; echo quit ) \
| ( TCPREMOTEIP=127.0.0.2 RBLSMTPD=-Error rblsmtpd echo whoops 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
echo '--- rblsmtpd understands -r'
( echo help; echo quit ) \
| ( TCPREMOTEIP=127.0.0.2 rblsmtpd -r nonexistent.local echo ok 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
echo '--- rblsmtpd understands -a'
( echo help; echo quit ) \
| ( TCPREMOTEIP=127.0.0.2 rblsmtpd -a rbl.maps.vix.com echo ok 2>&1; echo $? ) \
| sed 's/pid [0-9]*/pid x/'
svc -dx 50016
wait
echo '--- tcpserver -1v prints proper messages'
sed -e 's/::.*/::x/' -e 's/ [0-9]* / x /' < log
exit 0
|