#! /bin/sh
### BEGIN INIT INFO
# Provides:          tcosxmlrpc-standalone tcos-standalone
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start tcosxmlrpc standalone in installed system
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Author: Mario Izquierdo (mariodebian) <mariodebian@gmail.com>
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/lib/tcos

DESC="TcosXMLRPC standalone"
NAME=tcosxmlrpc-standalone
DAEMON=/usr/lib/tcos/$NAME

DAEMON_ARGS="/var/lib/tcos/standalone/etc/abyss-standalone.conf"
DAEMON_WWW="/var/lib/tcos/standalone/www"

SCRIPTNAME=/etc/init.d/$NAME
DEFAULT_CONF=/etc/default/tcos-standalone
TCOS_STANDALONE_START=0

ETHTOOL=""
[ -x /sbin/ethtool ] && ETHTOOL=/sbin/ethtool
[ -x /usr/sbin/ethtool ] && ETHTOOL=/usr/sbin/ethtool


# Exit if the package is not installed
[ ! -e $DAEMON ] && exit 0

# Read configuration file if it is present
[ -e "$DEFAULT_CONF" ] && . ${DEFAULT_CONF}

# Load the VERBOSE setting and other rcS variables
[ -e /lib/init/vars.sh ] && . /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
        # don't start if start-stop-daemon is not a ELF file (installing in chroot)
        if ! file /sbin/start-stop-daemon |grep -q ELF ; then
          log_begin_msg "Fake start-stop-daemon detected, not starting "
          return 0
        fi

        # start stunnel4
        if [ "$TCOS_XMLRPC_SSL" = "1" ] && [ -x "$(which stunnel4)" ] ; then
           # fix permissions
           chown -R stunnel4:stunnel4 /var/lib/tcos/standalone/lib/stunnel4/
           [ -e /var/lib/tcos/standalone/log/stunnel.log ] && \
               chown stunnel4:stunnel4 /var/lib/tcos/standalone/log/stunnel.log

           # generate SSL cert
	   [ -e /var/lib/tcos/standalone/etc/stunnel/tcos.pem ] && \
               rm -f /var/lib/tcos/standalone/etc/stunnel/tcos.pem

           openssl req -new -x509 -nodes -days 365 \
              -out /var/lib/tcos/standalone/etc/stunnel/tcos.pem \
              -keyout /var/lib/tcos/standalone/etc/stunnel/tcos.pem \
              -subj "/C=/ST=/L=/CN=localhost/emailAddress=root@localhost" 2>/dev/null

           TMP_FILE=$(mktemp /tmp/tcos.ssl.XXXXXXXX)

           chmod 600 /var/lib/tcos/standalone/etc/stunnel/tcos.pem
           dd if=/dev/urandom of=$TMP_FILE count=2 2>/dev/null
           openssl dhparam -rand $TMP_FILE 256 >> /var/lib/tcos/standalone/etc/stunnel/tcos.pem 2>/dev/null
           rm -f $TMP_FILE

           stunnel4 /var/lib/tcos/standalone/etc/stunnel/stunnel.conf > /dev/null 2>&1 &
        fi
        $DAEMON $DAEMON_ARGS >> /var/lib/tcos/standalone/log/tcos-standalone.log 2>&1 || return 2
}

#
# Function that stops the daemon/service
#
do_stop()
{

        # stop stunnel4
	if [ -f /var/lib/tcos/standalone/lib/stunnel4/stunnel4.pid ] ; then
          kill -9 $(cat /var/lib/tcos/standalone/lib/stunnel4/stunnel4.pid) 2>/dev/null
          rm -f /var/lib/tcos/standalone/lib/stunnel4/stunnel4.pid
          [ -e /var/lib/tcos/standalone/etc/stunnel/tcos.pem ] && \
              rm -f /var/lib/tcos/standalone/etc/stunnel/tcos.pem
          # empty log file
          cat /dev/null > /var/lib/tcos/standalone/log/stunnel.log
        fi

        kill $(cat /var/lib/tcos/standalone/log/abyss.pid 2>/dev/null ) 2> /dev/null
        killall tcosxmlrpc-standalone 2>/dev/null
        rm -f /var/lib/tcos/standalone/log/abyss.pid
        # clean www data
        rm -f ${DAEMON_WWW}/*
	return 0
}

#
# Function that enable WakeOnLan in all network devices
#
do_wakeonlan()
{
	if [ -n "${ETHTOOL}" ]; then
		return
	fi

	# get list of network interfaces
	TCOS_NET_DEVS=$(ls /sys/class/net/|grep -v -e lo -e sit0 -e wmaster -e vmnet -e vbox)
	
	# search for network interfaces with link ok status
	for dev in $TCOS_NET_DEVS; do
    	        # have link ???
    		if [ -e /sys/class/net/$dev/carrier ] && \
       	   	   [ "$(cat /sys/class/net/$dev/carrier 2>/dev/null)" = 1 ] && \
		   [ "$(${ETHTOOL} $dev| grep -c 'Wake-on: g')" = "1" ]; then
      			${ETHTOOL} -s $dev wol g > /dev/null 2>&1
    		fi
	done
}

do_checklog_size()
{
    # clean logs when size > 5 MB
    for logfile in /var/lib/tcos/standalone/log/*; do
        [ $(du $logfile| awk '{print $1}') -gt 5000 ] && \
            cat /dev/null > $logfile
    done
}


case "$1" in
  start)
        [ "$TCOS_STANDALONE_START" = "0" ] && exit 0 
	log_daemon_msg "Starting $DESC" "$NAME"
	do_start
	case "$?" in
		0|1) log_end_msg 0 ;;
		2)  log_end_msg 1 ;;
	esac
	;;
  stop)
	log_daemon_msg "Stopping $DESC" "$NAME"
	# enable WAKEONLAN in ethernet devices (only needed during poweroff/reboot)
	do_wakeonlan
	do_stop
	do_checklog_size
	case "$?" in
		0|1) log_end_msg 0 ;;
		2)  log_end_msg 1 ;;
	esac
	;;
  restart|force-reload)
	#
	# If the "reload" option is implemented then remove the
	# 'force-reload' alias
	#
        [ "$TCOS_STANDALONE_START" = "0" ] && exit 0 
	log_daemon_msg "Restarting $DESC" "$NAME"
	do_stop
	case "$?" in
	  0|1)
		do_start
		case "$?" in
			0) log_end_msg 0 ;;
			1) log_end_msg 1 ;; # Old process is still running
			*) log_end_msg 1 ;; # Failed to start
		esac
		;;
	  *)
	  	# Failed to stop
		log_end_msg 1
		;;
	esac
	;;
   status)
       if [ "$(pidof tcosxmlrpc-standalone | sed '/^$/d')" = "$(cat /var/lib/tcos/standalone/log/abyss.pid 2>/dev/null)" ] && \
	  [ "$(pidof tcosxmlrpc-standalone | sed '/^$/d')" != "" ] ; then
           echo "tcosxmlrpc running"
       else
           echo "tcosxmlrpc stopped"
       fi
       ;;
  *)
	echo "Usage: $SCRIPTNAME {start|stop|restart|status}" >&2
	exit 3
	;;
esac

exit 0
