#!/bin/sh
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
#  
# bos720 src/bos/usr/lpp/bosinst/samples/AE/AE/CreateService.sh 1.1 
#  
# Licensed Materials - Property of IBM 
#  
# COPYRIGHT International Business Machines Corp. 2008,2009 
# All Rights Reserved 
#  
# US Government Users Restricted Rights - Use, duplication or 
# disclosure restricted by GSA ADP Schedule Contract with IBM Corp. 
#  
# IBM_PROLOG_END_TAG 

# @(#)24        1.1  src/bos/usr/lpp/bosinst/samples/AE/AE/CreateService.sh, bosinst, bos720 3/29/09 15:19:56

# CreateService - A utility for adding a service script to init.d 

# Path to a generic template for adding a service 
SERVICETEMPLATE="/opt/IBM/AE/AE/ServiceTemplate"
AL=`find /opt/IBM/AE/AL/ -name "*.al"`
AEPATH="/opt/IBM/AE"
AE="${AEPATH}/ae"
TEMPCONF="/tmp/tempconf"
ALPATH="${AEPATH}/AL";

PERL_BIN="/usr/bin/perl"
MANAGEAL_BIN="${AEPATH}/AE/ManageALFile"

START_SCRIPT_PATH="/etc/rc.d"
ECHOE="echo -e"

UNAME=`uname -s`;
if [ "$UNAME" = "AIX" ]
then
  # /etc/rc.d is a symlink to /etc/init.d on suse
  # /etc/init.d does not exist on aix, but /etc/rc.d/init.d does
  # scripts usually kept in init.d instead of rc.d for aix

  START_SCRIPT_PATH="$START_SCRIPT_PATH/init.d"
  ECHOE="echo"
fi

#---------------functions-----------------#
# calculate a number from dependencies for boot
calcstartNum()
{
	startnum=0
	for _deps in $1
	do
		tmp=`ls -R /etc/rc.d/ | grep "^S..$_deps" | head -n1 | sed 's/S\([0-9]\{2\}\).*/\1/'`
		if [ -n "$tmp" ]
		then
			if [ "$tmp" -gt "$startnum" ]
			then
				startnum="$tmp"
			fi
		fi
	done
	if [ $startnum -lt 9 ]
	then
		echo 0`expr $startnum + 1`
	elif [ $startnum -gt 98 ]
	then
		echo 99
	else
		echo `expr $startnum + 1`
	fi
}

# extract configuration element
extractConfFromAL()
{
	cp $AL $TEMPCONF
}

# extract resources names
extractResrcName(){
	$ECHOE "$1" | sed "s/.*software-resource name=\"//g" | sed "s/\".*//g"
}

# extract configuration names
extractConfName()
{
  $ECHOE "$1" | sed "s/.*configuration name=\"//g" | sed "s/\".*//g"
}

# extract service names
extractServName()
{
  $ECHOE "$1" | sed "s/.*service name=\"//g" | sed "s/\".*//g"
}

# extract service runlevels
extractRunLevel()
{
  $ECHOE "$1" | sed "s/.*runlevel value=\"//g" | sed "s/\".*//g"
}

# extract services dependencies
extractDependency()
{
  $ECHOE "$1" | sed "s/.*dependency service=\"//g" | sed "s/\".*//g"
}

add_service()
{
  if [ "$UNAME" == "AIX" ]
  then
    /usr/bin/perl \
        -e "my @run_levels = split(//, $2);" \
        -e "foreach my \$run_level (@run_levels)" \
        -e "{" \
        -e "my \$cmd = \"ln -fs $START_SCRIPT_PATH/$1 /etc/rc.d/rc\${run_level}.d/S${3}${1}\";" \
        -e "system(\"\$cmd\");" \
        -e "my \$cmd = \"ln -fs $START_SCRIPT_PATH/$1 /etc/rc.d/rc\${run_level}.d/K${4}${1}\";" \
        -e "system(\"\$cmd\");" \
        -e "}"
  else
    /sbin/chkconfig --add "$1"
  fi
}

del_service()
{
  if [ "$UNAME" == "AIX" ]
  then
    /usr/bin/perl \
	-e "my @run_levels = split($2);" \
        -e "foreach my \$run_level (@run_levels)" \
	-e "{" \
	-e "`rm /etc/rc.d/rc[0-9].d/[SK][0-9][0-9]${1}`;" \
	-e "}"
  else
    /sbin/chkconfig --del "$1" $2
  fi
}

# create all services descriped by AL&AP
createMultipleServicesFile()
{
  servPath="$START_SCRIPT_PATH/$1"
  servName="Provides:\t$1"
	rsrcName="$2"
	confName="$3"
  servDependency="Required-Start:\t$4"
  servRunLevel="Default-Start:\t$5"
	rhRunLevel="`$ECHOE $5 | sed 's/ //g'`"
	rhDependency="`calcstartNum $4` 50"
	if [ -f /etc/SuSE-release ]
	then
		#generate service init scripts, see "ServiceTemplate"
		sed "s|AE_BIN=|AE_BIN=\"${AE}\"|g" $SERVICETEMPLATE | sed "s/\(# chkconfig:\)/\1 $rhRunLevel $rhDependency/g" | sed "s/Provides:/$servName/g" | sed "s/Required-Start:/$servDependency/g" | sed "s/Default-Start:/$servRunLevel/g" | sed '6,7d' | sed "5i\# $servPath" | sed "s|sh \$AE_BIN -s |sh \$AE_BIN -s $rsrcName $confName|g" > $servPath
	else
		sed "s|AE_BIN=|AE_BIN=\"${AE}\"|g" $SERVICETEMPLATE | sed "s/\(# chkconfig:\)/\1 $rhRunLevel $rhDependency/g" | sed "s/Provides:/$servName/g" | sed "s/Required-Start:/$servDependency/g" | sed "s/Default-Start:/$servRunLevel/g" | sed '9,17d' | sed "5i\# $servPath" | sed "s|sh \$AE_BIN -s |sh \$AE_BIN -s $rsrcName $confName|g" > $servPath
	fi
  chmod 755 "$servPath"
  add_service $1 $rhRunLevel $rhDependency
}

# create a single service which will excute sh ae -f
createSingleServiceFile()
{
  servPath="$START_SCRIPT_PATH/$1"
  servName="Provides:\t$1"
  servRunLevel="Default-Start:\t3 5"
  if [ -f /etc/SuSE-release ]
  then
      sed "s|AE_BIN=|AE_BIN=\"${AE}\"|g" $SERVICETEMPLATE | sed "s/\(# chkconfig:\)/\1 35 50 50/g" | sed "s/Provides:/$servName/g" | sed "s/Default-Start:/$servRunLevel/g" | sed "5i\# $servPath" | sed 's|sh $AE_BIN -s $SERVNAME|sh $AE_BIN -f|g' > $servPath
  else
      sed "s|AE_BIN=|AE_BIN=\"${AE}\"|g" $SERVICETEMPLATE | sed "s/\(# chkconfig:\)/\1 2 50 50/g" | sed "s/Provides:/$servName/g" | sed "s/Default-Start:/$servRunLevel/g" | sed "5i\# $servPath" | sed 's|sh $AE_BIN -s $SERVNAME|sh $AE_BIN -f|g' > $servPath
  fi
  chmod 755 "$servPath"
      
  if [ "$UNAME" == "AIX" ]
  then
    add_service $1 "2" "50" "50"
  else
    add_service $1 "35" "50" "50"
  fi
}

# parse configure file, execute each scripts in AL&AP
parseTempConf()
{
  counter=1
	rsrcName=""
  servName=""
	servRunLevel=""
	servDependency=""
	while :
  do
    loopstr=`sed -n "${counter}p" $TEMPCONF`
    if [ -z "$loopstr" ]; then
      $ECHOE "$0: Create Service Done"
      break
    else
			case $loopstr in
				*\<software-resource*)
				rsrcName=`extractResrcName "$loopstr"`
				;;
				*\<configuration*)
				servName="";servRunLevel="";servDependency=""
				confName=`extractConfName "$loopstr"`
				;;
				*\<service*)
				servName=`extractServName "$loopstr"`
				;;
				*\<runlevel*)
				servRunLevel="$servRunLevel"`extractRunLevel "$loopstr"`" "
				;;
				*\<dependency*)
				dependency=`extractDependency "$loopstr"`
				servDependency="$servDependency"`extractDependency "$loopstr"`" "
				;;
				*\</configuration*)
				servRunLevel=`$ECHOE $servRunLevel | sed "s/ $//g"`
				servDependency=`$ECHOE $servDependency | sed "s/ $//g"`
				if [ ! -z "$servName" ]; then
					if [ -z "$dependency" ]
					then
						# if [ "$UNAME" == "AIX" ]
						# then
						    # match runlevel used for the nim first boot script
						    # `telinit q` will not work in runlevel 2 with an action of 'wait'
						#     mkitab "${servName}:2:once:${AE} -s ${rsrcName} ${confName}"
						# else
						    echo "sh ${AE} -s ${rsrcName} ${confName}">>${START_SCRIPT_PATH}/${servName}
						# fi

						if [ "$UNAME" == "AIX" ]
						then
						    chmod 755 ${START_SCRIPT_PATH}/${servName}
						    add_service ${servName} "`$ECHOE $servRunLevel | sed 's/ //g'`" "50" "50"
						fi
					else
						createMultipleServicesFile "$servName" "$rsrcName" "$confName" "$servDependency" "$servRunLevel"
					fi
					#if [ "$servName" = "activation.*network" ]; then
					#	$ECHOE "Replace network service with $servName"
					#	if [ ! -z "`grep -i "suse" /etc/issue`" ]; then
					#		/sbin/chkconfig --del network -f
					#	else
					#		/sbin/chkconfig --del network
					#	fi
					#fi
				fi
				;;
				*)
				;;
			esac
      counter=`expr $counter + 1`
    fi
  done
}

#---------------functions-----------------#


#----------begin of main process----------#

# input AL path manually
if [ ! -z "$1" ]; then
  AL="$1"
  $ECHOE "$0: use input AL file:			\"$AL\""
else
  $ECHOE "$0: use default AL file:			\"$AL\""
fi

# input SERVICETEMPLATE path manually
if [ ! -z "$2" ]; then
  SERVICETEMPLATE="$2"
  $ECHOE "$0: use input SERVICETEMPLATE file:	\"$SERVICETEMPLATE\""
else
  $ECHOE "$0: use default SERVICETEMPLATE file:	\"$SERVICETEMPLATE\""  
fi

# input AE Path manually
if [ ! -z "$3" ]; then
  AE="$3"
  $ECHOE "$0: use input AE file:			\"$AE\""
else
  $ECHOE "$0: use default AE file:			\"$AE\""  
fi

# input single service name
if [ ! -z "$4" ]; then
  SERVICE_NAME="$4"
fi

test -f $AL || {
	echo "$AL is missing."
	exit 1
}

test -f "$SERVICETEMPLATE" || {
	echo "$SERVICETEMPLATE is missing."
	exit 1
}

if [ ! -z "$SERVICE_NAME" ]; then
	SiservName=$SERVICE_NAME
	createSingleServiceFile "$SERVICE_NAME"
	if [ "$Siserv_NAME" = "activation.*.network" ]
	then
		$ECHOE "Replace network service with $Siserv_NAME"
		if [ ! -z "`grep -i "suse" /etc/issue`" ]
		then
			del_service network -f
		else
			del_service network
		fi
	fi
	
else
  extractConfFromAL
  if [ ! -f "$TEMPCONF" ]; then
    $ECHOE "$0: $TEMPCONF is not created."
    exit -1
  fi

  parseTempConf
  rm -rf $TEMPCONF
fi

$PERL_BIN $MANAGEAL_BIN -a $AL

#----------end of main process----------#
