#!/bin/sh

MOD_NAME=gpsd
MOD_BINARY=gpsd
MOD_DEFAULTS=/opt/$MOD_NAME/etc/defaults
MOD_SETTINGS=/opt/$MOD_NAME/etc/settings
[ -L "$MOD_SETTINGS" ] && MOD_SETTINGS=`readlink $MOD_SETTINGS`

[ -f "$MOD_SETTINGS" ] || cp $MOD_DEFAULTS $MOD_SETTINGS
[ -x "/sbin/hash_verify" ] && [ ! -f "$MOD_SETTINGS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash

. $MOD_SETTINGS

add_chain() {
  /sbin/iptables -N $1 || return
  /sbin/iptables -A $1 -p $2 --dport $3 -j ACCEPT
  /sbin/iptables -A in_mod -j $1
  /sbin/iptables -t nat -N $1
  /sbin/iptables -t nat -A $1 -p $2 --dport $3 -j ACCEPT
  /sbin/iptables -t nat -A pre_mod -j $1
}

del_chain() {
  /sbin/iptables -D in_mod -j $1
  /sbin/iptables -F $1
  /sbin/iptables -X $1
  /sbin/iptables -t nat -D pre_mod -j $1
  /sbin/iptables -t nat -F $1
  /sbin/iptables -t nat -X $1
}

case "$1" in
  start|restart)
    [ -x "/sbin/hash_verify" ] && ! hash_verify $MOD_SETTINGS && exit 1
    if [ "$1" = "restart" ]; then
      echo -n "Restarting module $MOD_NAME: "
      killall $MOD_BINARY 2>/dev/null
    else
      echo -n "Starting module $MOD_NAME: "
    fi

    if [ "$MOD_GPSD_ENABLED" != "1" ]; then
      echo "skipped"
      exit 0
    fi

    GNSS_SUPPORT=$(if [ -e /run/sys/hardware/gnss/count ]; then cat /run/sys/hardware/gnss/count; else echo 0; fi)
    if [ $GNSS_SUPPORT -eq 0 ]; then
      logger -t "gpsd" "GNSS is not supported." -p error
      echo "failed"
      exit 1
    fi

    . /etc/settings.gnss
    if [ -z $GNSS_ENABLED ] || [ $GNSS_ENABLED == "0" ]; then
      logger -t "gpsd" "GNSS service is disabled." -p error
      echo "failed"
      exit 1
    fi

    echo "GNSS_RSOCK4_ENABLED=$MOD_GPSD_ENABLED" > /tmp/config
    echo "GNSS_RSOCK4_IPADDR=127.0.0.1" >> /tmp/config
    echo "GNSS_RSOCK4_PROTOCOL=1" >> /tmp/config
    echo "GNSS_RSOCK4_PORT=$MOD_GPSD_PORT_INNER" >> /tmp/config
    echo "GNSS_RSOCK4_PERIOD_MOVE=1" >> /tmp/config
    echo "GNSS_RSOCK4_PERIOD_HALT=1" >> /tmp/config
    HASH_VAL=$(openssl sha512 /tmp/config | awk '{print $2}')
    echo "INTEGRITY=CFG_HASH=$HASH_VAL" >> /tmp/config
    restore /tmp/config
    rm /tmp/config
    /etc/init.d/gnss restart
    RETVAL=$?
    add_chain mod_$MOD_NAME tcp $MOD_GPSD_PORT_LISTEN 2>/dev/null
    /opt/$MOD_NAME/bin/$MOD_BINARY -n -G -S$MOD_GPSD_PORT_LISTEN udp://127.0.0.1:$MOD_GPSD_PORT_INNER
    RETVAL=$(($RETVAL + $?))
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
  ;;

  stop)
    echo -n "Stopping module $MOD_NAME: "
    del_chain mod_$MOD_NAME 2>/dev/null
    killall $MOD_BINARY 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
    exit $RETVAL
  ;;

  status)
    echo -n "Module $MOD_NAME is "
    killall -0 $MOD_BINARY 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "running"; else echo "stopped"; fi
    exit $RETVAL
  ;;

  defaults)
    cp $MOD_DEFAULTS $MOD_SETTINGS 2>/dev/null
    [ -f "$MOD_DEFAULTS.hash" ] && cp $MOD_DEFAULTS.hash $MOD_SETTINGS.hash
    exit 0
  ;;

  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
    exit 1
  ;;

esac
