#!/bin/bash

#
#  Copyright Red Hat Inc., 2002
#  Copyright Mission Critical Linux, 2000
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by the
#  Free Software Foundation; either version 2, or (at your option) any
#  later version.
#
#  This program is distributed in the hope that it will be useful, but
#  WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#  General Public License for more details.
#
#  You should have received a copy of the GNU General Public License
#  along with this program; see the file COPYING.  If not, write to the
#  Free Software Foundation, Inc.,  675 Mass Ave, Cambridge, 
#  MA 02139, USA.
#

# $Revision: 1.13 $
#
# Author: Gregory P. Myrdal <Myrdal@MissionCriticalLinux.Com>

#
# Service resource action script to be used as a template.
#

#---------------------------------------------------------------------------
# Global variables
#---------------------------------------------------------------------------

export PATH=/sbin:/bin:/usr/sbin:/usr/bin

#
# Since we may parse output of commands, make sure we get what we think
# we should get.
#
unset LANG
unset LC_CTYPE
unset LC_ALL

MYNAME=$(basename $0)
SH_LIB=$(dirname $0)

LIBRARIES="\
	$SH_LIB/svclib_globals \
	$SH_LIB/svclib_log \
	$SH_LIB/svclib_svcdb \
	$SH_LIB/svclib_user \
	$SH_LIB/svclib_nfs \
	$SH_LIB/svclib_nfslock \
	$SH_LIB/svclib_samba \
	$SH_LIB/svclib_device \
	$SH_LIB/svclib_filesystem \
	$SH_LIB/svclib_ip \
	$SH_LIB/svclib_ip_netlink \
"

for library in $LIBRARIES
do
	if [ -f $library ]; then
	  . $library
	else
	  logAndPrint $LOG_ERR "$MYNAME Error: Cannot find $library" | \
	                        tee > /dev/console
	  return $FAIL
	fi
done

#---------------------------------------------------------------------------
# Functions
#---------------------------------------------------------------------------
printUsage() {
	logAndPrint $LOG_ERR "Usage: $MYNAME [start, stop, status] serviceID"
}

#---------------------------------------------------------------------------
# Main
#---------------------------------------------------------------------------

if [ $# -ne 2 ]; then
	printUsage
	exit 1
fi

typeset SVC_ACTION=$1
typeset SVC_ID=$2
typeset SVC_NAME

SVC_NAME=$(getSvcName $DB $SVC_ID)
case $? in
	0)  : ;;	# found it
	*)  logAndPrint $LOG_ERR "\
Cannot get service name for service entry $SVC_ID, err=$?"
	    exit 1 ;;
esac

typeset -i ret_val=0
typeset logfile_str="/tmp/${SVC_NAME}_${SVC_ACTION}.XXXXXX"
typeset logfile
logfile=$(mktemp "$logfile_str"); ret_val=$?

if [ -z "$logfile" ]; then
	logAndPrint $LOG_ERR \
"Cannot create temporary file name with 'mktemp \"$logfile_str\"', err=$ret_val"
	  return $FAIL
fi

typeset nfs_lock_workaround=$(getSvcMgrNFSLock $DB)

case "$SVC_ACTION" in
'start')

	logAndPrint $LOG_NOTICE "Starting service $SVC_NAME ..."

	(device start $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot start devices for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(filesystem start $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot start filesystems for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(nfs start $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot start NFS for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	declare netlink=$(cludb -g clusvcmgrd%use_netlink)
	declare -i ip_ret
	if [ "$netlink" = "yes" ]; then
	  (ip_netlink start $SVC_ID 2> "$logfile")
	  ip_ret=$?
	else
	  (ip start $SVC_ID 2> "$logfile")
	  ip_ret=$?
	fi

	if [ $ip_ret -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot start IP addresses for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	# send notify messages lists
	if is_nfs_service $SVC_ID; then
	  if [ "$nfs_lock_workaround" = "yes" ] || \
	     [ "$nfs_lock_workaround" = "1" ]; then
	    notify_list_broadcast /var/lib/nfs/statd
          fi
	fi

	# Note: Samba must be started after the IP.  Reason being, that
	# the samba daemons bind to the specified interface, so it must
	# be ifconfig'd.

	(samba start $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot start Samba for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(user start $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot start user script for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	touch /var/lock/clumanager/service.$SVC_ID
	logAndPrint $LOG_NOTICE "Started service $SVC_NAME ..."
	exit 0
	;;


'stop')

	logAndPrint $LOG_NOTICE "Stopping service $SVC_NAME ..."

	(user stop $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot stop user script for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	declare netlink=$(cludb -g clusvcmgrd%use_netlink)
	declare -i ip_ret
	if [ "$netlink" = "yes" ]; then
	  (ip_netlink stop $SVC_ID 2> "$logfile")
	  ip_ret=$?
	else
	  (ip stop $SVC_ID 2> "$logfile")
	  ip_ret=$?
	fi

	if [ $ip_ret -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot stop IP addresses for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(nfs stop $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot stop NFS for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(samba stop $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot stop Samba for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(filesystem stop $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot stop filesystems for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(device stop $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Cannot stop devices for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	rm -f /var/lock/clumanager/service.$SVC_ID
	logAndPrint $LOG_NOTICE "Stopped service $SVC_NAME ..."
	exit 0
	;;


'status')

	logAndPrint $LOG_DEBUG "Checking service $SVC_NAME ..."

	(device status $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Check status failed on devices $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(filesystem status $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Check status failed on filesystems for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(nfs status $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Check status failed on NFS for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(samba status $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Check status failed on Samba for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	declare netlink=$(cludb -g clusvcmgrd%use_netlink)
	declare -i ip_ret
	if [ "$netlink" = "yes" ]; then
	  (ip_netlink status $SVC_ID 2> "$logfile")
	  ip_ret=$?
	else
	  (ip status $SVC_ID 2> "$logfile")
	  ip_ret=$?
	fi

	if [ $ip_ret -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Check status failed on IP addresses for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	(user status $SVC_ID 2> "$logfile")
	if [ $? -ne $SUCCESS ]; then
	  logAndPrintFile $LOG_ERR "$logfile"
	  logAndPrint $LOG_ERR "Check status failed on user script for $SVC_NAME"
	  rm -f "$logfile"
	  exit 1
	fi

	logAndPrintFile $LOG_INFO "$logfile"
	rm -f "$logfile"

	logAndPrint $LOG_DEBUG "Checked service $SVC_NAME ..."
	exit 0
	;;
esac
