mirror of
https://github.com/strongswan/strongswan.git
synced 2025-10-05 00:00:45 -04:00
added possibility to mount the strongswan tree into all UMLs added script for installing from shared tree in all UMLs added script to shut down all UMLs properly
534 lines
15 KiB
Bash
Executable File
534 lines
15 KiB
Bash
Executable File
#!/bin/bash
|
|
# Automatically execute the strongSwan test cases
|
|
#
|
|
# Copyright (C) 2004 Eric Marchionni, Patrik Rayo
|
|
# Zuercher Hochschule Winterthur
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU General Public License as published by the
|
|
# Free Software Foundation; either version 2 of the License, or (at your
|
|
# option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
# for more details.
|
|
#
|
|
# RCSID $Id: do-tests,v 1.20 2006/02/08 21:27:59 as Exp $
|
|
|
|
DIR=`dirname $0`
|
|
|
|
source $DIR/scripts/function.sh
|
|
|
|
[ -f $DIR/testing.conf ] || die "Configuration file 'testing.conf' not found"
|
|
[ -d $DIR/hosts ] || die "Directory 'hosts' not found"
|
|
[ -d $DIR/tests ] || die "Directory 'tests' not found"
|
|
|
|
source $DIR/testing.conf
|
|
|
|
|
|
##############################################################################
|
|
# test if UMLs have been built at all
|
|
#
|
|
|
|
[ -d $BUILDDIR ] || die "Directory '$BUILDDIR' does not exist. Please run 'make-testing'first."
|
|
|
|
|
|
##############################################################################
|
|
# take care of new path and file variables
|
|
#
|
|
|
|
[ -d $TESTRESULTSDIR ] || mkdir $TESTRESULTSDIR
|
|
|
|
TESTDATE=`date +%Y%m%d-%H%M`
|
|
|
|
TODAYDIR=$TESTRESULTSDIR/$TESTDATE
|
|
mkdir $TODAYDIR
|
|
TESTRESULTSHTML=$TODAYDIR/index.html
|
|
DEFAULTTESTSDIR=$UMLTESTDIR/testing/tests
|
|
|
|
testnumber="0"
|
|
failed_cnt="0"
|
|
passed_cnt="0"
|
|
|
|
|
|
##############################################################################
|
|
# copy default tests to $BUILDDIR
|
|
#
|
|
|
|
TESTSDIR=$BUILDDIR/tests
|
|
[ -d $TESTSDIR ] || mkdir $TESTSDIR
|
|
|
|
##############################################################################
|
|
# assign IP for each host to hostname
|
|
#
|
|
|
|
for host in $STRONGSWANHOSTS
|
|
do
|
|
eval ipv4_${host}="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $1 }' | awk '{ print $1 }'`"
|
|
eval ipv6_${host}="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $1 }' | awk '{ print $1 }'`"
|
|
|
|
case $host in
|
|
moon)
|
|
eval ipv4_moon1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
|
|
eval ipv6_moon1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
|
|
;;
|
|
sun)
|
|
eval ipv4_sun1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
|
|
eval ipv6_sun1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
|
|
;;
|
|
alice)
|
|
;;
|
|
venus)
|
|
;;
|
|
bob)
|
|
;;
|
|
carol)
|
|
eval ipv4_carol1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
|
|
eval ipv6_carol1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
|
|
;;
|
|
dave)
|
|
eval ipv4_dave1="`echo $HOSTNAMEIPV4 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
|
|
eval ipv6_dave1="`echo $HOSTNAMEIPV6 | sed -n -e "s/^.*${host},//gp" | awk -F, '{ print $2 }' | awk '{ print $1 }'`"
|
|
;;
|
|
winnetou)
|
|
;;
|
|
esac
|
|
done
|
|
|
|
|
|
##############################################################################
|
|
# create header for the results html file
|
|
#
|
|
|
|
KERNEL_VERSION=`basename $KERNEL .tar.bz2`
|
|
IPSEC_VERSION=`basename $STRONGSWAN .tar.bz2`
|
|
|
|
cat > $TESTRESULTSHTML <<@EOF
|
|
<html>
|
|
<head>
|
|
<title>strongSwan UML Testing</title>
|
|
</head>
|
|
<body>
|
|
<h2>strongSwan UML Testing</h2>
|
|
<table border="0" cellspacing="2">
|
|
<tr><td><b>Host:</b></td><td>`uname -a`</td></tr>
|
|
<tr><td><b>UML kernel: </b></td><td>$KERNEL_VERSION</td></tr>
|
|
<tr><td><b>IPsec:</b></td><td>$IPSEC_VERSION</td></tr>
|
|
<tr><td><b>Date:</b></td><td>$TESTDATE</td></tr>
|
|
</table>
|
|
<p>
|
|
<table border="0" width="500">
|
|
<thead align="left"><th>Number</th><th>Test</th><th>Result</th></thead>
|
|
@EOF
|
|
|
|
cecho "UML kernel: $KERNEL_VERSION"
|
|
cecho "IPsec: $IPSEC_VERSION"
|
|
cecho "Date: $TESTDATE"
|
|
cecho ""
|
|
|
|
|
|
##############################################################################
|
|
# enter specific test directory
|
|
#
|
|
|
|
if [ $# -gt 0 ]
|
|
then
|
|
TESTS=$*
|
|
elif [ $SELECTEDTESTSONLY = "yes" ]
|
|
then
|
|
# set internal field seperator
|
|
TESTS=$SELECTEDTESTS
|
|
else
|
|
# set internal field seperator
|
|
TESTS="`ls $DEFAULTTESTSDIR`"
|
|
fi
|
|
|
|
for SUBDIR in $TESTS
|
|
do
|
|
SUBTESTS="`basename $SUBDIR`"
|
|
|
|
if [ $SUBTESTS = $SUBDIR ]
|
|
then
|
|
SUBTESTS="`ls $DEFAULTTESTSDIR/$SUBDIR`"
|
|
else
|
|
SUBDIR="`dirname $SUBDIR`"
|
|
fi
|
|
|
|
for name in $SUBTESTS
|
|
do
|
|
let "testnumber += 1"
|
|
testname=$SUBDIR/$name
|
|
cecho-n " $testnumber $testname.."
|
|
|
|
if [ ! -d $DEFAULTTESTSDIR/${testname} ]
|
|
then
|
|
cecho "is missing..skipped"
|
|
continue
|
|
fi
|
|
|
|
[ -f $DEFAULTTESTSDIR/${testname}/description.txt ] || die "!! File 'description.txt' is missing"
|
|
[ -f $DEFAULTTESTSDIR/${testname}/test.conf ] || die "!! File 'test.conf' is missing"
|
|
[ -f $DEFAULTTESTSDIR/${testname}/pretest.dat ] || die "!! File 'pretest.dat' is missing"
|
|
[ -f $DEFAULTTESTSDIR/${testname}/posttest.dat ] || die "!! File 'posttest.dat' is missing"
|
|
[ -f $DEFAULTTESTSDIR/${testname}/evaltest.dat ] || die "!! File 'evaltest.dat' is missing"
|
|
|
|
TESTRESULTDIR=$TODAYDIR/$testname
|
|
mkdir -p $TESTRESULTDIR
|
|
CONSOLE_LOG=$TESTRESULTDIR/console.log
|
|
touch $CONSOLE_LOG
|
|
|
|
TESTDIR=$TESTSDIR/${testname}
|
|
rm -rf $TESTDIR
|
|
mkdir -p $TESTDIR
|
|
cp -rfp $DEFAULTTESTSDIR/${testname}/* $TESTDIR
|
|
|
|
|
|
##############################################################################
|
|
# replace IP wildcards with actual IPv4 and IPv6 addresses
|
|
#
|
|
|
|
for host in $STRONGSWANHOSTS
|
|
do
|
|
case $host in
|
|
moon)
|
|
searchandreplace PH_IP_MOON1 $ipv4_moon1 $TESTDIR
|
|
searchandreplace PH_IP_MOON $ipv4_moon $TESTDIR
|
|
searchandreplace PH_IP6_MOON1 $ipv6_moon1 $TESTDIR
|
|
searchandreplace PH_IP6_MOON $ipv6_moon $TESTDIR
|
|
;;
|
|
sun)
|
|
searchandreplace PH_IP_SUN1 $ipv4_sun1 $TESTDIR
|
|
searchandreplace PH_IP_SUN $ipv4_sun $TESTDIR
|
|
searchandreplace PH_IP6_SUN1 $ipv6_sun1 $TESTDIR
|
|
searchandreplace PH_IP6_SUN $ipv6_sun $TESTDIR
|
|
;;
|
|
alice)
|
|
searchandreplace PH_IP_ALICE $ipv4_alice $TESTDIR
|
|
searchandreplace PH_IP6_ALICE $ipv6_alice $TESTDIR
|
|
;;
|
|
venus)
|
|
searchandreplace PH_IP_VENUS $ipv4_venus $TESTDIR
|
|
searchandreplace PH_IP6_VENUS $ipv6_venus $TESTDIR
|
|
;;
|
|
bob)
|
|
searchandreplace PH_IP_BOB $ipv4_bob $TESTDIR
|
|
searchandreplace PH_IPV6_BOB $ipv6_bob $TESTDIR
|
|
;;
|
|
carol)
|
|
searchandreplace PH_IP_CAROL1 $ipv4_carol1 $TESTDIR
|
|
searchandreplace PH_IP_CAROL $ipv4_carol $TESTDIR
|
|
searchandreplace PH_IP6_CAROL1 $ipv6_carol1 $TESTDIR
|
|
searchandreplace PH_IP6_CAROL $ipv6_carol $TESTDIR
|
|
;;
|
|
dave)
|
|
searchandreplace PH_IP_DAVE1 $ipv4_dave1 $TESTDIR
|
|
searchandreplace PH_IP_DAVE $ipv4_dave $TESTDIR
|
|
searchandreplace PH_IP6_DAVE1 $ipv6_dave1 $TESTDIR
|
|
searchandreplace PH_IP6_DAVE $ipv6_dave $TESTDIR
|
|
;;
|
|
winnetou)
|
|
searchandreplace PH_IP_WINNETOU $ipv4_winnetou $TESTDIR
|
|
searchandreplace PH_IP6_WINNETOU $ipv6_winnetou $TESTDIR
|
|
;;
|
|
esac
|
|
done
|
|
|
|
|
|
##########################################################################
|
|
# copy test specific configurations to uml hosts and clear auth.log files
|
|
#
|
|
|
|
$DIR/scripts/load-testconfig $testname
|
|
source $TESTDIR/test.conf
|
|
|
|
|
|
##########################################################################
|
|
# run tcpdump in the background
|
|
#
|
|
|
|
if [ "$TCPDUMPHOSTS" != "" ]
|
|
then
|
|
echo -e "TCPDUMP\n" >> $CONSOLE_LOG 2>&1
|
|
|
|
for host_iface in $TCPDUMPHOSTS
|
|
do
|
|
host=`echo $host_iface | awk -F ":" '{print $1}'`
|
|
iface=`echo $host_iface | awk -F ":" '{if ($2 != "") { print $2 } else { printf("eth0") }}'`
|
|
tcpdump_cmd="tcpdump -i $iface not port ssh and not port domain and not arp > /tmp/tcpdump.log 2>&1 &"
|
|
echo "${host}# $tcpdump_cmd" >> $CONSOLE_LOG
|
|
ssh root@`eval echo \\\$ipv4_$host '$tcpdump_cmd'`
|
|
eval TDUP_${host}="true"
|
|
done
|
|
fi
|
|
|
|
|
|
##########################################################################
|
|
# execute pre-test commands
|
|
#
|
|
|
|
cecho-n "pre.."
|
|
echo -e "\nPRE-TEST\n" >> $CONSOLE_LOG 2>&1
|
|
|
|
eval `awk -F "::" '{
|
|
if ($2 != "")
|
|
{
|
|
printf("echo \"%s# %s\"; ", $1, $2)
|
|
printf("ssh root@\044ipv4_%s \"%s\"; ", $1, $2)
|
|
printf("echo;\n")
|
|
}
|
|
}' $TESTDIR/pretest.dat` >> $CONSOLE_LOG 2>&1
|
|
|
|
|
|
##########################################################################
|
|
# stop tcpdump
|
|
#
|
|
|
|
function stop_tcpdump {
|
|
echo "${1}# killall tcpdump" >> $CONSOLE_LOG
|
|
eval ssh root@\$ipv4_${1} killall tcpdump
|
|
eval TDUP_${1}="false"
|
|
echo ""
|
|
}
|
|
|
|
|
|
##########################################################################
|
|
# get and evaluate test results
|
|
#
|
|
|
|
cecho-n "test.."
|
|
echo -e "\nTEST\n" >> $CONSOLE_LOG 2>&1
|
|
|
|
STATUS="passed"
|
|
|
|
eval `awk -F "::" '{
|
|
host=$1
|
|
command=$2
|
|
pattern=$3
|
|
hit=$4
|
|
if (command != "")
|
|
{
|
|
if (command == "tcpdump")
|
|
{
|
|
printf("if [ \044TDUP_%s == \"true\" ]; then stop_tcpdump %s; fi; \n", host, host)
|
|
printf("echo \"%s# cat /tmp/tcpdump.log | grep \047%s\047 [%s]\"; ", host, pattern, hit)
|
|
printf("ssh root@\044ipv4_%s cat /tmp/tcpdump.log | grep \"%s\"; ", host, pattern)
|
|
}
|
|
else if (command == "tcpdumpcount")
|
|
{
|
|
printf("if [ \044TDUP_%s == \"true\" ]; then stop_tcpdump %s; fi; \n", host, host)
|
|
printf("echo -e \"%s# [ \\\\140cat /tmp/tcpdump.log | grep \047%s\047 | tee -a /dev/stderr | wc -l\\\\140 -eq %s ] [YES]\"; ", host, pattern, hit)
|
|
printf("tcpdumpcount=\`ssh root@\044ipv4_%s cat /tmp/tcpdump.log | grep \"%s\" | tee -a /dev/stderr | wc -l\`; ", host, pattern)
|
|
printf("[ \044tcpdumpcount -eq %s ]; ", hit)
|
|
hit="YES"
|
|
}
|
|
else if (command == "cmd")
|
|
{
|
|
printf("echo \"%s# %s [%s]\"; ", host, pattern, hit)
|
|
printf("ssh root@\044ipv4_%s %s; ", host, pattern)
|
|
}
|
|
else
|
|
{
|
|
printf("echo \"%s# %s | grep \047%s\047 [%s]\"; ", host, command, pattern, hit)
|
|
printf("ssh root@\044ipv4_%s %s | grep \"%s\"; ", host, command, pattern)
|
|
}
|
|
printf("cmd_exit=\044?; ")
|
|
printf("echo; ")
|
|
printf("if [ \044cmd_exit -eq 0 -a \"%s\" = \"NO\" ] ", hit)
|
|
printf("|| [ \044cmd_exit -ne 0 -a \"%s\" = \"YES\" ] ", hit)
|
|
printf("; then STATUS=\"failed\"; fi; \n")
|
|
}
|
|
}' $TESTDIR/evaltest.dat` >> $CONSOLE_LOG 2>&1
|
|
|
|
|
|
##########################################################################
|
|
# set counters
|
|
#
|
|
|
|
if [ $STATUS = "failed" ]
|
|
then
|
|
let "failed_cnt += 1"
|
|
else
|
|
let "passed_cnt += 1"
|
|
fi
|
|
|
|
|
|
##########################################################################
|
|
# log statusall and listall output
|
|
# get copies of ipsec.conf, ipsec.secrets
|
|
# create index.html for the given test case
|
|
|
|
cat > $TESTRESULTDIR/index.html <<@EOF
|
|
<html>
|
|
<head>
|
|
<title>Test $testname</title>
|
|
</head>
|
|
<body>
|
|
<table border="0" width="600">
|
|
<tr><td>
|
|
<h2>Test $testname</h2>
|
|
<h3>Description</h3>
|
|
@EOF
|
|
|
|
cat $TESTDIR/description.txt >> $TESTRESULTDIR/index.html
|
|
|
|
cat >> $TESTRESULTDIR/index.html <<@EOF
|
|
<ul>
|
|
<li><a href="console.log">console.log</a></li>
|
|
</ul>
|
|
<img src="../images/$DIAGRAM" alt="$UMLHOSTS">
|
|
@EOF
|
|
|
|
for host in $IPSECHOSTS
|
|
do
|
|
eval HOSTLOGIN=root@\$ipv4_${host}
|
|
|
|
for command in statusall listall
|
|
do
|
|
ssh $HOSTLOGIN ipsec $command \
|
|
> $TESTRESULTDIR/${host}.$command 2>/dev/null
|
|
done
|
|
|
|
for file in ipsec.conf ipsec.secrets
|
|
do
|
|
scp $HOSTLOGIN:/etc/$file \
|
|
$TESTRESULTDIR/${host}.$file > /dev/null 2>&1
|
|
done
|
|
|
|
cat >> $TESTRESULTDIR/index.html <<@EOF
|
|
<h3>$host</h3>
|
|
<ul>
|
|
<li><a href="$host.ipsec.conf">ipsec.conf</a></li>
|
|
<li><a href="$host.ipsec.secrets">ipsec.secrets</a></li>
|
|
<li><a href="$host.statusall">ipsec statusall</a></li>
|
|
<li><a href="$host.listall">ipsec listall</a></li>
|
|
<li><a href="$host.auth.log">auth.log</a></li>
|
|
</ul>
|
|
@EOF
|
|
|
|
done
|
|
|
|
cat >> $TESTRESULTDIR/index.html <<@EOF
|
|
</td></tr>
|
|
<tr><td align="right">
|
|
<b><a href="../index.html">Back</a></b>
|
|
</td></tr>
|
|
</table>
|
|
</body>
|
|
</html>
|
|
@EOF
|
|
|
|
|
|
##########################################################################
|
|
# execute post-test commands
|
|
#
|
|
|
|
cecho-n "post.."
|
|
echo -e "\nPOST-TEST\n" >> $CONSOLE_LOG 2>&1
|
|
|
|
eval `awk -F "::" '{
|
|
if ($2 != "")
|
|
{
|
|
printf("echo \"%s# %s\"; ", $1, $2)
|
|
printf("ssh root@\044ipv4_%s \"%s\"; ", $1, $2)
|
|
printf("echo;\n")
|
|
}
|
|
}' $TESTDIR/posttest.dat` >> $CONSOLE_LOG 2>&1
|
|
|
|
|
|
##########################################################################
|
|
# get a copy of /var/log/auth.log
|
|
#
|
|
|
|
for host in $IPSECHOSTS
|
|
do
|
|
eval HOSTLOGIN=root@\$ipv4_${host}
|
|
ssh $HOSTLOGIN grep pluto /var/log/auth.log \
|
|
> $TESTRESULTDIR/${host}.auth.log
|
|
echo >> $TESTRESULTDIR/${host}.auth.log
|
|
ssh $HOSTLOGIN grep charon /var/log/auth.log \
|
|
>> $TESTRESULTDIR/${host}.auth.log
|
|
done
|
|
|
|
|
|
##########################################################################
|
|
# stop tcpdump if necessary
|
|
#
|
|
|
|
for host in $TCPDUMPHOSTS
|
|
do
|
|
if [ "`eval echo \\\$TDUP_${host}`" = "true" ]
|
|
then
|
|
echo "${host}# killall tcpdump" >> $CONSOLE_LOG
|
|
eval ssh root@\$ipv4_$host killall tcpdump
|
|
eval TDUP_${host}="false"
|
|
fi
|
|
done
|
|
|
|
|
|
##########################################################################
|
|
# copy default host config back if necessary
|
|
#
|
|
|
|
$DIR/scripts/restore-defaults $testname
|
|
|
|
|
|
##########################################################################
|
|
# write test status to html file
|
|
#
|
|
|
|
cecho "$STATUS"
|
|
if [ $STATUS = "passed" ]
|
|
then
|
|
COLOR="green"
|
|
else
|
|
COLOR="red"
|
|
fi
|
|
|
|
cat >> $TESTRESULTSHTML << @EOF
|
|
<tr>
|
|
<td>$testnumber</td>
|
|
<td><a href="$testname/">$testname</a></td>
|
|
<td><a href="$testname/console.log"><font color="$COLOR">$STATUS</font></a></td>
|
|
</tr>
|
|
@EOF
|
|
|
|
done
|
|
done
|
|
|
|
|
|
##############################################################################
|
|
# finish the results html file
|
|
#
|
|
|
|
cat >> $TESTRESULTSHTML << @EOF
|
|
</table>
|
|
<p>
|
|
<b>Passed: $passed_cnt</b><br>
|
|
<b>Failed: $failed_cnt</b><br>
|
|
<p>
|
|
</body>
|
|
</html>
|
|
@EOF
|
|
|
|
cecho ""
|
|
cecho "Passed: $passed_cnt"
|
|
cecho "Failed: $failed_cnt"
|
|
cecho ""
|
|
|
|
|
|
##############################################################################
|
|
# copy the test results to the apache server
|
|
#
|
|
|
|
HTDOCS="/var/www/localhost/htdocs"
|
|
|
|
cecho-n "Copying test results to winnetou.."
|
|
ssh root@${ipv4_winnetou} mkdir -p $HTDOCS/testresults > /dev/null 2>&1
|
|
scp -r $TODAYDIR root@${ipv4_winnetou}:$HTDOCS/testresults > /dev/null 2>&1
|
|
ssh root@${ipv4_winnetou} ln -s $HTDOCS/images $HTDOCS/testresults/$TESTDATE/images > /dev/null 2>&1
|
|
cecho "done"
|
|
cecho ""
|
|
cecho "The results are available in $TODAYDIR"
|
|
cecho "or via the link http://$ipv4_winnetou/testresults/$TESTDATE"
|