#!/bin/bash
if [ "$1" == "" ]
then
    delay=3
else
    delay=$1
fi
echo "Starting slow asterisk restart with a delay of $delay seconds"
echo "Stopping all crontab activities"
service crond stop
echo "Stopping asterisk"
service asterisk stop
echo "Waiting for asterisk to stop"
while [ "a`pidof asterisk`a" != "aa" ]
do
    echo -n "."
    sleep 5s
done 
echo "Cleaning the firewall"
iptables -X
iptables -F
iptables -X
echo "Closing the firewall"
iptables -I INPUT -s 0.0.0.0/0 -p udp -m multiport --dports 5060,5061,5062,5080,5081,5082 -j DROP
iptables -I INPUT -s 0.0.0.0/0 -p tcp -m multiport --dports 5060,5061,5062,5080,5081,5082 -j DROP
echo "Starting asterisk"
service asterisk start
echo "Waiting for services to came up"
while [ `netstat -nap | grep "0.0.0.0:5038" | wc -l` -eq 0 ]
do
    sleep 1s
done
echo "  Manager service up"
while [ `netstat -nap | grep "0.0.0.0:5060" | wc -l` -eq 0 ]
do
    sleep 1s
done
echo "  SIP module up"
while [ `netstat -nap | grep "0.0.0.0:5080" | wc -l` -eq 0 ]
do
    sleep 1s
done
echo "  PJSIP module up"
echo "Slowly opening the firewall"
ip=0
while [ $ip -lt 256 ]
do
    echo -n "  Network $ip.0.0.0/8 "
    iptables -I INPUT -s $ip.0.0.0/8 -j ACCEPT
    sleep $delay
    sipbuffer=`netstat -nap | grep "0.0.0.0:5060" | grep udp | awk '{print $2}'`
    pjsipbuffer=`netstat -nap | grep "0.0.0.0:5080" | grep udp | awk '{print $2}'`
    sipfriends=`asterisk -rx 'sip show peers' | grep OK | wc -l`
    pjsipendpoints=`asterisk -rx 'pjsip show contacts' | grep Avail | wc -l`
    echo -n " SIP buffer at $sipbuffer, PJSIP buffer at $pjsipbuffer"
    echo  " $sipfriends SIP friends online, $pjsipendpoints PJSIP contacts online"
    while [ $sipbuffer -gt 0 ]
    do
	sipbuffer=`netstat -nap | grep 5060 | grep udp | awk '{print $2}'`
	echo "Waiting for SIP buffer to stabilize... now at $sipbuffer"
	sleep $delay
    done
    while [ $pjsipbuffer -gt 0 ]
    do
	pjsipbuffer=`netstat -nap | grep 5080 | grep udp | awk '{print $2}'`
	echo "Waiting for PJSIP buffer to stabilize... now at $pjsipbuffer"
	sleep $delay
    done
    ip=$((ip+1))
done
echo "Cleaning the firewall again"
iptables -X
iptables -F
iptables -X
echo "Restarting all crontab activities"
service crond start