#!/bin/bash
#
# Copyright (c) 2003-2014 SUSE Linux GmbH Nuernberg, Germany.
# All rights reserved.
#
# Authors: Lars Mueller <lmuelle@suse.com>
#

case "$1" in
	--add|-a)
		MONIT_MODIFY_INITTAB_MODE="add"
		;;
	--remove|-r)
		MONIT_MODIFY_INITTAB_MODE="remove"
		;;
	*)
		MONIT_MODIFY_INITTAB_MODE=""
		;;
esac

#
# check if we are started as root
# only one of UID and USER must be set correctly
#
if test "$UID" != 0 -a "$USER" != root; then
    echo "You must be root to start $0."
    exit 1
fi

#
# check for monit settings
#
MONIT_SYSCONFIG_FILE="/etc/sysconfig/monit"
test -f "${MONIT_SYSCONFIG_FILE}" || \
	{ echo "No file, ${MONIT_SYSCONFIG_FILE} found!" && exit 1 ; }
. "${MONIT_SYSCONFIG_FILE}"

function outputMessage()
{
	tput bold
	echo -en "$1: "
	tput sgr0
	echo -e "$2"
}

function warnMessage()
{
	outputMessage Warning "$1"
}

function errorMessage()
{
	outputMessage Error "$1"
}

BASENAME=$( basename $0)
function removeOldInittabEntries()
{
	NEW_INITTAB_FILE=$( mktemp -t ${BASENAME}.XXXXXXXXXX)
	chmod --reference=/etc/inittab ${NEW_INITTAB_FILE}
	chown --reference=/etc/inittab ${NEW_INITTAB_FILE}
	#
	# find the next unused file descriptor
	#
	declare -i fd=3
	while [ -t ${fd} ]; do
		fd=$(( ${fd} + 1 ))
	done
	eval "exec ${fd}> \"${NEW_INITTAB_FILE}\""

	IFS=""
	while read line; do
		case "${line}" in
			${MONIT_INITTAB_CMDLINE}|${MONIT_INITTAB_COMMENT})
				continue
				;;
			*)
				echo "${line}" >&${fd}
				;;
		esac
	done </etc/inittab

	eval "exec ${fd}<&-"
	mv ${NEW_INITTAB_FILE} /etc/inittab
}

if [ -z "${MONIT_RC_FILE}" ]; then
	MONIT_RC_FILE="/etc/monitrc"
	warnMessage "MONIT_RC_FILE not set in configuration file, ${MONIT_SYSCONFIG_FILE}."
	warnMessage "Using ${MONIT_RC_FILE} instead."
fi

if [ -z "${MONIT_INITTAB_BASE}" ]; then
	MONIT_INITTAB_BASE="mi:2345:respawn:/usr/bin/monit"
	warnMessage "MONIT_INITTAB_BASE not set in configuration file, ${MONIT_SYSCONFIG_FILE}."
	warnMessage "Using ${MONIT_INITTAB_BASE} instead."
fi

MONIT_INITTAB_STATE_FILE="/var/lib/monit/monit-inittab.state"
# Check /etc/inittab and exit if we start monit via the init script
if [ x"${MONIT_VIA_INITTAB}" != x"yes" -o \
	x${MONIT_MODIFY_INITTAB_MODE} = x"remove" ]; then
	test -f ${MONIT_INITTAB_STATE_FILE} || exit 0
	. ${MONIT_INITTAB_STATE_FILE}
	# Remove line from /etc/inittab
	if grep -q "^${MONIT_INITTAB_CMDLINE}$" /etc/inittab; then
		removeOldInittabEntries
		init q
		rm -f ${MONIT_INITTAB_STATE_FILE}
		echo "Monit entry removed from /etc/inittab."
	fi
	exit 0
fi

MONIT_NEW_INITTAB="no"
NEW_MONIT_INITTAB_CMDLINE="${MONIT_INITTAB_BASE} -c ${MONIT_RC_FILE} -I ${MONIT_ARGS}"
# Add lines to /etc/inittab?
if ! grep -q "^${NEW_MONIT_INITTAB_CMDLINE}$" /etc/inittab; then
	NEW_MONIT_INITTAB_COMMENT="${MONIT_INITTAB_COMMENT}"
	echo ${NEW_MONIT_INITTAB_COMMENT} | grep -q '^#' ||
		NEW_MONIT_INITTAB_COMMENT="# ${NEW_MONIT_INITTAB_COMMENT}"
	if [ -f ${MONIT_INITTAB_STATE_FILE} ]; then
		. ${MONIT_INITTAB_STATE_FILE}
		if [ ${MONIT_INITTAB_COMMENT} != ${NEW_MONIT_INITTAB_COMMENT} -o \
			${MONIT_INITTAB_CMDLINE} != ${NEW_MONIT_INITTAB_CMDLINE} ]; then
			removeOldInittabEntries
			echo "Old monit entry removed from /etc/inittab."
			MONIT_NEW_INITTAB="yes"
		fi
	else
		MONIT_NEW_INITTAB="yes"
	fi
fi

if [ ${MONIT_NEW_INITTAB} = "yes" ]; then
	echo -e "MONIT_INITTAB_COMMENT=\"${NEW_MONIT_INITTAB_COMMENT}\"\nMONIT_INITTAB_CMDLINE=\"${NEW_MONIT_INITTAB_CMDLINE}\"" > ${MONIT_INITTAB_STATE_FILE}
	echo ${NEW_MONIT_INITTAB_COMMENT} | grep -q \n$ || \
		NEW_MONIT_INITTAB_COMMENT="${NEW_MONIT_INITTAB_COMMENT}\n"
	echo -e "${NEW_MONIT_INITTAB_COMMENT}${NEW_MONIT_INITTAB_CMDLINE}" >> /etc/inittab
	init q
	echo "New monit entry added to /etc/inittab and changes activated."
fi

exit 0

