#!/bin/bash
#
# /etc/init.d/thnuclnt
#
# Generic ThinPrint Client Unix InitD Script
# (c) 2007-2016 Cortado AG
#
initd_VER='$7.0.$Revision: 30$'
#
# LSB compatible service control script; see http://www.linuxbase.org/spec/
# 
# chkconfig: 2345 99 00
# description: ThinPrint client
# 
### BEGIN INIT INFO
# Provides:          thnuclnt
# Required-Start:    $syslog $local_fs $remote_fs $network $named
# Should-Start:      $time ypbind sendmail
# Required-Stop:     $syslog $local_fs $remote_fs $network $named
# Should-Stop:       $time ypbind sendmail
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: ThinPrint client
# Description:       ThinPrint client
### END INIT INFO
# 
# Any extensions to the keywords given above should be preceeded by 
# X-VendorTag- according to LSB.
# 
# Notes on Required-Start/Should-Start:
# * There are two different issues that are solved by Required-Start
#    and Should-Start
# (a) Hard dependencies: This is used by the runlevel editor to determine
#     which services absolutely need to be started to make the start of
#     this service make sense. Example: nfsserver should have
#     Required-Start: $portmap
#     Also, required services are started before the dependent ones.
#     The runlevel editor will warn about such missing hard dependencies
#     and suggest enabling. During system startup, you may expect an error,
#     if the dependency is not fulfilled.
# (b) Specifying the init script ordering, not real (hard) dependencies.
#     This is needed by insserv to determine which service should be
#     started first (and at a later stage what services can be started
#     in parallel). The tag Should-Start: is used for this.
#     It tells, that if a service is available, it should be started
#     before. If not, never mind.
# * When specifying hard dependencies or ordering requirements, you can 
#   use names of services (contents of their Provides: section)
#   or pseudo names starting with a $. The following ones are available
#   according to LSB (1.1):
#	$local_fs		all local file systems are mounted
#				(most services should need this!)
#	$remote_fs		all remote file systems are mounted
#				(note that /usr may be remote, so
#				 many services should Require this!)
#	$syslog			system logging facility up
#	$network		low level networking (eth card, ...)
#	$named			hostname resolution available
#	$netdaemons		all network daemons are running
#   The $netdaemons pseudo service has been removed in LSB 1.2.
#   For now, we still offer it for backward compatibility.
#   These are new (LSB 1.2):
#	$time			the system time has been set correctly	
#	$portmap		SunRPC portmapping service available
#   UnitedLinux/SUSE/Novell extensions:
#	$ALL			indicates that a script should be inserted
#				at the end
# * The services specified in the stop tags 
#   (Required-Stop/Should-Stop)
#   specify which services need to be still running when this service
#   is shut down. Often the entries there are just copies or a subset 
#   from the respective start tag.
# * Should-Start/Stop are now part of LSB as of 2.0,
#   formerly SUSE/Unitedlinux used X-UnitedLinux-Should-Start/-Stop.
#   insserv does support both variants.
# * X-UnitedLinux-Default-Enabled: yes/no is used at installation time
#   (%fillup_and_insserv macro in %post of many RPMs) to specify whether
#   a startup script should default to be enabled after installation.
#
# Note on runlevels:
# 0 - halt/poweroff 			6 - reboot
# 1 - single user			2 - multiuser without network exported
# 3 - multiuser w/ network (text mode)  5 - multiuser w/ network and X11 (xdm)
# 
# Note on script names:
# http://www.linuxbase.org/spec/refspecs/LSB_1.3.0/gLSB/gLSB/scrptnames.html
# A registry has been set up to manage the init script namespace.
# http://www.lanana.org/
# Please use the names already registered or register one or use a
# vendor prefix.


IFS="${IFS= 	}"; _ifs="$IFS"; IFS="${IFS}:"
read mv rv <<EOF
  $(IFS=$; echo $initd_VER)
EOF
read vmaj vmin <<EOF
  $(IFS=.; echo $mv)
EOF
read z vrev <<EOF
  $(IFS=" "; echo $rv)
EOF
IFS="$_ifs"

# thnuclnt compatibility level
THNUCLNT_COMPLVL=3

if [ "$1" = "-v" ]; then
    echo "ThinPrint Client Linux InitD Version $vmaj.$vmin.$vrev, (c) 2007-2016 Cortado AG"
    exit 0
fi
if [ "$1" = "-V" ]; then
    echo "CLVL $THNUCLNT_COMPLVL"
    exit 0
fi

# module consistency check.
# new technique performs check against thnuclnt compatibility level!
module=init.d/thnuclnt-$vmaj.$vmin.$vrev
# modchk=$module
modchk=$THNUCLNT_COMPLVL
if ! /etc/thnuclnt/.thnumod -c $modchk; then
    echo "module $module distribution check failed"
    exit 1
fi

# Check for missing binaries (stale symlinks should not happen)
# Note: Special treatment of stop for LSB conformance
thnuclnt_BIN=/usr/sbin/thnuclntd
test -x $thnuclnt_BIN || { echo "$thnuclnt_BIN not installed"; 
	if [ "$1" = "stop" ]; then exit 0;
	else exit 5; fi; }

# pidfile
thnuclnt_PID=/var/run/thnuclntd.pid

# set required environment for running thnuclnt as global service
export THNUCLNT_SVC=global:daemon


# Return values acc. to LSB for all commands but status:
# 0	  - success
# 1       - generic or unspecified error
# 2       - invalid or excess argument(s)
# 3       - unimplemented feature (e.g. "reload")
# 4       - user had insufficient privileges
# 5       - program is not installed
# 6       - program is not configured
# 7       - program is not running
# 8--199  - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
# 
# Note that starting an already running service, stopping
# or restarting a not-running service as well as the restart
# with force-reload (in case signaling is not supported) are
# considered a success.

case "$1" in
    start)
        echo -n "Starting thnuclnt ... "
        if $thnuclnt_BIN; then
            echo "ok"
            exit 0
        else
            echo "failed"
            exit 1
        fi
        ;;
    stop)
        echo -n "Shutting down thnuclnt ... "
        pid=`cat $thnuclnt_PID 2>/dev/null`
        if [ ! "$pid" = "" ]; then
            kill $pid
            n=1
            while [ "`cat $thnuclnt_PID 2>/dev/null`" = "$pid" ]; do
                n=$(expr $n + 1)
                if [ $n -gt 15 ]; then
                    echo "failed"
                    exit 1
                fi
                sleep 1
            done
        fi
        echo "ok"
        exit 0
        ;;
    try-restart|condrestart)
        ## Do a restart only if the service was active before.
        ## Note: try-restart is now part of LSB (as of 1.9).
        ## RH has a similar command named condrestart.
        $0 status
        if test $? = 0; then
            $0 restart
            exit $?
        else
            exit 0
        fi
        ;;
    restart)
        ## Stop the service and regardless of whether it was
        ## running or not, start it again.
        $0 stop
        $0 start
        exit $?
        ;;
    force-reload|reload)
	## Signal the daemon to reload its config. Most daemons
	## do this on signal 1 (SIGHUP).
	## If it does not support it, restart the service on
	## force-reload (if it is running) and do nothing on
	## reload.
	echo -n "Reload service thnuclnt "
        pid=`cat $thnuclnt_PID 2>/dev/null`
        if [ ! "$pid" = "" ]; then
            kill -HUP $pid
	fi
        exit 0
	;;
    status)
        echo -n "Checking for service thnuclnt ... "
        ## Check status with checkproc(8), if process is running
        ## checkproc will return with exit status 0.

        # Return value is slightly different for the status command:
        # 0 - service up and running
        # 1 - service dead, but /var/run/  pid  file exists
        # 2 - service dead, but /var/lock/ lock file exists
        # 3 - service not running (unused)
        # 4 - service status unknown :-(
        # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
        
        if test -f $thnuclnt_PID; then
            echo "running"
            exit 0
         else
            echo "unused"
            exit 3
        fi
        ;;
#   probe)
#	## Optional: Probe for the necessity of a reload, print out the
#	## argument to this init script which is required for a reload.
#	## Note: probe is not (yet) part of LSB (as of 1.9)
#
#	test /etc/thnuclnt/thnuclnt.conf -nt /var/run/thnuclnt.pid && echo reload
#	;;
    *)
#       echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
        echo "Usage: $0 {start|stop|status|try-restart|restart}"
        exit 1
        ;;
esac
