#!/usr/bin/sh
#
# $Log: create_service.in,v $
# Revision 1.18  2021-04-14 13:20:10+05:30  Cprogrammer
# fixed .options
#
# Revision 1.17  2021-04-14 09:47:14+05:30  Cprogrammer
# update variables only if changed
#
# Revision 1.16  2021-04-13 18:25:27+05:30  Cprogrammer
# do not overwrite POWER_OFF env variable
#
# Revision 1.15  2021-04-13 18:07:55+05:30  Cprogrammer
# added command line invocation in run header
#
# Revision 1.14  2021-04-13 17:49:38+05:30  Cprogrammer
# create variables/.options file
#
# Revision 1.13  2021-04-13 16:48:02+05:30  Cprogrammer
# fixed home variable
#
# Revision 1.12  2021-04-13 15:29:40+05:30  Cprogrammer
# backup file in fclient service
#
# Revision 1.11  2021-04-01 20:58:31+05:30  Cprogrammer
# do backup using backup script; start mpd of not running
#
# Revision 1.10  2021-04-01 20:52:13+05:30  Cprogrammer
# use absolute path in BACKUP env variable
#
# Revision 1.9  2021-02-25 15:42:57+05:30  Cprogrammer
# use relative path for variables to allow renaming of service directory
#
# Revision 1.8  2021-01-11 22:21:14+05:30  Cprogrammer
# create HOME environment variable
#
# Revision 1.7  2020-08-31 16:40:17+05:30  Cprogrammer
# fixed shutdown script
#
# Revision 1.6  2020-08-31 12:22:40+05:30  Cprogrammer
# added code to do backup during startup in fserver
#
# Revision 1.5  2020-08-29 17:12:50+05:30  Cprogrammer
# fixed shutdown script
#
# Revision 1.4  2020-08-29 16:01:45+05:30  Cprogrammer
# use bash for run file
#
# Revision 1.3  2020-08-28 22:44:00+05:30  Cprogrammer
# create shutdown script for fserver service
#
# Revision 1.2  2020-08-28 22:05:45+05:30  Cprogrammer
# fixed syntax error
#
# Revision 1.1  2020-08-28 17:17:26+05:30  Cprogrammer
# Initial revision
#
#
# $Id: create_service.in,v 1.18 2021-04-14 13:20:10+05:30 Cprogrammer Exp mbhangui $
#

check_update_if_diff()
{
	val=`cat $1 2>/dev/null`
	if [ ! " $val" = " $2" ] ; then
		echo $2 > $1
	fi
}

add_service()
{
	if [ $# -ne 2 ] ; then
		(
		echo -n "USAGE: create_service --servicedir=path "
		echo -n "--service_name=fclient|fserver --host=host "
		echo -n "--port=port --add-service"
		echo
		) 1>&2
		return 1
	fi
	if [ ! -d $logdir ] ; then
		mkdir -p $logdir
		chown qmaill:nofiles $logdir
	fi
	mkdir -p $servicedir/$service_name/log
	(
		echo "#!/bin/sh"
		echo "exec /usr/bin/setuidgid qmaill \\"
		if [ -f /usr/sbin/multilog ] ; then
			echo "/usr/sbin/multilog t $logdir/$service_name"
		else
			echo "/usr/bin/multilog t $logdir/$service_name"
		fi
	) > $servicedir/$service_name/log/run
	chmod +x $servicedir/$service_name/log/run

	mkdir -p $servicedir/$service_name/variables
	echo "$prog_args" > $servicedir/$service_name/variables/.options
	check_update_if_diff $servicedir/$service_name/variables/HOST       $1
	check_update_if_diff $servicedir/$service_name/variables/PORT       $2
	check_update_if_diff $servicedir/$service_name/variables/TIMEOUT    300
	check_update_if_diff $servicedir/$service_name/variables/MAXDAEMONS 10
	home=$(getent passwd 1000|cut -d: -f6)
	if [ -n "$home" ] ; then
		check_update_if_diff $servicedir/$service_name/variables/HOME $home
	fi
	if [ " $service_name" = " fclient" ] ; then
		(
		echo "#!/bin/bash"
		echo "# $prog_args"
		echo "exec 2>&1"
		echo 
		echo "HOST=\`cat variables/HOST\`"
		echo "PORT=\`cat variables/PORT\`"
		echo "</dev/tcp/\$HOST/\$PORT"
		echo "if [ \$? -eq 0 ] ; then"
		echo "  exec /usr/bin/envdir variables sh -c \""
        echo "    /usr/libexec/pistop/backup"
		echo "      sleep 5;exec /usr/bin/tcpclient -v -D -H -R -t \\"
		echo "      \\\$TIMEOUT \\\$HOST \\\$PORT /usr/libexec/pistop/client start 2>&1\""
		echo "else"
		echo "  exec /usr/bin/envdir variables sh -c \""
		echo "    sleep 10; /usr/libexec/pistop/client sleep 2>&1\""
		echo "fi"
		) > $servicedir/$service_name/run
		if [ ! -f $servicedir/$service_name/variables/POWER_OFF ] ; then
			> $servicedir/$service_name/variables/POWER_OFF
		fi
	elif [ " $service_name" = " fserver" ] ; then
		(
		echo "#!/bin/sh"
		echo "# $prog_args"
		echo "exec 2>&1"
		echo
		echo "exec /usr/bin/envdir variables sh -c \""
        echo "  /usr/libexec/pistop/backup"
        echo "  systemctl status mpd >/dev/null 2>&1"
        echo "  if [ \$? -eq 0 ] ; then"
        echo "    systemctl start mpd"
        echo "  fi"
        echo ""
		echo "  exec /usr/bin/tcpserver -v -D -H -R -l 0 \\"
		echo "    -c variables/MAXDAEMONS -o -b \\\$MAXDAEMONS \\"
		echo "    -u 0 -g 0 \\\$HOST \\\$PORT \\"
		echo "  /usr/libexec/pistop/server\""
		) > $servicedir/$service_name/run
		(
		echo "#!/bin/sh"
		echo "killall /usr/libexec/pistop/server"
		echo "exit 0"
		) > $servicedir/$service_name/shutdown
		chmod +x $servicedir/$service_name/shutdown
	fi
	chmod +x $servicedir/$service_name/run
}

del_service()
{
	if [ ! -d $servicedir/$service_name ] ; then
		return 0
	fi
	mv $servicedir/$service_name $servicedir/."$service_name"
	svc -dx $servicedir/."$service_name" $servicedir/."$service_name"/log > /dev/null
	sleep 5
	/bin/rm -rf $servicedir/."$service_name" $servicedir/."$service_name"/log > /dev/null
}

usage()
{
echo "Usage: create_service [OPTIONS]"
echo "create_service --servicedir=dir --service_name=name --host=host --port=port --add-service"
echo "  or"
echo "create_service --servicedir=dir --service_name=name --del-service"
exit $1
}

################################# Main ##################################
if test $# -eq 0; then
	usage 1
fi
ID=$(id -u)
if [ $ID -ne 0 ] ; then
	echo "You are not root" 1>&2
	exit 1
fi
logdir=/var/log/svc
servicedir=/service
prog_args="$0 $*"
RCSID="# \$Id: create_service.in,v 1.18 2021-04-14 13:20:10+05:30 Cprogrammer Exp mbhangui $"
while test $# -gt 0; do
	case "$1" in
	-*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
	;;
	*) optarg=
	;;
	esac

	case "$1" in
	--servicedir=*)
	servicedir=$optarg
	;;
	--service_name=*)
	service_name=$optarg
	if [ " $service_name" != " fclient" -a " $service_name" != " fserver" ] ; then
		echo "service_name should be fclient or fserver" 1>&2
	fi
	;;
	--host=*)
	host=$optarg
	;;
	--port=*)
	port=$optarg
	;;

	--add-service)
	if [ -z "$servicedir" -o -z "$service_name" -o -z "$port" -o -z "$host" ] ; then
		echo "You must specify servicedir, service_name, port, host" 1>&2
		usage
	else
		add_service $host $port
	fi
	;;
	--del-service)
	del_service
	;;
	*)
	echo "invalid option [$1]"
	read key
	usage 1
	;;
	esac
	shift
done
