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
|
#!/bin/sh
TEST_DIR=/tmp/portsentry-test
SRC_DIR=""
PORTSENTRY_EXEC=""
PORTSENTRY_CONF=""
PORTSENTRY_TEST=""
PORTSENTRY_SCRIPT=""
PORTSENTRY_HOOK_PRE_SETUP=""
log() {
echo "$@"
}
debug() {
if [ -z "$DEBUG" ]; then
return
fi
log "DEBUG: $@"
}
init() {
if [ "$(whoami)" != "root" ]; then
echo "Need root to run"
exit 1
fi
if [ $# -lt 2 ]; then
echo "Usage: $0 <portsentry binary> <directory containing test files>"
exit 1
fi
PORTSENTRY_EXEC=$1
SRC_DIR=$2
PORTSENTRY_CONF=$SRC_DIR/portsentry.conf
PORTSENTRY_TEST=$SRC_DIR/portsentry.test
PORTSENTRY_SCRIPT=$SRC_DIR/test.sh
PORTSENTRY_HOOK_PRE_SETUP=$SRC_DIR/hook_pre_setup.sh
if [ ! -x $PORTSENTRY_EXEC ]; then
echo "Error: portsentry executable file: $PORTSENTRY_EXEC not found or not executable"
exit 1
fi
if [ ! -f $PORTSENTRY_CONF ]; then
echo "Error: portsentry config: $PORTSENTRY_CONF not found"
exit 1
fi
if [ ! -f $PORTSENTRY_TEST ]; then
echo "Error: portsentry test file: $PORTSENTRY_TEST not found"
exit 1
fi
if [ ! -x $PORTSENTRY_SCRIPT ]; then
echo "Error: portsentry script file: $PORTSENTRY_SCRIPT not found or not executable"
exit 1
fi
}
hook_pre_setup() {
if [ -x $PORTSENTRY_HOOK_PRE_SETUP ]; then
. $PORTSENTRY_HOOK_PRE_SETUP
fi
}
setup() {
rm -rf $TEST_DIR
mkdir -p $TEST_DIR
cp $PORTSENTRY_EXEC $TEST_DIR
cp $(dirname $PORTSENTRY_EXEC)/portcon $TEST_DIR
cp $PORTSENTRY_CONF $TEST_DIR
cp $PORTSENTRY_TEST $TEST_DIR
cp $PORTSENTRY_SCRIPT $TEST_DIR
cp ./testlib.sh $TEST_DIR/testlib.sh
[ -f $SRC_DIR/portsentry.ignore ] && cp $SRC_DIR/portsentry.ignore $TEST_DIR/
PORTSENTRY_EXEC=$TEST_DIR/$(basename $PORTSENTRY_EXEC)
PORTSENTRY_CONF=$TEST_DIR/$(basename $PORTSENTRY_CONF)
PORTSENTRY_TEST=$TEST_DIR/$(basename $PORTSENTRY_TEST)
PORTSENTRY_SCRIPT=$TEST_DIR/$(basename $PORTSENTRY_SCRIPT)
PORTSENTRY_STDOUT=$TEST_DIR/portsentry.stdout
PORTSENTRY_STDERR=$TEST_DIR/portsentry.stderr
debug "PORTSENTRY_EXEC: $PORTSENTRY_EXEC"
debug "PORTSENTRY_CONF: $PORTSENTRY_CONF"
debug "PORTSENTRY_TEST: $PORTSENTRY_TEST"
debug "PORTSENTRY_SCRIPT: $PORTSENTRY_SCRIPT"
}
run_portsentry() {
local switches="$(head -n 1 $PORTSENTRY_TEST)"
debug "switches: $switches"
if echo $switches | grep -q "pcap" && ! ldd $PORTSENTRY_EXEC | grep -q "libpcap\.so"; then
log "pcap test detected on portsentry binary without pcap support, skipping"
exit 0
fi
cd $TEST_DIR
$PORTSENTRY_EXEC -c $PORTSENTRY_CONF $switches > $PORTSENTRY_STDOUT 2>$PORTSENTRY_STDERR &
local timeout=5
while [ ! -f $PORTSENTRY_STDOUT ]; do
debug "waiting for $PORTSENTRY_STDOUT to be created"
sleep 1
timeout=$((timeout - 1))
if [ $timeout -eq 0 ]; then
echo "Error: Timeout waiting for $PORTSENTRY_STDOUT to be created"
exit 1
fi
done
timeout=5
while [ $timeout -gt 0 ]; do
debug "waiting for portsentry to report ready in $PORTSENTRY_STDOUT"
if grep -q "Portsentry is now active and listening." $PORTSENTRY_STDOUT; then
return
fi
sleep 1
timeout=$((timeout - 1))
done
echo "Error: Unable to parse portsentry ready message, aborting"
report_and_stop
exit 1
}
stop_portsentry() {
local pid="$(ps auxww|grep "$PORTSENTRY_EXEC -c $PORTSENTRY_CONF $switches"|grep -v grep | awk '{print $2}')"
debug "Stopping portsentry with pid: $pid"
if [ -n "$pid" ]; then
kill $pid
return
fi
timeout=5
while [ $timeout -gt 0 ]; do
debug "waiting for portsentry to stop $PORTSENTRY_STDOUT"
if grep -q "Portsentry is shutting down" $PORTSENTRY_STDOUT; then
return
fi
sleep 1
timeout=$((timeout - 1))
done
echo "Error: Unable to parse portsentry stop message, aborting"
exit 1
}
report_and_stop() {
echo "Detected test failure, stopping portsentry, printing portsentry run log and exit"
stop_portsentry
echo "#### PORTSENTRY STDOUT ####"
cat $PORTSENTRY_STDOUT
echo
echo "#### PORTSENTRY STDERR ####"
cat $PORTSENTRY_STDERR
exit 1
}
run_test() {
cd $TEST_DIR
if ! $PORTSENTRY_SCRIPT $TEST_DIR $PORTSENTRY_EXEC $PORTSENTRY_CONF $PORTSENTRY_TEST $PORTSENTRY_SCRIPT $PORTSENTRY_STDOUT $PORTSENTRY_STDERR; then
report_and_stop
fi
}
init $@
hook_pre_setup
setup
run_portsentry
run_test
stop_portsentry
|