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
 |