#! /bin/bash
#

if [ -z "$toolsPath" ] ;then
  toolsPath=/root/test/tools/bin
fi

doSudo="sudo"
sipport=5070
rtpport=5500
nrtodial=230000
maxcalls=100
maxsimultan=30
my_ip=$(ifconfig eth0 | awk '/inet addr/ {split ($2,A,":"); print A[2]}')

export PATH=$PATH:${toolsPath}

cleanuplog()
{
  ${doSudo} rm masstest.csv
  ${doSudo} rm masstest.log
  ${doSudo} rm ua[sc]_* 2>/dev/null
}

dumpState()
{
  #echo -e "SSRC\t\tFromIp\t\tPort\tPackets\t1stSeq\tOrdered\tLoss\tJMax\tJMean\tDMax\tSkew"
  for i in *rtp.log; do 
	l=$(awk -f rtp_stat.awk $i | sed -e 's/,/\t/g')
        echo -e "$l"
  done
}

dumpDtmfSequence()
{
  dtmfseq=$(cat $1 | grep "inband  DTMF:" | cut -d ":" -f2 | tr '\n' ' ' | sed 's/ //g')
  #echo -n $dtmfseq
}

launchReceiver()
{
   #PROGRAM="${doSudo} ${toolsPath}/sipp $my_ip -sf uas.xml -mp $rtpport -silent -t tn -i $my_ip -mi $my_ip -p $sipport
   #         -trace_dtmf -trace_msg -trace_shortmsg -trace_logs -trace_err -trace_rtp -pause_msg_ign -m 1 -users 1 
   #         -s '$nrtodial' -rtp_echo" 
   
   PROGRAM="sipp 10.0.1.131 -sf uas.xml -mp $rtpport -silent -t tn -i 10.0.1.131 -mi 10.0.1.131 -p $sipport -trace_msg -trace_shortmsg -trace_logs -trace_err -pause_msg_ign -m 1 -users 1 -s '$nrtodial' -rtp_echo"

PID=$(ssh root@10.0.1.131 "/root/test/mass/receiver.sh $sipport $rtpport &")
echo "####$PID"

  #echo $PROGRAM
 #  $PROGRAM >/dev/null 2>/dev/null &
#xxx
#echo $PROGRAM
#echo   "ssh root@10.0.1.131 \"cd  /root/test/mass; ${PROGRAM} >/dev/null 2>/dev/null \&; echo \${PPID}\""
#   PID=$!
}

makeCall()
{
  let sipclientport=$sipport+1000
  let rtpclientport=$rtpport+1000 

  PROGRAM="${doSudo} ${toolsPath}/sipp 10.0.0.9 -sf uac.xml -silent -t tn -p $sipclientport -mp $rtpclientport\
            -trace_stat -trace_dtmf -trace_msg -trace_shortmsg -trace_logs -trace_err -trace_rtp -pause_msg_ign -m 1 \
            -users 1 -s $nrtodial -cid_str $callnr#$nrtodial-%p@%s -rtp_receive"
  $PROGRAM 
# >/dev/null 2>/dev/null &
  PID_CALLEE=$!
 
  #let nrtodial+=1
}

calcPorts()
{
   ports=$(lsof -P -i TCP | sed -e 's/.*TCP *.*[\.:]\([0-9]*\) .*$/\1/' | awk 'NR>1{print $1}' | sort -g | uniq)
   for p in "$ports"; do
     echo $p","
   done
}

isProcessRunning()
{
  kill -0 $1 2>/dev/null
 
  if [ $? -eq 0 ]
  then
     return 0   #echo "existing process $1"
  else
     return 1   #echo "no process with pid: $1"
  fi
}

dumpRTP()
{
  l=$(awk -f rtp_stat.awk $1 | sed -e 's/,/\t/g')
  echo "  RTP SSRC:           " $(echo $l | cut -d " " -f1) >> masstest.log
  echo "      From:           " $(echo $l | cut -d " " -f2,3 | sed -e 's/ /:/g') >> masstest.log
  echo "      Packets:        " $(echo $l | cut -d " " -f4) >> masstest.log
  echo "      Ordered:        " $(echo $l | cut -d " " -f6) >> masstest.log
  echo "      Lost:           " $(echo $l | cut -d " " -f7) >> masstest.log
  echo "      Jitter Max:     " $(echo $l | cut -d " " -f8) >> masstest.log
  echo "      Jitter Mean:    " $(echo $l | cut -d " " -f9) >> masstest.log
  echo "      Delta:          " $(echo $l | cut -d " " -f10) >> masstest.log
  echo "      Skew:           " $(echo $l | cut -d " " -f11) >> masstest.log
  echo "" >> masstest.log
}

dumpCall()
{
  prefix=$1
  if [ -e "${prefix}_errors.log" ] ;then
    echo "  Errors:              Yes"  >> masstest.log
  else
    echo "  Errors:              No"  >> masstest.log
  fi

  dtmfseq=$(cat "${prefix}_dtmf.log" | grep "inband  DTMF:" | cut -d ":" -f2 | tr '\n' ' ' | sed 's/ //g')  
  echo "  DTMF:                $dtmfseq"  >> masstest.log

  dumpRTP "${prefix}_rtp.log"
}

dumpCallState()
{
  echo "Call [$1] with Called Party Number $2"  >> masstest.log

  dtmf1=$(cat "uas_${3}_dtmf.log" | grep "inband  DTMF:" | cut -d ":" -f2 | tr '\n' ' ' | sed 's/ //g')
  dtmf2=$(cat "uac_${4}_dtmf.log" | grep "inband  DTMF:" | cut -d ":" -f2 | tr '\n' ' ' | sed 's/ //g')
  
  #echo "$dtmf1 vs $dtmf2"
  if [ "$dtmf1" == "$dtmf2" ]; then
     echo "Status:  Ok"  >> masstest.log
  else
     echo "Status:  DTMF sequence is not in sync"  >> masstest.log
     echo "Call[$1] is not in sync ($dtmf1 != $dtmf2)"
  fi

  echo "Callee:"  >> masstest.log
  dumpCall "uas_${3}"

  echo "Caller:"  >> masstest.log
  dumpCall "uac_${4}"
  
  echo "---------------------------------------------------------" >> masstest.log
}

dumpActivateCalls()
{
  #echo "Elements in call array:  ${calls[@]}"
  #echo "Length of first element in call array = ${#calls}"
  #echo "Number of elements in call array = ${#calls[*]}"

  for (( i = 1 ; i <= ${#calls[*]} ; i++ ))
  do
    cc=${calls[$i]}
    pid1=$(echo $cc | cut -d "," -f1)
    pid2=$(echo $cc | cut -d "," -f2)
    cpn=$(echo $cc | cut -d "," -f3)
    
    if [ -n "$cc" ]; then  
      if ! isProcessRunning $pid1; then
        if ! isProcessRunning $pid2; then
          dumpCallState $i $cpn $pid1 $pid2
          calls[i]=""
        fi
      fi
    fi
  done
}

waitForFreeChannel()
{
  while : ; do
    nCallee=$(ps aux | grep "sipp.*uas" | grep -v "grep" | wc -l)
    nCaller=$(ps aux | grep "sipp.*uac" | grep -v "grep" | wc -l)
    
    if [ $nCaller -lt $maxsimultan ] && [ $nCallee -lt $maxsimultan ]; then
       break;
    fi      
    
    #echo "Caller: $nCaller, Calllee: $nCallee"
    sleep 1;
  done

  let mod=$callnr%200
  #$maxsimultan

  dumpActivateCalls

  if [ $mod -eq 0 ]; then
     echo "rotate"
     sipport=5070
     rtpport=5500
     sleep 5
  else
     let sipport+=1
     let rtpport+=4
  fi
}

while getopts "n:b" o
do	case "$o" in
	n)	maxcalls="$OPTARG";;
	b)	nrtodial="$OPTARGS";;
	[?])	print >&2 "Usage: $0 [-n number of calls] [-b first number to dial] ..."
		exit 1;;
	esac
done
shift $((OPTIND-1))

cleanuplog
${doSudo} killall -9 sipp 2>/dev/null
#calcPorts

callnr=0
while [ $maxcalls -gt $callnr ]; do
  let callnr+=1
  launchReceiver
  makeCall
  calls[$callnr]="$PID,$PID_CALLEE,$nrtodial"

  #echo -e "New Call [$callnr]:\t cpn:$nrtodial, Callee[pid:$PID_CALLEE,sip:$sipport,rtp:$rtpport]," \
  #        "Caller[pid:$PID,sip:$sipclientport,rtp:$rtpclientport]" 
  echo -e "Call $callnr, cpn=$nrtodial, rec_pid=$PID_CALLEE, rec_sip=$sipport, rec_rtp=$rtpport," \
          "snd_pid=$PID, snd_sip=$sipclientport, snd_rtp=$rtpclientport, state=<unknown>" >> masstest.csv
  sleep 1
  waitForFreeChannel 
  let nrtodial+=1
done

let linecheck=60
dobreak="0"
        while [ "$dobreak" = "0" ];do
            dobreak="1"
            for j in $(ls /proc | grep -E "[0-9].*"); do
                if test -e "/proc/${j}/cmdline" ;then
                    if grep -q "sipp.*uac" /proc/${j}/cmdline ;then
                        dobreak="0"
                        let linecheck=$linecheck-1
                        if test $linecheck -le 0; then
                            #echo " "
                            #echo -n "* $j: "
                            ps -w -o "cmd=" -p $j
                            sudo kill -9  $j
                            #sleep 1
                        else
			    dumpActivateCalls
                            #echo -n "."
                        fi
                        sleep 1
                    fi
                fi
            done
        done
        echo " "
sleep 5 
dumpActivateCalls
#dumpState


