263 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
	
		
			6.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/bin/bash
 | |
| 
 | |
| #starting with define of stream getter functions
 | |
| #for all funcions: $1 = stream, $2 = time to download
 | |
| function genericGetter {
 | |
|   echo filesize `curl -s -m $2 $1| wc -c` 1>&2
 | |
| }
 | |
| 
 | |
| function flvGetter {
 | |
|   curl -s -m $2 $1 2> /dev/null | ../MistAnalyserFLV -m validate 2> /dev/null
 | |
| }
 | |
| 
 | |
| function hlsGetter {
 | |
|   ../MistAnalyserHLS -m validate -a $2 $1 2>/dev/null
 | |
| }
 | |
| 
 | |
| function oggGetter {
 | |
|   curl -s -m $2 $1 | ../MistAnalyserOGG -m validate
 | |
| }
 | |
| 
 | |
| function dashGetter {
 | |
|   ../MistAnalyserDASH -m validate -a $2 $1 2>/dev/null
 | |
| }
 | |
| 
 | |
| function rtmpGetter {
 | |
|   #$rtmpGetter ignores $2, because rtmpdump has no time setting
 | |
|   #rtmpdump is ended with killall in parent function
 | |
|   rtmpdump -qRr $1 -o - 2> /dev/null | ../MistAnalyserFLV -m validate 2> /dev/null
 | |
| }
 | |
| 
 | |
| function serverTest {
 | |
|   rm /tmp/res*_*
 | |
|   #this functions creates a csv file with all statistics during the tests
 | |
|   #$1 = number of stream batches
 | |
|   #$2 = amount of streams per batch (amount of streams = $! * $2)
 | |
|   #$3 = current stream test
 | |
|   #$4 = ssh access to server where our log file is located
 | |
|   #$5 = duration of test in seconds
 | |
|   #$6 = location of log file on server
 | |
|   #$7 = getter used for stream testing
 | |
|   #$8 = Extra comments added to .csv file
 | |
|   #$9 = Output basename
 | |
|   echo "Test variables:" > $9.info
 | |
|   echo "Start time: `date`" >> $9.info
 | |
|   echo "Client count: `echo "$1 * $2" | bc`" >> $9.info
 | |
|   echo "Batch Size: $2" >> $9.info
 | |
|   echo "Stream URL: $3"  >> $9.info
 | |
|   echo "Duration: $5 seconds" >> $9.info
 | |
|   val="none"
 | |
|   logdir="$6"
 | |
|   if [ -n "$7" ] ; then
 | |
|     echo "Validator: $7" >> $9.info
 | |
|     val="$7"
 | |
|   fi
 | |
|   ssh $4 sudo systemctl restart capa_service
 | |
|   #sleeping, so service can properly start
 | |
|   sleep 2
 | |
|   
 | |
|   getter="${val}Getter"
 | |
|   #starting all tests
 | |
|   prefix="res"`date +%s`_
 | |
|   for x in `seq 1 1 $1`; do
 | |
|     for y in `seq 1 1 $2`; do
 | |
|       eval "$getter $3 $5" >& /tmp/$prefix`echo "$x * $2 + $y" | bc`.txt &
 | |
|     done
 | |
|     sleep 1
 | |
|   done
 | |
|   
 | |
|   start=`date +%s`
 | |
|   f=$(( `date +%s` - $start ))
 | |
|   while [ $f -lt $5 ]; do
 | |
|     sleep 2
 | |
|     f=$(( `date +%s` - $start ))
 | |
|   done
 | |
|   if [ "$val" == "rtmp" ] ; then
 | |
|     killall rtmpdump
 | |
|   fi
 | |
|   #wait 20 seconds after terminating
 | |
|   start=`date +%s`
 | |
|   f=$(( `date +%s` - $start ))
 | |
|   while [ $f -lt 20 ]; do
 | |
|     sleep 2
 | |
|     f=$(( `date +%s` - $start ))
 | |
|   done
 | |
|   cat /tmp/$prefix* > $9.times
 | |
|   ssh $4 sudo systemctl stop capa_service
 | |
|   ssh $4 "cat $logdir/log.csv" > $9.csv
 | |
|   wait
 | |
| }
 | |
| 
 | |
| function rebootHost {
 | |
|   nowtime=`ssh $1 uptime -s`
 | |
|   timeOut=$(( `date +%s` + 3600 ))
 | |
|   echo "Rebooting host $1..."
 | |
|   ssh $1 sudo shutdown -r 3
 | |
|   echo "Waiting for host to come back..."
 | |
|   sleep 3
 | |
|   while [ true ]; do
 | |
|     sleep 5
 | |
|     #ping for connection
 | |
|     ping -c1 $1 > /dev/null
 | |
|     if [ `echo $?` == 0 ]; then
 | |
|       #check ssh
 | |
|       if [ "`ssh -o 'ConnectTimeout 5' $1 echo DDVtesting`" == "DDVtesting" ]; then
 | |
|         #check uptime
 | |
|         if [ "`ssh -o 'ConnectTimeout 5' $1 uptime -s`" != "$nowtime" ]; then
 | |
|           echo host succesfully rebooted
 | |
|           return 0
 | |
|         fi
 | |
|       fi
 | |
|     fi
 | |
|     if [ $timeOut -lt `date +%s` ]; then
 | |
|       echo timeout
 | |
|       return 1
 | |
|     fi
 | |
|   done
 | |
| }
 | |
| 
 | |
| function checkService {
 | |
| echo "doing runcheck"
 | |
| echo "ssh $1 systemctl status $2 | grep Active\:"
 | |
| status="`ssh $1 systemctl status $2 | grep Active\:`"
 | |
|   if [ "${status:11:6}" != "active" ]; then
 | |
|     echo starting ${2}...
 | |
|     ssh $1 sudo systemctl stop wowza
 | |
|     ssh $1 sudo systemctl stop wowza4
 | |
|     ssh $1 sudo systemctl stop nginx
 | |
|     ssh $1 sudo systemctl stop mistserver
 | |
|     ssh $1 sudo systemctl stop adobe 
 | |
|     ssh $1 sudo systemctl disable wowza
 | |
|     ssh $1 sudo systemctl disable wowza4
 | |
|     ssh $1 sudo systemctl disable nginx
 | |
|     ssh $1 sudo systemctl disable mistserver
 | |
|     ssh $1 sudo systemctl disable adobe 
 | |
|     ssh $1 sudo systemctl enable $2
 | |
|     ssh $1 sudo systemctl start $2
 | |
|   else
 | |
|     echo $2 is running...
 | |
|   fi
 | |
| }
 | |
| 
 | |
| #setting default values
 | |
| server="localhost"
 | |
| comment=""
 | |
| logdir="`pwd`"
 | |
| freshBoot="y"
 | |
| product="mistserver"
 | |
| declare -a timegroup
 | |
| declare -a request
 | |
| declare -a stream
 | |
| 
 | |
| #parsing arguments
 | |
| red=1
 | |
| while [ $red -le $# ]; do
 | |
|   case ${!red} in
 | |
|     "-s") #defines server
 | |
|       red=$(( $red + 1 ))
 | |
|       server=${!red}
 | |
|     ;;
 | |
|     "-l") #defines directory on the server with the capabilities log
 | |
|       red=$(( $red + 1 ))
 | |
|       logdir=${!red}
 | |
|     ;;
 | |
|     "-t") #defines timelengths for tests
 | |
|       red=$(( $red + 1 ))
 | |
|       timegroup+=( ${!red} )
 | |
|     ;;
 | |
|     "-b") #defines user batches for tests (must be in format "batchamount batchsize")
 | |
|       red=$(( $red + 1 ))
 | |
|       request+=( "${!red}" )
 | |
|     ;;
 | |
|     "-c") #add a comment
 | |
|       red=$(( $red + 1 ))
 | |
|       comment=${!red}
 | |
|     ;;
 | |
|     "-m") #defines a media stream and validator
 | |
|       red=$(( $red + 1 ))
 | |
|       stream+=( "${!red}" )
 | |
|     ;;
 | |
|     "-p") #defines the product to be tested, default is mistserver
 | |
|       red=$(( $red + 1 ))
 | |
|       product=${!red}
 | |
|     ;;
 | |
|     "-fresh")
 | |
|       freshBoot="x"
 | |
|     ;;
 | |
|     *)
 | |
|       comment=`echo $comment ${!red}`
 | |
|   esac
 | |
|   red=$(( $red + 1 ))
 | |
| done
 | |
| 
 | |
| #determining validators
 | |
| for (( i=0; i<${#stream[@]}; i++ )) ; do
 | |
|   if [ "${stream[$i]:0:4}" == "rtmp" ]; then
 | |
|     validator[$i]="rtmp"
 | |
|   else
 | |
|     tempFile=$(basename "${stream[$i]}")
 | |
|     tempExt="${tempFile##*.}"
 | |
|     case $tempExt in
 | |
|     "flv")
 | |
|       validator[$i]="flv"
 | |
|     ;;
 | |
|     "ogg")
 | |
|       validator[$i]="ogg"
 | |
|     ;;
 | |
|     "m3u8")
 | |
|       validator[$i]="hls"
 | |
|     ;;
 | |
|     "m3u")
 | |
|       validator[$i]="hls"
 | |
|     ;;
 | |
|     "mpd")
 | |
|       validator[$i]="dash"
 | |
|     ;;
 | |
|     *)
 | |
|       validator[$i]="generic"
 | |
|     esac
 | |
|   fi
 | |
| done
 | |
| 
 | |
| if [ ${#request[@]} == 0 ]; then
 | |
|   request=( "1 1000" )
 | |
| fi
 | |
| 
 | |
| if [ ${#timegroup[@]} == 0 ]; then
 | |
|   timegroup=( 60 )
 | |
| fi
 | |
| 
 | |
| #checking if the right product is enabled on the server is 
 | |
| checkService $server $product
 | |
| 
 | |
| #making directory for test
 | |
| temp="$product"`date +%y%m%d%H%M%S`
 | |
| mkdir $temp
 | |
| 
 | |
| #starting test
 | |
| for (( i=0; i<${#stream[@]}; i++ )) ; do
 | |
|   for (( p=0; p<${#timegroup[@]}; p++ )) ; do
 | |
|     for (( o=0; o<${#request[@]}; o++ )) ; do
 | |
|       if [ $freshBoot == "x" ]; then
 | |
|         rebootHost $server
 | |
|         if [ $? -ne 0 ] ; then
 | |
|           echo lost host in reboot process, exiting...
 | |
|           exit $?;
 | |
|         fi
 | |
|         checkService $server $product
 | |
|       fi
 | |
|       tnr=` echo "$i * ${#timegroup[@]} * ${#request[@]} + $o * ${#timegroup[@]} + $p" | bc `
 | |
|       name=$temp"/run"
 | |
|       if [ $tnr -lt 100 ] ; then
 | |
|         name="${name}0"
 | |
|       fi
 | |
|       if [ $tnr -lt 10 ] ; then
 | |
|         name="${name}0"
 | |
|       fi
 | |
|       amount=`echo ${request[$o]} | sed -e 's/ /*/g' | bc`
 | |
|       name="${name}${tnr}_${amount}_${validator[$i]}_${timegroup[$p]}"
 | |
|       echo "$name ${request[$o]} ${stream[$i]} $server ${timegroup[$p]} ${validator[$i]}"
 | |
|       serverTest ${request[$o]} ${stream[$i]} $server ${timegroup[$p]} $logdir ${validator[$i]} "$comment" $name
 | |
|     done
 | |
|   done
 | |
| done
 | 
