| 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 indexdeclare -a scriptlist# fullheaders is a complete set of valid LSB headers, stored in memory for # each indexed script, to avoid multiple disk readsdeclare -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
 |