Home | History | Annotate | Download | only in ssh
      1 #!/bin/sh
      2 
      3 # Copyright (c) 2015 Oracle and/or its affiliates. All Rights Reserved.
      4 # Copyright (c) International Business Machines  Corp., 2005
      5 #
      6 # This program is free software; you can redistribute it and/or
      7 # modify it under the terms of the GNU General Public License as
      8 # published by the Free Software Foundation; either version 2 of
      9 # the License, or (at your option) any later version.
     10 #
     11 # This program is distributed in the hope that it would be useful,
     12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14 # GNU General Public License for more details.
     15 #
     16 # You should have received a copy of the GNU General Public License
     17 # along with this program; if not, write the Free Software Foundation,
     18 # Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     19 #
     20 # Author: Mitsuru Chinen <mitch (at] jp.ibm.com>
     21 #
     22 
     23 TCID=ssh-stress
     24 TST_TOTAL=3
     25 TST_CLEANUP="cleanup"
     26 
     27 TST_USE_LEGACY_API=1
     28 . tst_net.sh
     29 
     30 # Temporary directory to store sshd setting or ssh key
     31 # Note: ssh doesn't work when those directory is under /tmp.
     32 TMPDIR="/root"
     33 
     34 cleanup()
     35 {
     36 	# Stop the ssh daemon
     37 	test -s sshd.pid && kill $(cat sshd.pid)
     38 	pkill 'netstress$'
     39 	tst_rmdir
     40 	[ "$rtmpdir" ] && tst_rhost_run -c "rm -rf $rtmpdir"
     41 	TMPDIR=
     42 }
     43 
     44 setup()
     45 {
     46 	trap "tst_brkm TBROK 'test interrupted'" INT
     47 
     48 	tst_require_root
     49 	tst_test_cmds pkill sshd ssh od
     50 
     51 	# Get the sshd command with absolute path
     52 	SSHD=$(which sshd)
     53 	test "$SSHD" || tst_brkm TBROK "sshd daemon is not found"
     54 
     55 	check_icmpv${TST_IPVER}_connectivity $(tst_iface) $(tst_ipaddr rhost) || \
     56 		tst_brkm TBROK "Failed to ping to $(tst_ipaddr rhost)"
     57 
     58 	port=$(tst_rhost_run -c "tst_get_unused_port ipv${TST_IPVER} stream")
     59 
     60 	tst_tmpdir
     61 
     62 	tmpdir=$TST_TMPDIR
     63 
     64 	cat << EOD > $tmpdir/sshd_config
     65 Port $port
     66 ListenAddress $(tst_ipaddr)
     67 PermitRootLogin yes
     68 AuthorizedKeysFile $tmpdir/authorized_keys
     69 PasswordAuthentication no
     70 AllowTcpForwarding yes
     71 TCPKeepAlive yes
     72 UseDNS no
     73 PidFile $tmpdir/sshd.pid
     74 EOD
     75 
     76 	$SSHD -f $tmpdir/sshd_config || \
     77 		tst_brkm TBROK "Failed to run sshd daemon"
     78 
     79 	tst_resm TINFO "Generate configuration file and key at the remote host"
     80 	rtmpdir=$(tst_rhost_run -c "mktemp -d -p $TMPDIR")
     81 	tst_rhost_run -s -c "ssh-keygen -t rsa -N \"\" -f $rtmpdir/id_rsa > /dev/null"
     82 
     83 	rconfig=$rtmpdir/ssh_config
     84 
     85 	tst_rhost_run -s -c "printf \"\
     86 Port $port\n\
     87 StrictHostKeyChecking no\n\
     88 PasswordAuthentication no\n\
     89 UserKnownHostsFile $rtmpdir/known_hosts\n\
     90 IdentityFile $rtmpdir/id_rsa\n\" > $rconfig"
     91 
     92 	tst_rhost_run -s -c "chmod 700 $rtmpdir; chmod 600 $rtmpdir/*"
     93 
     94 	tst_resm TINFO "Generate authorized_keys"
     95 	tst_rhost_run -c "cat ${rtmpdir}/id_rsa.pub" > $tmpdir/authorized_keys
     96 
     97 	tst_resm TINFO "restore context of authorized_keys"
     98 	local rc=$(which restorecon)
     99 	test "$rc" && $rc $tmpdir/authorized_keys
    100 
    101 	chmod 700 $tmpdir
    102 	chmod 600 $tmpdir/*
    103 }
    104 
    105 test01()
    106 {
    107 	tst_resm TINFO "Creating '$CONNECTION_TOTAL' ssh sessions"
    108 
    109 	tst_rhost_run -s -c "ssh-stress01-rmt $TST_IPVER $(tst_ipaddr) \
    110 		$rconfig $CONNECTION_TOTAL"
    111 
    112 	tst_resm TPASS "Test is finished successfully"
    113 }
    114 
    115 test02()
    116 {
    117 	tst_resm TINFO "Log in/out by many clients asynchronously"
    118 	tst_resm TINFO "'$CONNECTION_TOTAL' clients, time $NS_DURATION sec"
    119 
    120 	tst_rhost_run -s -c "ssh-stress02-rmt $TST_IPVER $(tst_ipaddr) \
    121 		$rconfig $CONNECTION_TOTAL $NS_DURATION"
    122 
    123 	tst_resm TPASS "Test is finished successfully"
    124 }
    125 
    126 test03()
    127 {
    128 	tst_resm TINFO "Forwarding TCP traffic with $NS_TIMES requests"
    129 
    130 	# Run a TCP traffic server
    131 	port=$(tst_get_unused_port ipv${TST_IPVER} stream)
    132 
    133 	netstress -R 3 -g $port > tcp_server.log 2>&1 &
    134 
    135 	tst_rhost_run -s -c "ssh-stress03-rmt $TST_IPVER $(tst_ipaddr) \
    136 		$rconfig $port $NS_TIMES"
    137 
    138 	tst_resm TPASS "Test is finished successfully"
    139 }
    140 
    141 setup
    142 
    143 test01
    144 test02
    145 test03
    146 
    147 tst_exit
    148