#! /bin/sh

#
# Copyright Rainer Wichmann (2015)
#
# License Information:
# 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.
#
# 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.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#

LOGFILE="$PW_DIR/.samhain_log"; export LOGFILE
RCFILE="$PW_DIR/testrc_2";  export RCFILE

SERVER_BUILDOPTS="--quiet  $TRUST --enable-network=server --prefix=$PW_DIR --localstatedir=$PW_DIR --with-config-file=REQ_FROM_SERVER$PW_DIR/testrc_2 --with-data-file=REQ_FROM_SERVER$PW_DIR/.samhain_file --with-logserver=${SH_LOCALHOST}  --with-log-file=$PW_DIR/.samhain_log --with-pid-file=$PW_DIR/.samhain_lock --enable-debug=gdb --enable-static"; export SERVER_BUILDOPTS

CLIENT_BUILDOPTS="--quiet  $TRUST --enable-network=client --enable-srp --prefix=$PW_DIR --with-tmp-dir=$PW_DIR --localstatedir=$PW_DIR --with-config-file=REQ_FROM_SERVER$RCFILE --with-data-file=REQ_FROM_SERVER$PW_DIR/.samhain_file  --with-log-file=$LOGFILE --with-pid-file=$PW_DIR/.samhain_lock --enable-static"; export CLIENT_BUILDOPTS

TEST_DIRS="one two three four"
TEST_FILES="change leave rmthis"
BASE="/tmp/testrun_samhain"

TEST_LIST="./tmp_list_file"

ALTHOST=`find_hostname`

PROC_S=0; export PROC_S
PROC_Y=0; export PROC_Y

mod_files ()
{
    rm -f "${TEST_LIST}"
    touch "${TEST_LIST}"
    #
    for dd in ${TEST_DIRS}; do
	echo "changed" > "${BASE}/$dd/change"
	rm -f "${BASE}/$dd/rmthis"
	echo "added" > "${BASE}/$dd/addedthis"
	echo "${BASE}/$dd"           >> "${TEST_LIST}"
	echo "${BASE}/$dd/change"    >> "${TEST_LIST}"
	echo "${BASE}/$dd/rmthis"    >> "${TEST_LIST}"
	echo "${BASE}/$dd/addedthis" >> "${TEST_LIST}"
    done
}

do_test_2_g_yule_start () {

	[ -z "$verbose" ] || { 
	    echo; 
	    echo "${S}Start Server${E}: ./yule -l info -p none &"; 
	    echo; 
	}
	rm -f test_log_valgrind

 	# SetSocketAllowUid=$(id -u)
	#
	if test -f /usr/xpg4/bin/id; then
	    MY_ID=$(/usr/xpg4/bin/id -u)
	else
	    MY_ID=$(id -u)
	fi
	#
	sed -i -e "s/SetSocketAllowUid=0/SetSocketAllowUid=${MY_ID}/g" $RCFILE

	# Start server
	#
	${VALGRIND} ./yule -l info -p none >/dev/null 2>>test_log_valgrind &
	PROC_Y=$!
	five_sec_sleep


	[ -z "$verbose" ] || { 
	    echo; 
	    echo "${S}Start Client${E}: ./samhain.new -t check -D .. &"; 
	    echo; 
	}
	${VALGRIND} ./samhain.new -t check -D -p none -l none -e info --bind-address=127.0.0.1 --server-host=localhost >/dev/null 2>>test_log_valgrind 
	if test x$? = x0; then
	    [ -z "$verbose" ] || log_msg_ok    "starting samhain.new";
	else
	    [ -z "$quiet" ]   && log_msg_fail  "starting samhain.new";
	    kill $PROC_Y
	    return 1
	fi
	five_sec_sleep
	PROC_S=$(  ps aux | grep samhain.new | grep -v grep | awk '{ print $2; }' | sort | head -n 1 )

	for ff in 1 2; do
	    five_sec_sleep
	done
	egrep "File check completed" $LOGFILE >/dev/null 2>&1
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	NR=$( egrep "File check completed" $LOGFILE | wc -l )
	if [ $NR -ne 1 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check (1)";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	return 0
}

do_test_2_g_two () {

	#
	# >>> Modify files
	#
	mod_files
	#
	if ! test -f ${TEST_LIST}; then
	    [ -z "$verbose" ] || log_msg_fail "No file list created";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	#
	#
	# >>> Trigger a scan
	#
	kill -TTOU $PROC_S
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Kill -TTOU";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	for ff in 1 2 3; do
	    five_sec_sleep
	done
	NR=$( egrep "File check completed" $LOGFILE | wc -l )
	if [ $NR -ne 2 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check (2)";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	[ -z "$verbose" ] || log_msg_ok    "sigttou";

	NR=$( egrep "POLICY" $LOGFILE | grep ReadOnly | wc -l )
	if [ $NR -ne 8 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check (ReadOnly)";  
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	NR=$( egrep "POLICY" $LOGFILE | grep ADDED | wc -l )
	if [ $NR -ne 4 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check (added)";  
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	NR=$( egrep "POLICY" $LOGFILE | grep MISSING | wc -l )
	if [ $NR -ne 4 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check (removed)";  
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	kill $PROC_S; 
	kill $PROC_Y;
	return 0
}

do_test_2_g_one () {

	#
	# >>> (1) Modify files, create DeltaDB from file list in ${TEST_LIST}
	#
	mod_files
	#
	if ! test -f ${TEST_LIST}; then
	    [ -z "$verbose" ] || log_msg_fail "No file list created";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	#
	./samhain.new --outfile ./file.delta --create-database "${TEST_LIST}"
	#
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Create DeltaDB";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	if ! test -f ./file.delta; then
	    [ -z "$verbose" ] || log_msg_fail "No DeltaDB created";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	#
	# >>> (2) Copy to server and tag with a UUID
	#
	UUID=$(uuidgen)
	mv ./file.delta file.${SH_LOCALHOST}.${UUID}
	if [ "x${SH_LOCALHOST}" != "x${ALTHOST}" ]
	then
	    cp file.${SH_LOCALHOST}.${UUID} "./file.${ALTHOST}.${UUID}"
	fi
	
	#
	# >>> (3) Tell client to load delta database.
	# >>>     testrc_2: timestamps every 10 sec
	#
	grep '^SetLoopTime=10$' rc.${SH_LOCALHOST} >/dev/null 2>&1
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "SetLoopTime != 10 in rc.${SH_LOCALHOST}";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	grep '^SetLoopTime=10$' rc.${ALTHOST} >/dev/null 2>&1
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "SetLoopTime != 10 in rc.${ALTHOST}";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	NHOSTS=1
	
	./yulectl -c "DELTA:${UUID}" ${SH_LOCALHOST}
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "yulectl (1)";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	if [ "x${SH_LOCALHOST}" != "x${ALTHOST}" ]
	then
	    ./yulectl -c "DELTA:${UUID}" ${ALTHOST}
	    NHOSTS=2
	    if [ $? -ne 0 ]; then
		[ -z "$verbose" ] || log_msg_fail "yulectl (2)";
		kill $PROC_S; kill $PROC_Y;
		return 1
	    fi
	fi
	
	NR=$( ./yulectl -c LIST | grep ${UUID} | grep -v grep | wc -l )
	if [ $NR -ne $NHOSTS ]; then
	    [ -z "$verbose" ] || log_msg_fail "yulectl (3)";
	    [ -z "$verbose" ] || ./yulectl -c LIST
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	# Wait and verify that command has been sent
	#
	for tt in 1 2 3 4; do
	    five_sec_sleep
	done
	#
	NR=$( ./yulectl -c LISTALL | grep ${UUID} | grep SENT | grep -v grep | wc -l )
	# NR=$( ./yulectl -c LIST | grep ${UUID} | grep -v grep | wc -l )
	if [ $NR -ne 1 ]; then
	    [ -z "$verbose" ] || log_msg_fail "yulectl (4)";
	    [ -z "$verbose" ] || ./yulectl -c LISTALL
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	#
	# >>> (4) Trigger a scan
	#
	kill -TTOU $PROC_S
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Kill -TTOU";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	for ff in 1 2; do
	    five_sec_sleep
	done
	NR=$( egrep "File check completed" $LOGFILE | wc -l )
	if [ $NR -ne 2 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check (2)";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	[ -z "$verbose" ] || log_msg_ok    "sigttou";

	NR=$( egrep "POLICY" $LOGFILE | wc -l )
	if [ $NR -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check (3)";  
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	# --- The End ---

	kill $PROC_S; 
	kill $PROC_Y
	return 0
}

do_test_2_g_three () {

	#
	# >>> (1) Modify files, create DeltaDB from file list in ${TEST_LIST}
	#
	mod_files
	#
	if ! test -f ${TEST_LIST}; then
	    [ -z "$verbose" ] || log_msg_fail "No file list created";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	#
	./samhain.new --outfile ./file.delta --create-database "${TEST_LIST}"
	#
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Create DeltaDB";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	if ! test -f ./file.delta; then
	    [ -z "$verbose" ] || log_msg_fail "No DeltaDB created";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	[ -z "$verbose" ] || log_msg_ok    "... DeltaDB created ...";
	
	#
	# >>> (2) Copy to server and tag with a UUID
	#
	UUID=$(uuidgen)
	if [ x"$1" != "xnosig" ]; then
	    scripts/samhainadmin.pl -k 8A0B337A -m E ./file.delta >/dev/null
	fi
	if [ x"$1" == "xnodelta" ]; then
	    rm -f ./file.*
	else
	    mv ./file.delta file.${SH_LOCALHOST}.${UUID}
	    if [ "x${SH_LOCALHOST}" != "x${ALTHOST}" ]
	    then
		cp file.${SH_LOCALHOST}.${UUID} "./file.${ALTHOST}.${UUID}"
	    fi
	fi
	[ -z "$verbose" ] || log_msg_ok    "... DeltaDB copied as file.${SH_LOCALHOST}.${UUID} ...";
	
	#
	# >>> (3) Tell client to load delta database.
	# >>>     testrc_2: timestamps every 10 sec
	#
	grep '^SetLoopTime=10$' rc.${SH_LOCALHOST} >/dev/null 2>&1
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "SetLoopTime != 10 in rc.${SH_LOCALHOST}";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	grep '^SetLoopTime=10$' rc.${ALTHOST} >/dev/null 2>&1
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "SetLoopTime != 10 in rc.${ALTHOST}";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	NHOSTS=1
	
	./yulectl -c "DELTA:${UUID}" ${SH_LOCALHOST}
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "yulectl (1)";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	
	if [ "x${SH_LOCALHOST}" != "x${ALTHOST}" ]
	then
	    ./yulectl -c "DELTA:${UUID}" ${ALTHOST}
	    NHOSTS=2
	    if [ $? -ne 0 ]; then
		[ -z "$verbose" ] || log_msg_fail "yulectl (2)";
		kill $PROC_S; kill $PROC_Y;
		return 1
	    fi
	fi
	
	NR=$( ./yulectl -c LIST | grep ${UUID} | grep -v grep | wc -l )
	if [ $NR -ne $NHOSTS ]; then
	    [ -z "$verbose" ] || log_msg_fail "yulectl (3)";
	    [ -z "$verbose" ] || ./yulectl -c LIST
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	[ -z "$verbose" ] || log_msg_ok    "... command sent to client ...";

	# Wait and verify that command has been sent
	#
	for tt in 1 2 3 4; do
	    five_sec_sleep
	done
	#
	NR=$( ./yulectl -c LISTALL | grep ${UUID} | grep SENT | grep -v grep | wc -l )
	if [ $NR -ne 1 ]; then
	    [ -z "$verbose" ] || log_msg_fail "yulectl (4): ${UUID}";
	    [ -z "$verbose" ] || ./yulectl -c LISTALL
	    [ -z "$verbose" ] || echo "(now just LIST)"
	    [ -z "$verbose" ] || ./yulectl -c LIST
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	[ -z "$verbose" ] || OLINE=$( ./yulectl -c LISTALL | grep ${UUID} )
	[ -z "$verbose" ] || echo "${OLINE}"

	#
	# >>> (4) Trigger a scan
	#
	kill -TTOU $PROC_S
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Kill -TTOU";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	[ -z "$verbose" ] || echo    " ... TTOU sent to /${PROC_S}/ ...";
	
	for ff in 1 2; do
	    five_sec_sleep
	done
	if [ x"$1" != x ]; then
	    if [ x"$1" = xnodelta ]; then
		NR=$( egrep "File download failed" $LOGFILE | wc -l )
	    else
		NR=$( egrep "No good signature" $LOGFILE | wc -l )
	    fi
	    if [ $NR -ne 1 ]; then
		[ -z "$verbose" ] || log_msg_fail "Client file check (expected fail)";
		kill $PROC_S; kill $PROC_Y;
		return 1
	    else
		[ -z "$verbose" ] || log_msg_ok "Client file check (expected fail)";
		kill $PROC_S; kill $PROC_Y;
		return 0
	    fi
	fi

	NR=$( egrep "File check completed" $LOGFILE | wc -l )
	if [ $NR -ne 2 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check (2)";
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi
	[ -z "$verbose" ] || log_msg_ok    "sigttou";

	NR=$( egrep "POLICY" $LOGFILE | wc -l )
	if [ $NR -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "Client file check (3)";  
	    kill $PROC_S; kill $PROC_Y;
	    return 1
	fi

	# --- The End ---

	kill $PROC_S; 
	kill $PROC_Y
	return 0
}

testrun2g_prepare ()
{
	#####################################################################
	#
	# Create test area and initialize database
	#
	rm -f ./.samhain_file
	rm -f ./.samhain_log
	rm -f ./.samhain_lock
	rm -f ./rc.${SH_LOCALHOST}
	rm -f ./rc.${ALTHOST}
	rm -f ./file.*
	#
	rm -rf ${BASE}
	#
	mkdir ${BASE} 2>/dev/null
	for dd in ${TEST_DIRS}; do
	    mkdir ${BASE}/$dd
	    for ff in ${TEST_FILES}; do
		echo "foobar" > ${BASE}/$dd/$ff
	    done
	done
	#
	./samhain.build -t init -p none

	if test x$? = x0; then
	    [ -z "$verbose" ] || log_msg_ok    "init...";
	else
	    [ -z "$quiet" ]   && log_msg_fail  "init...";
	    return 1
	fi
}

testrun2g_build ()
{
        [ -z "$verbose" ] || { 
	    echo; 
	    echo Working directory: $PW_DIR; echo MAKE is $MAKE; 
	    echo; 
	}
	#
	#
	[ -z "$verbose" ] || { echo; echo "${S}Building client and server${E}"; echo; }
	#
	if test -r "Makefile"; then
		$MAKE distclean
	fi
	#
	${TOP_SRCDIR}/configure ${CLIENT_BUILDOPTS} $1 $2 >/dev/null 2>&1
	#
	if test x$? = x0; then
		[ -z "$verbose" ] ||     log_msg_ok "configure..."; 
		$MAKE > /dev/null 2>>test_log
		if test x$? = x0; then
		    [ -z "$verbose" ] || log_msg_ok "make..."; 
		else
		    [ -z "$quiet" ] &&   log_msg_fail "make..."; 
		    return 1
		fi

	else
		[ -z "$quiet" ] &&       log_msg_fail "configure...";
		return 1
	fi

	# save binary and build server
	#
	cp samhain samhain.build || return 1
	if test -f scripts/samhainadmin.pl
	then
	    cp scripts/samhainadmin.pl  scripts/xxx_samhainadmin.pl
	fi
	$MAKE clean >/dev/null || return 1

	${TOP_SRCDIR}/configure ${SERVER_BUILDOPTS}
	#
	if test x$? = x0; then
		[ -z "$verbose" ] ||     log_msg_ok "configure..."; 
		$MAKE  > /dev/null 2>>test_log
		if test x$? = x0; then
		    [ -z "$verbose" ] || log_msg_ok "make..."; 
		else
		    [ -z "$quiet" ] &&   log_msg_fail "make..."; 
		    return 1
		fi

	else
		[ -z "$quiet" ] &&       log_msg_fail "configure...";
		return 1
	fi

	# Create a password

	SHPW=`./yule -G`
	if test x"$SHPW" = x; then
	    [ -z "$quiet" ]   && log_msg_fail  "password not generated -- aborting"
	    return 1
	fi

	# Set in client

	./samhain_setpwd samhain.build new $SHPW >/dev/null

	if test x$? = x0; then
	    [ -z "$verbose" ] || log_msg_ok    "./samhain_setpwd samhain.build new $SHPW";
	else
	    [ -z "$quiet" ]   && log_msg_fail  "./samhain_setpwd samhain.build new $SHPW";
	    return 1
	fi

	mv samhain.build.new  samhain.new || return 1
	if test -f scripts/xxx_samhainadmin.pl
	then
	    cp scripts/xxx_samhainadmin.pl  scripts/samhainadmin.pl
	fi

	rm -f ./.samhain_log*
	rm -f ./.samhain_lock

	SHCLT=`./yule -P $SHPW`

	if test x$? = x0; then
	    [ -z "$verbose" ] || log_msg_ok    "yule -P $SHPW";
	else
	    [ -z "$quiet" ]   && log_msg_fail  "yule -P $SHPW";
	    return 1
	fi

	SHCLT1=`echo "${SHCLT}"  | sed s%HOSTNAME%${SH_LOCALHOST}%`
	AHOST=`find_hostname`
	SHCLT2=`echo "${SHCLT}"  | sed s%HOSTNAME%${AHOST}%`
	
	cp ${SCRIPTDIR}/testrc_2.in testrc_2
	#
	sed --in-place -e 's,file = /tmp,dir = 99/tmp/testrun_samhain,g' testrc_2
	# 
	sed --in-place -e 's,SetUdpActive=no,ReportCheckflags=yes,g' testrc_2
	#
 	echo $SHCLT1 >> testrc_2
 	echo $SHCLT2 >> testrc_2

	echo $SHPW > ./testpw
}

testrun2g_signrc ()
{
    scripts/samhainadmin.pl  -m R $1 >/dev/null
    scripts/samhainadmin.pl  -k 8A0B337A -m E $1 >/dev/null
}

testrun2g_signdb ()
{
    scripts/samhainadmin.pl  -k 8A0B337A -m E ./.samhain_file >/dev/null
}

copy_rc_db_files ()
{
	cp    ./testrc_2       ./rc.${SH_LOCALHOST}
	mv    ./.samhain_file  ./file.${SH_LOCALHOST}
	if [ $? -ne 0 ]; then
	    [ -z "$verbose" ] || log_msg_fail "No .samhain_file";
	    return 1
	fi
	chmod 644 ./rc.${SH_LOCALHOST}
	chmod 644 ./file.${SH_LOCALHOST}

	if [ "x${SH_LOCALHOST}" != "x${ALTHOST}" ]
	then
	    cp    ./testrc_2       "./rc.${ALTHOST}"
	    cp    ./file.${SH_LOCALHOST} "./file.${ALTHOST}" 2>/dev/null
	    chmod 644 ./rc.${ALTHOST}
	    chmod 644 ./file.${ALTHOST}
	fi
}

MAXTEST=6; export MAXTEST

testrun2g ()
{
    log_start "RUN CLIENT/SERVER CASE TWO";
    #
    if [ x"$1" = x ]; then
	[ -z "$quiet" ] && log_msg_fail "Missing hostname"
    fi
    #
    SH_LOCALHOST=$1; export SH_LOCALHOST
    #


    # Test with missing delta
    #
    gpg --list-keys | grep 8A0B337A >/dev/null 2>&1
    if [ $? -ne 0 ]; then
	echo "You need to do 'gpg --import test/gnupg/public-key.asc' first"
	log_skip 1 $MAXTEST 'Case Two w/signed files'
    else
	testrun2g_build "--with-gpg=/usr/bin/gpg" "--with-keyid=0x8A0B337A"
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "build..";
	    testrun2g_signrc ./testrc_2
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "sign rc..";
	    testrun2g_prepare
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "prepare..";
	    testrun2g_signdb
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "sign db..";
	    copy_rc_db_files
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "copy..";
	    do_test_2_g_yule_start
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "start yule..";
	    do_test_2_g_three nodelta
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$quiet" ] && log_ok   1 ${MAXTEST} "Case Two w/missing delta";
	else
	    [ -z "$quiet" ] && log_fail 1 ${MAXTEST} "Case Two w/missing delta";
	fi
    fi

    # Test with unsigned delta
    #
    gpg --list-keys | grep 8A0B337A >/dev/null 2>&1
    if [ $? -ne 0 ]; then
	echo "You need to do 'gpg --import test/gnupg/public-key.asc' first"
	log_skip 1 $MAXTEST 'Case Two w/signed files'
    else
	testrun2g_build "--with-gpg=/usr/bin/gpg" "--with-keyid=0x8A0B337A"
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "build..";
	    testrun2g_signrc ./testrc_2
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "sign rc..";
	    testrun2g_prepare
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "prepare..";
	    testrun2g_signdb
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "sign db..";
	    copy_rc_db_files
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "copy..";
	    do_test_2_g_yule_start
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "start yule..";
	    do_test_2_g_three nosig
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$quiet" ] && log_ok   1 ${MAXTEST} "Case Two w/unsigned delta";
	else
	    [ -z "$quiet" ] && log_fail 1 ${MAXTEST} "Case Two w/unsigned delta";
	fi
    fi

    # Test with signed files, no sig client
    #
    gpg --list-keys | grep 8A0B337A >/dev/null 2>&1
    if [ $? -ne 0 ]; then
	echo "You need to do 'gpg --import test/gnupg/public-key.asc' first"
	log_skip 1 $MAXTEST 'Case Two w/signed files'
    else
	testrun2g_build
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "build..";
	    testrun2g_signrc ./testrc_2
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "sign rc..";
	    testrun2g_prepare
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "prepare..";
	    testrun2g_signdb
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "sign db..";
	    copy_rc_db_files
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "copy..";
	    do_test_2_g_yule_start
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "start yule..";
	    do_test_2_g_three
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$quiet" ] && log_ok   1 ${MAXTEST} "Case Two w/signed files+nosig client";
	else
	    [ -z "$quiet" ] && log_fail 1 ${MAXTEST} "Case Two w/signed files+nosig client";
	fi
    fi

    # Test with signed files
    #
    gpg --list-keys | grep 8A0B337A >/dev/null 2>&1
    if [ $? -ne 0 ]; then
	echo "You need to do 'gpg --import test/gnupg/public-key.asc' first"
	log_skip 1 $MAXTEST 'Case Two w/signed files'
    else
	testrun2g_build "--with-gpg=/usr/bin/gpg" "--with-keyid=0x8A0B337A"
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "build..";
	    testrun2g_signrc ./testrc_2
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "sign rc..";
	    testrun2g_prepare
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "prepare..";
	    testrun2g_signdb
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "sign db..";
	    copy_rc_db_files
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "copy..";
	    do_test_2_g_yule_start
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$verbose" ] || log_msg_ok    "start yule..";
	    do_test_2_g_three
	fi
	if [ $? -eq 0 ]; then
	    [ -z "$quiet" ] && log_ok   1 ${MAXTEST} "Case Two w/signed files";
	else
	    [ -z "$quiet" ] && log_fail 1 ${MAXTEST} "Case Two w/signed files";
	fi
    fi

    # Test with non-signed files
    #
    testrun2g_build
    if [ $? -eq 0 ]; then
	[ -z "$verbose" ] || log_msg_ok    "build..";
	testrun2g_prepare
    fi
    if [ $? -eq 0 ]; then
	[ -z "$verbose" ] || log_msg_ok    "prepare..";
	copy_rc_db_files
    fi
    if [ $? -eq 0 ]; then
	[ -z "$verbose" ] || log_msg_ok    "copy..";
	do_test_2_g_yule_start
    fi
    if [ $? -eq 0 ]; then
	[ -z "$verbose" ] || log_msg_ok    "start yule..";
	do_test_2_g_one
    fi
    if [ $? -eq 0 ]; then
	[ -z "$quiet" ] && log_ok   2 ${MAXTEST} "Case Two w/unsigned files";
    else
	[ -z "$quiet" ] && log_fail 2 ${MAXTEST} "Case Two w/unsigned files";
    fi



    #
    testrun2g_prepare
    if [ $? -eq 0 ]; then
	[ -z "$verbose" ] || log_msg_ok    "prepare..";
	copy_rc_db_files
    fi
    if [ $? -eq 0 ]; then
	[ -z "$verbose" ] || log_msg_ok    "copy..";
	do_test_2_g_yule_start
    fi
    if [ $? -eq 0 ]; then
	[ -z "$verbose" ] || log_msg_ok    "start yule..";
	do_test_2_g_two
    fi
    if [ $? -eq 0 ]; then
	[ -z "$quiet" ] && log_ok   3 ${MAXTEST} "Case Two w/o delta";
    else
	[ -z "$quiet" ] && log_fail 3 ${MAXTEST} "Case Two w/o delta";
    fi

    if test -f scripts/xxx_samhainadmin.pl
    then
	rm -f scripts/xxx_samhainadmin.pl
    fi


    log_end "RUN CLIENT/SERVER CASE TWO"
}
