11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#	$OpenBSD: test-exec.sh,v 1.37 2010/02/24 06:21:56 djm Exp $
21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#	Placed in the Public Domain.
31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#SUDO=sudo
51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# Unbreak GNU head(1)
71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood_POSIX2_VERSION=199209
81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodexport _POSIX2_VERSION
91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodcase `uname -s 2>/dev/null` in
111305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodOSF1*)
121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	BIN_SH=xpg4
131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	export BIN_SH
141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	;;
151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodesac
161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ ! -z "$TEST_SSH_PORT" ]; then
181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PORT="$TEST_SSH_PORT"
191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodelse
201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PORT=4242
211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ -x /usr/ucb/whoami ]; then
241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	USER=`/usr/ucb/whoami`
251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodelif whoami >/dev/null 2>&1; then
261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	USER=`whoami`
271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodelif logname >/dev/null 2>&1; then
281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	USER=`logname`
291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodelse
301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	USER=`id -un`
311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
331305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodOBJ=$1
341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$OBJ" = "x" ]; then
351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo '$OBJ not defined'
361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	exit 2
371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ ! -d $OBJ ]; then
391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "not a directory: $OBJ"
401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	exit 2
411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
421305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSCRIPT=$2
431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$SCRIPT" = "x" ]; then
441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo '$SCRIPT not defined'
451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	exit 2
461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ ! -f $SCRIPT ]; then
481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "not a file: $SCRIPT"
491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	exit 2
501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif $TEST_SHELL -n $SCRIPT; then
521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	true
531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodelse
541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "syntax error in $SCRIPT"
551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	exit 2
561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodunset SSH_AUTH_SOCK
581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
591305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSRC=`dirname ${SCRIPT}`
601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# defaults
621305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSSH=ssh
631305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSSHD=sshd
641305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSSHAGENT=ssh-agent
651305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSSHADD=ssh-add
661305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSSHKEYGEN=ssh-keygen
671305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSSHKEYSCAN=ssh-keyscan
681305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSFTP=sftp
691305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSFTPSERVER=/usr/libexec/openssh/sftp-server
701305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodSCP=scp
711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# Interop testing
731305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodPLINK=plink
741305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodPUTTYGEN=puttygen
751305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodCONCH=conch
761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_SSH" != "x" ]; then
781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	SSH="${TEST_SSH_SSH}"
791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_SSHD" != "x" ]; then
811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	SSHD="${TEST_SSH_SSHD}"
821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_SSHAGENT" != "x" ]; then
841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	SSHAGENT="${TEST_SSH_SSHAGENT}"
851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_SSHADD" != "x" ]; then
871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	SSHADD="${TEST_SSH_SSHADD}"
881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_SSHKEYGEN" != "x" ]; then
901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	SSHKEYGEN="${TEST_SSH_SSHKEYGEN}"
911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_SSHKEYSCAN" != "x" ]; then
931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	SSHKEYSCAN="${TEST_SSH_SSHKEYSCAN}"
941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_SFTP" != "x" ]; then
961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	SFTP="${TEST_SSH_SFTP}"
971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_SFTPSERVER" != "x" ]; then
991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	SFTPSERVER="${TEST_SSH_SFTPSERVER}"
1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_SCP" != "x" ]; then
1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	SCP="${TEST_SSH_SCP}"
1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_PLINK" != "x" ]; then
1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# Find real binary, if it exists
1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case "${TEST_SSH_PLINK}" in
1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/*) PLINK="${TEST_SSH_PLINK}" ;;
1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	*) PLINK=`which ${TEST_SSH_PLINK} 2>/dev/null` ;;
1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	esac
1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
1111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_PUTTYGEN" != "x" ]; then
1121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# Find real binary, if it exists
1131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case "${TEST_SSH_PUTTYGEN}" in
1141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/*) PUTTYGEN="${TEST_SSH_PUTTYGEN}" ;;
1151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	*) PUTTYGEN=`which ${TEST_SSH_PUTTYGEN} 2>/dev/null` ;;
1161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	esac
1171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
1181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_CONCH" != "x" ]; then
1191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# Find real binary, if it exists
1201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	case "${TEST_SSH_CONCH}" in
1211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	/*) CONCH="${TEST_SSH_CONCH}" ;;
1221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	*) CONCH=`which ${TEST_SSH_CONCH} 2>/dev/null` ;;
1231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	esac
1241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
1251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# Path to sshd must be absolute for rexec
1271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodcase "$SSHD" in
1281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/*) ;;
1291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood*) SSHD=`which sshd` ;;
1301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodesac
1311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ "x$TEST_SSH_LOGFILE" = "x" ]; then
1331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	TEST_SSH_LOGFILE=/dev/null
1341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
1351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# these should be used in tests
1371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodexport SSH SSHD SSHAGENT SSHADD SSHKEYGEN SSHKEYSCAN SFTP SFTPSERVER SCP
1381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#echo $SSH $SSHD $SSHAGENT $SSHADD $SSHKEYGEN $SSHKEYSCAN $SFTP $SFTPSERVER $SCP
1391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# helper
1411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodechon()
1421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
1431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood       if [ "x`echo -n`" = "x" ]; then
1441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood               echo -n "$@"
1451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood       elif [ "x`echo '\c'`" = "x" ]; then
1461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood               echo "$@\c"
1471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood       else
1481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood               fatal "Don't know how to echo without newline."
1491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood       fi
1501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodhave_prog()
1531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
1541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	saved_IFS="$IFS"
1551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	IFS=":"
1561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	for i in $PATH
1571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	do
1581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if [ -x $i/$1 ]; then
1591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			IFS="$saved_IFS"
1601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			return 0
1611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		fi
1621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	done
1631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	IFS="$saved_IFS"
1641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	return 1
1651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodcleanup ()
1681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
1691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if [ -f $PIDFILE ]; then
1701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		pid=`$SUDO cat $PIDFILE`
1711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		if [ "X$pid" = "X" ]; then
1721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			echo no sshd running
1731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		else
1741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			if [ $pid -lt 2 ]; then
1751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				echo bad pid for ssh: $pid
1761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			else
1771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				$SUDO kill $pid
1781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				trace "wait for sshd to exit"
1791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				i=0;
1801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				while [ -f $PIDFILE -a $i -lt 5 ]; do
1811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood					i=`expr $i + 1`
1821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood					sleep $i
1831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				done
1841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				test -f $PIDFILE && \
1851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood				    fatal "sshd didn't exit port $PORT pid $pid"
1861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood			fi
1871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		fi
1881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	fi
1891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtrace ()
1921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
1931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "trace: $@" >>$TEST_SSH_LOGFILE
1941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if [ "X$TEST_SSH_TRACE" = "Xyes" ]; then
1951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		echo "$@"
1961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	fi
1971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
1981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
1991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodverbose ()
2001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
2011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "verbose: $@" >>$TEST_SSH_LOGFILE
2021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	if [ "X$TEST_SSH_QUIET" != "Xyes" ]; then
2031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		echo "$@"
2041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	fi
2051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodwarn ()
2081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
2091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "WARNING: $@" >>$TEST_SSH_LOGFILE
2101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "WARNING: $@"
2111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfail ()
2141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
2151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "FAIL: $@" >>$TEST_SSH_LOGFILE
2161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	RESULT=1
2171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "$@"
2181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfatal ()
2211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
2221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "FATAL: $@" >>$TEST_SSH_LOGFILE
2231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echon "FATAL: "
2241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	fail "$@"
2251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	cleanup
2261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	exit $RESULT
2271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# Check whether preprocessor symbols are defined in config.h.
2301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodconfig_defined ()
2311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
2321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	str=$1
2331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	while test "x$2" != "x" ; do
2341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		str="$str|$2"
2351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		shift
2361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	done
2371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	egrep "^#define.*($str)" ${BUILDDIR}/config.h >/dev/null 2>&1
2381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
2391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2401305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodRESULT=0
2411305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodPIDFILE=$OBJ/pidfile
2421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtrap fatal 3 2
2441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# create server config
2461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodcat << EOF > $OBJ/sshd_config
2471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	StrictModes		no
2481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Port			$PORT
2491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Protocol		2,1
2501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	AddressFamily		inet
2511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	ListenAddress		127.0.0.1
2521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	#ListenAddress		::1
2531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PidFile			$PIDFILE
2541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	AuthorizedKeysFile	$OBJ/authorized_keys_%u
2551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	LogLevel		VERBOSE
2561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	AcceptEnv		_XXX_TEST_*
2571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	AcceptEnv		_XXX_TEST
2581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Subsystem	sftp	$SFTPSERVER
2591305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodEOF
2601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ ! -z "$TEST_SSH_SSHD_CONFOPTS" ]; then
2621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	trace "adding sshd_config option $TEST_SSH_SSHD_CONFOPTS"
2631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "$TEST_SSH_SSHD_CONFOPTS" >> $OBJ/sshd_config
2641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
2651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# server config for proxy connects
2671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodcp $OBJ/sshd_config $OBJ/sshd_proxy
2681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# allow group-writable directories in proxy-mode
2701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodecho 'StrictModes no' >> $OBJ/sshd_proxy
2711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# create client config
2731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodcat << EOF > $OBJ/ssh_config
2741305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodHost *
2751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Protocol		2,1
2761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Hostname		127.0.0.1
2771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	HostKeyAlias		localhost-with-alias
2781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	Port			$PORT
2791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	User			$USER
2801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	GlobalKnownHostsFile	$OBJ/known_hosts
2811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	UserKnownHostsFile	$OBJ/known_hosts
2821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	RSAAuthentication	yes
2831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PubkeyAuthentication	yes
2841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	ChallengeResponseAuthentication	no
2851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	HostbasedAuthentication	no
2861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	PasswordAuthentication	no
2871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	BatchMode		yes
2881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	StrictHostKeyChecking	yes
2891305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodEOF
2901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ ! -z "$TEST_SSH_SSH_CONFOPTS" ]; then
2921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	trace "adding ssh_config option $TEST_SSH_SSHD_CONFOPTS"
2931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "$TEST_SSH_SSH_CONFOPTS" >> $OBJ/ssh_config
2941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
2951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodrm -f $OBJ/known_hosts $OBJ/authorized_keys_$USER
2971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
2981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtrace "generate keys"
2991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfor t in rsa rsa1; do
3001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# generate user key
3011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	rm -f $OBJ/$t
3021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	${SSHKEYGEN} -b 1024 -q -N '' -t $t  -f $OBJ/$t ||\
3031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		fail "ssh-keygen for $t failed"
3041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# known hosts file for client
3061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	(
3071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		echon 'localhost-with-alias,127.0.0.1,::1 '
3081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		cat $OBJ/$t.pub
3091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	) >> $OBJ/known_hosts
3101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# setup authorized keys
3121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	cat $OBJ/$t.pub >> $OBJ/authorized_keys_$USER
3131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo IdentityFile $OBJ/$t >> $OBJ/ssh_config
3141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# use key as host key, too
3161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	$SUDO cp $OBJ/$t $OBJ/host.$t
3171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo HostKey $OBJ/host.$t >> $OBJ/sshd_config
3181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# don't use SUDO for proxy connect
3201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo HostKey $OBJ/$t >> $OBJ/sshd_proxy
3211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwooddone
3221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchmod 644 $OBJ/authorized_keys_$USER
3231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# Activate Twisted Conch tests if the binary is present
3251305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodREGRESS_INTEROP_CONCH=no
3261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif test -x "$CONCH" ; then
3271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	REGRESS_INTEROP_CONCH=yes
3281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
3291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# If PuTTY is present and we are running a PuTTY test, prepare keys and
3311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# configuration
3321305e95ba6ff9fa202d0818caf10405df4b0f648Mike LockwoodREGRESS_INTEROP_PUTTY=no
3331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif test -x "$PUTTYGEN" -a -x "$PLINK" ; then
3341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	REGRESS_INTEROP_PUTTY=yes
3351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
3361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodcase "$SCRIPT" in
3371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood*putty*)	;;
3381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood*)		REGRESS_INTEROP_PUTTY=no ;;
3391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodesac
3401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif test "$REGRESS_INTEROP_PUTTY" = "yes" ; then
3421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	mkdir -p ${OBJ}/.putty
3431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# Add a PuTTY key to authorized_keys
3451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	rm -f ${OBJ}/putty.rsa2
3461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	puttygen -t rsa -o ${OBJ}/putty.rsa2 < /dev/null > /dev/null
3471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	puttygen -O public-openssh ${OBJ}/putty.rsa2 \
3481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	    >> $OBJ/authorized_keys_$USER
3491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# Convert rsa2 host key to PuTTY format
3511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	${SRC}/ssh2putty.sh 127.0.0.1 $PORT $OBJ/rsa > \
3521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	    ${OBJ}/.putty/sshhostkeys
3531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	${SRC}/ssh2putty.sh 127.0.0.1 22 $OBJ/rsa >> \
3541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	    ${OBJ}/.putty/sshhostkeys
3551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# Setup proxied session
3571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	mkdir -p ${OBJ}/.putty/sessions
3581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	rm -f ${OBJ}/.putty/sessions/localhost_proxy
3591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "Hostname=127.0.0.1" >> ${OBJ}/.putty/sessions/localhost_proxy
3601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "PortNumber=$PORT" >> ${OBJ}/.putty/sessions/localhost_proxy
3611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "ProxyMethod=5" >> ${OBJ}/.putty/sessions/localhost_proxy
3621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo "ProxyTelnetCommand=sh ${SRC}/sshd-log-wrapper.sh ${SSHD} ${TEST_SSH_LOGFILE} -i -f $OBJ/sshd_proxy" >> ${OBJ}/.putty/sessions/localhost_proxy 
3631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	REGRESS_INTEROP_PUTTY=yes
3651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
3661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# create a proxy version of the client config
3681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood(
3691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	cat $OBJ/ssh_config
3701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo proxycommand ${SUDO} sh ${SRC}/sshd-log-wrapper.sh ${SSHD} ${TEST_SSH_LOGFILE} -i -f $OBJ/sshd_proxy
3711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood) > $OBJ/ssh_proxy
3721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# check proxy config
3741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood${SSHD} -t -f $OBJ/sshd_proxy	|| fatal "sshd_proxy broken"
3751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstart_sshd ()
3771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{
3781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	# start sshd
3791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	$SUDO ${SSHD} -f $OBJ/sshd_config "$@" -t || fatal "sshd_config broken"
3801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	$SUDO ${SSHD} -f $OBJ/sshd_config -e "$@" >>$TEST_SSH_LOGFILE 2>&1
3811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	trace "wait for sshd"
3831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	i=0;
3841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	while [ ! -f $PIDFILE -a $i -lt 10 ]; do
3851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		i=`expr $i + 1`
3861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood		sleep $i
3871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	done
3881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	test -f $PIDFILE || fatal "no sshd running on port $PORT"
3901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood}
3911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# source test body
3931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood. $SCRIPT
3941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood
3951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# kill sshd
3961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodcleanup
3971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodif [ $RESULT -eq 0 ]; then
3981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	verbose ok $tid
3991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodelse
4001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood	echo failed $tid
4011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodfi
4021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodexit $RESULT
403