| … | |
… | |
| 76 | ;; |
76 | ;; |
| 77 | esac |
77 | esac |
| 78 | } |
78 | } |
| 79 | for opt in "$@" ; do |
79 | for opt in "$@" ; do |
| 80 | do_opt ${opt} |
80 | do_opt ${opt} |
| 81 | [ -n "$2" ] && shift |
81 | [[ -n $2 ]] && shift |
| 82 | done |
82 | done |
| 83 | |
83 | |
| 84 | ################################################################################ |
84 | ################################################################################ |
| 85 | # Find the current runlevel being queried. This is either something supplied # |
85 | # Find the current runlevel being queried. This is either something supplied # |
| 86 | # on the command line, or pulled from softlevel # |
86 | # on the command line, or pulled from softlevel # |
| 87 | ################################################################################ |
87 | ################################################################################ |
| 88 | if [ -z "${runlevel}" ] ; then |
88 | if [[ -z "${runlevel}" ]] ; then |
| 89 | if [ -e "${svcdir}/softlevel" ] ; then |
89 | if [[ -e "${svcdir}/softlevel" ]] ; then |
| 90 | runlevel="$(<${svcdir}/softlevel)" |
90 | runlevel="$( <${svcdir}/softlevel )" |
| 91 | else |
91 | else |
| 92 | ewarn "Could not local current runlevel in ${svcdir}/softlevel" |
92 | ewarn "Could not local current runlevel in ${svcdir}/softlevel" |
| 93 | if [ -d "${runleveldir}/single" ] ; then |
93 | if [[ -d "${runleveldir}/single" ]] ; then |
| 94 | runlevel=single |
94 | runlevel=single |
| 95 | elif [ -d "${runleveldir}/default" ] ; then |
95 | elif [[ -d "${runleveldir}/default" ]] ; then |
| 96 | runlevel=default |
96 | runlevel=default |
| 97 | else |
97 | else |
| 98 | eerror "Your installation is probably broken ... please \`emerge baselayout\`" |
98 | eerror "Your installation is probably broken ... please \`emerge baselayout\`" |
| 99 | exit 1 |
99 | exit 1 |
| 100 | fi |
100 | fi |
| 101 | ewarn "Assuming current runrevel is '${runlevel}'" |
101 | ewarn "Assuming current runrevel is '${runlevel}'" |
| 102 | fi |
102 | fi |
| 103 | fi |
103 | fi |
| 104 | if [ ! -d "${runleveldir}/${runlevel}" ] ; then |
104 | if [[ ! -d "${runleveldir}/${runlevel}" ]] ; then |
| 105 | eerror "${runlevel} is not a valid run level !" |
105 | eerror "${runlevel} is not a valid run level !" |
| 106 | eerror "Valid runlevels (obtained from \`rc-status --list\`):" |
106 | eerror "Valid runlevels (obtained from \`rc-status --list\`):" |
| 107 | rc-status --list |
107 | rc-status --list |
| 108 | exit 1 |
108 | exit 1 |
| 109 | fi |
109 | fi |
| … | |
… | |
| 113 | # trivial case, this is simply the current runlevel. If --all was specified, # |
113 | # trivial case, this is simply the current runlevel. If --all was specified, # |
| 114 | # we gather information about all of the runlevels. If --unused was # |
114 | # we gather information about all of the runlevels. If --unused was # |
| 115 | # specified, we pull info about all of the services and filter for the ones # |
115 | # specified, we pull info about all of the services and filter for the ones # |
| 116 | # that don't appear in any runlevel. # |
116 | # that don't appear in any runlevel. # |
| 117 | ################################################################################ |
117 | ################################################################################ |
| 118 | runlevelidxs=`ls ${runleveldir}` |
118 | runlevelidxs=$( ls ${runleveldir} ) |
| 119 | declare -a runlevels |
119 | declare -a runlevels |
| 120 | # For each directory in /etc/runlevels, do ... |
120 | # For each directory in /etc/runlevels, do ... |
| 121 | arridx=0 |
121 | arridx=0 |
| 122 | for level in ${runlevelidxs} ; do |
122 | for level in ${runlevelidxs} ; do |
| 123 | if [ "${level}" == "${runlevel}" ] || [ -n "${ALL}" ] ; then |
123 | if [[ ${level} == ${runlevel} || -n ${ALL} ]] ; then |
| 124 | runlevels[${arridx}]=$(find ${runleveldir}/${level} -maxdepth 1 -type l -printf '%f ') |
124 | runlevels[${arridx}]=$( find ${runleveldir}/${level} -maxdepth 1 -type l -printf '%f ' ) |
| 125 | let "arridx += 1" |
125 | let "arridx += 1" |
| 126 | fi |
126 | fi |
| 127 | done |
127 | done |
| 128 | |
128 | |
| 129 | # In case --all was specified, get a list of all the services set up in |
129 | # In case --all was specified, get a list of all the services set up in |
| 130 | # /etc/init.d; services can be added, but not enabled, and we need to |
130 | # /etc/init.d; services can be added, but not enabled, and we need to |
| 131 | # identify these 'orphan' services. |
131 | # identify these 'orphan' services. |
| 132 | in_list() { #$1=list $2=find |
132 | in_list() { #$1=list $2=find |
| 133 | for ele in $1 ; do |
133 | for ele in $1 ; do |
| 134 | if [ "${ele}" == "$2" ] ; then |
134 | if [[ ${ele} == $2 ]] ; then |
| 135 | echo 1 |
135 | echo 1 |
| 136 | return 0 |
136 | return 0 |
| 137 | fi |
137 | fi |
| 138 | done |
138 | done |
| 139 | echo 0 |
139 | echo 0 |
| 140 | return 0 |
140 | return 0 |
| 141 | } |
141 | } |
| 142 | if [ -n "${ALL}" ] ; then |
142 | if [[ -n ${ALL} ]] ; then |
| 143 | unassigned= |
143 | unassigned= |
| 144 | allservices= |
144 | allservices= |
| 145 | for service in `ls -1 /etc/init.d | grep -v '\.sh$'` ; do |
145 | for service in $( ls -1 /etc/init.d | grep -v '\.sh$' ) ; do |
| 146 | if [ $(in_list "${runlevels[*]}" "${service}") -eq 0 ] ; then |
146 | if [[ $( in_list "${runlevels[*]}" "${service}" ) -eq 0 ]] ; then |
| 147 | unassigned="${unassigned} ${service}" |
147 | unassigned="${unassigned} ${service}" |
| 148 | fi |
148 | fi |
| 149 | allservices="${allservices} ${service}" |
149 | allservices="${allservices} ${service}" |
| 150 | done |
150 | done |
| 151 | runlevelidxs="${runlevelidxs} UNASSIGNED" |
151 | runlevelidxs="${runlevelidxs} UNASSIGNED" |
| … | |
… | |
| 156 | ################################################################################ |
156 | ################################################################################ |
| 157 | # Now collect information about the status of the various services; whether # |
157 | # Now collect information about the status of the various services; whether # |
| 158 | # they're started, broken, or failed. Put all of this into arrays. # |
158 | # they're started, broken, or failed. Put all of this into arrays. # |
| 159 | ################################################################################ |
159 | ################################################################################ |
| 160 | # Read services from ${svcdir}/{started,failed,broken} |
160 | # Read services from ${svcdir}/{started,failed,broken} |
|
|
161 | [[ -x "${svcdir}/starting" ]] && starting=$( ls ${svcdir}/starting ) |
|
|
162 | [[ -x "${svcdir}/inactive" ]] && inactive=$( ls ${svcdir}/inactive ) |
| 161 | [ -x ${svcdir}/started ] && started=`ls ${svcdir}/started` |
163 | [[ -x "${svcdir}/started" ]] && started=$( ls ${svcdir}/started ) |
|
|
164 | [[ -x "${svcdir}/stopping" ]] && stopping=$( ls ${svcdir}/stopping ) |
| 162 | [ -x ${svcdir}/failed ] && failed=`ls ${svcdir}/failed` |
165 | [[ -x "${svcdir}/failed" ]] && failed=$( ls ${svcdir}/failed ) |
| 163 | [ -x ${svcdir}/broken ] && broken=`ls ${svcdir}/broken` |
166 | [[ -x "${svcdir}/broken" ]] && broken=$( ls ${svcdir}/broken ) |
| 164 | |
167 | |
| 165 | ################################################################################ |
168 | ################################################################################ |
| 166 | # Now print out the information we've gathered. We do this by going through # |
169 | # Now print out the information we've gathered. We do this by going through # |
| 167 | # the hash of 'runlevels' information, and for each String key/Array value # |
170 | # the hash of 'runlevels' information, and for each String key/Array value # |
| 168 | # pair, print the runlevel; then for each service in that runlevel, print the # |
171 | # pair, print the runlevel; then for each service in that runlevel, print the # |
| … | |
… | |
| 172 | print_msg() { |
175 | print_msg() { |
| 173 | printf " %-$((COLS - 5 - ${#3}))s%s\n" "$1" "${BRACKET}[ $2$3 ${BRACKET}]${NORMAL}" |
176 | printf " %-$((COLS - 5 - ${#3}))s%s\n" "$1" "${BRACKET}[ $2$3 ${BRACKET}]${NORMAL}" |
| 174 | } |
177 | } |
| 175 | |
178 | |
| 176 | # if --all wasnt specified, dont print everything |
179 | # if --all wasnt specified, dont print everything |
| 177 | [ -z "${ALL}" ] && runlevelidxs="${runlevel}" |
180 | [[ -z ${ALL} ]] && runlevelidxs=${runlevel} |
| 178 | if [ -z "${UNUSED}" ] ; then |
181 | if [[ -z ${UNUSED} ]] ; then |
| 179 | if [ -z "${SERVICELIST}" ] ; then |
182 | if [[ -z ${SERVICELIST} ]] ; then |
| 180 | arridx=0 |
183 | arridx=0 |
| 181 | else |
184 | else |
| 182 | runlevelidxs="all" |
185 | runlevelidxs="all" |
| 183 | let "arridx += 1" |
186 | let "arridx += 1" |
| 184 | fi |
187 | fi |
| … | |
… | |
| 187 | fi |
190 | fi |
| 188 | |
191 | |
| 189 | for level in ${runlevelidxs} ; do |
192 | for level in ${runlevelidxs} ; do |
| 190 | echo "Runlevel: ${HILITE}${level}${NORMAL}" |
193 | echo "Runlevel: ${HILITE}${level}${NORMAL}" |
| 191 | for service in ${runlevels[${arridx}]} ; do |
194 | for service in ${runlevels[${arridx}]} ; do |
|
|
195 | if [[ -n ${inactive} && $( in_list "${inactive}" "${service}" ) -eq 1 ]] ; then |
|
|
196 | print_msg "${service}" "${WARN}" 'inactive' |
| 192 | if [ $(in_list "${started}" "${service}") -eq 1 ] ; then |
197 | elif [[ $(in_list "${started}" "${service}") -eq 1 ]] ; then |
| 193 | print_msg "${service}" "${GOOD}" 'started' |
198 | print_msg "${service}" "${GOOD}" 'started' |
|
|
199 | elif [[ -n ${starting} && $( in_list "${starting}" "${service}" ) -eq 1 ]] ; then |
|
|
200 | print_msg "${service}" "${GOOD}" 'starting' |
|
|
201 | elif [[ -n ${stopping} && $( in_list "${stopping}" "${service}" ) -eq 1 ]] ; then |
|
|
202 | print_msg "${service}" "${BAD}" 'stopping' |
|
|
203 | elif [[ -n ${failed} && $( in_list "${failed}" "${service}" ) -eq 1 ]] ; then |
|
|
204 | print_msg "${service}" "${BAD}" 'failed' |
|
|
205 | elif [[ -n ${broken} && $( in_list "${broken}" "${service}" ) -eq 1 ]] ; then |
|
|
206 | print_msg "${service}" "${BAD}" 'broken' |
| 194 | else |
207 | else |
| 195 | if [ -n "${failed}" ] && [ $(in_list "${failed}" "${service}") -eq 1 ] ; then |
|
|
| 196 | print_msg "${service}" "${BAD}" 'failed' |
|
|
| 197 | elif [ -n "${broken}" ] && [ $(in_list "${broken}" "${service}") -eq 1 ] ; then |
|
|
| 198 | print_msg "${service}" "${BAD}" 'broken' |
|
|
| 199 | else |
|
|
| 200 | print_msg "${service}" "${WARN}" ' off' |
208 | print_msg "${service}" "${WARN}" ' off' |
| 201 | fi |
|
|
| 202 | fi |
209 | fi |
| 203 | done |
210 | done |
| 204 | let "arridx += 1" |
211 | let "arridx += 1" |
| 205 | [ -n "${UNUSED}" ] && exit 0 |
212 | [ -n "${UNUSED}" ] && exit 0 |
| 206 | done |
213 | done |