123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- #!/bin/sh
- #
- # $Id: client-test,v 1.2 2006/02/13 23:50:44 quozl Exp $
- #
- # client-test, PPTP lab test script
- # Copyright (C) 2005 James Cameron (quozl@us.netrek.org)
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software
- # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- #
- # --
- #
- # Creates many tunnels from a test client to a single server.
- # Test sequence is as follows
- #
- # 1. on server ... set it to listen on chosen network address
- # ip addr add 10.9.0.3/16 dev eth0
- # and edit /etc/hosts.allow to cover range "ALL: 10.9.0.0/16"
- #
- # 2. on client ... run pptpconfig to define a tunnel named test
- #
- # 3. run "./client-test start" to create the tunnels
- #
- # 4. run "./client-test status" to test the tunnels with ping
- #
- # 5. run "./client-test stop" to stop the tunnels
- #
- # number of sets of tunnels to create
- MAX_C=10
- # number of tunnels in each set
- MAX_D=100
- # network address prefix for test network
- PREFIX=10.9
- # address of server on test network
- SERVER=10.9.0.3
- # create a virtual interface for the address
- function if_up {
- ip addr add ${PREFIX}.${2}.${3}/16 dev eth0 && echo -n .
- }
- # delete the virtual interface
- function if_down {
- ip addr del ${PREFIX}.${2}.${3}/16 dev eth0 2>/dev/null && echo -n .
- # expected error on 2.6.8 ...
- # RTNETLINK answers: Cannot assign requested address
- }
- # create a tunnel from the virtual interface to the server
- function tu_up {
- pppd call test updetach linkname test-${1} \
- pty "pptp ${SERVER} --nolaunchpppd --localbind=${PREFIX}.${2}.${3}"
- }
- # create a tunnel from the virtual interface to the server
- function tu_up_fast {
- pppd call test linkname test-${1} \
- pty "pptp ${SERVER} --nolaunchpppd --localbind=${PREFIX}.${2}.${3}"
- echo -n .
- sleep 0.1
- }
- # delete a tunnel previously created
- function tu_down {
- if test -f /var/run/ppp-test-${1}.pid; then
- kill `head -1 /var/run/ppp-test-${1}.pid` && echo -n .
- fi
- }
- # start tunnels rapidly and fill up available memory until swap free
- # starts to be scarce
- function filler {
- if_up $1 $2 $3
- tu_up_fast $1 $2 $3
- swapfree=`grep SwapFree /proc/meminfo |awk '{print $2}'`
- until test ${swapfree} -gt 4096; do
- echo -n -
- sleep 1
- done
- }
- # check the state of a tunnel slot
- function state {
- echo -n "slot ${1} "
- if ! test -f /var/run/ppp-test-${1}.pid; then
- echo -n "(missing) "
- else
- pid=`head -1 /var/run/ppp-test-${1}.pid`
- echo -n "pid ${pid} "
- if ! kill -0 ${pid} 2>/dev/null; then
- echo -n "(missing) "
- fi
- iface=`tail -1 /var/run/ppp-test-${1}.pid`
- echo -n "iface ${iface} "
- if ! ip addr show dev ${iface} 1>/dev/null 2>/dev/null; then
- echo -n "(missing) "
- fi
- inet=`ip addr show dev ${iface}|egrep --only-matching "inet [0-9.]*"|awk '{print $2}'`
- echo -n "inet ${inet} "
- peer=`ip addr show dev ${iface}|egrep --only-matching "peer [0-9.]*"|awk '{print $2}'`
- echo -n "peer ${peer} "
- avg=`/bin/ping -c 1 ${peer} 2>/dev/null | grep "rtt min" | cut -f6 -d/`
- if test -z "${avg}"; then
- echo -n "ping (missing) "
- else
- echo -n "ping ${avg} "
- fi
- fi
- echo
- }
- # general purpose iteration function to call a handler (above) once
- # for each slot in the test set. Handler receives slot number, then
- # the fragments of IP address a.b.C.D.
- function iterate {
- x=1
- for c in `seq ${MAX_C}`; do
- for d in `seq ${MAX_D}`; do
- ${1} ${x} ${c} ${d}
- x=`expr ${x} + 1`
- done
- done
- }
- # start the test
- function start {
- iterate if_up
- echo
- iterate tu_up
- echo
- }
- # start slow test
- function fill {
- iterate filler
- echo
- }
- # stop the test
- function stop {
- iterate tu_down
- echo
- sleep 10
- iterate if_down
- echo
- }
- # check status of test
- function status {
- iterate state
- }
- # main dispatcher
- case "$1" in
- start)
- start
- break
- ;;
- fill)
- fill
- break
- ;;
- stop)
- stop
- break
- ;;
- restart)
- stop
- start
- break
- ;;
- status)
- status
- break
- ;;
- *)
- echo "Usage: ${0} start|fill|stop|restart|status" 1>&2
- exit 1
- ;;
- esac
|