#!/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 *\>${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----------#