#!/bin/sh
add_chain() {
  /sbin/iptables -N $1
  /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
}

MOD_NAME=tcp2rtu
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

case "$1" in

  start|restart)
    [ -x "/sbin/hash_verify" ] && ! hash_verify $MOD_SETTINGS && exit 1
    RETVAL=0
    RETVAL2=0
    RETVAL3=0
    if [ "$2" = "1" ]; then
      TOUCHED=1
    elif [ "$2" = "2" ]; then
      TOUCHED2=1
    elif [ "$2" = "3" ]; then
      TOUCHED3=1
    else
      TOUCHED=1
      TOUCHED2=1
      TOUCHED3=1
    fi
    if [ "$1" = "restart" ]; then
      echo -n "Restarting module $MOD_NAME: "
      if [ "$TOUCHED" = 1 ]; then
        killall tcp2rtu1d 2>/dev/null
        del_chain mod_tcp2rtu1 2>/dev/null
      fi
      if [ "$TOUCHED2" = 1 ]; then
        killall tcp2rtu2d 2>/dev/null
        del_chain mod_tcp2rtu2 2>/dev/null
      fi
      if [ "$TOUCHED3" = 1 ]; then
        killall tcp2rtu3d 2>/dev/null
        del_chain mod_tcp2rtu3 2>/dev/null
      fi
    else
      echo -n "Starting module $MOD_NAME: "
    fi
    if [ "$TOUCHED" = 1 ]; then
      if [ "$MOD_TCP2RTU_ENABLED" = 1 ]; then
        add_chain mod_tcp2rtu1 tcp $MOD_TCP2RTU_PORT 2>/dev/null
        /opt/$MOD_NAME/bin/tcp2rtu1d &
        RETVAL=$?
        if [ $RETVAL = 0 ]; then echo "done"; else echo "failed"; fi
      else
        echo "skipped port1"
      fi
    fi
    if [ "$TOUCHED2" = 1 ]; then
      if [ "$MOD_TCP2RTU2_ENABLED" = 1 ]; then
        add_chain mod_tcp2rtu2 tcp $MOD_TCP2RTU2_PORT 2>/dev/null
        /opt/$MOD_NAME/bin/tcp2rtu2d &
        RETVAL2=$?
        if [ $RETVAL2 = 0 ]; then echo "done"; else echo "failed"; fi
      else
        echo "skipped port2"
      fi
    fi
    if [ "$TOUCHED3" = 1 ]; then
      if [ "$MOD_TCP2RTU3_ENABLED" = 1 ]; then
        add_chain mod_tcp2rtu3 tcp $MOD_TCP2RTU3_PORT 2>/dev/null
        /opt/$MOD_NAME/bin/tcp2rtu3d &
        RETVAL3=$?
        if [ $RETVAL3 = 0 ]; then echo "done"; else echo "failed"; fi
      else
        echo "skipped port3"
      fi
    fi
    if [ "$RETVAL" = 0 ] && [ "$RETVAL2" = 0 ] && [ "$RETVAL3" = 0 ]; then
      exit 0
    fi
    exit 1
  ;;

  stop)
    echo -n "Stopping module $MOD_NAME: "
    RETVAL=0
    RETVAL2=0
    if [ "$2" = 1 ]; then
      killall tcp2rtu1d 2>/dev/null
      del_chain mod_tcp2rtu1 2>/dev/null
      RETVAL=$?
    elif [ "$2" = 2 ]; then
      killall tcp2rtu2d 2>/dev/null
      del_chain mod_tcp2rtu2 2>/dev/null
      RETVAL2=$?
    elif [ "$2" = 3 ]; then
      killall tcp2rtu3d 2>/dev/null
      del_chain mod_tcp2rtu3 2>/dev/null
      RETVAL3=$?
    else
      killall tcp2rtu1d 2>/dev/null
      del_chain mod_tcp2rtu1 2>/dev/null
      RETVAL=$?
      killall tcp2rtu2d 2>/dev/null
      del_chain mod_tcp2rtu2 2>/dev/null
      RETVAL2=$?
      killall tcp2rtu3d 2>/dev/null
      del_chain mod_tcp2rtu3 2>/dev/null
      RETVAL3=$?
    fi
    if [ "$RETVAL" = 0 ] && [ "$RETVAL2" = 0 ] && [ "$RETVAL3" = 0 ]; then
      echo "done"
      exit 0
    fi
    echo "failed"
    exit 1
  ;;

  status)
    echo -n "Module $MOD_NAME "
    if [ "$2" = 1 ]; then
      echo -n "port1 is "
      killall -0 tcp2rtu1d 2>/dev/null
      RETVAL=$?
      if [ $RETVAL = 0 ]; then echo "running"; else echo "stopped"; fi
    elif [ "$2" = 2 ]; then
      echo -n "port2 is "
      killall -0 tcp2rtu2d 2>/dev/null
      RETVAL2=$?
      if [ $RETVAL2 = 0 ]; then echo "running"; else echo "stopped"; fi
    elif [ "$2" = 3 ]; then
      echo -n "port3 is "
      killall -0 tcp2rtu3d 2>/dev/null
      RETVAL3=$?
      if [ $RETVAL3 = 0 ]; then echo "running"; else echo "stopped"; fi
    else
      echo -n "port1 is "
      killall -0 tcp2rtu1d 2>/dev/null
      RETVAL=$?
      if [ $RETVAL = 0 ]; then echo "running"; else echo "stopped"; fi
      echo -n "port2 is "
      killall -0 tcp2rtu2d 2>/dev/null
      RETVAL2=$?
      if [ $RETVAL2 = 0 ]; then echo "running"; else echo "stopped"; fi
      echo -n "port3 is "
      killall -0 tcp2rtu3d 2>/dev/null
      RETVAL3=$?
      if [ $RETVAL3 = 0 ]; then echo "running"; else echo "stopped"; fi
    fi
    if [ "$RETVAL" = 0 ] && [ "$RETVAL2" = 0 ] && [ "$RETVAL3" = 0 ]; then
      exit 0
    fi
    exit 1
  ;;

  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
