123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- #!/bin/bash
- # Begin /lib/lsb/manage-functions
- # /lib/lsb/manage-functions contains the functions used by
- # /lib/lsb/install_initd and /lib/lsb/remove_initd as well as additional helper
- # functions for use in programs that would provide functionality similar to
- # the RedHat chkconfig utility, for instance.
- # source the confif file
- . /etc/lsb/lsb-config
- # Define all arrays at script start to avoid scope issues
- # scriptlist is a list of valid scripts used as an index
- declare -a scriptlist
- # fullheaders is a complete set of valid LSB headers, stored in memory for
- # each indexed script, to avoid multiple disk reads
- declare -a fullheaders
- ###############################################################################
- # get_headers() - Obtains a valid list of scripts contained in ${rcbase} and #
- # inserts the name of the script into the scriptlist[] array #
- # for use by all other functions. Additionally, it inserts #
- # the entire LSB header information from each script into a #
- # second array, fullheaders[], so that diskreads need only be #
- # done once #
- # Returns no value, but populates the variable ${scriptcount} #
- # and the arrays ${scriptlist} and ${fullheaders} for use #
- # with other functions in this script. This function is #
- # called unconditionally at the end of this scrip and is #
- # provided as a function only for the case that it needs to #
- # be called again after other operations. #
- ###############################################################################
- get_headers()
- {
- echo -n "Retrieving script information from disk..."
- count=1
- for file in $(find -P /etc/init.d -xdev -perm -u=x | sed -n 2~1p \
- | sed "s@/etc/init.d/rc@@")
- do
- # determine if script is an LSB compliant script
- grep "### BEGIN INIT INFO" $file > /dev/null
- if test $? -gt "0"
- then
- # this is not a valid script and is ignored
- # skip the rest of the loop
- continue
- fi
- # determine basename using only bash (is basename a builtin?)
- filename=$(echo "${file}" | sed "s@${rcbase}/@@")
- # assign it to an array possition
- scriptlist["${count}"]="${filename}"
- # find the begining of the init info for the script
- begin=$(grep -n "### BEGIN INIT INFO" "${file}" | cut -d: -f1)
- # find the end of the init info for the script
- end=$(grep -n "### END INIT INFO" "${file}" | cut -d: -f1)
- # we'll use the difference between the values in the tail command
- diff=$(( ${end} - ${begin} ))
- # assign the entire LSB header information as a single string to the
- # fullheaders[] array
- fullheaders["${count}"]=$(head -n "${end}" "${file}" \
- | tail -n "${diff}")
- count=$(( ${count} + 1 ))
- unset begin
- unset end
- unset diff
- unset filename
- done
- # a number or array elements would be a nice regular variable assignment
- scriptcount="${#scriptlist[@]}"
- unset count
- echo -e "Completed!"
- }
- ###############################################################################
- # print_headers() - Presents a formatted list of all LSB compliant script #
- # headers to stdout preceeded by script name for use in #
- # other scripts #
- ###############################################################################
- print_headers()
- {
- get_headers
- count=1
- while test "${count}" -lt "${scriptcount}"
- do
- echo "${scriptlist[$count]}"
- echo "============================================================="
- echo "${fullheaders[$count]}"
- echo ""
- echo ""
- count="$(( ${count} + 1 ))"
- done
- }
- ###############################################################################
- # get_index() - Determines the array index of the specified script #
- ###############################################################################
- get_index()
- {
- filename=$(echo "${1}" | sed "s@${rcbase}/@@")
- count=1
- while test "${count}" -lt "${scriptcount}"
- do
- echo "${scriptlist[${count}]}" | grep "${filename}" > /dev/null
- if test "${?}" -ne "0"
- then
- count=$(( ${count} + 1 ))
- continue
- else
- break
- fi
- done
- if test "${filename}" == "${scriptlist[${count}]}"
- then
- echo "${count}"
- else
- echo "${1} is not a valid LSB init script."
- exit 1
- fi
- unset filename
- unset count
- }
- ###############################################################################
- # get_lsb_value() - Obtains the LSB Value of $1 for index of script ($2). #
- ###############################################################################
- get_lsb_value()
- {
- # Probably need some error checking in here
- echo "${fullheaders[${2}]}" | \
- grep "^# ${1}" | \
- sed -e "s@# ${1}:@@" \
- -e "s/^[ \t]*//"
- }
- ###############################################################################
- # convert_lsb_required() - Converts LSB defined facilities (facility names #
- # begining with a '$' character) into script names #
- # for required start/stop #
- ###############################################################################
- convert_lsb_required()
- {
- local count=0
- local provides=""
- local reqfacility=""
- local reqprovideslist=""
- for reqfacility in $@
- do
- # find the requires and it's index and then find the script name
- # from the index. Since this is required, exit if it is not found
- ## If reqfacility is already in script name format, nothing needs to
- ## be done, just echo it back out. I can't think of an easy way to
- ## do this right now, the scriptname will be the same as the provides
- ## anyway, so just let it fly for now...it'll be correct, it just
- ## takes an extra couple of commands to get the same result.
- ## Besides, this will do some extra sanity checking in case somebody
- ## writes a script that isn't named the same as provides, though this
- ## isn't LSB compliant. Additionally, these same comments apply to
- ## the convert_lsb_should() fucntion below.
- count=0
- while test ${count} -lt ${scriptcount}
- do
- count=$(( $count + 1 ))
- provides="$( get_lsb_value Provides ${count} )"
- if test "${provides}" = "${reqfacility}"
- then
- reqprovideslist="${reqprovideslist} ${scriptlist[$count]}"
- break
- fi
- if test ${count} -eq ${scriptcount}; then
- # If we've never broken out of the while loop, then this is an
- # unrecoverable error since it is a required item. Exit now!
- echo "Error: unable to locate required facility ${reqfacility}!"
- exit 5
- fi
- done
- done
- echo "${reqprovideslist}" | sed -e "s/^[ \t]*//" -e "s/^[ \t]*//"
- }
- ###############################################################################
- # convert_lsb_should() - Converts LSB defined facilities (facility names #
- # begining with a '$' character) into script names for #
- # should start/stop #
- ###############################################################################
- convert_lsb_should()
- {
- local count=0
- local provides=""
- local optfacility=""
- local optprovideslist=""
- for optfacility in $@
- do
- # find the should and it's index and then find the script name
- # from the index. Since this is not an error, simply warn if it
- # is not found.
- count=0
- while test ${count} -lt ${scriptcount}
- do
- count=$(( $count + 1 ))
- provides="$( get_lsb_value Provides ${count} )"
- if test "${provides}" = "${optfacility}"
- then
- optprovideslist="${optprovideslist} ${scriptlist[$count]}"
- break
- fi
- # No need to error or warn on should items, and it's messy if so!
- done
- done
- echo "${optprovideslist}" | sed -e "s/^[ \t]*//" -e "s/[ \t]*$//"
- }
- get_headers
- ###############################################################################
- # get_lsb_required_value() - Additional function to simplify repetitive tasks #
- # Obtains the LSB Value of $1 for index of script #
- # ($2) and immediately converts LSB defined #
- # facilities (beginning with a '$' character) to a #
- # script name. If the script is not found, then #
- # the function exits with an error as per #
- # convert_lsb_required. #
- ###############################################################################
- get_lsb_required_value()
- {
- local reqval
- # Probably need some error checking in here
- reqval=`echo "${fullheaders[${2}]}" | \
- grep "^# ${1}" | \
- sed -e "s@# ${1}:@@" \
- -e "s/^[ \t]*//"`
- # If $reqval contains a '$' charcter, then convert it to a script name
- echo "${reqval}" | grep "\\$" 2>&1 > /dev/null
- if test "${?}" -eq "0"
- then
- reqval=`convert_lsb_required "${reqval}"`
- fi
- echo "${reqval}"
- }
- ###############################################################################
- # get_lsb_should_value() - Additional function to simplify repetitive tasks #
- # Obtains the LSB Value of $1 for index of script #
- # ($2) and immediately converts LSB defined #
- # facilities (beginning with a '$' character) to a #
- # script name. If the script is not found, the #
- # value is removed from the list as it is optional. #
- ###############################################################################
- get_lsb_should_value()
- {
- local optval
- local listitem
- local optitem
- # Probably need some error checking in here
- optval=`echo "${fullheaders[${2}]}" | \
- grep "^# ${1}" | \
- sed -e "s@# ${1}:@@" \
- -e "s/^[ \t]*//"`
- # If $optval contains a '$' charcter, then convert it to a script name
- echo "${optval}" | grep "\\$" 2>&1 > /dev/null
- if test "${?}" -eq "0"
- then
- optval=`convert_lsb_should "${optval}"`
- # if we still have a "$" character, then it's not found and it should
- # be removed from the list (and it's trailing space if one exists)
- # since it is optional
- echo "${optval}" | grep "\\$" 2>&1 > /dev/null
- if test "${?}" -eq "0"
- then
- # Remove the value
- for listitem in ${optval}
- do
- echo "${listitem}" | grep "\\$"
- if test "${?}" -eq "0"
- then
- optval=`echo "${optval}" | sed -e 's@${listitem} @@' \
- -e 's@${listitem}@@' | \
- sed -e "s@# ${1}:@@" \
- -e "s/^[ \t]*//"`
- fi
- done
- fi
- fi
- # If a should start value does not have a script associted with it, then
- # remove it (or it and trailing space) from the list
- for optitem in ${otpval}
- do
- grep "${optitem}" "${statedir}/enabled-scripts" 2>&1 > /dev/null
- if test "${?}" -ne "0"
- then
- optval=`echo "${optval}" | sed -e 's@${otpitem} @@' \
- -e 's@${optitem}@@' | \
- sed -e "s@# ${1}:@@" \
- -e "s/^[ \t]*//"`
- fi
- done
- echo "${optval}"
- }
- # End /lib/lsb/manage-functions
|