#!/bin/sh
# Start/stop/restart asterisk.

# Exit si un autre process identique deja en cours
script_name=${BASH_SOURCE[0]}
for pid in $(pidof -x $script_name); do
    if [ $pid != $$ ]; then
        exit
    fi
done

# Start asterisk:
asterisk_start() {

  # Recherche du process de discover :
  discoverCommand=`ps -A -o cmd | grep callbox_discover_sip_subscribe | grep -v CMD | grep -v grep | uniq | xargs echo -n | cut -d ":" -f 1`
  # Kill du discover qui peut empecher le bind de l'asterisk
  killall callbox_discover_sip_subscribe.py
  pkill -f callbox_discover_sip_subscribe.py

  echo -n "Starting asterisk"
  if [ `lspci | grep Digium | wc -l` -eq "0" ]&&[ `lspci | grep "Tiger3XX Modem/ISDN" | wc -l` -eq "0" ];then
	echo "No Digium card detected, launching dummy timer";
	/sbin/modprobe dahdi_dummy	# si pas de carte avec horloge
  fi
  ulimit -n 9999
  /etc/init.d/dahdi start
  # laisser le temps aux drivers de démarrer ( utile pour B410P au moins )
  sleep 10
  # lancer asterisk
  /usr/sbin/asterisk 2>/dev/null 1>/dev/null
  sleep 1
  /sbin/callbox_manager_collecter.pl 2>/dev/null 1>/dev/null &
  /sbin/callbox_manager_collecter-slow.pl 2>/dev/null 1>/dev/null &
  chmod 777 /var/run/asterisk/asterisk.ctl
  
  # Pas de discover sur les VM, peut perturber le bon binding asterisk sur udp 5060
  hardwareM=`dmidecode -s system-manufacturer`
  if [ "$hardwareM" != "QEMU" ]; then
  	sleep 20
    if [ -n "$discoverCommand" ]; then
  	  ${discoverCommand} 2>&1 1>/dev/null &
    else
      /sbin/callbox_discover_sip_subscribe.py 1>/dev/null 2>&1 &
    fi
  
  fi
  
  echo
}

# Stop asterisk:
asterisk_stop() {
  echo -n "Stopping asterisk..."
  killall callbox_manager_collecter.pl
  killall callbox_manager_collecter-slow.pl
  killall -9 asterisk
  /etc/init.d/dahdi stop
  echo
}

# Restart asterisk:
asterisk_restart() {
  asterisk_stop
  sleep 4
  asterisk_start
}

# Restart asterisk dans un temps minimal:
asterisk_restart_quick() {
  echo -n "Stopping asterisk..."
  killall callbox_manager_collecter.pl
  killall callbox_manager_collecter-slow.pl
  killall -9 asterisk
  echo
  sleep 1
  echo -n "Starting asterisk"
  /usr/sbin/asterisk
  sleep 3
  /sbin/callbox_manager_collecter.pl 2>/dev/null 1>/dev/null &
  /sbin/callbox_manager_collecter-slow.pl 2>/dev/null 1>/dev/null &
  chmod 777 /var/run/asterisk/asterisk.ctl
  echo
}

# Reload asterisk dans un temps minimal:
asterisk_reload() {
  echo -n "Reloading asterisk..."
  killall callbox_manager_collecter.pl
  killall callbox_manager_collecter-slow.pl
  /usr/sbin/asterisk -rx reload
  echo
  sleep 3
  /sbin/callbox_manager_collecter.pl 2>/dev/null 1>/dev/null &
  /sbin/callbox_manager_collecter-slow.pl 2>/dev/null 1>/dev/null &
  chmod 777 /var/run/asterisk/asterisk.ctl
  echo
}

# WatchDog asterisk lance par callbox_manager_collecter-slow:
asterisk_watchdog() {
  killall callbox_manager_collecter.pl
  killall callbox_manager_collecter-slow.pl
  /usr/bin/timeout -k 2s 5s /usr/sbin/asterisk -rx 'core show version' 1> /dev/null  2> /dev/null
  errcode=$?
  if [[ "$errcode" != "0" ]] ;then
    echo "<185>"`date '+%b %d %T'`" callbox-client callbox[`cat /etc/cbid`]: Watchdog reboot auto asterisk" > /dev/tcp/log1.thinkrosystem.com/4514 &
    echo "<185>"`date '+%b %d %T'`" callbox-client callbox[`cat /etc/cbid`]: Watchdog reboot auto asterisk" > /dev/tcp/log2.thinkrosystem.com/4514 &
    asterisk_restart
  fi
  sleep 3
  /sbin/callbox_manager_collecter.pl 2>/dev/null 1>/dev/null &
  /sbin/callbox_manager_collecter-slow.pl 2>/dev/null 1>/dev/null &
  chmod 777 /var/run/asterisk/asterisk.ctl
}

case "$1" in
'start')
  asterisk_start
  ;;
'stop')
  asterisk_stop
  ;;
'restart')
  asterisk_restart
  ;;
'restart_quick')
  asterisk_restart_quick
  ;;
'watchdog')
  asterisk_watchdog
  ;;
'reload')
  asterisk_reload
  ;;
*)
  echo "usage $0 start|stop|restart|restart_quick"
esac
