#!/bin/bash
# 
# codemeter - Init script starting the CodeMeter Server
#
# Copyright  2002-2011 by WIBU-SYSTEMS AG
#            Rueppurrer Strasse 52-54, D-76137 Karlsruhe, Germany/Europe
#            Web: http://www.wibu.com, Email: support@wibu.com
#            Phone: +49 (721) 93172 0, Fax: +49 (721) 93172 22
#
# Version .. 4.30.500 of 2011 Feb 01
# Author ... Heiko Abraham (ha)
# System ... Debian GNU/Linux, Novell Linux, RedHat, Fedora, Ubuntu
#
#
# description:   enables automatic startup of CodeMeter RunTime Server
# 
# processname:   CodeMeterLin
# config:        /etc/wibu/CodeMeter/Server.ini
#
### BEGIN INIT INFO
# Provides:       codemeter
# Required-Start: $network
# Required-Stop:
# Default-Start: 2 3 4 5 
# Default-Stop: 1
# Description:   enables automatic startup of CodeMeter Server
### END INIT INFO


# CodeMeterLin executable
DAEMON=/usr/share/CodeMeter/CodeMeterLin
DMODE=`cat /etc/wibu/CodeMeter/Server.ini   |  grep '^StartDaemon' | sed 's/StartDaemon=//'`

# user account for running CodeMeterLin
USER=daemon

# daemon bin-name and daemon call-name
NAME=CodeMeter
prog=CodeMeter

# daemon description
DESC="CodeMeter Server"

PIDFILE="/var/run/$NAME.pid"

# SuSE-Like output
esc=`echo -en "\033"`
done="${esc}[1;32m"
norm=`echo -en "${esc}[m\017"`
stat=`echo -en "\015${esc}[${COLUMNS}C${esc}[10D"`
warn="${esc}[1;31m"

# RedHat-Like output
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \\033[0;39m"

MYPID=/bin/unknown_file


if [ -f /etc/redhat-release ] ; then
  # RedHat Linux (8/9)
  LINUXDIST="RedHat"
fi
if [ -f /etc/mandrake-release ] ; then
  # Mandrake Linux (9/10)
  LINUXDIST="Mandrake"
fi
if [ -f /etc/fedora-release ] ; then
  # Fedora Linux (Core1/Core2)
  LINUXDIST="Fedora"
fi
if [ -f /etc/SuSE-release ] ; then
  # SuSE Linux (9.x)
  LINUXDIST="SuSE"
  if [ -f /etc/lsb-release ] ; then
    # SuSE Linux (10.x)
    LINUXDIST="SuSE10"
  fi
fi
if [ -f /etc/debian_version ] ; then
  # Debian 3.1 (Sarge)
  LINUXDIST="Debian"
fi

if [ -f /sbin/pidof ] ; then 
  MYPID=/sbin/pidof
elif [ -f /bin/pidof ] ; then 
  MYPID=/bin/pidof
fi

##############################################
# Check LogPath
##############################################
checklogpath () {
  if [ -f /etc/wibu/CodeMeter/Server.ini ] ; then
    LOGPATH=`cat /etc/wibu/CodeMeter/Server.ini | grep '^LogPath=' | sed 's/^LogPath=//'`
    if [ ! -z "${LOGPATH}" ] ; then 
      if [ -d "${LOGPATH}" ] ; then 
        touch "${LOGPATH}/CodeMeter.log"  >/dev/null 2>&1
      fi 
    fi 
  fi
}

##############################################
# Print 'Ok' Message 
##############################################
printok () {
if [ -f /etc/SuSE-release ] ; then
	# we run on a SuSE OS
	echo "${done}done${norm}"
else
	if [ -f /etc/redhat-release ] ; then
		# we run on a RedHat OS
		$MOVE_TO_COL
		echo -n "[  "
		$SETCOLOR_SUCCESS
		echo -n $"OK"
		$SETCOLOR_NORMAL
		echo -n "  ]"
		echo -ne "\r"
	else  
		$MOVE_TO_COL
		echo "done"
	fi
fi
}


##############################################
# Print 'Failed' Message 
##############################################
printfailed ()  {
if [ -f /etc/SuSE-release ] ; then
	# we run on a SuSE OS
	echo "${warn}failed${norm}"
else
	if [ -f /etc/redhat-release ]; then
		# we run on a RedHat OS
		$MOVE_TO_COL
		echo -n "[  "
		$SETCOLOR_FAILURE
		echo -n $"FAILED"
		$SETCOLOR_NORMAL
		echo -n "  ]"
		echo -ne "\r"
	else
		echo "failed"
	fi
fi
}


##############################################
# Check if $pid are running
##############################################
checkpid() {
	local i

	for i in $* ; do
		[ -d "/proc/$i" ] || return 1
	done
	return 0
}


##############################################
# A function to start a program.
##############################################
daemon() {
        # See if it's already running. Look *only* at the pid file.
	if [ -f ${PIDFILE} ]; then
		local line p
		read line < ${PIDFILE}
		for p in $line ; do
			[ -z "${p//[0-9]/}" -a -d "/proc/$p" ] && pid="$pid $p"
		done
	fi

	# check if already running...
	if [ -f ${MYPID} ] ; then 
	  pid2=`${MYPID} ${DAEMON}`
	else 
 	  pid2=`ps -A | grep "${DAEMON}"`
	fi
        if [ -n "${pid2}" ]; then
		echo -n " (is running) "
                return 1
        fi

	[ -n "${pid:-}" -a -z "${force:-}" ] && return

        checklogpath

	# make sure it doesn't core dump anywhere; while this could mask
	# problems with the daemon, it also closes some security problems
	ulimit -S -c 0 >/dev/null 2>&1
	
	# And start it up.
	if [ -z "$USER" ]; then
           /usr/share/CodeMeter/CodeMeterLin > /dev/null  &
	else
	   su --shell /bin/bash -c '/usr/bin/CodeMeterLin & ' - $USER
	fi
	RETVAL=$?
	return $RETVAL
}


##############################################
# A function to stop a proc
##############################################
killproc() {
        # Find pid.
	if [ -f ${MYPID} ] ; then 
	  pid=`${MYPID} ${DAEMON}`
	else 
 	  pid=`ps -A | grep "${DAEMON}" | sed 's/^ //' | sed 's/ .*$//'`
	fi
	RETVAL=0
	if [ ! -z "${pid}" ] ; then
		kill -INT $pid 2&>/dev/null
		sleep 3
		# if not dead,
		if checkpid $pid && sleep 1 &&
			checkpid $pid && sleep 3 &&
			checkpid $pid ; then
			sleep 4
			kill -KILL $pid 2&>/dev/null
			logger "stop CodeMeter (by kill PID ${P}"
		fi
		checkpid $pid
		RETVAL=$?
		RETVAL=$((! $RETVAL))
	fi
        	
	# Remove pid file if any.
	if [ $RETVAL = 0 ]; then
		if [ -f ${PIDFILE} ] ; then
	            rm -f ${PIDFILE}
		fi
	fi
	return $RETVAL
}


##############################################
# Start the daemon, create lock-file and pid-file
##############################################
startdaemon () {
	# start CodeMeter daemon
	if [ "${DMODE}x" == "1x" ] ; then
		echo -n "Starting ${DESC}: "
		daemon $DAEMON
		RETVAL=$?
		sleep 2
		if [ $RETVAL = 0 ]; then
			if [ -f ${MYPID} ] ; then 
			  pid2=`${MYPID} ${DAEMON}`
			else 
		 	  pid2=`ps -A | grep "${DAEMON}" `
			fi
        		if [ -z "${pid2}" ]; then
				rm -f /var/lock/${NAME}
				RETVAL=1
			else
				RETVAL=0
        		fi
		fi

		if [ $RETVAL = 0 ]; then
			printok
			touch /var/lock/${NAME} >/dev/null 2>&1
		else
			printfailed
		fi
		echo
		return $RETVAL
	else
		echo -n "${DESC} daemon mode disabled:"
		printok
		echo
		return 0
	fi
}


##############################################
# stop the daemon-proc
##############################################
stopdaemon () {
	# stop daemon
	echo -n "Stopping ${DESC}: "
	if [ -f ${MYPID} ] ; then 
	  pid2=`${MYPID} ${DAEMON}`
	else 
 	  pid2=`ps -A | grep "${DAEMON}" `
	fi
        if [ -z "${pid2}" ]; then
		echo -n " (not running) "
		RETVAL=0
	else
		killproc $DAEMON
		RETVAL=$?
        fi

	if [ $RETVAL = 0 ]; then
		printok
		rm -f /var/lock/${NAME}
	else
		printfailed
	fi
	echo

	return $RETVAL
}


##############################################
# restart the daemon 
##############################################
restart () {
	# restart daemon
	$0 stop
    sleep 15
	$0 start
}


##############################################
# result daemon status information
##############################################
getstatus () {
        local pid

        # Check for PID
	if [ -f ${MYPID} ] ; then 
	  pid=`${MYPID} ${DAEMON}`
	else 
 	  pid=`ps -A | grep "${DAEMON}"`
	fi
        if [ -n "${pid}" ]; then
                echo "${prog} (pid ${pid}) is running..."
                return 0
        fi

        # Check for existing PID-File ("/var/run/*.pid")
        if [ -f "${PIDFILE}" ] ; then
                read pid < ${PIDFILE}
                if [ -n "$pid" ]; then
                        echo $"${prog} dead but pid file exists"
			rm -f ${PIDFILE}
                        return 1
                fi
        fi
        # Check for Lock-File ("/var/lock/${NAME}")
        if [ -f /var/lock/${NAME} ]; then
                echo $"${prog} dead but locked"
		rm -f /var/lock/${NAME}
                return 2
        fi
        echo "${prog} is stopped"
        return 3
}










case "$1" in
  start)
	startdaemon
	exit 0
	  ;;
  stop)
	stopdaemon
	exit 0
	  ;;
  restart)
	$0 stop
	sleep 15
	$0 start
	exit 0
	  ;;
  status)
	getstatus $DAEMON
	exit 0
	  ;;
  *)
	  N=/etc/init.d/codemeter
	  echo "Usage: $N {start|stop|status|restart}"
	  exit 1
	;;
esac

exit 0
