Use exit trap to kill open ssh sessions
[strongswan.git] / testing / do-tests
1 #!/bin/bash
2 # Automatically execute the strongSwan test cases
3 #
4 # Copyright (C) 2004  Eric Marchionni, Patrik Rayo
5 # Zuercher Hochschule Winterthur
6 #
7 # This program is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by the
9 # Free Software Foundation; either version 2 of the License, or (at your
10 # option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
11 #
12 # This program is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 # for more details.
16
17 DIR=`dirname $0`
18
19 . $PWD/scripts/function.sh
20
21 [ -d $PWD/hosts ] || die "Directory 'hosts' not found"
22 [ -d $PWD/tests ] || die "Directory 'tests' not found"
23 [ -d $BUILDDIR ] || die "Directory '$BUILDDIR' does not exist, please run make-testing first"
24
25
26 ##############################################################################
27 # take care of new path and file variables
28 #
29
30 [ -d $TESTRESULTSDIR ] || mkdir $TESTRESULTSDIR
31
32 TESTDATE=`date +%Y%m%d-%H%M`
33
34 TODAYDIR=$TESTRESULTSDIR/$TESTDATE
35 mkdir $TODAYDIR
36 TESTRESULTSHTML=$TODAYDIR/all.html
37 INDEX=$TODAYDIR/index.html
38 DEFAULTTESTSDIR=$TESTDIR/testing/tests
39
40 SOURCEIP_ROUTING_TABLE=220
41
42 testnumber="0"
43 failed_cnt="0"
44 passed_cnt="0"
45
46
47 ##############################################################################
48 # copy default tests to $BUILDDIR
49 #
50
51 TESTSDIR=$BUILDDIR/tests
52 [ -d $TESTSDIR ] || mkdir $TESTSDIR
53
54 ##############################################################################
55 # assign IP for each host to hostname
56 #
57
58 for host in $STRONGSWANHOSTS
59 do
60     eval ipv4_${host}="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $1 }' | awk '{ print $1 }'`"
61     eval ipv6_${host}="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $1 }' | awk '{ print $1 }'`"
62
63     case $host in
64     moon)
65         eval ipv4_moon1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
66         eval ipv6_moon1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
67         ;;
68     sun)
69         eval ipv4_sun1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
70         eval ipv6_sun1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
71         ;;
72     alice)
73         eval ipv4_alice1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
74         eval ipv6_alice1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
75         ;;
76     venus)
77         ;;
78     bob)
79         ;;
80     carol)
81         eval ipv4_carol1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
82         eval ipv6_carol1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
83          ;;
84     dave)
85         eval ipv4_dave1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
86         eval ipv6_dave1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
87         ;;
88     winnetou)
89         ;;
90     esac
91 done
92
93
94 ##############################################################################
95 # open ssh sessions
96 #
97 for host in $STRONGSWANHOSTS
98 do
99     ssh $SSHCONF -N root@`eval echo \\\$ipv4_$host` >/dev/null 2>&1 &
100     eval ssh_pid_$host="`echo $!`"
101     do_on_exit kill `eval echo \\\$ssh_pid_$host`
102 done
103
104
105 ##############################################################################
106 # create header for the results html file
107 #
108
109 ENVIRONMENT_HEADER=$(cat <<@EOF
110   <table border="0" cellspacing="2" cellpadding="2">
111     <tr valign="top">
112       <td><b>Host</b></td>
113       <td colspan="3">`uname -a`</td>
114     </tr>
115     <tr valign="top">
116       <td><b>Guest kernel</b></td>
117       <td colspan="3">$KERNELVERSION</td>
118     </tr>
119     <tr valign="top">
120       <td><b>strongSwan</b></td>
121       <td colspan="3">$SWANVERSION</td>
122     </tr>
123     <tr valign="top">
124       <td><b>Date</b></td>
125       <td colspan="3">$TESTDATE</td>
126     </tr>
127     <tr>
128       <td width="100">&nbsp;</td>
129       <td width="300">&nbsp;</td>
130       <td width=" 50">&nbsp;</td>
131       <td >&nbsp;</td>
132     </tr>
133 @EOF
134 )
135
136 cat > $INDEX <<@EOF
137 <html>
138 <head>
139   <title>strongSwan UML Tests</title>
140 </head>
141 <body>
142   <h2>strongSwan UML Tests</h2>
143   $ENVIRONMENT_HEADER
144 @EOF
145
146 cat > $TESTRESULTSHTML <<@EOF
147 <html>
148 <head>
149   <title>strongSwan UML Tests - All Tests</title>
150 </head>
151 <body>
152   <div><a href="index.html">strongSwan UML Tests</a> / All Tests</div>
153   <h2>All Tests</h2>
154   $ENVIRONMENT_HEADER
155     <tr align="left">
156       <th>Number</th>
157       <th>Test</th>
158       <th colspan="2">Result</th>
159     </tr>
160 @EOF
161
162 echo "Guest kernel : $KERNELVERSION"
163 echo "strongSwan   : $SWANVERSION"
164 echo "Date         : $TESTDATE"
165 echo
166
167
168 ##############################################################################
169 # enter specific test directory
170 #
171
172 if [ $# -gt 0 ]
173 then
174     TESTS=$*
175 elif [ $SELECTEDTESTSONLY = "yes" ]
176 then
177     # set internal field seperator
178     TESTS=$SELECTEDTESTS
179 else
180     # set internal field seperator
181     TESTS="`ls $DEFAULTTESTSDIR`"
182 fi
183
184 for SUBDIR in $TESTS
185 do
186     SUBTESTS="`basename $SUBDIR`"
187
188     if [ $SUBTESTS = $SUBDIR ]
189     then
190         SUBTESTS="`ls $DEFAULTTESTSDIR/$SUBDIR`"
191     else
192         SUBDIR="`dirname $SUBDIR`"
193     fi
194
195     if [ ! -d $TODAYDIR/$SUBDIR ]
196     then
197         mkdir $TODAYDIR/$SUBDIR
198         if [ $testnumber == 0 ]
199         then
200             FIRST="<b>Category</b>"
201         else
202             FIRST="&nbsp;"
203         fi
204         echo "    <tr>" >> $INDEX
205     echo "      <td>$FIRST</td>">> $INDEX
206     echo "      <td><a href=\"$SUBDIR/index.html\">$SUBDIR</a></td>" >> $INDEX
207     echo "      <td align=\"right\">x</td>" >> $INDEX
208     echo "      <td>&nbsp;</td>" >> $INDEX
209     echo "    </tr>" >> $INDEX
210         SUBTESTSINDEX=$TODAYDIR/$SUBDIR/index.html
211         cat > $SUBTESTSINDEX <<@EOF
212 <html>
213 <head>
214   <title>strongSwan $SUBDIR Tests</title>
215 </head>
216 <body>
217   <div><a href="../index.html">strongSwan UML Tests</a> / $SUBDIR</div>
218   <h2>strongSwan $SUBDIR Tests</h2>
219   <table border="0" cellspacing="2" cellpadding="2">
220     <tr valign="top">
221       <td><b>UML kernel</b></td>
222       <td colspan="3">$KERNELVERSION</td>
223     </tr>
224     <tr valign="top">
225       <td><b>strongSwan</b></td>
226       <td colspan="3">$SWANVERSION</td>
227     </tr>
228     <tr valign="top">
229       <td><b>Date</b></td>
230       <td colspan="3">$TESTDATE</td>
231     </tr>
232     <tr>
233       <td width="100">&nbsp;</td>
234       <td width="300">&nbsp;</td>
235       <td width=" 50">&nbsp;</td>
236       <td >&nbsp;</td>
237     </tr>
238     <tr align="left">
239        <th>Number</th>
240        <th>Test</th>
241        <th colspan="2">Result</th>
242     </tr>
243 @EOF
244     fi
245
246     for name in $SUBTESTS
247     do
248         let "testnumber += 1"
249         testname=$SUBDIR/$name
250         log_action " $testnumber $testname:"
251
252         if [ ! -d $DEFAULTTESTSDIR/${testname} ]
253         then
254             echo "is missing..skipped"
255             continue
256         fi
257
258         if [ $SUBDIR = "ipv6" -o $name = "rw-psk-ipv6" ]
259         then
260             IPROUTE_CMD="ip -6 route list table $SOURCEIP_ROUTING_TABLE"
261             IPROUTE_DSP=$IPROUTE_CMD
262             IPTABLES_CMD="ip6tables -v -n -L"
263             IPTABLES_DSP="ip6tables -L"
264         else
265             IPROUTE_CMD="ip route list table $SOURCEIP_ROUTING_TABLE"
266             IPROUTE_DSP=$IPROUTE_CMD
267             IPTABLES_CMD="iptables -v -n -L"
268             IPTABLES_DSP="iptables -L"
269         fi
270
271         if [ $name = "net2net-ip4-in-ip6-ikev2" -o $name = "net2net-ip6-in-ip4-ikev2" ]
272         then
273             IPROUTE_CMD="ip route list table $SOURCEIP_ROUTING_TABLE; echo; ip -6 route list table $SOURCEIP_ROUTING_TABLE"
274             IPROUTE_DSP="ip (-6) route list table $SOURCEIP_ROUTING_TABLE"
275             IPTABLES_CMD="iptables -v -n -L ; echo ; ip6tables -v -n -L"
276             IPTABLES_DSP="iptables -L ; ip6tables -L"
277         fi
278
279         [ -f $DEFAULTTESTSDIR/${testname}/description.txt ] || die "!! File 'description.txt' is missing"
280         [ -f $DEFAULTTESTSDIR/${testname}/test.conf ]       || die "!! File 'test.conf' is missing"
281         [ -f $DEFAULTTESTSDIR/${testname}/pretest.dat ]     || die "!! File 'pretest.dat' is missing"
282         [ -f $DEFAULTTESTSDIR/${testname}/posttest.dat ]    || die "!! File 'posttest.dat' is missing"
283         [ -f $DEFAULTTESTSDIR/${testname}/evaltest.dat ]    || die "!! File 'evaltest.dat' is missing"
284
285         TESTRESULTDIR=$TODAYDIR/$testname
286         mkdir -p $TESTRESULTDIR
287         CONSOLE_LOG=$TESTRESULTDIR/console.log
288         touch $CONSOLE_LOG
289
290         TESTDIR=$TESTSDIR/${testname}
291         rm -rf $TESTDIR
292         mkdir -p $TESTDIR
293         cp -rfp $DEFAULTTESTSDIR/${testname}/* $TESTDIR
294
295
296         ##############################################################################
297         # replace IP wildcards with actual IPv4 and IPv6 addresses
298         #
299
300         for host in $STRONGSWANHOSTS
301         do
302             case $host in
303             moon)
304                 searchandreplace PH_IP_MOON1     $ipv4_moon1 $TESTDIR
305                 searchandreplace PH_IP_MOON      $ipv4_moon  $TESTDIR
306                 searchandreplace PH_IP6_MOON1    $ipv6_moon1 $TESTDIR
307                 searchandreplace PH_IP6_MOON     $ipv6_moon  $TESTDIR
308                 ;;
309             sun)
310                 searchandreplace PH_IP_SUN1      $ipv4_sun1 $TESTDIR
311                 searchandreplace PH_IP_SUN       $ipv4_sun  $TESTDIR
312                 searchandreplace PH_IP6_SUN1     $ipv6_sun1 $TESTDIR
313                 searchandreplace PH_IP6_SUN      $ipv6_sun  $TESTDIR
314                 ;;
315             alice)
316                 searchandreplace PH_IP_ALICE1    $ipv4_alice1 $TESTDIR
317                 searchandreplace PH_IP_ALICE     $ipv4_alice  $TESTDIR
318                 searchandreplace PH_IP6_ALICE1   $ipv6_alice1 $TESTDIR
319                 searchandreplace PH_IP6_ALICE    $ipv6_alice  $TESTDIR
320                 ;;
321             venus)
322                 searchandreplace PH_IP_VENUS     $ipv4_venus $TESTDIR
323                 searchandreplace PH_IP6_VENUS    $ipv6_venus $TESTDIR
324                 ;;
325             bob)
326                 searchandreplace PH_IP_BOB       $ipv4_bob $TESTDIR
327                 searchandreplace PH_IPV6_BOB     $ipv6_bob $TESTDIR
328                 ;;
329             carol)
330                 searchandreplace PH_IP_CAROL1    $ipv4_carol1 $TESTDIR
331                 searchandreplace PH_IP_CAROL     $ipv4_carol  $TESTDIR
332                 searchandreplace PH_IP6_CAROL1   $ipv6_carol1 $TESTDIR
333                 searchandreplace PH_IP6_CAROL    $ipv6_carol  $TESTDIR
334                 ;;
335             dave)
336                 searchandreplace PH_IP_DAVE1     $ipv4_dave1 $TESTDIR
337                 searchandreplace PH_IP_DAVE      $ipv4_dave  $TESTDIR
338                 searchandreplace PH_IP6_DAVE1    $ipv6_dave1 $TESTDIR
339                 searchandreplace PH_IP6_DAVE     $ipv6_dave  $TESTDIR
340                 ;;
341             winnetou)
342                 searchandreplace PH_IP_WINNETOU  $ipv4_winnetou $TESTDIR
343                 searchandreplace PH_IP6_WINNETOU $ipv6_winnetou $TESTDIR
344                 ;;
345             esac
346         done
347
348
349         ##########################################################################
350         # copy test specific configurations to uml hosts and clear auth.log files
351         #
352
353         $DIR/scripts/load-testconfig $testname
354         unset RADIUSHOSTS
355         source $TESTDIR/test.conf
356
357
358         ##########################################################################
359         # run tcpdump in the background
360         #
361
362         if [ "$TCPDUMPHOSTS" != "" ]
363         then
364             echo -e "TCPDUMP\n" >> $CONSOLE_LOG 2>&1
365
366             for host_iface in $TCPDUMPHOSTS
367             do
368                 host=`echo $host_iface | awk -F ":" '{print $1}'`
369                 iface=`echo $host_iface | awk -F ":" '{if ($2 != "") { print $2 } else { printf("eth0") }}'`
370                 tcpdump_cmd="tcpdump -i $iface not port ssh and not port domain > /tmp/tcpdump.log 2>&1 &"
371                 echo "${host}# $tcpdump_cmd" >> $CONSOLE_LOG
372                 ssh $SSHCONF root@`eval echo \\\$ipv4_$host '$tcpdump_cmd'`
373                 eval TDUP_${host}="true"
374             done
375         fi
376
377
378         ##########################################################################
379         # execute pre-test commands
380         #
381
382         echo -n "pre.."
383         echo -e "\nPRE-TEST\n" >> $CONSOLE_LOG 2>&1
384
385         eval `awk -F "::" '{
386             if ($2 != "")
387             {
388                 printf("echo \"%s# %s\"; ", $1, $2)
389                 printf("ssh \044SSHCONF root@\044ipv4_%s \"%s\"; ", $1, $2)
390                 printf("echo;\n")
391             }
392         }' $TESTDIR/pretest.dat` >> $CONSOLE_LOG 2>&1
393
394
395         ##########################################################################
396         # stop tcpdump
397         #
398
399         function stop_tcpdump {
400             echo "${1}# killall tcpdump" >> $CONSOLE_LOG
401             eval ssh $SSHCONF root@\$ipv4_${1} killall tcpdump
402             eval TDUP_${1}="false"
403             echo ""
404         }
405
406
407         ##########################################################################
408         # get and evaluate test results
409         #
410
411         echo -n "test.."
412         echo -e "\nTEST\n" >> $CONSOLE_LOG 2>&1
413
414         STATUS="passed"
415
416         eval `awk -F "::" '{
417             host=$1
418             command=$2
419             pattern=$3
420             hit=$4
421             if (command != "")
422             {
423                 if (command == "tcpdump")
424                 {
425                     printf("if [ \044TDUP_%s == \"true\" ]; then stop_tcpdump %s; fi; \n", host, host)
426                     printf("echo \"%s# cat /tmp/tcpdump.log | grep \047%s\047  [%s]\"; ", host, pattern, hit)
427                     printf("ssh \044SSHCONF root@\044ipv4_%s cat /tmp/tcpdump.log | grep \"%s\"; ", host, pattern)
428                 }
429                 else
430                 {
431                     printf("echo \"%s# %s | grep \047%s\047  [%s]\"; ", host, command, pattern, hit)
432                     printf("ssh \044SSHCONF root@\044ipv4_%s %s | grep \"%s\"; ",  host, command, pattern)
433                 }
434                 printf("cmd_exit=\044?; ")
435                 printf("echo; ")
436                 printf("if [ \044cmd_exit -eq 0 -a \"%s\" = \"NO\"  ] ", hit)
437                 printf("|| [ \044cmd_exit -ne 0 -a \"%s\" = \"YES\" ] ", hit)
438                 printf("; then STATUS=\"failed\"; fi; \n")
439             }
440         }' $TESTDIR/evaltest.dat` >> $CONSOLE_LOG 2>&1
441
442
443         ##########################################################################
444         # set counters
445         #
446
447         if [ $STATUS = "failed" ]
448         then
449             let "failed_cnt += 1"
450         else
451             let "passed_cnt += 1"
452         fi
453
454
455         ##########################################################################
456         # log statusall and listall output
457         # get copies of ipsec.conf, ipsec.secrets
458         # create index.html for the given test case
459
460         cat > $TESTRESULTDIR/index.html <<@EOF
461 <html>
462 <head>
463   <title>Test $testname</title>
464 </head>
465 <body>
466 <table border="0" cellpadding="0" cellspacing="0" width="600">
467   <tr><td>
468     <div><a href="../../index.html">strongSwan UML Tests</a> / <a href="../index.html">$SUBDIR</a> / $name</div>
469     <h2>Test $testname</h2>
470     <h3>Description</h3>
471 @EOF
472
473         cat $TESTDIR/description.txt >> $TESTRESULTDIR/index.html
474
475         cat >> $TESTRESULTDIR/index.html <<@EOF
476     <ul>
477       <li><a href="console.log">console.log</a></li>
478     </ul>
479     <img src="../../images/$DIAGRAM" alt="$UMLHOSTS">
480 @EOF
481
482         for host in $IPSECHOSTS
483         do
484             eval HOSTLOGIN=root@\$ipv4_${host}
485
486             for command in statusall listall
487             do
488                 ssh $SSHCONF $HOSTLOGIN ipsec $command \
489                     > $TESTRESULTDIR/${host}.$command 2>/dev/null
490             done
491
492             for file in strongswan.conf ipsec.conf ipsec.secrets
493             do
494                 scp $SSHCONF $HOSTLOGIN:/etc/$file \
495                     $TESTRESULTDIR/${host}.$file  > /dev/null 2>&1
496             done
497
498             scp $SSHCONF $HOSTLOGIN:/etc/ipsec.d/ipsec.sql \
499                 $TESTRESULTDIR/${host}.ipsec.sql  > /dev/null 2>&1
500
501             ssh $SSHCONF $HOSTLOGIN ip -s xfrm policy \
502                     > $TESTRESULTDIR/${host}.ip.policy 2>/dev/null
503             ssh $SSHCONF $HOSTLOGIN ip -s xfrm state \
504                     > $TESTRESULTDIR/${host}.ip.state 2>/dev/null
505             ssh $SSHCONF $HOSTLOGIN $IPROUTE_CMD \
506                     > $TESTRESULTDIR/${host}.ip.route 2>/dev/null
507             ssh $SSHCONF $HOSTLOGIN $IPTABLES_CMD \
508                     > $TESTRESULTDIR/${host}.iptables 2>/dev/null
509             chmod a+r $TESTRESULTDIR/*
510             cat >> $TESTRESULTDIR/index.html <<@EOF
511     <h3>$host</h3>
512       <table border="0" cellspacing="0" width="600">
513       <tr>
514         <td valign="top">
515           <ul>
516             <li><a href="$host.ipsec.conf">ipsec.conf</a></li>
517             <li><a href="$host.ipsec.secrets">ipsec.secrets</a></li>
518             <li><a href="$host.ipsec.sql">ipsec.sql</a></li>
519             <li><a href="$host.strongswan.conf">strongswan.conf</a></li>
520           </ul>
521         </td>
522         <td valign="top">
523           <ul>
524             <li><a href="$host.statusall">ipsec statusall</a></li>
525             <li><a href="$host.listall">ipsec listall</a></li>
526             <li><a href="$host.auth.log">auth.log</a></li>
527             <li><a href="$host.daemon.log">daemon.log</a></li>
528           </ul>
529       </td>
530         <td valign="top">
531           <ul>
532             <li><a href="$host.ip.policy">ip -s xfrm policy</a></li>
533             <li><a href="$host.ip.state">ip -s xfrm state</a></li>
534             <li><a href="$host.ip.route">$IPROUTE_DSP</a></li>
535             <li><a href="$host.iptables">$IPTABLES_DSP</a></li>
536           </ul>
537       </td>
538     </tr>
539     </table>
540 @EOF
541
542         done
543
544         for host in $RADIUSHOSTS
545         do
546             eval HOSTLOGIN=root@\$ipv4_${host}
547
548             for file in clients.conf eap.conf radiusd.conf proxy.conf users
549             do
550                 scp $SSHCONF $HOSTLOGIN:/etc/freeradius/$file \
551                     $TESTRESULTDIR/${host}.$file  > /dev/null 2>&1
552             done
553
554                 scp $SSHCONF $HOSTLOGIN:/etc/strongswan.conf \
555                     $TESTRESULTDIR/${host}.strongswan.conf  > /dev/null 2>&1
556
557             scp $SSHCONF $HOSTLOGIN:/var/log/freeradius/radius.log \
558                 $TESTRESULTDIR/${host}.radius.log  > /dev/null 2>&1
559
560             chmod a+r $TESTRESULTDIR/*
561             cat >> $TESTRESULTDIR/index.html <<@EOF
562     <h3>$host</h3>
563       <table border="0" cellspacing="0" width="600">
564       <tr>
565         <td valign="top">
566           <ul>
567             <li><a href="$host.clients.conf">clients.conf</a></li>
568             <li><a href="$host.radiusd.conf">radiusd.conf</a></li>
569             <li><a href="$host.strongswan.conf">strongswan.conf</a></li>
570           </ul>
571         </td>
572         <td valign="top">
573           <ul>
574             <li><a href="$host.eap.conf">eap.conf</a></li>
575             <li><a href="$host.radius.log">radius.log</a></li>
576           </ul>
577       </td>
578         <td valign="top">
579           <ul>
580             <li><a href="$host.proxy.conf">proxy.conf</a></li>
581             <li><a href="$host.users">users</a></li>
582           </ul>
583       </td>
584     </tr>
585     </table>
586 @EOF
587
588         done
589
590         cat >> $TESTRESULTDIR/index.html <<@EOF
591         <h3>tcpdump</h3>
592         <ul>
593 @EOF
594
595         for host in $TCPDUMPHOSTS
596         do
597             eval HOSTLOGIN=root@\$ipv4_${host}
598
599                 scp $SSHCONF $HOSTLOGIN:/tmp/tcpdump.log \
600                         $TESTRESULTDIR/${host}.tcpdump.log > /dev/null 2>&1
601
602             cat >> $TESTRESULTDIR/index.html <<@EOF
603             <li><a href="$host.tcpdump.log">$host tcpdump.log</a></li>
604 @EOF
605
606         done
607
608         cat >> $TESTRESULTDIR/index.html <<@EOF
609         </ul>
610 @EOF
611
612         cat >> $TESTRESULTDIR/index.html <<@EOF
613   </td></tr>
614 </table>
615 </body>
616 </html>
617 @EOF
618
619
620         ##########################################################################
621         # execute post-test commands
622         #
623
624         echo -n "post"
625         echo -e "\nPOST-TEST\n" >> $CONSOLE_LOG 2>&1
626
627         eval `awk -F "::" '{
628             if ($2 != "")
629             {
630                 printf("echo \"%s# %s\"; ", $1, $2)
631                 printf("ssh \044SSHCONF root@\044ipv4_%s \"%s\"; ", $1, $2)
632                 printf("echo;\n")
633             }
634         }' $TESTDIR/posttest.dat` >> $CONSOLE_LOG 2>&1
635
636
637         ##########################################################################
638         # get a copy of /var/log/auth.log
639         #
640
641         for host in $IPSECHOSTS
642         do
643             eval HOSTLOGIN=root@\$ipv4_${host}
644             ssh $SSHCONF $HOSTLOGIN "grep -E 'charon|last message repeated' \
645                 /var/log/auth.log" >> $TESTRESULTDIR/${host}.auth.log
646         done
647
648
649         ##########################################################################
650         # get a copy of /var/log/daemon.log
651         #
652
653         for host in $IPSECHOSTS
654         do
655             eval HOSTLOGIN=root@\$ipv4_${host}
656             ssh $SSHCONF $HOSTLOGIN "grep -E 'charon|last message repeated' \
657                 /var/log/daemon.log" >> $TESTRESULTDIR/${host}.daemon.log
658         done
659
660
661         ##########################################################################
662         # stop tcpdump if necessary
663         #
664
665         for host in $TCPDUMPHOSTS
666         do
667             if [ "`eval echo \\\$TDUP_${host}`" = "true" ]
668             then
669                 echo "${host}# killall tcpdump" >> $CONSOLE_LOG
670                 eval ssh $SSHCONF root@\$ipv4_$host killall tcpdump
671                 eval TDUP_${host}="false"
672             fi
673         done
674
675
676         ##########################################################################
677         # copy default host config back if necessary
678         #
679
680         $DIR/scripts/restore-defaults $testname
681
682
683         ##########################################################################
684         # write test status to html file
685         #
686
687         if [ $STATUS = "passed" ]
688         then
689                 COLOR="green"
690                 log_status 0
691         else
692                 COLOR="red"
693                 log_status 1
694         fi
695
696         cat >> $TESTRESULTSHTML << @EOF
697   <tr>
698     <td>$testnumber</td>
699     <td><a href="$testname/index.html">$testname</a></td>
700     <td><a href="$testname/console.log"><font color="$COLOR">$STATUS</font></a></td>
701     <td>&nbsp;</td>
702   </tr>
703 @EOF
704         cat >> $SUBTESTSINDEX << @EOF
705   <tr>
706     <td>$testnumber</td>
707     <td><a href="$name/index.html">$name</a></td>
708     <td><a href="$name/console.log"><font color="$COLOR">$STATUS</font></a></td>
709     <td>&nbsp;</td>
710   </tr>
711 @EOF
712
713
714         ##########################################################################
715         # remove any charon.pid files that still may exist
716         #
717
718         for host in $IPSECHOSTS
719         do
720             eval HOSTLOGIN=root@\$ipv4_${host}
721             ssh $SSHCONF $HOSTLOGIN 'if [ -f /var/run/charon.pid ]; then rm /var/run/charon.pid; echo "    removed charon.pid on `hostname`"; fi'
722         done
723
724     done
725
726 done
727
728
729 ##############################################################################
730 # finish the results html file
731 #
732
733 cat >> $TESTRESULTSHTML << @EOF
734     <tr>
735       <td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>
736     </tr>
737     <tr>
738       <td><b>Passed</b></td><td><b><font color="green">$passed_cnt</font></b></td><td>&nbsp;</td><td>&nbsp;</td>
739     </tr>
740     <tr>
741       <td><b>Failed</b></td><td><b><font color="red">$failed_cnt</font></b></td><td>&nbsp;</td><td>&nbsp;</td>
742     </tr>
743   </table>
744 </body>
745 </html>
746 @EOF
747
748 let "all_cnt = $passed_cnt + $failed_cnt"
749
750 cat >> $INDEX << @EOF
751     <tr>
752       <td>&nbsp;</td>
753       <td><a href="all.html"><b>all</b></a></td>
754       <td align="right"><b>$all_cnt</b></td>
755       <td>&nbsp;</td>
756     </tr>
757     <tr>
758       <td><b>Failed</b></td>
759       <td>&nbsp;</td>
760       <td align="right"><b><font color="red">$failed_cnt</font></b></td>
761       <td>&nbsp;</td>
762     </tr>
763   </table>
764 </body>
765 </html>
766 @EOF
767
768 echo
769 echo_ok     "Passed : $passed_cnt"
770 echo_failed "Failed : $failed_cnt"
771 echo
772
773
774 ##############################################################################
775 # copy the test results to the apache server
776 #
777
778 HTDOCS="/var/www"
779
780 ssh $SSHCONF root@${ipv4_winnetou} mkdir -p $HTDOCS/testresults > /dev/null 2>&1
781 scp $SSHCONF -r $TODAYDIR root@${ipv4_winnetou}:$HTDOCS/testresults > /dev/null 2>&1
782 ssh $SSHCONF root@${ipv4_winnetou} ln -s $HTDOCS/images $HTDOCS/testresults/$TESTDATE/images > /dev/null 2>&1
783 echo
784 echo "The results are available in $TODAYDIR"
785 echo "or via the link http://$ipv4_winnetou/testresults/$TESTDATE"
786
787 ENDDATE=`date +%Y%m%d-%H%M`
788 echo
789 echo "Finished : $ENDDATE"