#!/bin/sh

NAME=freeswitch
COMMAND=/etc/init.d/$NAME

LOGGER="/usr/bin/logger -t $NAME-hotplug"
LOG_ERR="$LOGGER -p user.err --"
LOG_NOTICE="$LOGGER -p user.notice --"

[ "$ACTION" = ifup ] || exit 0

. /lib/functions.sh
config_load $NAME

config_get interface hotplug interface

[ "$INTERFACE" = "$interface" ] || exit 0

pidof $NAME &> /dev/null
if [ $? -eq 0 ]; then
  $LOG_NOTICE stopping $NAME
  $COMMAND stop &> /dev/null
fi

config_get timeout hotplug timeout 60

[ "$timeout" -gt 0 ] 2> /dev/null || unset timeout
timeout="${timeout:-60}"

config_get mount_point hotplug mount_point

# Mount condition, idea lifted from OpenWrt Wiki
[ -n "$mount_point" ] && {

  if ! [ -d "$mount_point" ]; then
    $LOG_ERR "$mount_point" not a valid mount point
    exit 1
  fi

  mnt="$mount_point"
  notReady=start
  tmp_timeout=$timeout

  while [ -n "$notReady" -a $tmp_timeout -gt 0 ]; do
    if [ "$notReady" != start ]; then
      $LOG_NOTICE "$mnt" not yet mounted, timeout in $tmp_timeout s
      sleep 5
      tmp_timeout=$(($tmp_timeout-5))
    fi

    notReady=

    result=$(cat /proc/mounts | awk '{print $2}' | grep "^$mnt\$")
    if [ -z "$result" ]; then
      notReady="$mnt not ready yet"
    fi
  done

  if [ -n "$notReady" ]; then
    $LOG_ERR "$mnt" still not mounted
    $LOG_ERR not starting $NAME
    exit 1
  else
    $LOG_NOTICE "$mnt" mounted
  fi

}

config_get_bool ntpd hotplug ntpd 0

# ntpd condition
[ $ntpd -eq 1 ] && {

  type ntpq &> /dev/null
  [ $? -eq 0 ] || {
    $LOG_ERR ntpq utility not found
    exit 1
  }

  pidof ntpd &> /dev/null || {
    $LOG_ERR ntpd not running
    exit 1
  }

  notReady=start
  tmp_timeout=$timeout

  while [ -n "$notReady" -a $tmp_timeout -gt 0 ]; do
    if [ "$notReady" != start ]; then
      $LOG_NOTICE system time not in sync yet, timeout in $tmp_timeout s
      sleep 5
      tmp_timeout=$(($tmp_timeout-5))
    fi

    notReady=

    result=$(ntpq -c 'timeout 300' -c 'rv 0 stratum' 2> /dev/null | \
                    awk -F '=' '{print $2}' | grep -o -E '^[0-9]+')
    if [ -z $result ]; then
      $LOG_ERR failed to extract stratum from ntpd
      notReady="unable to extract stratum"
    else
      $LOG_NOTICE ntpd stratum $result
      if [ $result -lt 16 ] 2> /dev/null; then
        result=$(ntpq -c 'timeout 300' -c 'rv 0 offset' 2> /dev/null \
                 | awk -F '=' '{print $2}' | grep -o -E '^[-+]?[0-9]+')
        if [ -z $result ]; then
          $LOG_ERR failed to extract offset from ntpd
          notReady="unable to extract offset"
        else
          # "-0" looks stupid, so remove "-"
          result=$(echo $result | grep -o '[0-9]*')
          $LOG_NOTICE ntpd to system time offset \+\/\- $result ms
          # If offset < 100 ms consider system time in sync
          [ $result -lt 100 ] || notReady="system time not in sync yet"
        fi
      else
        notReady="ntpd not in sync yet"
      fi
    fi
  done

  if [ -n "$notReady" ]; then
    $LOG_ERR system time still not in sync
    $LOG_ERR not starting $NAME
    exit 1
  else
    $LOG_NOTICE system time in sync
  fi

}

$COMMAND start &> /dev/null
sleep 1
pidof $NAME &>/dev/null
if [ $? -eq 0 ]; then
  $LOG_NOTICE started $NAME due to \"ifup "$INTERFACE"\" event
else
  $LOG_ERR start of $NAME due to \"ifup "$INTERFACE"\" event failed
  exit 1
fi
