#! /bin/bash
#
# $Id: rccss 78986 2013-09-19 16:11:31Z ahu $
#
# Provides a shortcut for complete CenShare Server startup and shutdown
#
copyright="(c) 2007..2017, censhare AG, Munich"
 suppmail="it-services@censhare.com"
  version="2.0.7"
# 2017-Apr-25 pmo       fixed service order default not working
# 2017-Jan-12 pmo       added postgresql support
# 2016-Dez-15 pmo	changed service order from custom to default
# 2016-Apr-22 pmo	ec=1 when writing config file successfully fixed
# 2016-Mar-30 pmo	added mount script
# 2016-Feb-29 pmo	fixed start/stop/status if servicename is given
# 2014-Dez-15 pmo	added sattelite
# 2014-Sep-16 pmo	added help page
# 2014-Sep-04 pmo   simplified installation procedure
# 2014-Sep-03 pmo   added support for systemd and centos7/redhat7
# 2013-Dez-17 pmo	changed /etc/redhat-release to /etc/system-release
# 2013-Dez-16 pmo	added check, redesigned runlevel handling
# 2013-Dez-06 pmo	exit if any script fails at start/stop
# 2013-Jul-23 pmo	now can run also as non root user
# 2013-Jan-23 dk	$Insert office
# 2012-Nov-12 pmo	$Insert css_serviceclient
# 2010-Oct-26 pmo	added '$Insert css_jetty'
# 2007-Oct-08 aka       old s2s relicts removed
# 2007-Sep-24 aka       Moved to use with s2s-2 and censhare
# 2007-Apr-04 pe	Added support for Mac OS X
# 2006-Dez-21 pe        improved root-check: whoami -> $UID
# 2006-Dez-15 pe        added root-check
# 2006-Dez-07 pe	optical changes in comments: spaces to tab 
# 2005-Dec-16 pe	improved $CORPUS_HOME; added $CORGRP
# 2005-Nov-18 aka	some rework, english comments
# 2005-Okt-18 vero/aka	s2s integriert 
# 2005-Sep-02 aka	-f|force als zweiten Param => 'Autostart' wird nicht geprueft
# 2005-Sep-01 aka	virtIP-* hinzu gefuegt
# 2005-Mar-07 aka	Solaris hinzu gefuegt
# 2004-Dez-16 aka	Voreinstellung: Status-Ausgabe
# 2004-Okt-08 aka	Ab sofort: Sun kompatibel
# 2004-Jul-21 aka	uses yasts configuration for including services
# 2004-May-21 aka	change to CenShare Server 2.0
# 2004-Feb-25 aka	restart added
# 2003-Apr-30 aka	initially
#
# pseudo comments for Novell/SuSE Linux
### BEGIN INIT INFO
# Provides: rccss
# Required-Start: $network sshd
# Required-Stop: $network
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Description: Start the Webclient Server for CenShare.
### END INIT INFO

# pseudo comments for RedHat / CentOS / Fedora Linux
### BEGIN
# chkconfig: 345 84 13
### END

test -z "$BASH" && exec /bin/bash $0 "$@"		# needed by Solaris: force bash

progname=$(basename $0)
progname=${progname#[KS][0-9][0-9]}
 progdir="${0%/*}"

Error ()   { echo -e >&2 "$progname: $*"; exit 1; }
Warning () { echo -e >&2 "$progname: $*"; }
Hint ()    { echo -e     "$progname: $*"; }

uplst=""; dnlst=""
for date in /usr/local/bin/date /usr/gnu/bin/date /bin/date /usr/bin/date notfound; do
    if test -x $date; then break; fi
done
if test $date = notfound; then Error "date not found."; fi

# for config file
services_known=" virtIP mount mntnfs ora_lsnr ora_censhare postgresql vmfusion aws censhare css_tomcat css_jetty css_jetty-webclient css_jetty-webservice css_jetty-webstart css_jetty-offlinedb office css_serviceclient css_satellite "
services_enabled=""
conffile=/etc/sysconfig/$progname

# check service input $2
eval test -n \"\${services_known/\* $2 \*/}\" && Error "Service '$2' unknown! Known Services are '$services_known'."

# simple configuration file handling
WriteConfFile ()					# write default configuration
{
    cat <<-EOF >$conffile || Error "configfile '$conffile' can not be created."
	# rccss
	# automatically generated by $progname at $($date +%Y.%m.%d-%H:%M)
	
	# Enabled services
	# default: services_enabled=""
	services_enabled="$services_enabled"
	
EOF
}

ReadConfFile ()						# read configuration
{
	if test -f $conffile; then
		if /bin/bash <$conffile >&/dev/null; then	#     sourcing wo error?
	    	. $conffile					#         then doit
	    	return						# and return
		else
	    	Error "Syntax error in configuration file '$conffile'."
		fi
	else
		WriteConfFile
		Hint "Configuration file \n'$conffile' has been written."
	fi
}

chkconfig_check () {
    service=$1
    if test -f /etc/SuSE-release; then
        chkconfig -c $service 3
    elif test -f /etc/system-release; then
	chkconfig --level 3 $service
    else
	Error "Unknown Linux Distribution. Exiting."
    fi
}

ec=0							# global errorcode
Action () {						# $0 $1=list $2=action
    local lst="$2"
    eval set -- \$$1 >&/dev/null
    ec=0
    while test $# -gt 0; do
	$1 $lst || exit $?				# set ec only if error encountered
	shift
    done
}

ActionStatus () {						# $0 $1=list $2=action
    local lst="$2"
    eval set -- \$$1 >&/dev/null
    ec=0
    while test $# -gt 0; do
	$1 $lst || ec=$?				# set ec only if error encountered
	shift
    done
}

Rebuild_services_enabled () {
    ## rebuild services_enabled list to have the services in the correct order ##
    # get array index numbers of enabled services
    array=($services_known)
    for service in $services_enabled; do
        for value in "${!array[@]}"; do
            if [[ "${array[$value]}" = "${service}" ]]; then
                services_array_list="$services_array_list ${value}"
            fi
        done
    done
    # sort services_array_list ascending
    services_array_list=$(echo $services_array_list | tr " " "\n" | sort -g | tr "\n" " ")
    # generate new services_enabled list
    services_enabled=""
    for service in $services_array_list; do
        services_enabled="$services_enabled ${array[$service]}"
    done
}

ReadConfFile
if test -z "$2"; then
    for service in $services_enabled; do
	uplst="$uplst /usr/sbin/rc$service"
	dnlst="/usr/sbin/rc$service $dnlst"
    done
else
    uplst="$uplst /usr/sbin/rc$2"
    dnlst="/usr/sbin/rc$2 $dnlst"
fi

################### Usage #############################
Usage () {
    cat <<EOF
$progname: Version $version, $copyright

NAME
    $progname - Provides a shortcut for complete censhare services startup and shutdown

SYNOPSIS
    $progname function {args...}

DESCRIPTION
    enable <service>
      enables a service
		
    disable <service>
      disables a service
	    
    list-services
      lists all known services and all enabled services

    status <service>
      checks current availability of a service
		
    start <service>
      starts a service, if no parameter supplied all
      services would be started
		
    stop <service>
      stops a service, if no parameter supplied all
      services would be stopped
		
    restart <service>
      restarts a service, if no parameter supplied all
      services would be restarted
		
    check
      enables and checks $progname to be started at system startup
	
OPTIONS
    -v          Version
    -h          Help

REQUIREMENTS
    You must be root or corpus.

FILES
    $conffile
      The configuration file contains a list of actually enabled services.

SEE ALSO
    bash(1) and others.

AUTHORS
    Patrick Molnar, (censhare AG, Munich)

BUGS
    Needs bash(1), developed with bash-3.1.16(1).
    Send bugreports to $suppmail and add version info.

    Designed for work on Solaris-10, Solaris-11, Linux and Mac OS X.

$copyright
EOF
    exit 0
}

test -z "$1" && { set -- status; echo "$progname: assume '$progname status'..."; }
case "$1" in
	enable)
		shift
		service_list="$@"
	    for service in $service_list; do
	        # test if service name is correct
	        test -z "${services_known/* $service */}" || Error "Service '$1' unknown."
	        # test if service is already enabled
	        if test -n "${services_enabled/* $service */}" -o -z "$services_enabled"; then
	            # enable service
	            services_enabled="$services_enabled $service "
	            Hint "Service '$service' enabled."
	        else
	            Hint "Service '$service' already enabled."
	            continue
	        fi
	    done
	    Rebuild_services_enabled
	    WriteConfFile
	    Hint "Configuration '$conffile' written."
	;;
	disable)
	    shift
	    service_list="$@"
	    for service in $service_list; do
	        # test if service name is correct
	        test -z "${services_known/* $service */}" || Error "Service '$1' unknown."
	        # test if service is already disabled	        
	        test -z "${services_enabled/* $service */}" || {
	            Hint "Service '$service' already disabled."
	            continue
	        }
	        # disable service
	        services_enabled="${services_enabled/ $service /}"
	        Hint "Service '$service' disabled."
	    done
	    WriteConfFile
	    Hint "Configuration '$conffile' written."
	;;
	list-services)
	    Hint "Known services: '$services_known'"
	    Hint "Enabled services: '$services_enabled'"
	;;
    start)
	Action uplst $1
	;;
    status)
	case $(uname) in
	    SunOS)
		test -h /etc/rc3.d/S50$progname || Hint "Not in runlevel. Please run '$progname check' to enable '$progname' in runlevel!"
	 	;;
	    Linux)
		if systemctl > /dev/null 2>&1; then
                    systemctl is-enabled rccss > /dev/null 2>&1 || Hint "Not in systemd. Please run '$progname check' to enable '$progname' on boot."
		else
		    chkconfig_check $progname || Hint "Not in runlevel. Please run '$progname check' to enable '$progname' in runlevel!"
		fi
		;;
	esac
	ActionStatus uplst $1
	;;
    stop)
	Action dnlst $1
	;;
    restart)
	Action dnlst stop
	sync
	sleep 2
	Action uplst start
	;;
    check)
	case $(uname) in
	    SunOS)
	        if test -h /etc/rc3.d/S50$progname; then
	            Hint "Checking for '$progname' in runlevel."
	            for i in 0 1 2 S; do
	                test -h /etc/rc$i.d/K36$progname || {
	                    Hint "'$progdir/$progname' not in '/etc/rc$i.d/K36$progname'. Linking..."
	                    ln -s $progdir/$progname /etc/rc$i.d/K36$progname || Error "Error while linking '$progdir/$progname' to '/etc/rc$i.d/K36$progname'!"
	                }
	            done
	            Hint "done"
	        else
	            Hint "Linking '$progname' into runlevel."
	            ln -s $progdir/$progname /etc/rc3.d/S50$progname || Error "Error while linking '$progdir/$progname' to ‘/etc/rc3.d/S50$progname'!"
	            for i in 0 1 2 S; do
	                ln -s $progdir/$progname /etc/rc$i.d/K36$progname || Error "Error while linking '$progdir/$progname' to '/etc/rc$i.d/K36$progname'."
	            done
	            Hint "done"
		fi
	        Hint "Checking and removing unneeded services from runlevel."
	        for service in $services_enabled; do
	            # disable unneeded services
	            test -h /etc/rc3.d/S??$service && {
	                Hint "Disabling service '$service' from runlevel '3'."
	                rm /etc/rc3.d/S??$service
	            }
	            for i in 0 1 2 S; do
	                test -h /etc/rc$i.d/K??$service && {
	                    Hint "Disabling service '$service' from runlevel '$i'."
	                    rm /etc/rc$i.d/K??$service
			}
	            done
	        done
	        ;;  
	    Linux)
		if systemctl > /dev/null 2>&1; then
		    if systemctl is-enabled rccss > /dev/null 2>&1; then
			Hint "Already enabled in systemd."
		    else
			echo -e "[Unit]\nDescription=rccss\nAfter=local-fs.target network.target\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nExecStart=/usr/sbin/rccss start\nExecStop=/usr/sbin/rccss stop\n\n[Install]\nWantedBy=multi-user.target" > /etc/systemd/system/rccss.service
			systemctl enable rccss.service
			Hint "Enable rccss in systemd."
		    fi
		else
	            if test -h /etc/init.d/$progname; then
		        Hint "Checking for '$progname' in runlevel."
		        if chkconfig_check $progname; then
		            Hint "'$progname' already in runlevel."
		        else
		            Hint "'chkconfig $progname on'."
		            chkconfig $progname on
		        fi
		    else
		        Hint "Linking '$progdir/$progname' to ‘/etc/init.d/$progname'."
		        ln -s $progdir/$progname /etc/init.d/$progname || Error "While linking '$progdir/$progname' to ‘/etc/init.d/$progname'!"
		        Hint "done"
		        Hint "'chkconfig $progname on'."
		        chkconfig $progname on || Error "Error while enabling '$progname' in runlevel!"
		        Hint "done"
		    fi
		    Hint "Checking and removing unneeded services from runlevel."
		    for service in $services_enabled; do
		        # disable unneeded services
		        chkconfig_check $service && {
		            Hint "Disabling service '$service'."
		            chkconfig $service off || Error "Error while disabling service '$service'."
		        }
		    done
		fi
		Hint "done"
		;;
	esac
	;;
    check)
	Usage
	;;
    *)
	Usage
	;;
esac
exit $ec

# Local Variables:
# mode:			shell-script
# mode:			font-lock
# comment-column:	56
# fill-column:		78
# End:
