#!/bin/sh
#
# $Id: testindimail-virtual,v 1.33 2024-12-12 21:23:35+05:30 Cprogrammer Exp mbhangui $
#
start=$(date +'%s')
user=$(whoami)
domain1=example.com    # virtual domain
domain2=newexample.com # alias domain
domain3=example2.com   # remote domain
ext_domain=gmail.com
#
#
testuser1=tuser01@$domain1
testuser2=tuser02@$domain1
testuser3=tuser03@$domain1
testuser4=tuser04@$domain1
nouser=tuser05@$domain1
password1="abcdefgh1234"
password2="abcdefgh2345"
password3="abcdefgh3456"
domain=indimail.org

adminhost=localhost
adminport=4050
adminuser=admin
adminpass=benhur30

testdir=/tmp/qmail-test
servicedir=$testdir/service
maildir=$testdir/$user/Maildir
qmaildir=$testdir/indimail
indimaildir=$testdir/indimail
sysconfdir=$testdir/etc/indimail
cntrldir=$sysconfdir/control
certdir=$sysconfdir/certs
tmpfifodir=$testdir/inquery
logdir=$testdir/logs
bindir=/usr/bin
sbindir=/usr/sbin
tmpdir=$testdir/tmp
SOFT_MEM=104857600
confsplit=23
HOSTNAME=$(uname -n)
LOCALIP=0
smtp_port=2025
qmail_newu=$sbindir/qmail-newu
qmail_start=$sbindir/qmail-start
qmail_smtpd=$sbindir/qmail-smtpd
multilog=$sbindir/multilog
svscan=$sbindir/svscan
svctool=$sbindir/svctool
qmail_inject=$bindir/qmail-inject
setuidgid=$bindir/setuidgid
tcpserver=$bindir/tcpserver
qmail_queue=$sbindir/qmail-queue
authcram=/usr/libexec/indimail/authcram
gsasl=$bindir/gsasl
in_cnf=$sysconfdir/indimail.cnf
MYSQL_USER=indimail
MYSQL_PASS="abcdefgh-"
MYSQL_DB="indimail"
MYSQL_SOCK=$testdir/run/mysqld/mysqld.sock
MYSQL_PORT=3307
MYUID=$(id -u)
MYGID=$(id -g)
INUID=$(id -u indimail)
INGID=$(id -g indimail)
sleep_int=0.5

#trap do_cleanup_failed 2 EXIT
trap do_cleanup_failed EXIT

setup_maildir()
{
	tm1=$(date +"%s.%4N")
	if [ -d $maildir/new ] ; then
		find $maildir/new -type f -exec /bin/rm -f {} \;
	fi
	printf "\rCreating %-30s %86s\n" $maildir " "
	status=0
	for i in cur new tmp
	do
		mkdir -p $maildir/$i
		if [ $? -ne 0 ] ; then
			status=1
		fi
	done
	if [ $status -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing create maildir succeeded %78s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing create maildir failed"
		exit 1
	fi
}

check_service()
{
	if [ $# -eq 2 ] ; then
		min_up=$2
	else
		min_up=10
	fi
	count=1
	while true
	do
		tmp=$(svstat $servicedir/$1 2>&1)
		if [ -z "$tmp" ] ; then
			echo "Service $1 is not up. unable to get service status" 1>&2
			return 2
		fi
		echo $tmp | grep -E -i "warning:|Error:" > /dev/null
		if [ $? -ne 0 ] ; then
			t=$(echo $tmp | awk '{print $2}')
			s=$(echo $tmp | awk '{print $3}')
		else
			sleep 5;
			count=$(expr $count + 1)
			if [ $count -gt 12 ] ; then
				break
			fi
			continue
		fi
		if [ "$t" = "up" ] ; then
			if [ $s -ge $min_up ] ; then
				return 0
			else
				sleep $(expr $min_up - $s)
				count=$(expr $count + 1)
				if [ $count -gt 12 ] ; then
					break
				fi
				continue
			fi
		elif [ "$t" = "wait" -a $s -gt 0 ] ; then
			sleep $s
			count=$(expr $count + 1)
			if [ $count -gt 12 ] ; then
				break
			fi
			continue
		elif [ "$t" = "down" -o $s -eq 0 ] ; then
			count=$(expr $count + 1)
		else
			echo "Service $1 is not up: [$tmp]" 1>&2
			return 2
		fi
		sleep 5;
		if [ $count -gt 12 ] ; then
			break
		fi
	done
	echo "Service $1 is not up: [$tmp]" 1>&2
	return 1
}

setup_assign()
{
	tm1=$(date +"%s.%4N")
	if [ ! -f $sysconfdir/users/assign ] ; then
		mkdir -p $sysconfdir/users
		(
		uid=$(id -u $user)
		gid=$(id -g $user)
		echo "=$user:$user:$uid:$gid:$testdir/$user:::"
		echo "+$user-:$user:$uid:$gid:$testdir/$user:-::"
		echo "+$domain-:$domain:555:555:$qmaildir/domains/$domain:-::"
		echo "."
		) > $sysconfdir/users/assign
	fi
	printf "\rCreating %-41s %75s\n" "$sysconfdir/users/cdb" " "
	$qmail_newu $sysconfdir/users
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing %-30s succeeded %-62s [%.4f sec]\n" $qmail_newu " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing $qmail_newu failed"
		exit 1
	fi
}

setup_queue()
{
	tm1=$(date +"%s.%4N")
	printf "\rCreating queue in %-62s %45s\n" "$qmaildir/queue" " "
	mkdir -p $qmaildir
	$sudo env BIGTODO=0 queue-fix -s $confsplit $qmaildir/queue
	ret=$?
	t1=$($sudo ls $qmaildir/queue/todo|wc -l)
	t2=$($sudo ls $qmaildir/queue/intd|wc -l)
	if [ $ret -eq 0 -a $t1 -eq 0 -a $t2 -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing queue-fix succeeded %-83s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing queue-fix failed"
		exit 1
	fi
}

setup_config()
{
	tm1=$(date +"%s.%4N")
	mkdir -p $cntrldir
	mkdir -p $testdir/run/mysqld
	mkdir -p $testdir/bin
	cd $testdir
	$sudo chown mysql:mysql $testdir/run/mysqld
	sudo mkdir -p $qmaildir/mysqldb

	printf "\rCreating default config files in %38s %54s\n" "$cntrldir" " "
	env CONTROLDIR=$cntrldir /usr/libexec/indimail/config-fast $HOSTNAME 1>&3
	t1=$?
	echo "./Maildir/" > $cntrldir/defaultdelivery
	echo TLSv1_3      > $cntrldir/tlsclientmethod
	echo TLSv1_3      > $cntrldir/tlsservermethod
	$sudo $svctool --cntrldir=$cntrldir --config=qmail 1>&3
	if [ $t1 -eq 0 -a $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing svctool create indimail-mta config succeeded %-58s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing svctool create indimail-mta config failed"
		exit 1
	fi

	tm1=$(date +"%s.%4N")
	if [ ! -f $certdir/servercert.pem ] ; then
		printf "\rCreating certificates %103s\n" " "
		$sudo $svctool --certdir=$certdir --config=cert \
			--postmaster=postmaster@$HOSTNAME --common_name=$HOSTNAME 1>&3 2>&1
		if [ $? -eq 0 ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing svctool create certificate succeeded %66s [%.4f sec]\n" " " $secs
			print_pct
		else
			fcount=$(expr $fcount + 1)
			echo "  testing svctool create certificate failed"
			exit 1
		fi
	fi

	tm1=$(date +"%s.%4N")
	# indimail config
	printf "\rCreating indimail config %101s\n" " "
	mkdir -p $qmaildir/alias
	$sudo $svctool --cntrldir=$cntrldir --qmaildir=$qmaildir \
		--indimaildir=$qmaildir --sysconfdir=$sysconfdir --config=indimail \
		--mysqluser="$MYSQL_USER" --mysqlpass="$MYSQL_PASS" \
		--mysqlhost=localhost --mysqlsocket=$MYSQL_SOCK --mysqlport=$MYSQL_PORT 1>&3
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing svctool create indimail config succeeded %62s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing svctool create indimail config failed"
		exit 1
	fi

	tm1=$(date +"%s.%4N")
	# mysql cnf file
	if [ ! -f $in_cnf ] ; then
		printf "\rCreating mysql config %-33s %100s\n" "$in_cnf" " "
		$sudo $svctool --cntrldir=$cntrldir --config=mysql --mysqlPrefix=/usr \
			--sysconfdir=$sysconfdir --mysqlsocket=$MYSQL_SOCK --mysqlport=$MYSQL_PORT \
			--databasedir=$qmaildir/mysqldb 1>&3 2>&1
		if [ $? -eq 0 -a -f $in_cnf ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing svctool create MySQL config %-45s %29s [%.4f sec]\n" $in_cnf " " $secs
			print_pct
		else
			fcount=$(expr $fcount + 1)
			echo "  testing svctool create MySQL config $in_cnf failed"
			exit 1
		fi
	fi

	tm1=$(date +"%s.%4N")
	# MySQL Database Creation
	if [ ! -d $qmaildir/mysqldb/data/mysql ] ; then
		printf "\rCreating mysql db %108s\n" " "
		$sudo $svctool --cntrldir=$cntrldir --config=mysqldb --mysqlPrefix=/usr \
			--mysqluser="$MYSQL_USER" --mysqlpass="$MYSQL_PASS" \
			--databasedir=$qmaildir/mysqldb --base_path=$testdir/mail \
			--mysqlsocket="$MYSQL_SOCK".tmp 1>&3 2>&1
		if [ $? -eq 0 ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing svctool create MySQL Database succeeded %63s [%.4f sec]\n" " " $secs
			print_pct
		else
			fcount=$(expr $fcount + 1)
			echo "  testing svctool create MySQL Database failed"
			exit 1
		fi
		t=$($sudo ls $qmaildir/mysqldb/data/indimail/indimail.frm -a $qmaildir/mysqldb/data/indimail/indimail.ibd 2>/dev/null)
		if [ -n "$t" ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing for indimail MySQL database succeeded %65s [%.4f sec]\n" " " $secs
			print_pct
		else
			echo "  testing for indimail MySQL database failed"
			echo "Disabling mysqld service"
			touch $servicedir/mysql.$MYSQL_PORT/down
		fi
	fi

	tm1=$(date +"%s.%4N")
	# MySQL service Creation
	mkdir -p $servicedir
	printf "\rCreating mysqld service %102s\n" " "
	$sudo $svctool --mysql=$MYSQL_PORT --servicedir=$servicedir --mysqlPrefix=/usr \
		--databasedir=$qmaildir/mysqldb --config=$in_cnf 1>&3
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing svctool create MySQL service succeeded %64s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing svctool create MySQL service failed"
		exit 1
	fi
	$sudo chown -R $user $servicedir/mysql.$MYSQL_PORT
	printf "#!/bin/sh\nexec $setuidgid $user $multilog t $logdir/mysqld\n" > $servicedir/mysql.$MYSQL_PORT/log/run
	if [ ! -f $sysconfdir/headerlist ] ; then
		cp /etc/indimail/headerlist $sysconfdir
	fi
	$sudo chown $user $sysconfdir/headerlist
	$sudo chmod 644 $sysconfdir/headerlist
	if [ ! -f $sysconfdir/nssd.conf ] ; then
		# nssd config
		printf "\r%126s\r" " "
		$sudo $svctool --sysconfdir=$sysconfdir --config=nssd \
			--threads=5 --timeout=-1 \
			--mysqluser="$MYSQL_USER" --mysqlpass="$MYSQL_PASS" \
			--mysqlhost=localhost --mysqlsocket=$MYSQL_SOCK --mysqlport=$MYSQL_PORT
		$sudo chown $user $sysconfdir/nssd.conf
		sed -i "s{pidfile.*{pidfile     $testdir/pwdlookup/nssd.pid{g" $sysconfdir/nssd.conf
	fi
	# create admin server
	sudo $svctool --indisrvr=$adminport --servicedir=$servicedir \
  		--localip=0 --maxdaemons=40 --maxperip=25 --avguserquota=2097152 \
  		--certfile=$certdir/servercert.pem --ssl \
		--sysconfdir=$sysconfdir --logdir=$logdir \
  		--hardquota=52428800 --base_path=$testdir/mail
	$sudo chown -R $user $servicedir/indisrvr.$adminport
	$sudo chmod 755 $servicedir/indisrvr.$adminport/variables
	echo $sysconfdir       > $servicedir/indisrvr.$adminport/variables/SYSCONFDIR
	echo $cntrldir         > $servicedir/indisrvr.$adminport/variables/CONTROLDIR
	echo $sysconfdir/users > $servicedir/indisrvr.$adminport/variables/ASSIGNDIR
	sed -i "s{qmaill{$user{g" $servicedir/indisrvr.$adminport/log/run
}

create_authimap()
{
	if [ -f /tmp/authimap ] ; then
		return 0
	fi
	(
	echo "#!/bin/sh"
	echo "if [ \$# -lt 1 ] ; then"
	echo "	exit 2"
	echo "fi"
	echo "var=\`tr [\"\\0\"] [\"\\n\"] 0<&3\`"
	echo "user=\`echo \$var | cut -d ' ' -f1\`"
	echo "pass=\`echo \$var | cut -d ' ' -f2\`"
	echo "echo user=\$user 1>&2"
	echo "echo pass=\$pass 1>&2"
	echo "exec 4>/tmp/authimap.\$\$ 3</tmp/authimap.\$\$"
	echo "/bin/rm -f /tmp/authimap.\$\$"
	echo "echo \$var | tr [\" \"] [\"\\0\"] 1>&4"
	echo "if [ \"\$user\" = \"$user@$HOSTNAME\" -a \"\$pass\" = \"abcd12345678\" ] ; then"
	echo "	exit 0"
	echo "fi"
	echo "exec \$*"
	) >/tmp/authimap
	chmod +x /tmp/authimap
}

setup_svscan()
{
	mkdir -p $servicedir/.svscan/log
	mkdir -p $servicedir/.svscan/variables
	mkdir -p $servicedir/qmail-send.2025/log
	mkdir -p $servicedir/qmail-send.2025/variables

	# svscan
	printf "#!/bin/sh\nexec echo hello world   > $testdir/svscan1.out\n" > $servicedir/.svscan/run
	printf "#!/bin/sh\nexec echo goodbye world > $testdir/svscan2.out\n" > $servicedir/.svscan/shutdown
	printf "#!/bin/sh\nexec $multilog t $logdir/svscan\n" > $servicedir/.svscan/log/run
	chmod +x $servicedir/.svscan/run
	chmod +x $servicedir/.svscan/shutdown
	chmod +x $servicedir/.svscan/log/run
	echo 1 > $servicedir/.svscan/variables/DISABLE_RUN
	echo 1 > $servicedir/.svscan/variables/SCANLOG
	echo 1 > $servicedir/.svscan/variables/SILENT
	echo 1 > $servicedir/.svscan/variables/VERBOSE
	echo   > $servicedir/.svscan/variables/INITCMD
	echo "/bin:/usr/bin:/usr/sbin" > $servicedir/.svscan/variables/PATH

	# imapd, pop3d, imapd-ssl, pop3d-ssl
	for j in authindi
	do
		IMAPMODULES="/usr/libexec/indimail/imapmodules/$j $IMAPMODULES"
	done
	for i in imap pop3
	do
		if [ "$i" = "imap" ] ; then
			port1=1430
			port2=9930
		else
			port1=1100
			port2=9950
		fi
		mkdir -p $servicedir/"$i"d/log
		mkdir -p $servicedir/"$i"d/variables
		mkdir -p $servicedir/"$i"d-ssl/log
		mkdir -p $servicedir/"$i"d-ssl/variables
		for j in d d-ssl
		do
			echo $indimaildir/inquery    > $servicedir/"$i"$j/variables/INFIFODIR
			echo $tmpfifodir             > $servicedir/"$i"$j/variables/FIFOTMPDIR
			echo 660                     > $servicedir/"$i"$j/variables/FIFO_MODE
			echo 1                       > $servicedir/"$i"$j/variables/USE_QPWGR
			echo 0                       > $servicedir/"$i"$j/variables/BIGTODO
			echo $confsplit              > $servicedir/"$i"$j/variables/CONFSPLIT
			echo $qmaildir/queue         > $servicedir/"$i"$j/variables/QUEUEDIR
			echo $cntrldir               > $servicedir/"$i"$j/variables/CONTROLDIR
			echo $sysconfdir             > $servicedir/"$i"$j/variables/SYSCONFDIR
			echo $sysconfdir/users       > $servicedir/"$i"$j/variables/ASSIGNDIR
			echo $qmaildir               > $servicedir/"$i"$j/variables/DOMAINDIR
			echo 1                       > $servicedir/"$i"$j/variables/DEBUG
			echo 1                       > $servicedir/"$i"$j/variables/DEBUG_LOGIN
			echo 1                       > $servicedir/"$i"$j/variables/OPEN_SMTP
			echo $certdir                > $servicedir/"$i"$j/variables/CERTDIR
			echo NONE                    > $servicedir/"$i"$j/variables/TLS_VERIFYPEER
			echo $certdir/servercert.pem > $servicedir/"$i"$j/variables/TLS_CERTFILE
			echo $certdir/dhparams.pem   > $servicedir/"$i"$j/variables/TLS_DHPARAMS
			echo TLSv1.2                 > $servicedir/"$i"$j/variables/TLS_STARTTLS_PROTOCOL
			echo YES                     > $servicedir/"$i"$j/variables/IMAP_STARTTLS
			echo YES                     > $servicedir/"$i"$j/variables/POP3_STARTTLS
			echo /usr/bin/couriertls     > $servicedir/"$i"$j/variables/COURIERTLS
		done
		(
		echo "#!/bin/sh"
		echo "prefix=/usr"
		echo "bindir=\${prefix}/bin"
		echo "libexecdir=/usr/libexec/indimail"
		echo "mkdir -p $indimaildir/inquery"
		echo "chmod 2770 $indimaildir/inquery"
		echo "chown qmaild:indimail $indimaildir/inquery"
		echo "exec 2>&1"
		echo "exec /usr/bin/envdir -c variables \\"
		echo " /usr/bin/softlimit -m $SOFT_MEM -o 1024 \\"
		) > $servicedir/"$i"d/run
		cp $servicedir/"$i"d/run $servicedir/"$i"d-ssl/run
		(
		echo "$tcpserver -o -H -l $HOSTNAME -R -u $INUID -g $INGID,qcerts $LOCALIP $port1 \\"
		echo "\$prefix/sbin/"$i"login $IMAPMODULES $bindir/"$i"d Maildir"
		) >> $servicedir/"$i"d/run
		(
		echo "$tcpserver -o -H -l $HOSTNAME -R -u $INUID -g $INGID,qcerts $LOCALIP $port2 \\"
		echo "\$prefix/bin/couriertls -server -tcpd \\"
		echo "\$prefix/sbin/"$i"login $IMAPMODULES $bindir/"$i"d Maildir"
		) >> $servicedir/"$i"d-ssl/run
		chmod +x $servicedir/"$i"d/run
		chmod +x $servicedir/"$i"d-ssl/run
		printf "#!/bin/sh\nexec $setuidgid $user $multilog t $logdir/"$i"d\n"     > $servicedir/"$i"d/log/run
		printf "#!/bin/sh\nexec $setuidgid $user $multilog t $logdir/"$i"d-ssl\n" > $servicedir/"$i"d-ssl/log/run
		chmod +x $servicedir/"$i"d/log/run
		chmod +x $servicedir/"$i"d-ssl/log/run
	done

	# qmail-send
	mkdir -p $servicedir/qmail-send.2025/variables
	mkdir -p $servicedir/qmail-send.2025/log
	echo /bin:/usr/sbin    > $servicedir/qmail-send.2025/variables/PATH
	echo 0                 > $servicedir/qmail-send.2025/variables/BIGTODO
	echo 1                 > $servicedir/qmail-send.2025/variables/QPWGR
	echo 1                 > $servicedir/qmail-send.2025/variables/MAKE_SEEKABLE
	echo $confsplit        > $servicedir/qmail-send.2025/variables/CONFSPLIT
	echo $qmaildir/queue   > $servicedir/qmail-send.2025/variables/QUEUEDIR
	echo $sysconfdir       > $servicedir/qmail-send.2025/variables/SYSCONFDIR
	echo $cntrldir         > $servicedir/qmail-send.2025/variables/CONTROLDIR
	echo $sysconfdir/users > $servicedir/qmail-send.2025/variables/ASSIGNDIR
	printf "#!/bin/sh\nexec envdir ./variables $qmail_start -s ./Maildir/ 2>&1\n"    > $servicedir/qmail-send.2025/run
	printf "#!/bin/sh\nexec  $setuidgid $user $multilog t $logdir/qmail-send\n" > $servicedir/qmail-send.2025/log/run
	chmod +x $servicedir/qmail-send.2025/run
	chmod +x $servicedir/qmail-send.2025/log/run

	# qmail-smtpd
	mkdir -p $servicedir/smtpd/variables
	mkdir -p $servicedir/smtpd/log
	echo 1                 > $servicedir/smtpd/variables/USE_QPWGR
	echo 1                 > $servicedir/smtpd/variables/STARTTLS
	echo 0                 > $servicedir/smtpd/variables/BIGTODO
	echo $confsplit        > $servicedir/smtpd/variables/CONFSPLIT
	echo 1                 > $servicedir/smtpd/variables/CHECKRELAY
	echo $qmaildir/queue   > $servicedir/smtpd/variables/QUEUEDIR
	echo $cntrldir         > $servicedir/smtpd/variables/CONTROLDIR
	echo $sysconfdir       > $servicedir/smtpd/variables/SYSCONFDIR
	echo $sysconfdir/users > $servicedir/smtpd/variables/ASSIGNDIR
	echo $certdir          > $servicedir/smtpd/variables/CERTDIR
	echo $qmaildir/inquery > $servicedir/smtpd/variables/INFIFODIR
	echo $qmaildir         > $servicedir/smtpd/variables/DOMAINDIR
	echo 1                 > $servicedir/smtpd/variables/DEBUG
	echo 1                 > $servicedir/smtpd/variables/DEBUG_LOGIN
	echo 0                 > $servicedir/smtpd/variables/PENALTY
	printf "#!/bin/sh\nexec envdir ./variables $tcpserver -u qmaild -g qmail,indimail -HR 0 $smtp_port $qmail_smtpd $HOSTNAME /usr/sbin/vchkpass /bin/false 2>&1\n" > $servicedir/smtpd/run
	printf "#!/bin/sh\nexec $setuidgid $user $multilog t $logdir/smtpd\n" > $servicedir/smtpd/log/run
	chmod +x $servicedir/smtpd/run
	chmod +x $servicedir/smtpd/log/run

	# inlookup
	mkdir -p $tmpfifodir
	$sudo /bin/chown indimail:qmail $tmpfifodir
	$sudo chmod 770 $tmpfifodir
	mkdir -p $servicedir/inlookup.infifo/variables
	mkdir -p $servicedir/inlookup.infifo/log
	echo $cntrldir          > $servicedir/inlookup.infifo/variables/CONTROLDIR
	echo $sysconfdir/users  > $servicedir/inlookup.infifo/variables/ASSIGNDIR
	echo $qmaildir/inquery  > $servicedir/inlookup.infifo/variables/INFIFODIR
	echo 660                > $servicedir/inlookup.infifo/variables/FIFO_MODE
	echo infifo             > $servicedir/inlookup.infifo/variables/INFIFO
	echo 5                  > $servicedir/inlookup.infifo/variables/THREAD_COUNT
	echo 5184000            > $servicedir/inlookup.infifo/variables/CACHE_COUNT
	echo 1                  > $servicedir/inlookup.infifo/variables/MYSQL_OPT_RECONNECT
	echo $in_cnf            > $servicedir/inlookup.infifo/variables/MYSQL_READ_DEFAULT_FILE
	echo inlookup           > $servicedir/inlookup.infifo/variables/MYSQL_READ_GROUP
	echo                    > $servicedir/inlookup.infifo/variables/PASSWD_CACHE
	echo                    > $servicedir/inlookup.infifo/variables/QUERY_CACHE
	echo 1                  > $servicedir/inlookup.infifo/variables/DOMAIN_LIMITS
	(
	echo "#!/bin/sh"
	echo "count=5"
	echo "echo \"initializing fifo count=\$count ...\""
	echo "/bin/rm -f $qmaildir/inquery/infifo.*"
	echo "for i in \$(seq 1 \$count); do f=$qmaildir/inquery/infifo.\$i; mkfifo \$f && /bin/chmod 660 \$f && /bin/chown qmaild:indimail \$f; done"
	echo "exec /usr/bin/envdir -c variables sh -c \""
	echo "exec /usr/bin/setuidgid -g qmail,indimail qmaild /usr/sbin/inlookup \\"
	echo "-i \\\$THREAD_COUNT -c \\\$CACHE_COUNT\""
	) > $servicedir/inlookup.infifo/run
	printf "#!/bin/sh\nexec $setuidgid $user $multilog t $logdir/inlookup\n" > $servicedir/inlookup.infifo/log/run
	chmod +x $servicedir/inlookup.infifo/run
	chmod +x $servicedir/inlookup.infifo/log/run
}

do_svscan_start()
{
	tm1=$(date +"%s.%4N")
	printf "\r%126s\n" " "
	echo "Starting svscan"
	(
	cd $servicedir/.svscan
	exec $sudo envdir -c variables $svscan $servicedir
	) 2>$logdir/svscan/svscan.log &
	sleep $sleep_int
	tty -s && stty sane
	$sudo chown -R $user $servicedir/*/supervise
	svpid=$(sed -n '$p' $servicedir/.svscan.pid)
	if [ -n "$svpid" ] ; then
		$sudo kill -0 $svpid >/dev/null 2>&1
		if [ $? -eq 0 ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing command svscan (with svscanlog) startup succeeded with pid [%9d] %32s [%.4f sec]\n" $svpid " " $secs
			print_pct
			tty -s && stty sane
		else
			fcount=$(expr $fcount + 1)
			if [ $prompt -eq 1 ] ; then
				less $logdir/svscan/current
			fi
			echo "  testing command svscan (with svscanlog) startup failed"
			[ -z "$failed" ] && failed="do_svscan_start" || failed="$failed, do_svscan_start"
			[ $continue_on_err -eq 0 ] && exit 1 || return 1
		fi
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/svscan/current
		fi
		echo "  testing command svscan (with svscanlog) startup failed"
		[ -z "$failed" ] && failed="do_svscan_start" || failed="$failed, do_svscan_start"
		[ $continue_on_err -eq 0 ] && exit 1 || return 1
	fi
}

test_svscan_log()
{
	tm1=$(date +"%s.%4N")
	grep "@.* svscan: info: pid: .*: starting..." $logdir/svscan/current >/dev/null
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command svscan log succeeded %74s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/svscan/current
		fi
		echo "  testing command svscan log failed"
		[ -z "$failed" ] && failed="test_svscan_log" || failed="$failed, test_svscan_log"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

test_svscan_run()
{
	tm1=$(date +"%s.%4N")
	if [ "$(cat $testdir/svscan1.out 2>/dev/null)" = "hello world" ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command svscan run script execution succeeded %57s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/svscan/current
		fi
		echo "  testing command svscan run script execution failed"
		[ -z "$failed" ] && failed="test_svscan_run" || failed="$failed, test_svscan_run"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

do_svscan_stop()
{
	tx1=$(date +"%s.%4N")
	count=0
	if [ -f $servicedir/.svscan.pid ] ; then
		svpid=$(sed -n '$p' $servicedir/.svscan.pid)
	else
		svpid=""
	fi
	while true
	do
		if [ -z "$svpid" -o ! -f $servicedir/.svscan.pid ] ; then
			break
		fi
		sudo kill $svpid 2>/dev/null
		if [ $? -ne 0 ] ; then
			break
		fi
		sleep 0.5
		count=$(expr $count + 1)
		if [ $count -gt 10 ] ; then
			if [ -d $servicedir/.svscan/log ] ; then
				sudo svc -dx $servicedir/* $servicedir/*/log $servicedir/.svscan/log 2>/dev/null
			else
				sudo svc -dx $servicedir/* $servicedir/*/log 2>/dev/null
			fi
			echo "shutdown_svscan: count=$count: Failed to stop svsan" 1>&2
			return 1
		fi
	done
	if [ -d $servicedir/.svscan/log ] ; then
		sudo svc -dx $servicedir/* $servicedir/*/log $servicedir/.svscan/log 2>/dev/null
	else
		sudo svc -dx $servicedir/* $servicedir/*/log 2>/dev/null
	fi
	tx2=$(date +"%s.%4N")
	sleep_secs=$(echo $tx1 $tx2 | awk '{printf("%0.4f\n", $2-$1)}')
	return 0
}

do_setup()
{
	if [ -x /usr/bin/mariadb ] ; then
		mysql=/usr/bin/mariadb
	else
		mysql=/usr/bin/mysql
	fi
	# basic setup for maildir, assign config and queue
	$sudo /bin/rm -rf $logdir $tmpdir
	mkdir -p $logdir/setup
	mkdir -p $logdir/qremote
	mkdir -p $logdir/gsasl
	mkdir -p $logdir/mysqld
	mkdir -p $logdir/inlookup
	mkdir -p $logdir/mail
	mkdir -p $logdir/qmail-send
	mkdir -p $logdir/svscan
	mkdir -p $logdir/imapd
	mkdir -p $logdir/pop3d
	mkdir -p $logdir/imapd-ssl
	mkdir -p $logdir/pop3d-ssl
	mkdir -p $logdir/tcpclient
	mkdir -p $tmpdir
	setup_maildir
	setup_assign
	setup_queue
	setup_svscan
	setup_config 3>>$logdir/setup/setup.log
}

create_domain()
{
	tm1=$(date +"%s.%4N")
	mkdir -p $sysconfdir/users
	mkdir -p $testdir/mail
	if [ $# -eq 3 ] ; then
		opt="-f"
	else
		opt=""
	fi
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
		SERVICEDIR=$servicedir \
		vadddomain $opt -B $testdir/mail -d $qmaildir $1 $2 > $logdir/setup/vadddomain.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vadddomain succeeded %74s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vadddomain.log
		fi
		echo "  testing command vadddomain failed"
		[ -z "$failed" ] && failed="vadddomain" || failed="$failed, vadddomain"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

create_plain_user()
{
	tm1=$(date +"%s.%4N")
	if [ $# -eq 3 ] ; then
		if [ "$3" = "default" ] ; then
			extra=""
		else
			extra="-h $3"
		fi
		hash="$3"
	else
		extra=""
		hash="default"
	fi
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
		SERVICEDIR=$servicedir \
		vadduser -d $extra $1 $2 > $logdir/setup/vadduser.log 2>&1
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vadduser (plain) hash=%-8s succeeded %54s [%.4f sec]\n" "$hash" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vadduser.log
		fi
		echo "  testing command vadduser (plain) hash=$hash failed"
		[ -z "$failed" ] && failed="create_plain_user" || failed="$failed, create_plain_user"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

create_cram_user()
{
	tm1=$(date +"%s.%4N")
	if [ $# -eq 3 ] ; then
		type="cram+plain"
		$sudo env - \
			PATH=/bin:/usr/bin \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
			DOMAINDIR=$qmaildir \
			SERVICEDIR=$servicedir \
			vadduser -C -m CRAM -d $1 $2 >> $logdir/setup/vadduser.log 2>&1
	else
		type="cram-only"
		$sudo env - \
			PATH=/bin:/usr/bin \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
			DOMAINDIR=$qmaildir \
			SERVICEDIR=$servicedir \
			vadduser -e $1 $2 >> $logdir/setup/vadduser.log 2>&1
	fi
	status=$?
	if [ $status -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vadduser (cram)  type=%-10s succeeded %52s [%.4f sec]\n" $type " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vadduser.log
		fi
		echo "  testing command vadduser (cram) type=$type failed"
		[ -z "$failed" ] && failed="vadduser (cram)" || failed="$failed, vadduser (cram)"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	if [ $# -eq 3 ] ; then
		tm1=$(date +"%s.%4N")
		pass=$($sudo env - \
			PATH=/bin:/usr/bin \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
			vuserinfo -p $testuser2 | awk '{print $3}' | cut -c1-6)
		if [ "$pass" = "{CRAM}" ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing command vadduser (cram format) succeeded %62s [%.4f sec]\n" " " $secs
			print_pct
		else
			fcount=$(expr $fcount + 1)
			if [ $prompt -eq 1 ] ; then
				less $logdir/setup/vadduser.log
			fi
			echo "  testing command vadduser (cram format) failed"
			[ -z "$failed" ] && failed="vadduser (cram format)" || failed="$failed, vadduser (cram format)"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi
	fi
}

create_scram_user()
{
	tm1=$(date +"%s.%4N")
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
		SERVICEDIR=$servicedir \
		vadduser -C -m $1 -d -h $4 $2 $3 >> $logdir/setup/vadduser.log 2>&1
	status=$?

	if [ $# -gt 4 ] ; then
		return $status
	fi
	if [ $status -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vadduser (scram) hash=%-8s succeeded %54s [%.4f sec]\n" $4 " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vadduser.log
		fi
		echo "  testing command vadduser (scram) hash=$4 failed"
		[ -z "$failed" ] && failed="vadduser (scram)" || failed="$failed, vadduser (scram)"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

delete_user()
{
	tm1=$(date +"%s.%4N")
	$sudo chown -R indimail:indimail $servicedir/inlookup.infifo
	$sudo chmod 660 $servicedir/inlookup.infifo/supervise/control
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
		SERVICEDIR=$servicedir \
		vdeluser $1 >> $logdir/setup/vdeluser.log 2>&1
	status=$?
	$sudo chown -R $user $servicedir/inlookup.infifo
	if [ $# -gt 1 ] ; then
		return $status
	fi
	if [ $status -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vdeluser succeeded %76s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vdeluser.log
		fi
		cat $logdir/setup/vdeluser.log
		echo "  testing command vdeluser failed"
		[ -z "$failed" ] && failed="vdeluser" || failed="$failed, vdeluser"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

delete_domain()
{
	tm1=$(date +"%s.%4N")
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
		SERVICEDIR=$servicedir \
	vdeldomain $1 > $logdir/setup/vdeldomain.log
	status=$?
	if [ $# -gt 1 ] ; then
		return $status
	fi
	if [ $status -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vdeldomain succeeded %74s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vdeldomain.log
		fi
		echo "  testing command vdeldomain failed"
		[ -z "$failed" ] && failed="vdeldomain" || failed="$failed, vdeldomain"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

change_password()
{
	tm1=$(date +"%s.%4N")
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		SERVICEDIR=$servicedir \
	vpasswd $1 $2 > $logdir/setup/vpasswd.log
	if [ $status -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vpasswd succeeded %77s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vpasswd.log
		fi
		echo "  testing command vpasswd failed"
		[ -z "$failed" ] && failed="vpasswd" || failed="$failed, vpasswd"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

}

do_vmoduser_quota()
{
	tm1=$(date +"%s.%4N")
	quota=$($sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		vuserinfo -q $1 | grep MiB | awk '{print $3}')
	if [ $quota -eq 524288000 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vuserinfo get quota (%9d) succeeded %53s [%.4f sec]\n" $quota " " $secs
		print_pct
	else
		echo "  testing command vuserinfo get quota ($quota) failed"
	fi
	tm1=$(date +"%s.%4N")
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		SERVICEDIR=$servicedir \
	vmoduser -q +100m $1 > $logdir/setup/vmoduser.log
	if [ $status -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vmoduser increase quota by 100m succeeded %53s [%.4f sec]\n" " " $secs
		print_pct
	else
		echo "  testing command vmoduser increase quota by 100m failed"
	fi
	quota=$($sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		vuserinfo -q $1 | grep MiB | awk '{print $3}')
	if [ $quota -eq 629145600 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vmoduser update quota to (%9d) succeeded %48s [%.4f sec]\n" $quota " " $secs
		print_pct
	else
		echo "  testing command vmoduser update quota to ($quota) failed"
	fi

}

do_inquerytest()
{
	tm1=$(date +"%s.%4N")
	$sudo $setuidgid indimail env - \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		INFIFODIR=$indimaildir/inquery \
		FIFOTMPDIR=$tmpfifodir \
		FIFO_MODE=0666 \
		/usr/sbin/inquerytest -v -q 3 -i "" $1 > $logdir/setup/inquerytest.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command inquerytest succeeded %73s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/inquerytest.log
		fi
		echo "  testing command inquerytest failed"
		[ -z "$failed" ] && failed="inquerytest" || failed="$failed, inquerytest"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

do_vdominfo()
{
	tm1=$(date +"%s.%4N")
	env - \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		ASSIGNDIR=$sysconfdir/users \
		/usr/bin/vdominfo > $logdir/setup/vdominfo.log 2>&1
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vdominfo succeeded %76s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vdominfo.log
		fi
		echo "  testing command vdominfo failed"
		[ -z "$failed" ] && failed="vdominfo" || failed="$failed, vdominfo"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

do_dbinfo()
{
	tm1=$(date +"%s.%4N")
	$sudo $setuidgid indimail env - \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		ASSIGNDIR=$sysconfdir/users \
		/usr/bin/dbinfo -s 	> $logdir/setup/dbinfo.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command dbinfo succeeded %78s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/dbinfo.log
		fi
		echo "  testing command dbinfo failed"
		[ -z "$failed" ] && failed="dbinfo" || failed="$failed, dbinfo"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

test_services()
{
	tm1=$(date +"%s.%4N")
	$sudo svstat $servicedir/* > $logdir/setup/services.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command svscan service startup succeeded %62s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/services.log
		fi
		echo "  testing command svscan service startup failed"
		[ -z "$failed" ] && failed="test_services" || failed="$failed, test_services"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

check_mail()
{
	tx1=$(date +"%s.%4N")
	# $1 - user
	# $2 - Maildir
	count=0
	ret=1
	mail_file=""
	while true
	do
		mcount=$($sudo $setuidgid $1 ls $2/new 2>/dev/null | wc -l)
		if [ $mcount -gt 0 ] ; then
			mail_file=$($sudo $setuidgid $1 ls -lt $2/new 2>/dev/null|head -2|tail -1|awk '{print $9}')
			subject=$($sudo sh -c "822header -I Subject < $2/new/$mail_file")
			echo $subject > $testdir/subject.tmp
			if [ $# -eq 2 ] ; then
				$sudo $setuidgid $1 /bin/rm -f $2/new/$mail_file
			fi
			break
		fi
		sleep 1
		count=$(expr "$count" + 1)
		if [ $count -gt 5 ] ; then
			#echo "Failed to receive Mail" 1>&2
			return 1
		fi
	done
	tx2=$(date +"%s.%4N")
	sleep_secs=$(echo $tx1 $tx2 | awk '{printf("%0.4f\n", $2-$1)}')
	return 0
}

do_smtp_auth_swaks()
{
	if [ $3 -eq 1 ] ; then
		methods="LOGIN PLAIN CRAM-MD5 DIGEST-MD5"
		type=" "
	elif [ $3 -eq 2 ] ; then
		methods="LOGIN PLAIN CRAM-MD5 DIGEST-MD5"
		type=" "
	elif [ $3 -eq 3 ] ; then
		methods="LOGIN PLAIN CRAM-MD5 DIGEST-MD5"
		type=" "
	elif [ $3 -eq 4 ] ; then
		methods="CRAM-MD5 DIGEST-MD5"
		type="CRAMONLY"
	fi
	for j in 1 2
	do
		case $j in
			1)
			str="incache=0"
			> $servicedir/smtpd/variables/PASSWD_CACHE
			> $servicedir/smtpd/variables/QUERY_CACHE
			;;
			2)
			str="incache=1"
			echo 1 > $servicedir/smtpd/variables/PASSWD_CACHE
			echo 1 > $servicedir/smtpd/variables/QUERY_CACHE
			;;
		esac
		$sudo svc -a $servicedir/smtpd/log
		$sudo svc -r $servicedir/smtpd
		check_service smtpd 3
		for i in $methods
		do
			tm1=$(date +"%s.%4N")
			if [ $3 -eq 1 ] ; then
				case $i in
					LOGIN|PLAIN)
					pass=$2
					;;
					*)
					pass=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -p $1 | awk '{print $3}')
					;;
				esac
			else
				pass=$2
			fi
			swaks -S --tls --to $user@$HOSTNAME --from $1 --server localhost --port $smtp_port -a $i -au $1 -ap "$pass" 2>/dev/null
			if [ $? -ne 0 ] ; then
				fcount=$(expr $fcount + 1)
				if [ $prompt -eq 1 ] ; then
					less $logdir/smtpd/current
				fi
				case $i in
				LOGIN|PLAIN)
				printf "  testing SMTP AUTH %-18s (%s) hash=%-8s %-8s using swk %s failed\n"    "$i" "$str" "$hash" "$type" "$1"
				;;
				*)
				printf "  testing SMTP AUTH %-18s (%s) hash=xxxxxxxx %-8s using swk %s failed\n"    "$i" "$str" "$type" "$1"
				esac
				[ -z "$failed" ] && failed="swaks-SMTP-AUTH-$i-hash-$hash" || failed="$failed, swaks-SMTP-AUTH-$i-hash-$hash"
				[ $continue_on_err -eq 0 ] && exit 1 || return 0
			fi
			check_mail $user $maildir
			if [ $? -eq 0 ] ; then
				last_line=$(tail -1 $logdir/smtpd/current|grep "AUTH $i:")
				if [ $? -eq 0 ] ; then
					tm2=$(date +"%s.%4N")
					secs=$(echo $tm1 $tm2 $sleep_secs | awk '{printf("%0.4f\n", $2-$1-$3)}')
					tcount=$(expr $tcount + 1)
					case $i in
					LOGIN|PLAIN)
					printf "\r  testing SMTP AUTH %-18s (%s) hash=%-8s %-8s using swk %s succeeded [%.4f sec]\n" "$i" "$str" "$hash" "$type" "$1" "$secs"
					;;
					*)
					printf "\r  testing SMTP AUTH %-18s (%s) hash=xxxxxxxx %-8s using swk %s succeeded [%.4f sec]\n" "$i" "$str" "$type" "$1" "$secs"
					;;
					esac
					print_pct
				else
					fcount=$(expr $fcount + 1)
					if [ $prompt -eq 1 ] ; then
						(
						echo "$logdir/smtpd/current"
						cat $logdir/smtpd/current
						echo ----------------------
						echo "$logdir/qmail-send/current"
						cat $logdir/qmail-send/current
						)
					fi
					case $i in
					LOGIN|PLAIN)
					printf "  testing SMTP AUTH %-18s (%s) hash=%-8s %-8s using swk %s failed\n"    "$i" "$str" "$hash" "$type" "$1"
					;;
					*)
					printf "  testing SMTP AUTH %-18s (%s) hash=xxxxxxxx %-8s using swk %s failed\n"    "$i" "$str" "$type" "$1"
					;;
					esac
					[ -z "$failed" ] && failed="swaks-SMTP-AUTH-$i-hash-$hash" || failed="$failed, swaks-SMTP-AUTH-$i-hash-$hash"
					[ $continue_on_err -eq 0 ] && exit 1 || return 0
				fi
			else
				fcount=$(expr $fcount + 1)
				if [ $prompt -eq 1 ] ; then
					(
					echo "$logdir/smtpd/current"
					cat $logdir/smtpd/current
					echo ----------------------
					echo "$logdir/qmail-send/current"
					cat $logdir/qmail-send/current
					)
				fi
				echo "  testing mail delivery in do_smtp_auth_swaks failed - SMTP AUTH $i"
				[ -z "$failed" ] && failed="check_mail $maildir swaks-SMTP-AUTH-$i-hash-$hash" || failed="$failed, check_mail $maildir swaks-SMTP-AUTH-$i-hash-$hash"
				[ $continue_on_err -eq 0 ] && exit 1 || return 0
			fi
		done
		tm1=$(date +"%s.%4N")
		if [ $j -eq 2 ] ; then
			t=$(tail -2 $logdir/inlookup/current |head -1|awk '{print $6" "$7}')
			if [ "$t" = "['Password Query']," ] ; then
				tm1=$(tail -2 $logdir/inlookup/current|head -1|awk '{print $1}'|tai64nunix)
				tm2=$(tail -1 $logdir/inlookup/current|awk '{print $1}'|tai64nunix)
				secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
				tcount=$(expr $tcount + 1)
				printf "\r  testing command inquery password cache succeeded %62s [%0.4f sec]\n" " " $secs
				print_pct
			else
				fcount=$(expr $fcount + 1)
				if [ $prompt -eq 1 ] ; then
					less $logdir/inlookup/current
				fi
				echo "  testing command inquery password cache failed"
				[ -z "$failed" ] && failed="inlookup PWD query" || failed="$failed, inlookup PWD query"
				[ $continue_on_err -eq 0 ] && exit 1 || return 0
			fi
		fi
	done
}

do_smtp_auth_qmr_o()
{
	# domain   = $1
	# user     = $2
	# password = $3
	# type     = $4 1 - CRAM=NO (plain user), 2 - CRAM=YES (plain user), 3 - CRAM=YES (scram user)
	case $4 in
		1)
		methods="LOGIN PLAIN XOAUTH2 CRAM-MD5 CRAM-SHA1 CRAM-SHA224 CRAM-SHA256 CRAM-SHA384 CRAM-SHA512 CRAM-RIPEMD DIGEST-MD5"
		type=" "
		;;
		2)
		methods="LOGIN PLAIN XOAUTH2 CRAM-MD5 CRAM-SHA1 CRAM-SHA224 CRAM-SHA256 CRAM-SHA384 CRAM-SHA512 CRAM-RIPEMD DIGEST-MD5"
		type=" "
		;;
		3)
		methods="LOGIN PLAIN XOAUTH2 CRAM-MD5 CRAM-SHA1 CRAM-SHA224 CRAM-SHA256 CRAM-SHA384 CRAM-SHA512 CRAM-RIPEMD DIGEST-MD5"
		type=" "
		;;
		4)
		methods="CRAM-MD5 CRAM-SHA1 CRAM-SHA224 CRAM-SHA256 CRAM-SHA384 CRAM-SHA512 CRAM-RIPEMD DIGEST-MD5"
		type="CRAMONLY"
		;;
	esac
	for j in 1 2
	do
		case $j in
			1)
			str="incache=0"
			> $servicedir/smtpd/variables/PASSWD_CACHE
			> $servicedir/smtpd/variables/QUERY_CACHE
			;;
			2)
			str="incache=1"
			echo 1 > $servicedir/smtpd/variables/PASSWD_CACHE
			echo 1 > $servicedir/smtpd/variables/QUERY_CACHE
			;;
		esac
		$sudo svc -r $servicedir/smtpd
		check_service smtpd 3
		for i in $methods
		do
			if [ $4 -eq 1 ] ; then
				case $i in
					LOGIN|PLAIN|XOAUTH2)
					pass=$3
					;;
					*)
					pass=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -p $2 | awk '{print $3}')
					;;
				esac
			else
				pass=$3
			fi
			tm1=$(date +"%s.%4N")
			(
			echo "From: $2"
			echo "To: $user@$HOSTNAME"
			echo "Subject: Test"
			echo "Date: $(date -R)"
			echo
			echo "Test message"
			) | env - \
				SMTPROUTE="$1:127.0.0.1:$smtp_port $2 $pass" \
				AUTH_SMTP="$i" \
				CONTROLDIR=$cntrldir \
			/usr/sbin/qmail-remote $1 $2 "" 10 $user@$HOSTNAME > $logdir/qremote/qmail-remote.log
			check_mail $user $maildir
			if [ $? -eq 0 ] ; then
				last_line=$(tail -1 $logdir/smtpd/current|grep "AUTH $i:")
				if [ $? -eq 0 ] ; then
					tm2=$(date +"%s.%4N")
					secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
					tcount=$(expr $tcount + 1)
					case $i in
						LOGIN|PLAIN)
						printf "\r  testing SMTP AUTH %-18s (%s) hash=%-8s %-8s using qmr %19s succeeded [%.4f sec]\n" "$i" "$str" "$hash" "$type" "$2" "$secs"
						;;
						*)
						printf "\r  testing SMTP AUTH %-18s (%s) hash=xxxxxxxx %-8s using qmr %19s succeeded [%.4f sec]\n" "$i" "$str" "$type" "$2" "$secs"
						;;
					esac

					print_pct
				else
					fcount=$(expr $fcount + 1)
					if [ $prompt -eq 1 ] ; then
						less $logdir/smtpd/current
					fi
					case $i in
						LOGIN|PLAIN)
						printf "  testing SMTP AUTH %-18s (%s) hash=%-8s %-7s using qmr %s failed\n"    "$i" "$str" "$hash" "$type" "$2"
						;;
						*)
						printf "  testing SMTP AUTH %-18s (%s) hash=xxxxxxxx %-7s using qmr %s failed\n"    "$i" "$str" "$type" "$2"
						;;
					esac
					[ -z "$failed" ] && failed="qmr-SMTP-AUTH-$i-hash-$hash" || failed="$failed, qmr-SMTP-AUTH-$i-hash-$hash"
					[ $continue_on_err -eq 0 ] && exit 1 || return 0
				fi
			else
				fcount=$(expr $fcount + 1)
				if [ $prompt -eq 1 ] ; then
					less $logdir/qremote/qmail-remote.log
				fi
				echo "  testing mail delivery in do_smtp_auth_qmr_o failed - qmr-SMTP-AUTH $i"
				[ -z "$failed" ] && failed="check_mail $maildir qmr-SMTP-AUTH-$i-hash-$hash" || failed="$failed, check_mail $maildir qmr-SMTP-AUTH-$i-hash-$hash"
				[ $continue_on_err -eq 0 ] && exit 1 || return 0
			fi
		done
	done
}

do_smtp_auth_qmr_scram()
{
	tm1=$(date +"%s.%4N")
	(
	echo "From: $3"
	echo "To: $user@$HOSTNAME"
	echo "Subject: Test"
	echo "Date: $(date -R)"
	echo
	echo "Test message"
	) | env - \
		SMTPROUTE="$2:127.0.0.1:$smtp_port $3 $4" \
		AUTH_SMTP="$1" \
		CONTROLDIR=$cntrldir \
	/usr/sbin/qmail-remote $2 $3 "" 10 $user@$HOSTNAME >> $logdir/qremote/qmail-remote.log 2>&1
	check_mail $user $maildir
	if [ $? -eq 0 ] ; then
		last_line=$(tail -1 $logdir/smtpd/current|grep "AUTH $1:")
		if [ $? -eq 0 ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing SMTP AUTH %-18s (%s) hash=%-8s          using qmr (plaintext) succeeded %7s [%.4f sec]\n" "$1" "$str" "$hash" " " "$secs"
			print_pct
		else
			fcount=$(expr $fcount + 1)
			if [ $prompt -eq 1 ] ; then
				less $logdir/smtpd/current
			fi
			printf "  testing SMTP AUTH %-18s (%s) hash=%-8s          using qmr (plaintext) failed\n" "$1" "$str" "$hash"
			[ -z "$failed" ] && failed="qmr-SMTP-AUTH-plaintext-$1-hash-$hash" || failed="$failed, qmr-SMTP-AUTH-plaintext-$1-hash-$hash"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/qremote/qmail-remote.log
		fi
		echo "  testing mail delivery in do_smtp_auth_qmr_scram failed SMTP AUTH $1"
		[ -z "$failed" ] && failed="check_mail $maildir qmr-SMTP-AUTH-plaintext-$1-hash-$hash" || failed="$failed, check_mail $maildir qmr-SMTP-AUTH-plaintext-$1-hash-$hash"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	hexsalted=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -p $3 | cut -d: -f3)
	(
	echo "From: $3"
	echo "To: $user@$HOSTNAME"
	echo "Subject: Test"
	echo "Date: $(date -R)"
	echo
	echo "Test message"
	) | env - \
		SALTED_PASSWORD=1 \
		SMTPROUTE="$2:127.0.0.1:$smtp_port $3 $hexsalted" \
		AUTH_SMTP="$1" \
		CONTROLDIR=$cntrldir \
	/usr/sbin/qmail-remote $2 $3 "" 10 $user@$HOSTNAME >> $logdir/qremote/qmail-remote.log 2>&1
	check_mail $user $maildir
	if [ $? -eq 0 ] ; then
		last_line=$(tail -1 $logdir/smtpd/current|grep "AUTH $1:")
		if [ $? -eq 0 ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing SMTP AUTH %-18s (%s) hash=%-8s          using qmr (hexsalted) succeeded %7s [%.4f sec]\n" "$1" "$str" "$hash" " " "$secs"
			print_pct
		else
			fcount=$(expr $fcount + 1)
			if [ $prompt -eq 1 ] ; then
				less $logdir/smtpd/current
			fi
			printf "  testing SMTP AUTH %-18s (%s) hash=%-8s          using qmr (hexsalted) failed\n" "$1" "$str" "$hash"
			[ -z "$failed" ] && failed="SMTP-AUTH-hexsalted-$1-hash-$hash" || failed="$failed, SMTP-AUTH-hexsalted-$1-hash-$hash"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/qremote/qmail-remote.log
		fi
		echo "  testing mail delivery in do_smtp_auth_qmr_scram failed SMTP AUTH $1"
		[ -z "$failed" ] && failed="check_mail $maildir SMTP-AUTH-hexsalted-$1-hash-$hash" || failed="$failed, check_mail $maildir SMTP-AUTH-hexsalted-$1-hash-$hash"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

do_gsasl_test()
{
	tm1=$(date +"%s.%4N")
	case $1 in
		SCRAM-SHA-1-PLUS|SCRAM-SHA-256-PLUS)
		opt=""
		;;
		SCRAM-SHA-1|SCRAM-SHA-256)
		opt="--no-cb"
		;;
	esac
	$gsasl -d $opt --hostname=$HOSTNAME --x509-ca-file="" -a $2 --password "$3" \
		--mechanism "$1" --smtp --connect localhost:$smtp_port >> $logdir/gsasl/gsasl.log 2>&1
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing SMTP AUTH %-18s (%s) hash=%-8s          using gsasl succeeded %17s [%.4f sec]\n" "$1" "$str" "$hash" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/gsasl/gsasl.log
		fi
		printf "  testing SMTP AUTH %-18s (%s) hash=%-8s          using gsasl failed\n" "$1" "$str" "$hash"
		[ -z "$failed" ] && failed="SMTP-AUTH-gsasl-$1-hash-$hash" || failed="$failed, SMTP-AUTH-gsasl-$1-hash-$hash"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

check_relay()
{
	TM=$(expr $(date +%s) - 1800)
	echo "SELECT email,ipaddr from relay where timestamp > $TM" | \
		$mysql --defaults-file=$sysconfdir/indimail.cnf \
			-s -u $MYSQL_USER -p$MYSQL_PASS -S $MYSQL_SOCK $MYSQL_DB
	return $?
}

delete_relay()
{
	echo "DELETE from relay where 1=1" | \
		$mysql --defaults-file=$sysconfdir/indimail.cnf \
			-s -u $MYSQL_USER -p$MYSQL_PASS -S $MYSQL_SOCK $MYSQL_DB
	return $?
}

auth_pop3()
{
	(
	echo "#!/bin/sh"
	echo "exec 0<&6"
	echo "exec 1>&7"
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	if [ "$3" = "PLAIN" ] ; then
		b64=$(printf "\0$1\0$2" | base64)
		echo "printf \"AUTH PLAIN\r\n\" 1>&2"
		echo "printf \"AUTH PLAIN\r\n\""
		echo "read line"
		echo "printf \"%s\n\" \"\$line\" 1>&2"
		echo "printf \"$b64\r\n\" 1>&2"
		echo "printf \"$b64\r\n\""
	elif [ "$3" = "CRAM-MD5" -o "$3" = "CRAM-SHA1" -o "$3" = "CRAM-SHA256" ] ; then
		echo "printf \"AUTH $3\r\n\" 1>&2"
		echo "printf \"AUTH $3\r\n\""
		echo "read line"
		echo "line=\$(echo \$line | cut -c3- | sed -e 's/\r//g')"
		echo "b64=\$($authcram -t $3 $1 $2 \$line | sed -e 's/\r//g')"
		echo "printf \"%s\r\n\" \"\$b64\" 1>&2"
		echo "printf \"%s\r\n\" \"\$b64\""
	fi
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	echo "printf \"%s\" \"\$line\" | grep -E \"+OK logged in.\" >/dev/null 2>&1"
	echo "if [ \$? -ne 0 ] ; then"
	echo "	echo \"Failed to login\" 1>&2"
	echo "	exit 1"
	echo "fi"
	echo "printf \"LIST\r\n\" 1>&2"
	echo "printf \"LIST\r\n\""
	echo "read line"
	echo "printf \"%s\" \"\$line\" |grep -E \"+OK POP3 clients that break here, they violate STD53.\" > /dev/null"
	echo "if [ \$? -ne 0 ] ; then"
	echo "	echo \"LIST command failed\" 1>&2"
	echo "	exit 1"
	echo "fi"
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	echo "octets=\$(printf \"%s\n\" \"\$line\"|awk '{print \$2}')"
	echo "while true"
	echo "do"
	echo "	read line"
	echo "	if [ -z \"\$line\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	printf \"%s\n\" \"\$line\" 1>&2"
	echo "	line=\$(echo \"\$line\"|tr -d '\r')"
	echo "	if [ -z \"\$line\" -o \"\$line\" = \".\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "done"
	echo "printf \"RETR 1\r\n\" 1>&2"
	echo "printf \"RETR 1\r\n\""
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	echo "printf \"%s\" \"\$line\" | grep -E \"+OK .* octets follow.\" > /dev/null"
	echo "if [ \$? -ne 0 ] ; then"
	echo "	echo \"RETR command failed\" 1>&2"
	echo "	exit 1"
	echo "fi"
	echo "found=0"
	echo "while true"
	echo "do"
	echo "	read line"
	echo "	if [ -z \"\$line\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	printf \"%s\n\" \"\$line\" 1>&2"
	echo "	line=\$(echo \"\$line\"|tr -d '\r')"
	echo "	if [ \"\$line\" = \".\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	echo \"\$line\" | grep \"This is a test mailing\" > /dev/null"
	echo "	if [ \$? -eq 0 ] ; then"
	echo "		found=1"
	echo "	fi"
	echo "done"
	echo "printf \"QUIT\r\n\""
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	echo "if [ \$found -eq 1 ] ; then"
	echo "	exit 0"
	echo "else"
	echo "	exit 1"
	echo "fi"
	) > $testdir/tcpclient.pop3
	chmod +x $testdir/tcpclient.pop3
	check_service pop3d
	tcpclient -a 10 -vDHR 0 1100 $testdir/tcpclient.pop3
	return $?
}

create_tcpclient_pop3()
{
	(
	echo "#!/bin/sh"
	echo "exec 0<&6"
	echo "exec 1>&7"
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	if [ "$3" = "PLAIN" ] ; then
		b64=$(printf "\0$1\0$2" | base64)
		echo "printf \"AUTH PLAIN\r\n\" 1>&2"
		echo "printf \"AUTH PLAIN\r\n\""
		echo "read line"
		echo "printf \"%s\n\" \"\$line\" 1>&2"
		echo "printf \"$b64\r\n\" 1>&2"
		echo "printf \"$b64\r\n\""
	elif [ "$3" = "CRAM-MD5" -o "$3" = "CRAM-SHA1" -o "$3" = "CRAM-SHA256" ] ; then
		echo "printf \"AUTH $3\r\n\" 1>&2"
		echo "printf \"AUTH $3\r\n\""
		echo "read line"
		echo "line=\$(echo \$line | cut -c3- | sed -e 's/\r//g')"
		echo "b64=\$($authcram -t $3 $1 $2 \$line | sed -e 's/\r//g')"
		echo "printf \"%s\r\n\" \"\$b64\" 1>&2"
		echo "printf \"%s\r\n\" \"\$b64\""
	fi
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	echo "printf \"%s\" \"\$line\" | grep -E \"+OK logged in.\" >/dev/null 2>&1"
	echo "if [ \$? -ne 0 ] ; then"
	echo "	echo \"Failed to login\" 1>&2"
	echo "	exit 1"
	echo "fi"
	echo "printf \"LIST\r\n\" 1>&2"
	echo "printf \"LIST\r\n\""
	echo "read line"
	echo "printf \"%s\" \"\$line\" |grep -E \"+OK POP3 clients that break here, they violate STD53.\" > /dev/null"
	echo "if [ \$? -ne 0 ] ; then"
	echo "	echo \"LIST command failed\" 1>&2"
	echo "	exit 1"
	echo "fi"
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	echo "octets=\$(printf \"%s\n\" \"\$line\"|awk '{print \$2}')"
	echo "while true"
	echo "do"
	echo "	read line"
	echo "	if [ -z \"\$line\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	printf \"%s\n\" \"\$line\" 1>&2"
	echo "	line=\$(echo \"\$line\"|tr -d '\r')"
	echo "	if [ -z \"\$line\" -o \"\$line\" = \".\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "done"
	echo "printf \"RETR 1\r\n\" 1>&2"
	echo "printf \"RETR 1\r\n\""
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	echo "printf \"%s\" \"\$line\" | grep -E \"+OK .* octets follow.\" > /dev/null"
	echo "if [ \$? -ne 0 ] ; then"
	echo "	echo \"RETR command failed\" 1>&2"
	echo "	exit 1"
	echo "fi"
	echo "found=0"
	echo "while true"
	echo "do"
	echo "	read line"
	echo "	if [ -z \"\$line\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	printf \"%s\n\" \"\$line\" 1>&2"
	echo "	line=\$(echo \"\$line\"|tr -d '\r')"
	echo "	if [ \"\$line\" = \".\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	echo \"\$line\" | grep \"This is a test mailing\" > /dev/null"
	echo "	if [ \$? -eq 0 ] ; then"
	echo "		found=1"
	echo "	fi"
	echo "done"
	echo "printf \"QUIT\r\n\""
	echo "read line"
	echo "printf \"%s\n\" \"\$line\" 1>&2"
	echo "if [ \$found -eq 1 ] ; then"
	echo "	exit 0"
	echo "else"
	echo "	exit 1"
	echo "fi"
	) > $testdir/tcpclient.pop3
	chmod +x $testdir/tcpclient.pop3
}

test_pop3()
{
	if [ "$5" = "CRAM-SHA256" ] ; then
		swaks -S --tls --to $1 --from $1 --server localhost --port $smtp_port -a "CRAM-MD5" -au $1 -ap "$2"
	else
		swaks -S --tls --to $1 --from $1 --server localhost --port $smtp_port -a $5 -au $1 -ap "$2"
	fi
	check_mail indimail $4 no-delete

	create_tcpclient_pop3 $1 $2 $5
	check_service pop3d
	tm1=$(date +"%s.%4N")
	tcpclient -a 10 -vDHR 0 1100 $testdir/tcpclient.pop3 2>$logdir/pop3d/pop3d.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		if [ "$5" = "PLAIN" -o "$5" = "LOGIN" ] ; then
		printf "\r  testing POP3   login %-15s hash=%-8s %-11s +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$hash" "$5" "$str" " " "$secs"
		else
		printf "\r  testing POP3   login %-15s hash=xxxxxxxx %-11s +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$5" "$str" " " "$secs"
		fi
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo
		if [ "$5" = "PLAIN" -o "$5" = "LOGIN" ] ; then
		printf "  testing POP3  login %s hash=%-8s %-11s and mail retrieval (%s) failed\n" "$1" "$hash" "$5" "$str"
		else
		printf "  testing POP3  login %s hash=xxxxxxxx %-11s and mail retrieval (%s) failed\n" "$1" "$5" "$str"
		fi
		if [ $prompt -eq 1 ] ; then
			less $logdir/pop3d/pop3d.log
		fi
		[ -z "$failed" ] && failed="POP3 login $hash" || failed="$failed, POP3 login $hash"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	check_relay > /dev/null 2>>$logdir/pop3d/pop3d.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing record in relay table succeeded %71s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		delete_relay 2>>$logdir/pop3d/pop3d.log
		echo
		printf "  testing record in relay table failed\n"
		if [ $prompt -eq 1 ] ; then
			less $logdir/pop3d/pop3d.log
		fi
		[ -z "$failed" ] && failed="check relay" || failed="$failed, check relay"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	swaks -S --to tuser01@$domain3 --from $1 --server ::1 --port $smtp_port >> $logdir/pop3d/pop3d.log 2>&1
	ret1=$?
	swaks -S --to tuser01@$domain3 --from $3 --server ::1 --port $smtp_port >> $logdir/pop3d/pop3d.log 2>&1
	ret2=$?
	if [ $ret1 -eq 0 -a $ret2 -ne 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing Open RELAY using POP3  login succeeded %64s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		delete_relay 2>>$logdir/pop3d/pop3d.log
		echo
		printf "  testing Open RELAY using POP3  login failed ret1=%d ret2=%d\n" $ret1 $ret2
		if [ $prompt -eq 1 ] ; then
			less $logdir/pop3d/pop3d.log
		fi
		[ -z "$failed" ] && failed="open relay pop3" || failed="$failed, open relay pop3"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	n1=$(openssl ciphers -v | awk '{print $2}' | grep TLS | sort | uniq | tail -1 |cut -c5- |cut -d. -f1)
	n2=$(openssl ciphers -v | awk '{print $2}' | grep TLS | sort | uniq | tail -1 |cut -c5- |cut -d. -f2)
	max=$(expr 10 \* $n1 + $n2)
	[ $max -gt 12 ] && fn=clientciphersuite || fn=clientcipherlist
	check_service pop3d-ssl 3
	tm1=$(date +"%s.%4N")
	sudo $setuidgid -g qcerts $user tcpclient -a 10 -f $cntrldir/$fn \
		-n $certdir/clientcert.pem -vDHR 0 9950 \
		$testdir/tcpclient.pop3 2>$logdir/pop3d-ssl/pop3d-ssl.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		if [ "$5" = "PLAIN" -o "$5" = "LOGIN" ] ; then
		printf "\r  testing POP3S  login %-15s hash=%-8s %-11s +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$hash" "$5" "$str" " " "$secs"
		else
		printf "\r  testing POP3S  login %-15s hash=xxxxxxxx %-11s +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$5" "$str" " " "$secs"
		fi
		print_pct
	else
		fcount=$(expr $fcount + 1)
		delete_relay 2>>$logdir/pop3d-ssl/pop3d-ssl.log
		echo
		if [ "$5" = "PLAIN" -o "$5" = "LOGIN" ] ; then
		printf "  testing POP3S login %s hash=%s %s and mail retrieval (%s) failed\n" "$1" "$hash" "$5" "$str"
		else
		printf "  testing POP3S login %s hash=xxxxxxxx %s and mail retrieval (%s) failed\n" "$1" "$5" "$str"
		fi
		if [ $prompt -eq 1 ] ; then
			less $logdir/pop3d-ssl/pop3d-ssl.log
		fi
		[ -z "$failed" ] && failed="POP3S login $hash" || failed="$failed, POP3S login $hash"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	swaks -S --to tuser01@$domain3 --from $1 --server ::1 --port $smtp_port >> $logdir/pop3d-ssl/pop3d-ssl.log 2>&1
	ret1=$?
	swaks -S --to tuser01@$domain3 --from $3 --server ::1 --port $smtp_port >> $logdir/pop3d-ssl/pop3d-ssl.log 2>&1
	ret2=$?
	if [ $ret1 -eq 0 -a $ret2 -ne 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		delete_relay 2>>$logdir/pop3d-ssl/pop3d-ssl.log
		printf "\r  testing Open RELAY using POP3S login succeeded %64s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo
		delete_relay 2>>$logdir/pop3d-ssl/pop3d-ssl.log
		printf "  testing Open RELAY using POP3S login failed ret1=%d ret2=%d\n" $ret1 $ret2
		if [ $prompt -eq 1 ] ; then
			less $logdir/pop3d-ssl/pop3d-ssl.log
		fi
		[ -z "$failed" ] && failed="open relay pop3s" || failed="$failed, open relay pop3s"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	check_mail indimail $4
}

auth_imap()
{
	b64=$(printf "\0$1\0$2" | base64)
	(
	echo "#!/bin/sh"
	echo "exec 0<&6"
	echo "exec 1>&7"
	echo "read key"
	echo "printf \"%s\n\" \"\$key\" 1>&2"
	if [ "$3" = "PLAIN" ] ; then
		echo "printf \"a1 AUTHENTICATE PLAIN\r\n\" 1>&2"
		echo "printf \"a1 AUTHENTICATE PLAIN\r\n\""
		echo "read line"
		echo "printf \"%s\n\" \"\$line\" 1>&2"
		echo "printf \"%s\r\n\" $b64 1>&2"
		echo "printf \"%s\r\n\" $b64"
	elif [ "$3" = "CRAM-MD5" -o "$3" = "CRAM-SHA1" -o "$3" = "CRAM-SHA256" ] ; then
		echo "printf \"a1 AUTHENTICATE $3\r\n\" 1>&2"
		echo "printf \"a1 AUTHENTICATE $3\r\n\""
		echo "read line"
		echo "line=\$(echo \$line | cut -c3- | sed -e 's/\r//g')"
		echo "b64=\$($authcram -t $3 $1 $2 \$line | sed -e 's/\r//g')"
		echo "printf \"%s\r\n\" \"\$b64\" 1>&2"
		echo "printf \"%s\r\n\" \"\$b64\""
	fi
	echo "read key"
	echo "printf \"%s\" \"\$key\" |grep \"a1 OK LOGIN Ok.\" >/dev/null"
	echo "if [ \$? -ne 0 ] ; then"
	echo "	printf \"%s\n\" \"\$key\" 1>&2"
	echo "	echo \"LOGIN Failed\" 1>&2"
	echo "	exit 1"
	echo "else"
	echo "	printf \"%s\n\" \"\$key\" 1>&2"
	echo "fi"
	echo "printf \"a1 select inbox\r\n\""
	echo "while true"
	echo "do"
	echo "	read line"
	echo "	if [ -z \"\$line\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	t=\$(echo \"\$line\" | cut -d' ' -f1)"
	echo "	if [ \"\$t\" = \"*\" ] ; then"
	echo "		echo \"\$line\" 1>&2"
	echo "		continue"
	echo "	elif [ \"\$t\" = \"a1\" ] ; then"
	echo "		break"
	echo "	else"
	echo "		echo \"\$line\" 1>&2"
	echo "	fi"
	echo "done"
	echo ""
	echo "printf \"a1 fetch 1 RFC822\r\n\""
	echo "found=0"
	echo "while true"
	echo "do"
	echo "	read line"
	echo "	if [ -z \"\$line\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	echo \"\$line\" | grep \"a1 OK FETCH completed.\" > /dev/null"
	echo "	if [ \$? -eq 0 ] ; then"
	echo "		break"
	echo "	fi"
	echo "	echo \"\$line\" | grep \"This is a test mailing\" > /dev/null"
	echo "	if [ \$? -eq 0 ] ; then"
	echo "		found=1"
	echo "	fi"
	echo "	echo \"\$line\" 1>&2"
	echo "done"
	echo "printf \"a1 logout\r\n\""
	echo "read line"
	echo "printf \"%s\n\" \"\$line\""
	echo "if [ \$found -eq 1 ] ; then"
	echo "	exit 0"
	echo "else"
	echo "	exit 1"
	echo "fi"
	) > $testdir/tcpclient.imap
	chmod +x $testdir/tcpclient.imap
	check_service imapd 3
	chmod +x $testdir/tcpclient.imap
	check_service imapd 3
	tcpclient -a 10 -vDHR 0 1430 $testdir/tcpclient.imap
	return $?
}

create_tcpclient_imap()
{
	b64=$(printf "\0$1\0$2" | base64)
	(
	echo "#!/bin/sh"
	echo "exec 0<&6"
	echo "exec 1>&7"
	echo "read key"
	echo "printf \"%s\n\" \"\$key\" 1>&2"
	if [ "$3" = "PLAIN" ] ; then
		echo "printf \"a1 AUTHENTICATE PLAIN\r\n\" 1>&2"
		echo "printf \"a1 AUTHENTICATE PLAIN\r\n\""
		echo "read line"
		echo "printf \"%s\n\" \"\$line\" 1>&2"
		echo "printf \"%s\r\n\" $b64 1>&2"
		echo "printf \"%s\r\n\" $b64"
	elif [ "$3" = "CRAM-MD5" -o "$3" = "CRAM-SHA1" -o "$3" = "CRAM-SHA256" ] ; then
		echo "printf \"a1 AUTHENTICATE $3\r\n\" 1>&2"
		echo "printf \"a1 AUTHENTICATE $3\r\n\""
		echo "read line"
		echo "line=\$(echo \$line | cut -c3- | sed -e 's/\r//g')"
		echo "b64=\$($authcram -t $3 $1 $2 \$line | sed -e 's/\r//g')"
		echo "printf \"%s\r\n\" \"\$b64\" 1>&2"
		echo "printf \"%s\r\n\" \"\$b64\""
	fi
	echo "read key"
	echo "printf \"%s\" \"\$key\" |grep \"a1 OK LOGIN Ok.\" >/dev/null"
	echo "if [ \$? -ne 0 ] ; then"
	echo "	printf \"%s\n\" \"\$key\" 1>&2"
	echo "	echo \"LOGIN Failed\" 1>&2"
	echo "	exit 1"
	echo "else"
	echo "	printf \"%s\n\" \"\$key\" 1>&2"
	echo "fi"
	echo "printf \"a1 select inbox\r\n\""
	echo "while true"
	echo "do"
	echo "	read line"
	echo "	if [ -z \"\$line\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	t=\$(echo \"\$line\" | cut -d' ' -f1)"
	echo "	if [ \"\$t\" = \"*\" ] ; then"
	echo "		echo \"\$line\" 1>&2"
	echo "		continue"
	echo "	elif [ \"\$t\" = \"a1\" ] ; then"
	echo "		break"
	echo "	else"
	echo "		echo \"\$line\" 1>&2"
	echo "	fi"
	echo "done"
	echo ""
	echo "printf \"a1 fetch 1 RFC822\r\n\""
	echo "found=0"
	echo "while true"
	echo "do"
	echo "	read line"
	echo "	if [ -z \"\$line\" ] ; then"
	echo "		break"
	echo "	fi"
	echo "	echo \"\$line\" | grep \"a1 OK FETCH completed.\" > /dev/null"
	echo "	if [ \$? -eq 0 ] ; then"
	echo "		break"
	echo "	fi"
	echo "	echo \"\$line\" | grep \"This is a test mailing\" > /dev/null"
	echo "	if [ \$? -eq 0 ] ; then"
	echo "		found=1"
	echo "	fi"
	echo "	echo \"\$line\" 1>&2"
	echo "done"
	echo "printf \"a1 logout\r\n\""
	echo "read line"
	echo "printf \"%s\n\" \"\$line\""
	echo "if [ \$found -eq 1 ] ; then"
	echo "	exit 0"
	echo "else"
	echo "	exit 1"
	echo "fi"
	) > $testdir/tcpclient.imap
	chmod +x $testdir/tcpclient.imap
}

test_imap()
{
	if [ "$5" = "CRAM-SHA256" ] ; then
		swaks -S --tls --to $1 --from $1 --server localhost --port $smtp_port -a "CRAM-MD5" -au $1 -ap "$2"
	else
		swaks -S --tls --to $1 --from $1 --server localhost --port $smtp_port -a $5 -au $1 -ap "$2"
	fi
	check_mail indimail $4 no-delete
	create_tcpclient_imap $1 $2 $5
	check_service imapd 3
	tm1=$(date +"%s.%4N")
	tcpclient -a 10 -vDHR 0 1430 $testdir/tcpclient.imap 2>$logdir/imapd/imapd.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		if [ "$5" = "PLAIN" -o "$5" = "LOGIN" ] ; then
		printf "\r  testing IMAP   login %-15s hash=%-8s %-11s +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$hash" "$5" "$str" " " "$secs"
		else
		printf "\r  testing IMAP   login %-15s hash=xxxxxxxx %-11s +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$5" "$str" " " "$secs"
		fi
		print_pct
	else
		echo
		if [ "$5" = "PLAIN" -o "$5" = "LOGIN" ] ; then
		printf "  testing IMAP login %s hash=%-8s and mail retrieval (%s) failed\n" "$1" "$hash" "$str"
		else
		printf "  testing IMAP login %s hash=xxxxxxxx and mail retrieval (%s) failed\n" "$1" "$str"
		fi
		if [ $prompt -eq 1 ] ; then
			less $logdir/imapd/imapd.log
		fi
		[ -z "$failed" ] && failed="IMAP login $hash" || failed="$failed, IMAP login $hash"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	check_relay > /dev/null 2>>$logdir/imapd/imapd.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing record in relay table succeeded %71s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		delete_relay 2>>$logdir/imapd/imapd.log
		echo
		printf "  testing record in relay table failed\n"
		if [ $prompt -eq 1 ] ; then
			less $logdir/imapd/imapd.log
		fi
		[ -z "$failed" ] && failed="check relay" || failed="$failed, check relay"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	swaks -S --to tuser01@$domain3 --from $1 --server ::1 --port $smtp_port >> $logdir/imapd/imapd.log 2>&1
	ret1=$?
	swaks -S --to tuser01@$domain3 --from $3 --server ::1 --port $smtp_port >> $logdir/imapd/imapd.log 2>&1
	ret2=$?
	if [ $ret1 -eq 0 -a $ret2 -ne 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing Open RELAY using IMAP  login succeeded %64s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		delete_relay 2>>$logdir/imapd/imapd.log
		echo
		printf "  testing Open RELAY using IMAP  login failed ret1=%d ret2=%d\n" $ret1 $ret2
		if [ $prompt -eq 1 ] ; then
			less $logdir/imapd/imapd.log
		fi
		[ -z "$failed" ] && failed="open relay imap" || failed="$failed, open relay imap"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	n1=$(openssl ciphers -v | awk '{print $2}' | grep TLS | sort | uniq | tail -1 |cut -c5- |cut -d. -f1)
	n2=$(openssl ciphers -v | awk '{print $2}' | grep TLS | sort | uniq | tail -1 |cut -c5- |cut -d. -f2)
	max=$(expr 10 \* $n1 + $n2)
	[ $max -gt 12 ] && fn=clientciphersuite || fn=clientcipherlist
	check_service imapd-ssl 3
	tm1=$(date +"%s.%4N")
	sudo $setuidgid -g qcerts $user tcpclient -a 10 -f $cntrldir/$fn  \
		-n $certdir/clientcert.pem -vDHR 0 9930 $testdir/tcpclient.imap \
		2>$logdir/imapd-ssl/imapd-ssl.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		if [ "$5" = "PLAIN" -o "$5" = "LOGIN" ] ; then
		printf "\r  testing IMAPS  login %-15s hash=%-8s %-11s +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$hash" "$5" "$str" " " "$secs"
		else
		printf "\r  testing IMAPS  login %-15s hash=xxxxxxxx %-11s +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$5" "$str" " " "$secs"
		fi
		print_pct
	else
		fcount=$(expr $fcount + 1)
		delete_relay 2>>$logdir/imapd-ssl/imapd-ssl.log
		echo
		if [ "$5" = "PLAIN" -o "$5" = "LOGIN" ] ; then
		printf "  testing IMAPS login %s hash=%-8s and mail retrieval (%s) failed\n" "$1" "$hash" "$str"
		else
		printf "  testing IMAPS login %s hash=xxxxxxxx and mail retrieval (%s) failed\n" "$1" "$str"
		fi
		if [ $prompt -eq 1 ] ; then
			less $logdir/imapd-ssl/imapd-ssl.log
		fi
		[ -z "$failed" ] && failed="IMAPS login $hash" || failed="$failed, IMAPS login $hash"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	swaks -S --to tuser01@$domain3 --from $1 --server ::1 --port $smtp_port >> $logdir/imapd-ssl/imapd-ssl.log 2>&1
	ret1=$?
	swaks -S --to tuser01@$domain3 --from $3 --server ::1 --port $smtp_port >> $logdir/imapd-ssl/imapd-ssl.log 2>&1
	ret2=$?
	if [ $ret1 -eq 0 -a $ret2 -ne 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		delete_relay 2>>$logdir/imapd-ssl/imapd-ssl.log
		printf "\r  testing Open RELAY using IMAPS login succeeded %64s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		delete_relay 2>>$logdir/imapd-ssl/imapd-ssl.log
		echo
		printf "  testing Open RELAY using IMAPS login failed ret1=%d ret2=%d\n" $ret1 $ret2
		if [ $prompt -eq 1 ] ; then
			less $logdir/imapd-ssl/imapd-ssl.log
		fi
		[ -z "$failed" ] && failed="open relay imaps" || failed="$failed, open relay imaps"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	check_mail indimail $4
}

test_pop3_starttls()
{
	swaks -S --tls --to $1 --from $1 --server localhost --port $smtp_port -a PLAIN -au $1 -ap "$2"
	check_mail indimail $4 no-delete

	n1=$(openssl ciphers -v | awk '{print $2}' | grep TLS | sort | uniq | tail -1 |cut -c5- |cut -d. -f1)
	n2=$(openssl ciphers -v | awk '{print $2}' | grep TLS | sort | uniq | tail -1 |cut -c5- |cut -d. -f2)
	max=$(expr 10 \* $n1 + $n2)
	[ $max -gt 12 ] && fn=clientciphersuite || fn=clientcipherlist

	create_tcpclient_pop3 $1 $2 "PLAIN"
	sed -i -e '4,5d' $testdir/tcpclient.pop3
	check_service pop3d-ssl 3

	tm1=$(date +"%s.%4N")
	sudo $setuidgid -g qcerts $user tcpclient -s pop3 -a 10 -f $cntrldir/$fn  \
		-n $certdir/clientcert.pem -vDHR 0 1100 $testdir/tcpclient.pop3 >$logdir/pop3d-ssl/pop3d-ssl.log 2>&1
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing POP3STARTTLS %-15s hash=%-8s PLAIN       +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$hash" "$str" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		delete_relay 2>>$logdir/pop3d-ssl/pop3d-ssl.log
		echo
		printf "  testing POP3 STARTTLS login %s hash=%-8s and mail retrieval (%s) failed\n" "$1" "$hash" "$str"
		if [ $prompt -eq 1 ] ; then
			less $logdir/pop3d-ssl/pop3d-ssl.log
		fi
		[ -z "$failed" ] && failed="POP3 STARTTLS login $hash" || failed="$failed, POP3 STARTTLS login $hash"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	delete_relay 2>>$logdir/pop3d-ssl/pop3d-ssl.log
}

test_imap_starttls()
{
	swaks -S --tls --to $1 --from $1 --server localhost --port $smtp_port -a PLAIN -au $1 -ap "$2"
	check_mail indimail $4 no-delete

	n1=$(openssl ciphers -v | awk '{print $2}' | grep TLS | sort | uniq | tail -1 |cut -c5- |cut -d. -f1)
	n2=$(openssl ciphers -v | awk '{print $2}' | grep TLS | sort | uniq | tail -1 |cut -c5- |cut -d. -f2)
	max=$(expr 10 \* $n1 + $n2)
	[ $max -gt 12 ] && fn=clientciphersuite || fn=clientcipherlist

	create_tcpclient_imap $1 $2 "PLAIN"
	sed -i -e '4,5d' $testdir/tcpclient.imap
	check_service imapd-ssl 3

	tm1=$(date +"%s.%4N")
	sudo $setuidgid -g qcerts $user tcpclient -s imap -a 10 -f $cntrldir/$fn  \
		-n $certdir/clientcert.pem -vDHR 0 1430 $testdir/tcpclient.imap >$logdir/imapd-ssl/imapd-ssl.log 2>&1
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing IMAPSTARTTLS %-15s hash=%-8s PLAIN       +  mail retrieval (%s) succeeded %4s [%.4f sec]\n" "$1" "$hash" "$str" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		delete_relay 2>>$logdir/imapd-ssl/imapd-ssl.log
		echo
		printf "  testing IMAP STARTTLS login %s hash=%-8s and mail retrieval (%s) failed\n" "$1" "$hash" "$str"
		if [ $prompt -eq 1 ] ; then
			less $logdir/imapd/imapd.log
		fi
		[ -z "$failed" ] && failed="IMAP STARTTLS login $hash" || failed="$failed, IMAP STARTTLS login $hash"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	delete_relay 2>>$logdir/imapd-ssl/imapd-ssl.log
}

do_post_handle()
{
	(
	echo "#!/bin/sh"
	echo "echo MYUID=\$(id -u)"
	echo "exit 0"
	) > $testdir/post_handle
	chmod +x $testdir/post_handle
	arg1=$1 # $domain1
	arg2=$2 # pass
	arg3=$3 # $domain2
	arg4=$4 # $testuser3
	arg5=$5 # $testuser4
	arg6=$6 # $domain3
	for i in vadddomain vaddaliasdomain vadduser vmoduser vmoveuserdir vrenameuser vrenamedomain vdeldomain1 vdeldomain2
	do
		prog=$i
		case $i in
			vadddomain)
			set -- -B $testdir/qmail -d $qmaildir $arg1 $arg2
			uid=$INUID
			;;
			vaddaliasdomain)
			set "$arg3 $arg1"
			uid=$INUID
			;;
			vadduser)
			set "$arg4 $arg2"
			uid=$INUID
			;;
			vmoduser)
			set -- -q +100m $arg4
			uid=$INUID
			;;
			vmoveuserdir)
			set "$arg4 $testdir/mail/T2Zsym/$domain1/testuser"
			uid=$INUID
			;;
			vrenameuser)
			set "$arg4 $arg5"
			uid=$INUID
			;;
			vrenamedomain)
			set "$arg1 $arg6"
			uid=$INUID
			;;
			vdeldomain1)
			prog=vdeldomain
			set "$arg3"
			uid=$INUID
			;;
			vdeldomain2)
			set "$arg6"
			prog=vdeldomain
			;;
			*)
			set "notset"
			;;
		esac
		if [ "$1" = "notset" ] ; then
			continue
		fi
		tm1=$(date +"%s.%4N")
		printf "\r%126s\n" " "
		printf "\rExecuting %s %s\n" "$prog" "$*"
		$sudo $setuidgid indimail env - \
			PATH=/usr/bin:/usr/sbin \
			POST_HANDLE=$testdir/post_handle \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
			DOMAINDIR=$qmaildir \
		$prog $* > $logdir/setup/test"$i".log
		if [ $? -eq 0 ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing command %-17s succeeded %67s [%.4f sec]\n" "$prog" " " "$secs"
			print_pct
			id=$(grep MYUID $logdir/setup/test"$i".log | grep MYUID | cut -d= -f2)
			if [ $id -eq $uid ] ; then
				tm2=$(date +"%s.%4N")
				secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
				tcount=$(expr $tcount + 1)
				printf "\r  testing POST HANDLE for %-17s succeeded %59s [%.4f sec]\n" "$prog" " " "$secs"
				print_pct
			else
				fcount=$(expr $fcount + 1)
				if [ $prompt -eq 1 ] ; then
					less $logdir/setup/test"$i".log
				fi
				printf "  testing POST HANDLE for $prog failed\n"
				[ -z "$failed" ] && failed="post handle $prog" || failed="$failed, post handle $prog"
				[ $continue_on_err -eq 0 ] && exit 1 || return 0
			fi
		else
			fcount=$(expr $fcount + 1)
			if [ $prompt -eq 1 ] ; then
				less $logdir/setup/test"$i".log
			fi
			printf "  testing command $prog failed\n"
			[ -z "$failed" ] && failed="$prog failed" || failed="$failed, $prog failed"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi
	done
}

do_qmail_inject()
{
	# $1 - user
	# $2 - envelope From
	# $3 - envelope To
	# $4 - subject
	# $5 - header
	# $6 - from
	# $7 - to
	# $8 - cc
	# $9 - body
	if [ $# -eq 9 ] ; then
		body=$9
	else
		body=""
	fi
	if [ $# -eq 8 ] ; then
		cc=$8
	else
		cc=""
	fi
	if [ $# -eq 7 ] ; then
		if [ -n "$7" ] ; then
			to=$7
		else
			to=$3
		fi
	else
		to=$3
	fi
	if [ $# -eq 6 ] ; then
		if [ -n "$6" ] ; then
			from=$6
		else
			from=$2
		fi
	else
		from=$2
	fi
	if [ $# -eq 5 ] ; then
		header=$5
	else
		header=""
	fi
	if [ $# -eq 4 ] ; then
		if [ -n "$4" ] ; then
			subj=$4
		else
			subj="Testing qmail-inject"
		fi
	else
		subj="Testing qmail-inject"
	fi
	(
	echo "From: $from"
	echo "To: $to"
	if [ -n "$cc" ] ; then
		echo "Cc: $cc"
	fi
	echo "Subject: $subj"
	if [ -n "$header" ] ; then
		echo $header
	fi
	echo "Date: $(date -R)"
	echo
	if [ -n "$body" ] ; then
		echo "$body"
	else
		echo "Test message"
	fi
	) > /tmp/mail.txt
	cat /tmp/mail.txt | $sudo $setuidgid -g qcerts $1 env - \
		CONTROLDIR=$cntrldir \
		QUEUEDIR=$qmaildir/queue \
		QMAILQUEUE=$qmail_queue \
		BIGTODO=0 \
		CONFSPLIT=$confsplit \
		$qmail_inject -f$2 $3
	if [ $? -eq 0 ] ; then
		return 0
	else
		fcount=$(expr $fcount + 1)
		[ -z "$failed" ] && failed="do_qmail_inject" || failed="$failed, do_qmail_inject"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

do_valias()
{
	tm1=$(date +"%s.%4N")
	# $1 is testuser1
	# $2 is testuser2
	echo "Starting valias tests"
	destdir1=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $1 | awk '{print $3}')
	destdir2=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $2 | awk '{print $3}')
	$sudo $setuidgid indimail env - \
		PATH=/usr/bin:/usr/sbin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
	valias -i "&$2" $1 # forward mails from testuser1 to testuser2
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command valias insert succeeded %71s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		printf "  testing command valias insert failed\n"
		[ -z "$failed" ] && failed="valias insert" || failed="$failed, valias insert"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	do_qmail_inject $user $user@$HOSTNAME $1 # send email to testuser1 from $user@$HOSTNAME
	check_mail indimail $destdir2/Maildir
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 $sleep_secs | awk '{printf("%0.4f\n", $2-$1-$3)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing valias forwarding succeeded %75s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing valias forwarding failed"
		[ -z "$failed" ] && failed="valias forward" || failed="$failed, valias forward"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	$sudo $setuidgid indimail env - \
		PATH=/usr/bin:/usr/sbin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
	valias -u "&$2" -i "$maildir/" $1
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command valias update succeeded %71s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		printf "  testing command valias update failed\n"
		[ -z "$failed" ] && failed="valias update" || failed="$failed, valias update"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	$sudo chown -R $INUID:$INGID $maildir
	tm1=$(date +"%s.%4N")
	do_qmail_inject $user $user@$HOSTNAME $1
	sleep $sleep_int
	$sudo chown -R $MYUID:$MYUID $maildir
	check_mail $user $maildir
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 $sleep_int $sleep_secs| awk '{printf("%0.4f\n", $2-$1-$3-$4)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing valias maildir delivery succeeded %69s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing valias maildir delivery failed"
		[ -z "$failed" ] && failed="valias maildir delivery" || failed="$failed, valias maildir delivery"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	tm1=$(date +"%s.%4N")
	$sudo $setuidgid indimail env - \
		PATH=/usr/bin:/usr/sbin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
	valias -d "&$2" $1
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command valias delete succeeded %71s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		printf "  testing command valias delete failed\n"
		[ -z "$failed" ] && failed="valias delete" || failed="$failed, valias delete"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

do_pwdlookup()
{
	tm1=$(date +"%s.%4N")
	enc_pass1=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -p $1 | awk '{print $3}')
	t=$(echo $1|cut -d@ -f1)
	mkdir -p $testdir/pwdlookup $logdir/pwdlookup
	env NSSD_SOCKET=$testdir/pwdlookup/nssd.sock \
		/usr/sbin/nssd -f $sysconfdir/nssd.conf -d debug >$logdir/pwdlookup/nssd.log 2>&1 &
	sleep 1
	enc_pass2=$(env NSSD_SOCKET=$testdir/pwdlookup/nssd.sock /usr/libexec/indimail/check_getpw $1 | \
		awk -F: '{print $1":"$2}')
	ret=$?
	kill $(cat $testdir/pwdlookup/nssd.pid)
	if [ $ret -eq 0 -a "$t:$enc_pass1" = "$enc_pass2" ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1-1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing pwdlookup succeeded %83s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		fcount=$(expr $fcount + 1)
		printf "  testing pwdlookup failed\n"
		echo "ret=$? pass [$t:$enc_pass1] [$enc_pass2]"
		cat $logdir/pwdlookup/nssd.log
		[ -z "$failed" ] && failed="pwdlookup" || failed="$failed, pwdlookup"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

do_cleanup_failed()
{
	if [ -f $testdir/cleanup.done ] ; then
		rm -f $testdir/cleanup.done
	fi
	do_cleanup 1
}

do_cleanup()
{
	touch $testdir/cleanup.done
	delete_domain $domain1 1 >/dev/null 2>&1
	do_svscan_stop
	# Cleanup
	$sudo /bin/rm -rf $servicedir
	$sudo /bin/rm -rf $qmaildir/queue
	$sudo /bin/rm -rf $testdir/svscan1.out $testdir/svscan2.out
	if [ $# -eq 0 ] ; then
		$sudo /bin/rm -rf $logdir
		$sudo /bin/rm -rf $cntrldir
		$sudo /bin/rm -rf $qmaildir/alias
	fi
	$sudo /bin/rm -rf $qmaildir/inquery
	$sudo /bin/rm -rf $testdir/run
	if [ $# -eq 0 ] ; then
		$sudo /bin/rm -rf $testdir/mail
	fi
	$sudo /bin/rm -rf $testdir/$user
	$sudo /bin/rm -rf $testdir/inquery
	$sudo /bin/rm  -f $testdir/tcpclient.imap $testdir/tcpclient.pop3 \
		$testdir/tcpclient.smtp $testdir/post_handle
	$sudo /bin/rm -rf $sysconfdir/users
	/bin/rm -f $sysconfdir/nssd.conf
	$sudo /bin/rm -rf $qmaildir/domains
	$sudo /bin/rm -rf $testdir/mail
	$sudo /bin/rm -f $testdir/subject.tmp
	$sudo /bin/rm -f $testdir/.vacation.msg
	$sudo /bin/rm -rf $qmaildir/autoturn
}

do_autoresponder()
{
	# $1=$testuser1
	# $2=$testuser2
	tm1=$(date +"%s.%4N")
	echo "Starting Autoresponder test"
	destdir1=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $1 | awk '{print $3}')
	destdir2=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $2 | awk '{print $3}')
	echo "Testing Autoresponder" > /tmp/vacation.$$
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		SERVICEDIR=$servicedir \
	vmoduser -l + $2 > $logdir/setup/vmoduser.log < /tmp/vacation.$$
	if [ $status -eq 0 ] ; then
		/bin/rm -f /tmp/vacation.$$
		tcount=$(expr $tcount + 1)
	else
		/bin/rm -f /tmp/vacation.$$
		fcount=$(expr $fcount + 1)
		echo "  testing vmoduser set vacation failed"
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vmoduser.log
		fi
		[ -z "$failed" ] && failed="autoresponder" || failed="$failed, autoresponder"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	subj="Testing Autoresponder"
	do_qmail_inject $user $1 $2 "$subj" # send email from testuser1 to $testuser2
	check_mail indimail $destdir2/Maildir
	if [ $? -ne 0 ] ; then
		echo "Check $destdir2/Maildir [$subject]"
		fcount=$(expr $fcount + 1)
		echo "  testing autoresponder failed"
		[ -z "$failed" ] && failed="autoresponder send_mail $2" || failed="$failed, autoresponder send_mail $2"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	s1=$sleep_secs
	check_mail indimail $destdir1/Maildir
	if [ $? -ne 0 ] ; then
		fcount=$(expr $fcount + 1)
		echo "  testing autoresponder failed2"
		[ -z "$failed" ] && failed="autoresponder" || failed="$failed, autoresponder"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	s2=$sleep_secs
	subject=$(cat $testdir/subject.tmp)
	if [ "$subject" = "Subject: Autoreply: Re: $subj" ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 $s1 $s2 | awk '{printf("%0.4f\n", $2-$1-$3-$4)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing autoresponder succeeded %79s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "[$subject] [Subject: Autoreply: Re: $subj]"
		echo "  testing autoresponder failed (subject mismatch)"
		[ -z "$failed" ] && failed="autoresponder subject" || failed="$failed, autoresponder subject"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		SERVICEDIR=$servicedir \
	vmoduser -l - $2 >> $logdir/setup/vmoduser.log
}

do_dot_qmail_vdelivermail()
{
	destdir1=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser1 | awk '{print $3}')
	destdir2=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser2 | awk '{print $3}')
	tm1=$(date +"%s.%4N")
	echo "Starting dot-qmail multi-instruction test for vdelivermail"
	(
	echo "&$testuser2"
	echo "$destdir1/Maildir"
	) > /tmp/dot-qmail.$$
	sudo mv /tmp/dot-qmail.$$ $destdir1/.qmail
	sudo chown indimail:indimail $destdir1/.qmail
	do_qmail_inject $user $user@$HOSTNAME $testuser1 "" "" "" "" "" "Test dot-qmail" # send email to testuser1 from $user@$HOSTNAME
	check_mail indimail $destdir1/Maildir no-delete
	fn1=$(sudo ls $destdir1/Maildir/new)
	t1=$(sudo sh -c "/bin/822body < $destdir1/Maildir/new/$fn1")
	check_mail indimail $destdir2/Maildir no-delete
	fn2=$(sudo ls $destdir2/Maildir/new)
	t2=$(sudo sh -c "/bin/822body < $destdir2/Maildir/new/$fn2")
	if [ "$t1" = "$t2" -a "$t1" = "Test dot-qmail" ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 $sleep_secs | awk '{printf("%0.4f\n", $2-$1-(2 * $3))}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing dot-qmail multi-instruction in vdelivermail succeeded %49s [%.4f sec]\n" " " $secs
		print_pct
	else
		echo "fn1=$fn1, fn2=$fn2, t1=[$t1], t2=[$t2]"
		fcount=$(expr $fcount + 1)
		echo "testing dot-qmail multi-instruction in vdelivermail failed"
		[ -z "$failed" ] && failed="dot-qmail multi-instruction" || failed="$failed, dot-qmail multi-instruction"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	sudo /bin/rm -f $destdir1/.qmail $destdir1/Maildir/new/$fn1 $destdir2/Maildir/new/$fn2
}

do_eliminate_dups()
{
	destdir1=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser1 | awk '{print $3}')
	tm1=$(date +"%s.%4N")
	echo "Starting Duplicate Eliminator tests"
	echo  1 > $servicedir/qmail-send.2025/variables/ELIMINATE_DUPS
	echo 60 > $servicedir/qmail-send.2025/variables/ELIMINATE_DUPS_INT
	echo "/bin/822header -X Received -X Delivered-To -X X-Delivered-To -X Date -X Message-ID" \
		> $servicedir/qmail-send.2025/variables/ELIMINATE_DUPS_ARGS
	sudo svc -r $servicedir/qmail-send.2025
	sleep $sleep_int
	do_qmail_inject $user $user@$HOSTNAME $testuser1 # send email to testuser1 from $user@$HOSTNAME
	sleep 1
	do_qmail_inject $user $user@$HOSTNAME $testuser1 # send email to testuser1 from $user@$HOSTNAME
	sleep 1
	do_qmail_inject $user $user@$HOSTNAME $testuser1 # send email to testuser1 from $user@$HOSTNAME
	count1=$(sudo ls $destdir1/Maildir/new | wc -l)
	count2=$(sudo cat $destdir1/Maildir/dupmd5 2>/dev/null| wc -l)
	if [ $count1 -eq $count2 -a $count1 -eq 1 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 $sleep_int 2 | awk '{printf("%0.4f\n", $2-$1-$3-$4)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing duplicate mail eliminator in vdelivermail succeeded %51s [%.4f sec]\n" " " $secs
		print_pct
	else
		echo count1=$count1, count2=$count2
		fcount=$(expr $fcount + 1)
		echo "  testing duplicate mail eliminator in vdelivermail failed"
		[ -z "$failed" ] && failed="duplicate eliminator vdelivermail" || failed="$failed, duplicate eliminator vdelivermail"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	check_mail indimail $destdir1/Maildir

	tm1=$(date +"%s.%4N")
	echo "|/bin/ismaildup $maildir /bin/maildirdeliver $maildir" > $testdir/$user/.qmail
	do_qmail_inject $user $user@$HOSTNAME $user@$HOSTNAME # send email to $user from $user@$HOSTNAME
	sleep 1
	do_qmail_inject $user $user@$HOSTNAME $user@$HOSTNAME # send email to $user from $user@$HOSTNAME
	sleep 1
	do_qmail_inject $user $user@$HOSTNAME $user@$HOSTNAME # send email to $user from $user@$HOSTNAME
	count1=$(sudo ls $maildir/new | wc -l)
	count2=$(sudo cat $maildir/dupmd5 | wc -l)
	if [ $count1 -eq $count2 -a $count1 -eq 1 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 2 | awk '{printf("%0.4f\n", $2-$1-$3)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing duplicate mail eliminator in ismaildup succeeded %54s [%.4f sec]\n" " " $secs
		print_pct
	else
		printf "\r"
		echo count1=$count1, count2=$count2
		read key
		fcount=$(expr $fcount + 1)
		echo "  testing duplicate mail eliminator in ismaildup failed"
		[ -z "$failed" ] && failed="duplicate eliminator ismaildup" || failed="$failed, duplicate eliminator ismaildup"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	check_mail $user $maildir
	/bin/rm -f $testdir/$user/.qmail
}

run_vcfilter()
{
	$sudo env - \
		PATH=/bin:/usr/bin:/usr/sbin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		"$@"
}

do_plain_cram_user_tests()
{
	if [ -n "$thash_supported" ] ; then
		hash_supported=$thash_supported
	else
		hash_supported="default DES MD5 SHA-256 SHA-512"
		sudo grep '\$y\$' /etc/shadow > /dev/null 2>&1 && shadow_pass=1 || shadow_pass=0
		if [ $shadow_pass -eq 1 ] ; then
			hash_supported="$hash_supported YESCRYPT"
		fi
	fi
	for hash in $hash_supported
	do
		printf "\r%126s\n" " "
		echo "Starting SMTP AUTH, qmail-remote, IMAP/POP3 login tests for hash $hash plain/cram users"
		t1="$password2""$hash"
		t2="$password3""$hash"
		t3="$password1""$hash"
		create_plain_user $testuser1 $t1 $hash
		create_cram_user  $testuser2 $t2 cram # both non-cram + cram
		create_cram_user  $testuser3 $t3      # only cram
		do_inquerytest $testuser1
		do_inquerytest $testuser2
		do_inquerytest $testuser3
		if [ "$hash" = "DES" ] ; then
			echo -1 > $servicedir/smtpd/variables/PASSWORD_HASH
		else
			> $servicedir/smtpd/variables/PASSWORD_HASH
		fi
		echo 1 > $servicedir/smtpd/variables/ENABLE_CRAM
		do_smtp_auth_swaks $testuser1 $t1 1 # LOGIN, PLAIN
		do_smtp_auth_qmr_o $domain1 $testuser1 $t1 1

		> $servicedir/smtpd/variables/ENABLE_CRAM
		do_smtp_auth_swaks $testuser2 $t2 2 # LOGIN, PLAIN, CRAM
		do_smtp_auth_qmr_o $domain1 $testuser2 $t2 2

		echo 1 > $servicedir/smtpd/variables/ENABLE_CRAM
		do_smtp_auth_swaks $testuser3 $t3 4 # CRAM only
		do_smtp_auth_qmr_o $domain1 $testuser3 $t3 4
		for j in 1 2
		do
			case $j in
				1)
				str="incache=0"
				for i in imap pop3
				do
					for k in d d-ssl
					do
						> $servicedir/"$i"$k/variables/PASSWD_CACHE
						> $servicedir/"$i"$k/variables/QUERY_CACHE
						if [ "$hash" = "DES" ] ; then
							echo -1 > $servicedir/"$i"$k/variables/PASSWORD_HASH
						else
							> $servicedir/"$i"$k/variables/PASSWORD_HASH
						fi
					done
				done
				;;
				2)
				str="incache=1"
				for i in imap pop3
				do
					for k in d d-ssl
					do
						echo 1 > $servicedir/"$i"$k/variables/PASSWD_CACHE
						echo 1 > $servicedir/"$i"$k/variables/QUERY_CACHE
						echo 1 > $servicedir/"$i"$k/variables/OPEN_SMTP
						if [ "$hash" = "DES" ] ; then
							echo -1 > $servicedir/"$i"$k/variables/PASSWORD_HASH
						else
							> $servicedir/"$i"$k/variables/PASSWORD_HASH
						fi
					done
				done
				;;
			esac
			for i in imap pop3
			do
				for k in d d-ssl
				do
					$sudo svc -r $servicedir/"$i"$k
				done
			done
			destdir1=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser1 | awk '{print $3}')
			destdir2=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser2 | awk '{print $3}')
			destdir3=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser3 | awk '{print $3}')
			check_service pop3d 3
			check_service pop3d-ssl 3
			test_pop3 $testuser2 $t2 $testuser1 $destdir2/Maildir "PLAIN"
			test_pop3 $testuser1 $t1 $testuser2 $destdir1/Maildir "PLAIN"
			if [ "$hash" = "default" ] ; then
			test_pop3 $testuser3 $t3 $testuser1 $destdir3/Maildir "CRAM-MD5"
			test_pop3 $testuser3 $t3 $testuser1 $destdir3/Maildir "CRAM-SHA1"
			test_pop3 $testuser3 $t3 $testuser1 $destdir3/Maildir "CRAM-SHA256"
			fi
			check_service imapd 3
			check_service imapd-ssl 3
			test_imap $testuser2 $t2 $testuser1 $destdir2/Maildir "PLAIN"
			test_imap $testuser1 $t1 $testuser2 $destdir1/Maildir "PLAIN"
			if [ "$hash" = "default" ] ; then
				test_imap $testuser3 $t3 $testuser1 $destdir3/Maildir "CRAM-MD5"
				test_imap $testuser3 $t3 $testuser1 $destdir3/Maildir "CRAM-SHA1"
				test_imap $testuser3 $t3 $testuser1 $destdir3/Maildir "CRAM-SHA256"
			fi
			check_mail indimail $destdir1/Maildir
			test_pop3_starttls $testuser1 $t1 $testuser2 $destdir1/Maildir
			test_imap_starttls $testuser1 $t1 $testuser2 $destdir1/Maildir
			printf "\r  testing SMTP AUTH, qmail-remote, IMAP/POP3 login tests for hash $hash plain/cram users succeeded"
		done
		delete_user $testuser1
		delete_user $testuser2
		delete_user $testuser3
	done
}

do_scram_user_tests()
{
	echo 1 > $servicedir/smtpd/variables/ENABLE_CRAM
	if [ -n "$thash_supported" ] ; then
		hash_supported=$thash_supported
	else
		hash_supported="DES MD5 SHA-256 SHA-512"
		sudo grep '\$y\$' /etc/shadow > /dev/null 2>&1 && shadow_pass=1 || shadow_pass=0
		if [ $shadow_pass -eq 1 ] ; then
			hash_supported="$hash_supported YESCRYPT"
		fi
	fi
	for hash in $hash_supported
	do
		printf "\r%126s\n" " "
		echo "Starting SMTP AUTH, IMAP/POP3 login, GSASL tests for hash $hash scram users"
		t1="$password1""$hash"
		t2="$password2""$hash"
		create_scram_user SCRAM-SHA-1   $testuser1 $t1 $hash
		create_scram_user SCRAM-SHA-256 $testuser2 $t2 $hash
		$sudo svc -h $servicedir/inlookup.infifo
		if [ "$hash" = "DES" ] ; then
			echo -1 > $servicedir/smtpd/variables/PASSWORD_HASH
		else
			> $servicedir/smtpd/variables/PASSWORD_HASH
		fi
		$sudo svc -r $servicedir/smtpd
		sleep $sleep_int
		check_service smtpd 3
		do_smtp_auth_swaks $testuser1 $t1 3 # SCRAM
		do_smtp_auth_qmr_o $domain1 $testuser1 $t1 3
		for j in 1 2
		do
			case $j in
				1)
				str="incache=0"
				> $servicedir/smtpd/variables/PASSWD_CACHE
				> $servicedir/smtpd/variables/QUERY_CACHE
				for i in imap pop3
				do
					for k in d d-ssl
					do
						> $servicedir/"$i"$k/variables/PASSWD_CACHE
						> $servicedir/"$i"$k/variables/QUERY_CACHE
						if [ "$hash" = "DES" ] ; then
							echo -1 > $servicedir/"$i"$k/variables/PASSWORD_HASH
						else
							> $servicedir/"$i"$k/variables/PASSWORD_HASH
						fi
					done
				done
				;;
				2)
				str="incache=1"
				echo 1 > $servicedir/smtpd/variables/PASSWD_CACHE
				echo 1 > $servicedir/smtpd/variables/QUERY_CACHE
				for i in imap pop3
				do
					for k in d d-ssl
					do
						echo 1 > $servicedir/"$i"$k/variables/PASSWD_CACHE
						echo 1 > $servicedir/"$i"$k/variables/QUERY_CACHE
						if [ "$hash" = "DES" ] ; then
							echo -1 > $servicedir/"$i"$k/variables/PASSWORD_HASH
						else
							> $servicedir/"$i"$k/variables/PASSWORD_HASH
						fi
					done
				done
				;;
			esac
			$sudo svc -r $servicedir/smtpd
			check_service smtpd 3
			if [ -x $gsasl ] ; then
				do_gsasl_test                   "SCRAM-SHA-1"        $testuser1 $t1
				do_gsasl_test                   "SCRAM-SHA-1-PLUS"   $testuser1 $t1
				do_gsasl_test                   "SCRAM-SHA-256"      $testuser2 $t2
				do_gsasl_test                   "SCRAM-SHA-256-PLUS" $testuser2 $t2
			fi
			do_smtp_auth_qmr_scram "SCRAM-SHA-1"        $domain1 $testuser1 $t1
			do_smtp_auth_qmr_scram "SCRAM-SHA-1-PLUS"   $domain1 $testuser1 $t1
			do_smtp_auth_qmr_scram "SCRAM-SHA-256"      $domain1 $testuser2 $t2
			do_smtp_auth_qmr_scram "SCRAM-SHA-256-PLUS" $domain1 $testuser2 $t2

			for i in imap pop3
			do
				for k in d d-ssl
				do
					$sudo svc -r $servicedir/"$i"$k
				done
			done
			destdir1=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser1 | awk '{print $3}')
			check_service pop3d 3
			check_service pop3d-ssl 3
			test_pop3 $testuser1 $t1 $testuser2 $destdir1 "PLAIN"
			check_service imapd 3
			check_service imapd-ssl 3
			test_imap $testuser1 $t1 $testuser2 $destdir1 "PLAIN"
			test_pop3_starttls $testuser1 $t1 $testuser2 $destdir1/Maildir
			test_imap_starttls $testuser1 $t1 $testuser2 $destdir1/Maildir
		done
		delete_user $testuser1
		delete_user $testuser2
		printf "\r%126s" " "
		printf "\r  testing SMTP AUTH, IMAP/POP3 login, GSASL tests for hash $hash scram users succeeded\n"
	done
	tcount=$(expr $tcount + 4)
	printf "  testing command tcpserver non-encrypted succeeded\n"
	printf "  testing command tcpclient non-encrypted succeeded\n"
	printf "  testing command tcpclient encrypted     succeeded\n"
	printf "  testing command tcpclient starttls      succeeded\n"
	print_pct
}

do_vfilter()
{
	tm1=$(date +"%s.%4N")
	echo "Starting VFILTER tests"
	$sudo env - \
		PATH=/bin:/usr/bin:/usr/sbin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	vmoddomain -f 1 -h bounce-no-mailbox $domain1 > $logdir/setup/vmoddomain.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vmoddomain set vfilter succeeded %62s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vadddomain.log
		fi
		echo "  testing command vmoddomain set vfilter failed"
		[ -z "$failed" ] && failed="vmoddomain set vfilter" || failed="$failed, vmoddomain set vfilter"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	# Comparisions tets
	# 0 - Equals                                  1 - Contains
	# 2 - Does not contain                        3 - Starts with
	# 4 - Ends with                               5 - My id not in To, CC, Bcc
	# 6 - Numerical Logical Expression            7 - RegExp

	destdir1=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser1 | awk '{print $3}')
	destdir2=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser2 | awk '{print $3}')
	vcount=1
	for i in "Equals" "Contains" "Does not contain" "Starts with" "Ends with" \
		"My id not in To, CC, Bcc" "Numerical Logical Expression" "RegExp"
	do
		tm1=$(date +"%s.%4N")
		sudo /bin/rm -rf $destdir1/Maildir/.Quarantine
		# Test delivery to folder after matching folder
		case $i in
			"Equals")
			run_vcfilter vcfilter -i -t "$i-Test" -c "$i" -k "virus found" -f Quarantine -b 0 -h "X-QHPSI" $testuser2
			do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-QHPSI: virus found"
			run_vcfilter vcfilter -d 1 $testuser2
			;;
			"Contains")
			run_vcfilter vcfilter -i -t "$i-Test" -c "$i" -k "Vfilter $vcount" -f Quarantine -b 0 -h "X-QHPSI" $testuser2
			do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-QHPSI: Test Vfilter $vcount"
			run_vcfilter vcfilter -d 1 $testuser2
			;;
			"Does not contain")
			run_vcfilter vcfilter -i -t "$i-Test" -c "$i" -k "xxx yyyy zzz" -f Quarantine -b 0 -h "X-QHPSI" $testuser2
			do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-QHPSI: abcdefgh"
			run_vcfilter vcfilter -d 1 $testuser2
			;;
			"Starts with")
			run_vcfilter vcfilter -i -t "$i-Test" -c "$i" -k "yyy xxxx zzz" -f Quarantine -b 0 -h "X-QHPSI" $testuser2
			do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-QHPSI: yyy xxxx zzz"
			run_vcfilter vcfilter -d 1 $testuser2
			;;
			"Ends with")
			run_vcfilter vcfilter -i -t "$i-Test" -c "$i" -k "yyy1 zzz" -f Quarantine -b 0 -h "X-QHPSI" $testuser2
			do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-QHPSI: yyy yyy1 zzz"
			run_vcfilter vcfilter -d 1 $testuser2
			;;
			"My id not in To, CC, Bcc")
			run_vcfilter vcfilter -i -t "$i-Test" -c "$i" -f Quarantine -b 0  $testuser2
			do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "" abcd@$domain1 efgh@$domain1 hijk@$domain1
			run_vcfilter vcfilter -d 0 $testuser2
			;;
			"Numerical Logical Expression")
			run_vcfilter vcfilter -i -t "Numerical Logical Expression" -c "$i" -k "%p >= 11.2" -f Quarantine -b 0 -h "X-QHPSI" $testuser2
			do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-QHPSI: 12.24"
			run_vcfilter vcfilter -d 1 $testuser2
			;;
			"RegExp")
			run_vcfilter vcfilter -i -t "Regular Expression" -c "$i" -k "abd.*efgh $count" -f Quarantine -b 0 -h "X-QHPSI" $testuser2
			do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-QHPSI: abd.dfkdjf...efgh $count"
			run_vcfilter vcfilter -d 1 $testuser2
			;;
		esac
		check_mail indimail $destdir2/Maildir/.Quarantine
		if [ $? -eq 0 ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 $sleep_secs | awk '{printf("%0.4f\n", $2-$1-$3)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing vfilter delivery to matched folder comparision=%-28s succeeded %17s [%.4f sec]\n" "$i" " " $secs
			print_pct
		else
			fcount=$(expr $fcount + 1)
			echo "  testing vfilter delivery to matched folder comparision=$i failed"
			[ -z "$failed" ] && failed="do_vfilter folder comparision=$i" || failed="$failed, do_vfilter folder comparision=$i"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi
		vcount=$(expr $vcount + 1)
	done

	# -b bounce action
	#    0               - Do not Bounce to sender
	#    3'&user@domain' - Forward to another id and Bounce
	#    3'|program'     - Feed mail to another program and Bounce
	echo "X-Header" >> $sysconfdir/headerlist

	# bounce to sender test
	#    1               - Bounce to sender
	tm1=$(date +"%s.%4N")
	run_vcfilter vcfilter -i -t "Test bounce" -c "Equals" -k "Test Header" -f /NoDeliver -b 1 -h "X-Header" $testuser2
	do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-Header: Test Header"
	run_vcfilter vcfilter -d 1 $testuser2
	check_mail indimail $destdir1/Maildir
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing vfilter delivery for bounce  on match succeeded %55s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing vfilter delivery for bounce  on match failed"
		[ -z "$failed" ] && failed="do_vfilter bounce on match" || failed="$failed, do_vfilter bounce on match"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	# forward to another id test
	#    2'&user@domain' - Forward to another id
	tm1=$(date +"%s.%4N")
	run_vcfilter vcfilter -i -t "Test bounce" -c "Equals" -k "Test Header" -f /NoDeliver -b "2&$testuser1" -h "X-Header" $testuser2
	do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-Header: Test Header"
	run_vcfilter vcfilter -d 1 $testuser2
	check_mail indimail $destdir1/Maildir
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing vfilter delivery for forward on match succeeded %55s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing vfilter delivery for forward on match failed"
		[ -z "$failed" ] && failed="do_vfilter forward on match" || failed="$failed, do_vfilter forward on match"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	tm1=$(date +"%s.%4N")
	# feed to another program test
	#    2'|program'     - Feed mail to another program
	(
		echo "#!/bin/sh"
		echo "$qmail_inject $testuser1"
	)  > $testdir/forwarder
	chmod +x $testdir/forwarder
	run_vcfilter vcfilter -i -t "Test bounce" -c "Equals" -k "Test Header" -f /NoDeliver -b "2|$testdir/forwarder" -h "X-Header" $testuser2
	do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-Header: Test Header"
	run_vcfilter vcfilter -d 1 $testuser2
	check_mail indimail $destdir1/Maildir
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		/bin/rm -rf $testdir/forwarder
		tcount=$(expr $tcount + 1)
		printf "\r  testing vfilter delivery for feed program on match succeeded %50s [%.4f sec]\n" " " $secs
		print_pct
	else
		/bin/rm -rf $testdir/forwarder
		fcount=$(expr $fcount + 1)
		echo "  testing vfilter delivery for feed program on match failed"
		[ -z "$failed" ] && failed="do_vfilter feed program on match" || failed="$failed, do_vfilter feed program on match"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	tm1=$(date +"%s.%4N")
	# forward to another id and bounce test
	#    3'&user@domain' - Forward to another id and Bounce
	destdir3=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser3 | awk '{print $3}')
	run_vcfilter vcfilter -i -t "Test bounce" -c "Equals" -k "Test Header" -f /NoDeliver -b "3&$testuser3" -h "X-Header" $testuser2
	do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-Header: Test Header"
	run_vcfilter vcfilter -d 1 $testuser2
	check_mail indimail $destdir1/Maildir
	ret1=$?
	if [ $ret1 -eq 0 ] ; then
		check_mail indimail $destdir3/Maildir
		if [ $? -ne 0 ] ; then
			echo failed to forward to $testuser3
			ret1=1
		fi
	else
		echo failed to bounce to $testuser1
	fi
	if [ $ret1 -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing vfilter delivery for forward and bounce on match succeeded %44s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		echo "  testing vfilter delivery for forward and bounce on match failed"
		[ -z "$failed" ] && failed="do_vfilter forward and bounce on match" || failed="$failed, do_vfilter forward and bounce on match"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi


	tm1=$(date +"%s.%4N")
	# feed to another program and bounce test
	#    3'|program'     - Feed mail to another program and Bounce
	(
		echo "#!/bin/sh"
		echo "$qmail_inject $testuser3"
	)  > $testdir/forwarder
	chmod +x $testdir/forwarder
	run_vcfilter vcfilter -i -t "Test bounce" -c "Equals" -k "Test Header" -f /NoDeliver -b "3|$testdir/forwarder" -h "X-Header" $testuser2
	do_qmail_inject $user $testuser1 $testuser2 "Testing Vfilter" "X-Header: Test Header"
	run_vcfilter vcfilter -d 1 $testuser2
	check_mail indimail $destdir1/Maildir
	ret1=$?
	if [ $ret1 -eq 0 ] ; then
		check_mail indimail $destdir3/Maildir
		if [ $? -ne 0 ] ; then
			echo failed to forward to $testuser3
			ret1=1
		fi
	else
		echo failed to bounce to $testuser1
	fi
	if [ $ret1 -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		/bin/rm -rf $testdir/forwarder
		tcount=$(expr $tcount + 1)
		printf "\r  testing vfilter delivery for feed program and bounce on match succeeded %39s [%.4f sec]\n" " " $secs
		print_pct
	else
		/bin/rm -rf $testdir/forwarder
		fcount=$(expr $fcount + 1)
		echo "  testing vfilter delivery for feed program and bounce on match failed"
		[ -z "$failed" ] && failed="do_vfilter feed program and bounce on match" || failed="$failed, do_vfilter feed program and bounce on match"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	tm1=$(date +"%s.%4N")
	$sudo env - \
		PATH=/bin:/usr/bin:/usr/sbin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	vmoddomain -f 0 -h bounce-no-mailbox $domain1 > $logdir/setup/vmoddomain.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vmoddomain unset vfilter succeeded %60s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vadddomain.log
		fi
		echo "  testing command vmoddomain unset vfilter failed"
		[ -z "$failed" ] && failed="vmoddomain unset vfilter" || failed="$failed, vmoddomain unset vfilter"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

create_tcpclient_smtp()
{
	if [ -z "$fromuser" ] ; then
		fromuser=$user@$HOSTNAME
	fi
	list=$*
	(
	echo "#!/bin/sh"
	echo "exec 0<&6"
	echo "exec 1>&7"
	echo "read key"
	echo "greeting=\$(echo \$key | awk '{print \$1}')"
	echo "if [ \$greeting -ne 220 ] ; then"
	echo "	echo \"Greeting failed\" 1>&2"
	echo "	printf \"QUIT\r\n\""
	echo "fi"
	echo "printf \"EHLO\r\n\""
	echo "while true"
	echo "do"
	echo "	read line"
	echo "	echo \$line |grep \"250 \" >/dev/null"
	echo "	if [ \$? -eq 0 ] ; then"
	echo "		echo \$line 1>&2"
	echo "		break"
	echo "	fi"
	echo "	echo \$line 1>&2"
	echo "done"
	echo "printf \"MAIL FROM:<$fromuser>\r\n\" 1>&2"
	echo "printf \"MAIL FROM:<$fromuser>\r\n\""
	echo "read key"
	echo "echo \$key 1>&2"
	echo "code=\$(echo \$key |cut -c1-3)"
	echo "if [ \$code -ne 250 ] ; then"
	echo "	echo \"MAIL From failed: code=\$code\" 1>&2"
	echo "	exit 1"
	echo "fi"
	for i in $list
	do
		echo "printf \"RCPT TO:<$i>\r\n\" 1>&2"
		echo "printf \"RCPT TO:<$i>\r\n\""
		echo "read key"
		echo "echo \$key 1>&2"
		echo "code=\$(echo \$key |cut -c1-3)"
		echo "if [ \$code -ne 250 ] ; then"
		echo "	echo \"RCPT To failed: code=\$code\" 1>&2"
		echo "	exit 1"
		echo "fi"
	done
	echo "printf \"QUIT\r\n\" 1>&2"
	echo "printf \"QUIT\r\n\""
	echo "read key"
	echo "echo \$key 1>&2"
	echo "exit 0"
	) > $testdir/tcpclient.smtp
	chmod +x $testdir/tcpclient.smtp
}

test_recipients()
{
	echo "Starting CHECKRECIPIENT tests"
	fromuser=$user@$HOSTNAME
	tm1=$(date +"%s.%4N")
	echo 1 > $servicedir/smtpd/variables/CHECKRECIPIENT
	mkdir -p $logdir/tcpclient
	svc -r $servicedir/smtpd
	sleep $sleep_int
	> $servicedir/smtpd/variables/CHECKRECIPIENT

	# Pass1: This should succeed
	create_tcpclient_smtp $testuser1 $testuser2 $testuser2
	tcpclient -vDHR 0 $smtp_port $testdir/tcpclient.smtp > $logdir/tcpclient/tcpclient.log 2>&1
	ret1=$?
	if [ $ret1 -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 $sleep_int | awk '{printf("%0.4f\n", $2-$1-$3)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing recipient extension (positive match) succeeded %56s [%.4f sec]\n" " " $secs
		print_pct
	else
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 $sleep_int | awk '{printf("%0.4f\n", $2-$1-$3)}')
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/tcpclient/tcpclient.log
		fi
		echo "  testing recipient extension (positive match) failed [$secs sec]"
		[ -z "$failed" ] && failed="test recipient (positive match)" || failed="$failed, test recipient (positive match)"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	# Pass2: This should fail
	tm1=$(date +"%s.%4N")
	create_tcpclient_smtp $nouser
	tcpclient -vDHR 0 $smtp_port $testdir/tcpclient.smtp > $logdir/tcpclient/tcpclient.log 2>&1
	ret2=$?
	l1=$(tail -2 $logdir/tcpclient/tcpclient.log|sed -n 1p)
	echo "$l1"|grep "550 sorry, $user@$HOSTNAME mailbox <$nouser> is absent on this domain (#5.1.1)" >/dev/null
	if [ $? -eq 0 ] ; then
		ret3=0
	else
		ret3=1
	fi
	if [ $ret2 -eq 1 -a $ret3 -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing recipient extension (negative match) succeeded %56s [%.4f sec]\n" " " $secs
		print_pct
	else
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/tcpclient/tcpclient.log
		fi
		echo "  testing recipient extension (negative match) failed [$secs sec]"
		[ -z "$failed" ] && failed="test recipient (negative match)" || failed="$failed, test recipient (negative match)"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

test_smtp_chk_sender()
{
	echo "Starting CHECKSENDER tests"
	tm1=$(date +"%s.%4N")
	echo 0 > $servicedir/smtpd/variables/CHECKSENDER
	sudo svc -r $servicedir/smtpd
	sleep $sleep_int
	> $servicedir/smtpd/variables/CHECKSENDER

	# delivery to external domain
	# First: This should work as from matches authenticated user
	swaks -S --to $user@$ext_domain --from $testuser1 --server localhost \
		--port $smtp_port --a LOGIN -au $testuser1 -ap "$password1"
	ret1=$?
	destdir1=$($sudo $setuidgid indimail envdir $servicedir/smtpd/variables vuserinfo -d $testuser1 | awk '{print $3}')
	check_mail indimail $destdir1/Maildir
	s1=$sleep_secs

	# delivery to local domain
	# Second: This should be denied as from does not match the authenticated user
	swaks -S --to $user@$HOSTNAME --from $user@$ext_domain --server localhost \
		--port $smtp_port --a LOGIN -au $testuser1 -ap "$password1" >/tmp/swaks.$$
	ret2=$?
	l1=$(sed -n 1p < /tmp/swaks.$$)
	/bin/rm -f /tmp/swaks.$$
	echo "$l1" | grep ".*553 sorry, this MTA does not accept masquerading/forging,.*" >/dev/null
	if [ $? -eq 0 ] ; then
		ret3=0
	else
		ret3=1
	fi

	# delivery to local domain
	# Third: This should work as from matches authenticated user
	swaks -S --to $user@$HOSTNAME --from $testuser1 --server localhost \
		--port $smtp_port --a LOGIN -au $testuser1 -ap "$password1"
	check_mail $user $maildir
	ret4=$?
	s2=$sleep_secs

	# delivery to local domain
	# fourth: This should be denied as from is in rcpthosts and user
	# has not authenticated
	swaks -S --to $testuser1 --from $testuser1 --server localhost \
		--port $smtp_port >/tmp/swaks.$$
	ret5=$?
	l2=$(sed -n 1p < /tmp/swaks.$$)
	/bin/rm -f /tmp/swaks.$$
	echo "$l2" | grep ".*530 authentication required (#5.7.1)" >/dev/null
	if [ $? -eq 0 ] ; then
		ret6=0
	else
		ret6=1
	fi
	if [ $ret1 -eq 0 -a $ret2 -ne 0 -a $ret3 -eq 0 -a $ret4 -eq 0 -a $ret5 -ne 0 -a $ret6 -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 $s1 $s2 $sleep_int | awk '{printf("%0.4f\n", $2-$1-$3-$4-$5)}')
		tcount=$(expr $tcount + 4)
		printf "\r  testing mail using SMTP with CHECKSENDER succeeded %60s [%.4f sec]\n" " " $secs
		print_pct
	else
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 $s1 $s2 $sleep_int | awk '{printf("%0.4f\n", $2-$1-$3-$4-$5)}')
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			(
			echo "l1=$l1"
			echo "l2=$l2"
			echo "  testing mail using SMTP with CHECKSENDER failed [$secs sec]"
			echo "$logdir/smtpd/current"
			cat $logdir/smtpd/current
			) | less
		fi
		echo "  testing mail using SMTP with CHECKSENDER failed [$secs sec]"
		[ -z "$failed" ] && failed="test CHECKSENDER" || failed="$failed, test CHECKSENDER"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

do_admin_server_tests()
{
	ln -sf $cntrldir/host.mysql $cntrldir/host.master
	ln -sf $cntrldir/host.mysql $cntrldir/host.cntrl
	printf "\r%126s\n" " "
	echo "Starting admin server tests"
	$sudo env - \
			PATH=/usr/bin:/usr/sbin \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vpriv -D admin '*'
	tm1=$(date +"%s.%4N")
	$sudo env - \
			PATH=/usr/bin:/usr/sbin \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vpriv -i /usr/bin/vuserinfo admin '*'
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing vpriv       command %-17s succeeded %55s [%.4f sec]\n" " " " " "$secs"
		print_pct
	else
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		echo "  testing vpriv command succeeded failed [%.4f sec]\n" "$secs"
		[ -z "$failed" ] && failed="test vpriv" || failed="$failed, test vpriv"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	$sudo env - \
			PATH=/usr/bin:/usr/sbin \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		mgmtpass -u admin -p $adminpass
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing mgmtpass    command %-17s succeeded %55s [%.4f sec]\n" " " " " "$secs"
		print_pct
	else
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		echo "  testing mgmtpass command failed [%.4f sec]\n" "$secs"
		[ -z "$failed" ] && failed="test vpriv" || failed="$failed, test vpriv"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	$sudo env - \
			PATH=/usr/bin:/usr/sbin \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vpriv -d /usr/bin/vuserinfo admin

	tm1=$(date +"%s.%4N")
	$sudo $setuidgid -g indimail,qcerts indimail env - \
		PATH=/usr/bin:/usr/sbin \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	adminclient -n $certdir/servercert.pem  -h $adminhost -p $adminport \
		-u $adminuser -P $adminpass -c "vuserinfo $testuser1" > $logdir/setup/adminclient-"vuserinfo".log 2>&1
	if [ $? -ne 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing adminclient command denial            succeeded %55s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		echo "  testing adminclient command denial failed [%.4f sec]\n" "$secs"
		[ -z "$failed" ] && failed="test vpriv" || failed="$failed, test vpriv"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	###############################################################
	$sudo env - \
			PATH=/usr/bin:/usr/sbin \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vpriv -i /usr/bin/vuserinfo admin '*'

	# this should succeed
	$sudo $setuidgid -g indimail,qcerts indimail env - \
		PATH=/usr/bin:/usr/sbin \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	adminclient -n $certdir/servercert.pem  -h $adminhost -p $adminport \
		-u $adminuser -P $adminpass -c "vuserinfo $testuser1" > $logdir/setup/adminclient-"vuserinfo".log 2>&1
	ret1=$?
	for i in 1 2 3 4 5 6 7
	do
	adminclient -n $certdir/servercert.pem  -h $adminhost -p $adminport \
		-u $adminuser -P "abcdefg" -c "vuserinfo $testuser1" > $logdir/setup/adminclient-"vuserinfo".log 2>&1
	done

	tm1=$(date +"%s.%4N")
	# this should fail
	adminclient -n $certdir/servercert.pem  -h $adminhost -p $adminport \
		-u $adminuser -P "$adminpass" -c "vuserinfo $testuser1" > $logdir/setup/adminclient-"vuserinfo".log 2>&1
	ret2=$?
	if [ $ret1 -eq 0 -a $ret2 -ne 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing adminclient command disablement       succeeded %55s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		echo "  testing adminclient command disablement failed [%.4f sec]\n" "$secs"
		[ -z "$failed" ] && failed="test vpriv" || failed="$failed, test vpriv"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	tm1=$(date +"%s.%4N")
	# this should succeed
	$sudo env - \
			PATH=/usr/bin:/usr/sbin \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		mgmtpass -u admin -p $adminpass
	ret3=$?
	tm2=$(date +"%s.%4N")

	# this should succeed
	adminclient -n $certdir/servercert.pem  -h $adminhost -p $adminport \
		-u $adminuser -P "$adminpass" -c "vuserinfo $testuser1" > $logdir/setup/adminclient-"vuserinfo".log 2>&1
	ret4=$?
	if [ $ret3 -eq 0 -a $ret4 -eq 0 ] ; then
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing adminclient command enablement        succeeded %55s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		echo "ret3=$ret3, ret4=$ret4"
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		echo "  testing adminclient command enablement  failed [%.4f sec]\n" "$secs"
		[ -z "$failed" ] && failed="test vpriv" || failed="$failed, test vpriv"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	$sudo env - \
			PATH=/usr/bin:/usr/sbin \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vpriv -d /usr/bin/vuserinfo admin
	###############################################################

	tm1=$(date +"%s.%4N")
	for cmd in /usr/bin/vuserinfo /usr/bin/vsetuserquota \
		/usr/bin/vipmap /usr/bin/crc /usr/bin/printdir
	do
		d=$(dirname $cmd)
		prog=$(basename $cmd)
		$sudo env - \
				PATH=/usr/bin:/usr/sbin \
				SYSCONFDIR=$sysconfdir \
				CONTROLDIR=$cntrldir \
			vpriv -i $d/$prog admin '*'
		case $prog in
			vuserinfo)
			set "$testuser1"
			;;
			vsetuserquota)
			set "$testuser1" "300m"
			#set -- -B $testdir/qmail -d $qmaildir $arg1 $arg2
			;;
			vipmap)
			set -- -i "192.168.1.100" "$domain1"
			;;
			crc)
			set -- -v /etc/hosts
			;;
			printdir)
			set $domain1
			;;
			*)
			set "notset"
			;;
		esac
		if [ "$1" = "notset" ] ; then
			continue
		fi
		tm1=$(date +"%s.%4N")
		$sudo $setuidgid -g indimail,qcerts indimail env - \
			PATH=/usr/bin:/usr/sbin \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		adminclient -n $certdir/servercert.pem  -h $adminhost -p $adminport \
			-u $adminuser -P $adminpass -c "$prog $*" > $logdir/setup/adminclient-"$prog".log 2>&1
		ret=$?
		if [ $ret -eq 0 ] ; then
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			if [ "$prog" = "vsetuserquota" ] ; then
				#ASSIGNDIR=$sysconfdir/users
				quota=$($sudo env - \
					PATH=/bin:/usr/bin \
					SYSCONFDIR=$sysconfdir \
					CONTROLDIR=$cntrldir \
					vuserinfo -q $testuser1 | head -1 |cut -d: -f2|awk '{print $1}')
				if [ $quota -eq 314572800 ] ; then
					tcount=$(expr $tcount + 1)
					printf "\r  testing adminclient command %-17s succeeded %55s [%.4f sec]\n" "$prog" " " "$secs"
					print_pct
				else
					fcount=$(expr $fcount + 1)
					printf "\r  testing adminclient command %-17s    failed %55s [%.4f sec]\n" "$prog" " " "$secs"
					print_pct
					if [ $prompt -eq 1 ] ; then
						(
						if [ "$prog" = "vsetuserquota" ] ; then
							echo quota=$quota
						fi
						cat $logdir/setup/adminclient-"$prog".log
						) | less
					fi
					[ -z "$failed" ] && failed="adminclient $prog failed" || failed="$failed, adminclient $prog failed"
				fi
			else
				tcount=$(expr $tcount + 1)
				printf "\r  testing adminclient command %-17s succeeded %55s [%.4f sec]\n" "$prog" " " "$secs"
				print_pct
			fi
		else
			tm2=$(date +"%s.%4N")
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			fcount=$(expr $fcount + 1)
			printf "\r  testing adminclient command %-17s    failed %55s [%.4f sec]\n" "$prog" " " "$secs"
			print_pct
			if [ $prompt -eq 1 ] ; then
				(
				echo "Return status = $ret"
				if [ "$prog" = "vsetuserquota" ] ; then
					echo quota=$quota
				fi
				cat $logdir/setup/adminclient-"$prog".log
				) | less
			fi
			[ -z "$failed" ] && failed="adminclient $prog failed" || failed="$failed, adminclient $prog failed"
		fi
	done
	/bin/rm -f $cntrldir/host.master $cntrldir/host.cntrl
}

do_vlimit_tests()
{
	# Test the following
	# authindi, vchkpass: domain expiry, password expiry
	# authpgsql: gid mask
	# iauth: size, count limit
	# inquerytest: display limits
	# ProcessInFifo.c: get limits
	# sql_getpw: gid mask
	# vadduser, vmoduser: defaultquota, defaultmaxmsgcount
	# vsetuserquota: defaultquota
	#
	printf "\r%126s\n" " "
	echo "Starting domain limit tests"

	tm1=$(date +"%s.%4N")
	sudo touch $qmaildir/domains/$domain1/.domain_limits
	sudo chown indimail:indimail $qmaildir/domains/$domain1/.domain_limits
	$sudo env - \
		PATH=/bin:/usr/bin:/usr/sbin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	vmoddomain -l 0 $domain1
	ret1=$?
	$sudo ls $qmaildir/domains/$domain1/.domain_limits >/dev/null 2>&1
	[ $? -ne 0 ] && l1=0 || l1=1
	$sudo env - \
		PATH=/bin:/usr/bin:/usr/sbin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	vmoddomain -l 1 $domain1
	ret2=$?
	$sudo ls $qmaildir/domains/$domain1/.domain_limits >/dev/null
	[ $? -eq 0 ] && l2=0 || l2=1
	tm2=$(date +"%s.%4N")
	if [ $ret1 -eq 0 -a $ret2 -eq 0 -a $l1 -eq 0 -a $l2 -eq 0 ] ; then
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing vmoddomain enable domain limits       succeeded %55s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		echo "ret1=$ret1, ret2=$ret2, l1=$l1, l2=$l2"
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		echo  " testing vmoddomain enable domain limits       failed [%.4f sec]" "$secs"
		[ -z "$failed" ] && failed="test vmoddomain limits" || \
			failed="$failed, test vmoddomain limits"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	$sudo setuidgid indimail env - \
		PATH="/bin:/usr/bin" \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	vlimit -Q 50m $domain1
	ret1=$?
	$sudo setuidgid indimail env - \
		PATH="/bin:/usr/bin" \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	vlimit -q 5m $domain1
	ret2=$?
	$sudo setuidgid indimail env - \
		PATH="/bin:/usr/bin" \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	vlimit -s $domain1 > $tmpdir/vlimit.out
	ret3=$?
	tm2=$(date +"%s.%4N")
	t1=$(grep "Max Domain Quota" $tmpdir/vlimit.out|awk '{print $5}')
	t2=$(grep "Default User Quota" $tmpdir/vlimit.out|awk '{print $5}')
	#Max Domain Quota     :     104857600
	#Default User Quota   :       5242880
	if [ $ret1 -eq 0 -a $ret2 -eq 0 -a $ret3 -eq 0 -a "$t1" = "52428800" -a "$t2" = "5242880" ] ; then
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing vlimit set domain/user quota          succeeded %55s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		echo "ret1=$ret1, ret2=$ret2, ret3=$ret3, t1=$t1, t2=$t2"
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		echo "  testing vlimit set domain/user quota failed [%.4f sec]" "$secs"
		[ -z "$failed" ] && failed="test vlimit -qQ" || failed="$failed, test vlimit -qQ"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	/bin/rm -f $tmpdir/vlimit.out

	# test setting default user quota
	tm1=$(date +"%s.%4N")
	t1="$password1""md5"
	create_plain_user $testuser1 $t1 MD5 >/dev/null 2>&1
	quota=$($sudo env - \
		PATH=/bin:/usr/bin \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	vuserinfo -q $testuser1 | head -1 |cut -d: -f2|awk '{print $1}')
	tm2=$(date +"%s.%4N")

	if [ "$quota" = "5242880" ] ; then
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing vadduser set default user quota       succeeded %55s [%.4f sec]\n" " " "$secs"
		print_pct
	else
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		echo
		echo "quota=$quota"
		echo "  testing vadduser set default user quota failed [%.4f sec]" "$secs"
		[ -z "$failed" ] && failed="test vadduser set defaultquota" || \
			failed="$failed, test vadduser set defaultquota"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	# test disable change passwd
	tm1=$(date +"%s.%4N")
	$sudo setuidgid indimail env - \
		PATH="/bin:/usr/bin" \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
	vlimit -g d $domain1
	ret1=$?
	$sudo setuidgid indimail env - \
		PATH="/bin:/usr/bin" \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAIN_LIMITS=1 \
	vpasswd $testuser1 $password1 2>$tmpdir/vpasswd.out
	ret2=$?
	cat $tmpdir/vpasswd.out | grep "User not allowed to change password" >/dev/null 2>&1
	ret3=$?
	tm2=$(date +"%s.%4N")
	if [ $ret1 -eq 0 -a $ret2 -ne 0 -a $ret3 -eq 0 ] ; then
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing vlimit disable password change        succeeded %55s [%.4f sec]\n" " " "$secs"
		print_pct
		/bin/rm -f $tmpdir/vpasswd.out
	else
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		fcount=$(expr $fcount + 1)
		echo "  testing vlimit disable password change failed [%.4f sec]" "$secs"
		if [ $prompt -eq 1 ] ; then
			(
			echo "ret1=$ret1, ret2=$ret2, ret3=$ret3"
			cat $tmpdir/vpasswd.out
			) |less
		fi
		/bin/rm -f $tmpdir/vpasswd.out
		[ -z "$failed" ] && failed="test vlimit disable change password" || \
			failed="$failed, test vlimit disable change password"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi

	for in_type in 0 1
	do
		> $servicedir/smtpd/variables/CHECKSENDER
		echo 1 > $servicedir/smtpd/variables/DOMAIN_LIMITS
		echo 1 > $servicedir/imapd/variables/DOMAIN_LIMITS
		echo 1 > $servicedir/pop3d/variables/DOMAIN_LIMITS
		if [ $in_type -eq 0 ] ; then
			/bin/rm -f $servicedir/smtpd/variables/QUERY_CACHE \
				$servicedir/imapd/variables/QUERY_CACHE \
				$servicedir/pop3d/variables/QUERY_CACHE
		else
			echo 1 > $servicedir/smtpd/variables/QUERY_CACHE
			echo 1 > $servicedir/imapd/variables/QUERY_CACHE
			echo 1 > $servicedir/pop3d/variables/QUERY_CACHE
		fi
		$sudo svc -r $servicedir/smtpd $servicedir/imapd $servicedir/pop3d
		check_service pop3d 3
		/bin/rm -f $servicedir/smtpd/variables/DOMAIN_LIMITS \
			$servicedir/imapd/variables/DOMAIN_LIMITS \
			$servicedir/pop3d/variables/DOMAIN_LIMITS

		# disable SMTP check
		$sudo svc -a $servicedir/smtpd/log
		if [ $in_type -eq 0 ] ; then
			swaks -S --to $testuser1 --from $testuser1 --server 127.0.0.1 \
				--port $smtp_port --a LOGIN -au $testuser1 -ap "$t1" > $tmpdir/swaks.out
			ret1=$?
		else
			ret1=0
		fi
		# disable smtp
		tm1=$(date +"%s.%4N")
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -g s $domain1
		ret2=$?
		if [ $in_type -eq 1 ] ; then
			$sudo svc -h $servicedir/inlookup.infifo
			#sleep $sleep_int
		fi
		swaks -S --to $testuser1 --from $testuser1 --server 127.0.0.1 \
			--port $smtp_port --a LOGIN -au $testuser1 -ap "$t1" > $tmpdir/swaks.out 2>&1
		ret3=$?
		grep "553-Sorry, this account cannot use SMTP (#5.7.1)" $tmpdir/swaks.out >/dev/null
		ret4=$?
		tm2=$(date +"%s.%4N")
		if [ $ret1 -eq 0 -a $ret2 -eq 0 -a $ret3 -ne 0 -a $ret4 -eq 0 ] ; then
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing vlimit disable SMTP authentication incache=%d succeeded %48s [%.4f sec]\n" $in_type " " "$secs"
			print_pct
			/bin/rm -f $tmpdir/swaks.out
		else
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			fcount=$(expr $fcount + 1)
			echo "  testing vlimit disable SMTP authentication incache=$in_type failed"
			if [ $prompt -eq 1 ] ; then
				(
				echo "ret1=$ret1, ret2=$ret2, ret3=$ret3, ret4=$ret4"
				cat $tmpdir/swaks.out
				) |less
			fi
			/bin/rm -f $tmpdir/swaks.out
			[ -z "$failed" ] && failed="test vlimit disable smtp incache=$in_type" || \
				failed="$failed, test vlimit disable smtp incache=$in_type"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi

		# disable IMAP authentication
		delete_relay 2>$tmpdir/relay.out
		if [ $in_type -eq 0 ] ; then
			auth_imap $testuser1 $t1 "PLAIN" 2>$tmpdir/imapd.out
			ret1=$?
		else
			ret1=0
		fi
		# disable imap
		tm1=$(date +"%s.%4N")
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -g i $domain1
		ret2=$?
		if [ $in_type -eq 1 ] ; then
			$sudo svc -h $servicedir/inlookup.infifo
			#sleep $sleep_int
		fi
		tm2=$(date +"%s.%4N")
		$sudo svc -a $servicedir/imapd/log
		auth_imap $testuser1 $t1 "PLAIN" 2>$tmpdir/imapd.out
		grep "authindi: warn: imap disabled for this account" $logdir/imapd/current >/dev/null
		ret4=$?
		if [ $ret1 -eq 0 -a $ret2 -eq 0 -a $ret3 -ne 0 -a $ret4 -eq 0 ] ; then
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing vlimit disable IMAP authentication incache=%d succeeded %48s [%.4f sec]\n" $in_type " " "$secs"
			print_pct
			/bin/rm -f $tmpdir/imapd.out $tmpdir/relay.out
		else
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			fcount=$(expr $fcount + 1)
			echo "  testing vlimit disable IMAP authentication incache=$in_type failed"
			if [ $prompt -eq 1 ] ; then
				(
				echo "ret1=$ret1, ret2=$ret2, ret3=$ret3, ret4=$ret4"
				cat $tmpdir/imapd.out
				) |less
			fi
			/bin/rm -f $tmpdir/imapd.out $tmpdir/relay.out
			[ -z "$failed" ] && failed="test vlimit disable imap incache=$in_type" || \
				failed="$failed, test vlimit disable imap incache=$in_type"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi
		r1=$(check_relay 2>/dev/null|awk '{print $1}')
		ret6=$?
	
		# disable POP3 authentication
		delete_relay 2>$tmpdir/relay.out
		if [ $in_type -eq 0 ] ; then
			auth_pop3 $testuser1 $t1 "PLAIN" 2>$tmpdir/pop3d.out
			ret1=$?
		else
			ret1=0
		fi
		# disable pop3
		tm1=$(date +"%s.%4N")
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -g p $domain1
		ret2=$?
		if [ $in_type -eq 1 ] ; then
			$sudo svc -h $servicedir/inlookup.infifo
			#sleep $sleep_int
		fi
		tm2=$(date +"%s.%4N")
		$sudo svc -a $servicedir/pop3d/log
		auth_pop3 $testuser1 $t1 "PLAIN" 2>$tmpdir/pop3d.out
		grep "authindi: warn: pop3 disabled for this account" $logdir/pop3d/current >/dev/null
		ret4=$?
		if [ $ret1 -eq 0 -a $ret2 -eq 0 -a $ret3 -ne 0 -a $ret4 -eq 0 ] ; then
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing vlimit disable POP3 authentication incache=%d succeeded %48s [%.4f sec]\n" $in_type " " "$secs"
			print_pct
			/bin/rm -f $tmpdir/pop3d.out $tmpdir/relay.out
		else
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			fcount=$(expr $fcount + 1)
			echo "  testing vlimit disable POP3 authentication incache=$in_type failed"
			if [ $prompt -eq 1 ] ; then
				(
				echo "ret1=$ret1, ret2=$ret2, ret3=$ret3, ret4=$ret4"
				cat $tmpdir/pop3d.out
				echo ====================
				cat $logdir/pop3d/current
				) |less
			fi
			/bin/rm -f $tmpdir/pop3d.out $tmpdir/relay.out
			[ -z "$failed" ] && failed="test vlimit disable pop3 incache=$in_type" || \
				failed="$failed, test vlimit disable pop3 incache=$in_type"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi
		r2=$(check_relay 2>/dev/null|awk '{print $1}')
		ret7=$?

		# disable RELAY
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -g i -T $domain1
		ret1=$?
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -g p -T $domain1
		ret2=$?

		delete_relay 2>$tmpdir/relay.out
		tm1=$(date +"%s.%4N")
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -g r $domain1
		ret3=$?
		if [ $in_type -eq 1 ] ; then
			$sudo svc -h $servicedir/inlookup.infifo
			r1="$testuser1"
			r2="$testuser1"
		fi
		$sudo svc -a $servicedir/imapd/log
		auth_imap $testuser1 $t1 "PLAIN" 2>$tmpdir/imapd.out
		ret4=$?
		$sudo svc -a $servicedir/pop3d/log
		auth_pop3 $testuser1 $t1 "PLAIN" 2>$tmpdir/pop3d.out
		ret5=$?
		r3=$(check_relay 2>/dev/null |awk '{print $1}')
		ret8=$?
		/bin/rm -f $tmpdir/relay.out $tmpdir/imapd.out $tmpdir/pop3d.out
		tm2=$(date +"%s.%4N")
		if [ $ret1 -eq 0 -a $ret2 -eq 0 -a $ret3 -eq 0 -a $ret4 -eq 0 -a $ret4 -eq 0 \
				-a $ret6 -eq 0 -a $ret7 -eq 0 -a $ret8 -eq 0 -a "$r1" = "$testuser1" \
					-a "$r2" = "$testuser1" -a -z "$r3"] ; then
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing vlimit disable relaying            incache=%d succeeded %48s [%.4f sec]\n" $in_type " " "$secs"
			print_pct
		else
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			fcount=$(expr $fcount + 1)
			echo "  testing vlimit disable relaying incache=$in_type failed"
			if [ $prompt -eq 1 ] ; then
				(
				echo "ret1=$ret1, ret2=$ret2, ret3=$ret3, ret4=$ret4, ret5=$ret5, ret6=$ret6, ret7=$ret7, ret8=$ret8"
				echo "r1=$r1"
				echo "r2=$r2"
				echo "r3=$r3"
				)|less
			fi
			[ -z "$failed" ] && failed="test vlimit disable relay incache=$in_type" || \
				failed="$failed, test vlimit disable relay incache=$in_type"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi

		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -g s -T $domain1

		# domain expiry
		tm1=$(date +"%s.%4N")
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -n -1 $domain1
		ret1=$?
		if [ $in_type -eq 1 ] ; then
			$sudo svc -h $servicedir/inlookup.infifo
		fi
		swaks -S --to $testuser1 --from $testuser1 --server 127.0.0.1 \
			--port $smtp_port --a LOGIN -au $testuser1 -ap "$t1" > $tmpdir/swaks.out 2>&1
		ret2=$?
		grep "553-Sorry, your domain has expired (#5.7.1)" $tmpdir/swaks.out >/dev/null
		ret3=$?
		tm2=$(date +"%s.%4N")
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -e -1 $domain1
		ret4=$?
		if [ $ret1 -eq 0 -a $ret2 -ne 0 -a $ret3 -eq 0 -a $ret4 -eq 0 ] ; then
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing vlimit set domain   expiry         incache=%d succeeded %48s [%.4f sec]\n" $in_type " " "$secs"
			print_pct
			/bin/rm -f $tmpdir/swaks.out
		else
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			fcount=$(expr $fcount + 1)
			echo "  testing vlimit set domain expiry incache=$in_type failed"
			if [ $prompt -eq 1 ] ; then
				(
				echo "ret1=$ret1, ret2=$ret2, ret3=$ret3, ret4=$ret4"
				cat $tmpdir/swaks.out
				echo ====================
				cat $logdir/smtpd/current
				) |less
			fi
			/bin/rm -f $tmpdir/swaks.out
			[ -z "$failed" ] && failed="test vlimit set domain expiry incache=$in_type" || \
				failed="$failed, test vlimit set domain expiry incache=$in_type"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi
	
		# password expiry
		tm1=$(date +"%s.%4N")
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -N -1 $domain1
		ret1=$?
		if [ $in_type -eq 1 ] ; then
			$sudo svc -h $servicedir/inlookup.infifo
			#sleep $sleep_int
		fi
		swaks -S --to $testuser1 --from $testuser1 --server 127.0.0.1 \
			--port $smtp_port --a LOGIN -au $testuser1 -ap "$t1" > $tmpdir/swaks.out 2>&1
		ret2=$?
		grep "553-Sorry, your password has expired (#5.7.1)" $tmpdir/swaks.out >/dev/null
		ret3=$?
		tm2=$(date +"%s.%4N")
		$sudo setuidgid indimail env - \
			PATH="/bin:/usr/bin" \
			ASSIGNDIR=$sysconfdir/users \
			SYSCONFDIR=$sysconfdir \
			CONTROLDIR=$cntrldir \
		vlimit -t -1 $domain1
		ret4=$?
		if [ $ret1 -eq 0 -a $ret2 -ne 0 -a $ret3 -eq 0 -a $ret4 -eq 0 ] ; then
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			tcount=$(expr $tcount + 1)
			printf "\r  testing vlimit set password expiry         incache=%d succeeded %48s [%.4f sec]\n" $in_type " " "$secs"
			print_pct
			/bin/rm -f $tmpdir/swaks.out
		else
			secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
			fcount=$(expr $fcount + 1)
			echo "  testing vlimit set password expiry incache=$in_type failed"
			if [ $prompt -eq 1 ] ; then
				(
				echo "ret1=$ret1, ret2=$ret2, ret3=$ret3, ret4=$ret4"
				cat $tmpdir/swaks.out
				echo ====================
				cat $logdir/smtpd/current
				) |less
			fi
			/bin/rm -f $tmpdir/swaks.out
			[ -z "$failed" ] && failed="test vlimit set password expiry incache=$in_type" || \
				failed="$failed, test vlimit set password expiry incache=$in_type"
			[ $continue_on_err -eq 0 ] && exit 1 || return 0
		fi
	done
}

usage()
{
	echo "testindimail [-y|--nprompt]" 1>&2
}

display_tests()
{
	echo "svscan startup"
	echo "svscan log by creating .svscan/log/run"
	echo "svscan execute run script in /service/.svscan/run"
	echo "svscan start services configured in /service"
	echo "test domain creation using vadddomain"
	echo "test getting domain information using vdominfo"
	echo "test getting mysql db info using dbinfo"
	echo "test user creation with normal UNIX password by using vadduser"
	echo "test user modification using vmoduser to update quota"
	echo "test pwdlookup by using nssd or passwd, shadow, group in /etc/nsswitch.conf"
	echo "test user deletion using vdeluser"
	echo "test vfilter test match on header and deliver to a folder with various conditions"
	echo "  equals, contains, does not contain, starts with, ends with, numerical expression, regexp"
	echo "  my id not in to, cc, bcc"
	echo "test CHECKRECIPIENT"
	echo "test CHECKSENDER"
	echo "test autoesponder"
	echo "test valias by creating a valias forward and sending mail to it"
	echo "test setting inlookup in debug mode"
	echo "test inlookup caching"
	echo "Test authenticated SMTP using swaks with auth methods PLAIN LOGIN CRAM-MD5, DIGEST-MD5"
	echo "Test authenticated SMTP using qmail-remote with auth methods LOGIN PLAIN XOAUTH2 CRAM-MD5"
	echo "  CRAM-SHA1 CRAM-SHA224 CRAM-SHA256 CRAM-SHA384 CRAM-SHA512 CRAM-RIPEMD DIGEST-MD5"
	echo "Test IMAP, IMAPS, POP3, POP3S login with the user created to support non-SCRAM methods"
	echo "Test authenticated SMTP using gsasl to use SCRAM methods SCRAM-SHA-1, SCRAM-SHA-256, SCRAM-SHA-1-PLUS"
	echo "  SCRAM-SHA-256-PLUS"
	echo "Test authenticated SMTP using qmail to use SCRAM methods SCRAM-SHA-1, SCRAM-SHA-256, SCRAM-SHA-1-PLUS"
	echo "  SCRAM-SHA-256-PLUS"
	echo "Test IMAP, IMAPS, POP3, POP3S login with the user created to support SCRAM methods"
	echo "Test Admin Server"
	echo "Test domain deletion"
	echo "Test execution of post handle scripts"
}

print_pct()
{
	pct=$(echo $tcount $total_tests | awk '{printf("%0.2f\n", ($1 * 100)/$2)}')
	printf "%101s Test No %5d [%6.2f %%]" " " $tcount $pct
}

test_mysql()
{
	tm1=$(date +"%s.%4N")
	printf "\r  testing MySQL Service startup"
	check_service mysql.$MYSQL_PORT
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing MySQL service startup succeeded %71s [%.4f sec]\n" " " $secs
		print_pct
	else
		fcount=$(expr $fcount + 1)
		failed=1
		echo "  testing MySQL service startup failed"
		exit 1
	fi
}

test_atrn()
{
	tm1=$(date +"%s.%4N")
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
		SERVICEDIR=$servicedir \
		vadddomain -u qmaild -t atrn.dom > $logdir/setup/vadddomain.log
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vadddomain atrn domain succeeded %62s [%.4f sec]\n" " " $secs
		print_pct
	else
		failed_code=1
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/setup/vadddomain.log
		fi
		echo "  testing command vadddomain atrn domain failed"
		[ -z "$failed" ] && failed="vadddomain-atrn" || failed="$failed, vadddomain-atrn"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	do_qmail_inject $user $user@$HOSTNAME test@atrn.dom  # send email to test@atrn.dom from $user@$HOSTNAME
	check_mail qmaild $qmaildir/autoturn/atrn.dom/Maildir 1
	if [ $? -ne 0 ] ; then
		echo "Failed to receive mail in $qmaildir/autoturn/atrn.dom/Maildir"
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/qmail-send/current
		fi
		echo "  testing receive mail for atrn domain failed"
		[ -z "$failed" ] && failed="inject-atrn" || failed="$failed, inject-atrn"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	mailfile1=$mail_file
	tm1=$(date +"%s.%4N")
	$sudo setuidgid indimail env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
		SERVICEDIR=$servicedir \
	vatrn -i atrn.dom $testuser1
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vatrn access atrn domain succeeded %60s [%.4f sec]\n" " " $secs
		print_pct
	else
		echo "failed to give access for atrn.dom to $testuser1"
		fcount=$(expr $fcount + 1)
		echo "  testing command vatrn failed"
		[ -z "$failed" ] && failed="vatrn-atrn" || failed="$failed, vatrn-atrn"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	(
	echo "set postmaster \"$user\""
	echo "set bouncemail"
	echo "set no spambounce"
	echo "set no softbounce"
	echo "set properties \"\""
	echo "poll 127.0.0.1 with proto ODMR port $smtp_port timeout 120 interval 1 and options no dns"
	echo "user '$testuser1' there with password '$password1' smtphost 127.0.0.1/$smtp_port options"
	echo "	no rewrite forcecr pass8bits fetchlimit 50 batchlimit 250 expunge 50"
	echo "	fetchdomains atrn.dom"
	) > $sysconfdir/fetchmailrc
	chmod 600 $sysconfdir/fetchmailrc
	echo 1 > $testdir/service/smtpd/variables/ODMR
	$sudo svc -r $servicedir/smtpd
	check_service smtpd 3
	tm1=$(date +"%s.%4N")
	fetchmail -f $sysconfdir/fetchmailrc -s
	ret1=$?
	mail_file=""
	if [ $ret1 -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command fetchmail fetch atrn domain succeeded %57s [%.4f sec]\n" " " $secs
		print_pct
	else
		echo "fetchmail failed"
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/qmail-send/current
		fi
		echo "  testing command fetchmail atrn domain failed"
		[ -z "$failed" ] && failed="fetchmail-atrn" || failed="$failed, fetchmail-atrn"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	check_mail qmaild $qmaildir/autoturn/atrn.dom/Maildir 1
	ret1=$?
	mailfile2=$mail_file
	if [ $ret1 -eq 0 -a -n $mailfile1 -a -n $mailfile2 -a "$mailfile1" != "$mailfile2" ] ; then
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing ATRN (ODMR) succeeded %81s [%.4f sec]\n" " " $secs
		print_pct
	else
		echo "fetchmail failed"
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/qmail-send/current
		fi
		echo "  testing ATRN (ODMR) failed"
		[ -z "$failed" ] && failed="receive-mail-atrn" || failed="$failed, receive-mail-atrn"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	$sudo env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
		SERVICEDIR=$servicedir \
	vdeldomain -T atrn.dom > /dev/null
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vdeldomain atrn domain succeeded %62s [%.4f sec]\n" " " $secs
		print_pct
	else
		echo "vdeldomain atrn domain failed"
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/qmail-send/current
		fi
		echo "  testing command vdeldomain atrn domain failed"
		[ -z "$failed" ] && failed="vdeldomain-atrn" || failed="$failed, vdeldomain-atrn"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
	tm1=$(date +"%s.%4N")
	$sudo setuidgid indimail env - \
		PATH=/bin:/usr/bin \
		ASSIGNDIR=$sysconfdir/users \
		SYSCONFDIR=$sysconfdir \
		CONTROLDIR=$cntrldir \
		DOMAINDIR=$qmaildir \
		SERVICEDIR=$servicedir \
	vatrn -d atrn.dom $testuser1
	if [ $? -eq 0 ] ; then
		tm2=$(date +"%s.%4N")
		secs=$(echo $tm1 $tm2 | awk '{printf("%0.4f\n", $2-$1)}')
		tcount=$(expr $tcount + 1)
		printf "\r  testing command vatrn delete access atrn domain succeeded %53s [%.4f sec]\n" " " $secs
		print_pct
	else
		echo "vatrn delete atrn domain access failed"
		fcount=$(expr $fcount + 1)
		if [ $prompt -eq 1 ] ; then
			less $logdir/qmail-send/current
		fi
		echo "  testing command vatrn delete atrn domain access failed"
		[ -z "$failed" ] && failed="vdeldomain-atrn" || failed="$failed, vdeldomain-atrn"
		[ $continue_on_err -eq 0 ] && exit 1 || return 0
	fi
}

tty -s && stty sane
ID=$(id -u)
[ $ID -eq 0 ] && echo "This script cannot be run as root" 1>&2 && exit 1
sudo=$(which sudo 2>/dev/null)
[ -z "$sudo" ] && echo "This script requires sudo privileges" 1>&2 && exit 1
export SERVICEDIR=/service
tcount=0
fcount=0
current_dir=$(pwd)
thash_supported=""
failed=""
if [ -f $testdir/itotal.count ] ; then
	total_tests=$(cat $testdir/itotal.count)
else
	total_tests=1413
fi
prompt=1
continue_on_err=0
## begin getopt
options=$(getopt -a -n testindimail-virtual -o "hycH:" -l help,noprompt,continue,hash -- "$@")
if [ $? != 0 ]; then
	usage
	exit 1
fi
eval set -- "$options"
while :
do
	case "$1" in
		-y | --noprompt)
		prompt=0
		export LESS="-E"
		shift
		;;
		-c | --continue)
		continue_on_err=1
		shift
		;;
		-H | --hash)
		thash_supported=$2
		shift 2
		;;
		-h | --help)
		usage
		display_tests
		exit 1
		;;
		--) # end of options
		shift
		break
		;;
		*)
		echo "Unexpected option: $1 - this should'nt happen." 1>&2
		usage
	exit 1
		;;
	esac
done
## end getopt

do_setup
do_svscan_start
svpid=$(sed -n '$p' $servicedir/.svscan.pid)
test_svscan_log
test_svscan_run
test_services
test_mysql
create_domain $domain1 pass
do_vdominfo
do_dbinfo
create_plain_user $testuser1 $password2
change_password $testuser1 $password1
do_vmoduser_quota $testuser1
if [ -f /etc/nsswitch.conf ] ; then
	if (grep ^passwd /etc/nsswitch.conf|grep nssd >/dev/null 2>&1 && \
			grep ^shadow /etc/nsswitch.conf|grep nssd >/dev/null 2>&1 && \
			grep ^group /etc/nsswitch.conf|grep nssd >/dev/null 2>&1) ; then
		do_pwdlookup $testuser1
	fi
fi
delete_user $testuser1

create_plain_user $testuser1 $password1 >/dev/null 2>&1
create_plain_user $testuser2 $password2 >/dev/null 2>&1
create_plain_user $testuser3 $password3 >/dev/null 2>&1
test_atrn

printf "\r%126s\n" " "
do_vfilter

printf "\r%126s\n" " "
test_recipients

printf "\r%126s\n" " "
test_smtp_chk_sender

printf "\r%126s\n" " "
do_autoresponder $testuser1 $testuser2

printf "\r%126s\n" " "
do_dot_qmail_vdelivermail

printf "\r%126s\n" " "
do_eliminate_dups

printf "\r%126s\n" " "
do_valias $testuser1 $testuser2
delete_user $testuser1 >/dev/null 2>&1
delete_user $testuser2 >/dev/null 2>&1
delete_user $testuser3 >/dev/null 2>&1

$sudo svc -2 $servicedir/inlookup.infifo
check_service inlookup.infifo

$sudo setuidgid indimail env - \
	PATH="/bin:/usr/bin" \
	ASSIGNDIR=$sysconfdir/users \
	SYSCONFDIR=$sysconfdir \
	CONTROLDIR=$cntrldir \
vlimit -D $domain1 >/dev/null 2>&1

do_plain_cram_user_tests
do_scram_user_tests

# create testuser1, testuser2 for do_admin_server_tests and do_vlimit_tests
t1="$password1""md5"
t2="$password2""md5"
create_plain_user $testuser1 $t1 MD5 >/dev/null 2>&1
create_plain_user $testuser2 $t2 MD5 >/dev/null 2>&1
do_admin_server_tests

delete_user $testuser1 >/dev/null 2>&1
do_vlimit_tests

printf "\r%126s\n" " "
echo "Testing domain deletion"
delete_domain $domain1

printf "\r%126s\n" " "
echo "Starting POST Handle tests"
do_post_handle $domain1 pass $domain2 $testuser3 $testuser4 $domain3

do_svscan_stop $svpid

wait
printf "\r%126s\n" " "
do_cleanup
if [ $fcount -eq 0 ] ; then
	echo "All $tcount tests succeeded"
else
	echo "$tcount tests succeeded $fcount tests failed"
	echo "failed tests"
	echo $failed
fi
end=$(date +'%s')
secs=$(($end-$start))
printf '%d days, %d hours, %d minutes, %d seconds\n' $((secs/86400)) $((secs%86400/3600)) $((secs%3600/60)) \
	  $((secs%60))
t=$(expr $tcount + $fcount)
if [ -f $testdir/itotal.count ] ; then
	c=$(cat $testdir/itotal.count)
else
	c=0
fi
if [ $t -gt $c ] ; then
	echo $t > $testdir/itotal.count
fi
exit 0

#
# $Log: testindimail-virtual,v $
# Revision 1.33  2024-12-12 21:23:35+05:30  Cprogrammer
# updated test script for svscan log
#
# Revision 1.32  2024-09-05 17:23:30+05:30  Cprogrammer
# added imap/pop3 starttls tests
#
# Revision 1.31  2024-07-18 09:25:18+05:30  Cprogrammer
# added tests for XOAUTH2 authentication
#
# Revision 1.30  2024-05-30 22:50:59+05:30  Cprogrammer
# fixed typo
#
# Revision 1.29  2024-05-28 22:27:51+05:30  Cprogrammer
# added vlimit tests using inquery caching
#
# Revision 1.28  2024-05-28 00:23:38+05:30  Cprogrammer
# added tests for vlimits
#
# Revision 1.27  2024-05-24 14:53:22+05:30  Cprogrammer
# updated test script
#
# Revision 1.26  2024-05-24 08:49:45+05:30  Cprogrammer
# added tests for enabling, disabling adminclient passwords
#
# Revision 1.25  2024-05-23 01:51:33+05:30  Cprogrammer
# added test for adminclient/indisrvr
#
# Revision 1.24  2024-05-14 00:34:02+05:30  Cprogrammer
# fixed elapsed time
# new env variable PENALTY for qmail-smtpd
#
# Revision 1.23  2024-05-02 17:41:16+05:30  Cprogrammer
# use MYSQL_PORT variable instead of hardcoded number
#
# Revision 1.22  2024-02-18 16:37:52+05:30  Cprogrammer
# added imap, pop3 cram login tests
#
# Revision 1.21  2024-02-12 22:03:26+05:30  Cprogrammer
# fix clearing of progress percentage
#
# Revision 1.20  2023-12-13 00:31:27+05:30  Cprogrammer
# added tests for ATRN
#
# Revision 1.19  2023-11-13 08:47:33+05:30  Cprogrammer
# updated total test count
#
# Revision 1.18  2023-10-23 21:52:19+05:30  Cprogrammer
# added test for .qmail handling by vdelivermail
#
# Revision 1.17  2023-10-23 18:47:37+05:30  Cprogrammer
# added test for ismaildup
#
# Revision 1.16  2023-10-22 22:37:00+05:30  Cprogrammer
# added test for duplicate eliminiator
#
# Revision 1.15  2023-10-08 01:47:46+05:30  Cprogrammer
# added test count and pct completed
#
# Revision 1.14  2023-10-04 19:18:10+05:30  Cprogrammer
# updated test script
#
# Revision 1.13  2023-09-30 20:56:53+05:30  Cprogrammer
# clear temp file
#
# Revision 1.12  2023-09-29 19:38:37+05:30  Cprogrammer
# formated display for time taken to be displayed in the same column for all tests
#
# Revision 1.11  2023-09-29 13:56:26+05:30  Cprogrammer
# updated decimal digits for times to 4 places
#
# Revision 1.10  2023-09-29 02:19:04+05:30  Cprogrammer
# added test times
# added CHECKRECIPIENT, CHECKSENDER
#
# Revision 1.9  2023-09-25 18:39:23+05:30  Cprogrammer
# updated RCS
#
# Revision 1.8  2023-09-08 11:19:10+05:30  Cprogrammer
# removed duplicate tests
#
# Revision 1.7  2023-09-08 09:31:04+05:30  Cprogrammer
# added vfilter tests
#
# Revision 1.6  2023-08-23 13:09:26+05:30  Cprogrammer
# formated messages
#
# Revision 1.5  2023-08-22 21:23:31+05:30  Cprogrammer
# added test for autoresponder
#
# Revision 1.4  2023-08-04 00:11:14+05:30  Cprogrammer
# updated test script
#
# Revision 1.3  2023-07-31 20:24:57+05:30  Cprogrammer
# refactored code
#
# Revision 1.2  2023-07-16 22:42:59+05:30  Cprogrammer
# added test case for YESCRYPT
# test all hashes
#
# Revision 1.1  2023-07-15 00:14:58+05:30  Cprogrammer
# Initial revision
#
#
