#!/bin/bash
# SPDX-License-Identifier: LGPL-2.1-only
#
# Start/Stop the CGroups Rules Engine Daemon
#
# Copyright Red Hat Inc. 2008
#
# Authors:	Steve Olivieri <sjo@redhat.com>
#
# cgred		CGroups Rules Engine Daemon
# chkconfig:	- 14 86
# description:	This is a daemon for automatically classifying processes \
#		into cgroups based on UID/GID.
#
# processname: cgrulesengd
# pidfile: /var/run/cgred.pid
#
### BEGIN INIT INFO
# Provides:		cgrulesengd
# Required-Start:	$local_fs $syslog $cgconfig
# Required-Stop:	$local_fs $syslog
# Should-Start:
# Should-Stop:
# Short-Description:	start and stop the cgroups rules engine daemon
# Description:		CGroup Rules Engine is a tool for automatically using \
#			cgroups to classify processes
### END INIT INFO

sbindir=/usr/sbin
CGRED_BIN=$sbindir/cgrulesengd

# Sanity checks
[[ -x $CGRED_BIN ]] || exit 1

#
# Source LSB routines
#
SYSLIBFILE=/lib/lsb/init-functions
OLDSYSLIBFILE=/etc/init.d/functions
if [[ -x  $SYSLIBFILE ]] ; then
  # shellcheck disable=SC1090
  source $SYSLIBFILE
elif  [[ -x $OLDSYSLIBFILE ]] ; then
  # shellcheck disable=SC1090
  source $OLDSYSLIBFILE
  log_warning_msg() ( warning "$@" ; printf "\n" 1>&2 ; )
  log_failure_msg() ( failure "$@" ; printf "\n" 1>&2 ; )
  log_success_msg() ( success "$@" ; printf "\n" 1>&2 ; )
else
  log_warning_msg() ( printf "warning:%s\n" "$@" 1>&2 ;)
  log_failure_msg() ( printf "failure:%s\n" "$@" 1>&2 ;)
  log_success_msg() ( printf "success:%s\n" "$@" 1>&2 ;)
fi

# Read in configuration options.
if [[ -f "/etc/sysconfig/cgred.conf" ]] ; then
	# shellcheck disable=SC1091
	source /etc/sysconfig/cgred.conf
	OPTIONS="$NODAEMON $LOG"
	if [[ -n "$LOG_FILE" ]]; then
		OPTIONS="$OPTIONS --logfile=$LOG_FILE"
	fi
	if [[ -n "$SOCKET_USER" ]]; then
		OPTIONS="$OPTIONS -u $SOCKET_USER"
	fi
	if [[ -n "$SOCKET_GROUP" ]]; then
		OPTIONS="$OPTIONS -g $SOCKET_GROUP"
	fi
else
	OPTIONS=""
fi

# For convenience
processname=cgrulesengd
servicename=cgred
lockfile="/var/lock/subsys/$servicename"
pidfile=/var/run/cgred.pid

start()
{
	echo -n $"Starting CGroup Rules Engine Daemon: "
	if [[ -f "$lockfile" ]]; then
		log_failure_msg "$servicename is already running with PID $(cat ${pidfile})"
		return 0
	fi
	num=$(grep "cgroup" /proc/mounts | awk '$3=="cgroup"' | wc -l)
	if [[ "$num" -eq 0 ]]; then
		echo
		log_failure_msg $"Cannot find cgroups, is cgconfig service running?"
		return 1
	fi
	daemon --check $servicename --pidfile $pidfile $CGRED_BIN $OPTIONS
	retval=$?
	echo
	if [[ $retval -ne 0 ]]; then
		return 7
	fi
	if ! touch "$lockfile"; then
		return 1
	fi
	pidof "$processname" > $pidfile
	return 0
}

stop()
{
	echo -n $"Stopping CGroup Rules Engine Daemon..."
	if [[ ! -f $pidfile ]]; then
		log_success_msg
		return 0
	fi
	killproc -p $pidfile -TERM "$processname"
	retval=$?
	echo
	if [[ $retval -ne 0 ]]; then
		return 1
	fi
	rm -f "$lockfile" "$pidfile"
	return 0
}

RETVAL=0

# See how we are called
case "$1" in
	start)
		start
		RETVAL=$?
		;;
	stop)
		stop
		RETVAL=$?
		;;
	status)
		status -p $pidfile $servicename
		RETVAL=$?
		;;
	restart)
		stop
		start
		RETVAL=$?
		;;
	condrestart)
		if [[ -f "$lockfile" ]]; then
			stop
			start
			RETVAL=$?
		fi
		;;
	reload|flash)
		if [[ -f "$lockfile" ]]; then
			echo $"Reloading rules configuration..."
			kill -s 12 "$(cat ${pidfile})"
			RETVAL=$?
			if [[ $RETVAL -eq 0 ]] ; then
				log_success_msg ""
			else
				log_failure_msg ""
			fi
		else
			log_failure_msg "$servicename is not running."
		fi
		;;
	*)
		echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
		RETVAL=2
		;;
esac

exit $RETVAL
