service (4390B)
1 #!/bin/sh 2 3 # "User friendly" command 4 5 # $?: 6 # 0: OK 7 # 1: Redundant 8 # 2: Error 9 10 BASEDIR=/bin/svc.d 11 STATUSDELAY=${STATUSDELAY:-1} 12 13 if [ -e /lib/g_fun.sh ]; then 14 . /lib/g_fun.sh 15 else 16 echo /lib/g_fun.sh missing >&2 17 exit 2 18 fi 19 20 if [ "$(id -u)" -ne 0 ]; then 21 msg err "You must be root to run ${0##*/}" 22 exit 2 23 fi 24 25 usage() 26 { 27 printf "usage: %s [a(ctivated?)|d(eactivate)|l(ist)|sta(rt)|sto(p)|"\ 28 "re(start)|ru(nning)] [service|all]\n" "${0##*/}" >&2 29 } 30 31 if [ $# -lt 1 ]; then 32 usage 33 exit 2 34 fi 35 36 cmd="$1" 37 service="$2" 38 39 msgtabs() 40 { 41 local kind fmt 42 43 kind=$1 44 shift 45 fmt=$1 46 shift 47 48 message=$(printf "${fmt}" "$@") 49 lenmessage=${#message} 50 # 13 = length of "=I= 00:00:00 " 51 if [ $((13 + lenmessage)) -le 24 ]; then 52 tabs="\t\t\t\t" 53 elif [ $((13 + lenmessage)) -le 32 ]; then 54 tabs="\t\t\t" 55 elif [ $((13 + lenmessage)) -le 40 ]; then 56 tabs="\t\t" 57 elif [ $((13 + lenmessage)) -le 48 ]; then 58 tabs="\t" 59 else 60 tabs=" " 61 fi 62 63 msg "${kind}" "${fmt}${tabs}" "$@" 64 } 65 66 doservice() 67 { 68 local cmd=$1 service=$2 running=0 nooutcome=0 errno stop=${stop:-0} 69 local activated=0 70 71 sname=${service##*/} 72 case "${cmd}" in 73 a*d) activated=1 74 if [ "${service}" = "all" ] || [ -z "${service}" ]; then 75 nooutcome=1 76 svc -a 2>/dev/null 77 else 78 msgtabs serv "Service %s activated?" ${sname} 79 svc -ad "${service}" 2>/dev/null 80 fi;; 81 a*) if [ -z "${service}" ]; then 82 nooutcome=1 83 msg err "No service given" 84 exit 2 85 else 86 msgtabs serv "Activating %s" ${sname} 87 svc -a "${service}" 2>/dev/null 88 fi;; 89 d*) if [ -z "${service}" ]; then 90 nooutcome=1 91 msg err "No service given" 92 exit 2 93 else 94 msgtabs serv "Deactivating %s" ${sname} 95 svc -d "${service}" 2>/dev/null 96 fi;; 97 l*) nooutcome=1 98 svc -l;; 99 sta*) nooutcome=1 100 if [ -z "${service}" ]; then 101 msg err "No service given" 102 exit 2 103 else 104 msg servnl "Starting %s" ${sname} 105 svc -s "${service}" 2>/dev/null & 106 fi;; 107 sto*) nooutcome=1 108 if [ -z "${service}" ]; then 109 msg err "No service given" 110 exit 2 111 else 112 stop=1 113 msg servnl "Stopping %s" ${sname} 114 svc -k "${service}" 2>/dev/null & 115 fi;; 116 re*) nooutcome=1 117 if [ -z "${service}" ]; then 118 msg err "No service given" 119 exit 2 120 else 121 msg servnl "Restarting %s" ${sname} 122 svc -r "${service}" 2>/dev/null & 123 fi;; 124 ru*) if [ -z "${service}" ]; then 125 nooutcome=1 126 msg err "No service given" 127 exit 2 128 else 129 msgtabs serv "%s running?" ${sname} 130 running=1 131 svc -e "${service}" 2>/dev/null 132 fi;; 133 *) nooutcome=1 134 if [ -z "${service}" ]; then 135 msg err "No service given" 136 exit 2 137 else 138 msg err "What to do with %s?" ${sname} 139 exit 2 140 fi;; 141 esac 142 errno=$? 143 if [ "${nooutcome}" -eq 1 ]; then 144 return "${errno}" 145 else 146 case ${errno} in 147 0) if [ "${running}" -eq 1 ] || [ "${activated}" -eq 1 ]; then 148 if [ "${stop}" -eq 1 ]; then 149 printf "${green}(${lred} YE ${norm}${green})${norm}\n" 150 else 151 printf "${green}(${white} YE ${norm}${green})${norm}\n" 152 fi 153 else 154 printf "${green}(${white} OK ${norm}${green})${norm}\n" 155 fi;; 156 1) if [ "${running}" -eq 1 ]; then 157 printf "${green}(${gray}1-ST${norm}${green})${norm}\n" 158 else 159 printf "${green}(${gray}RNNG${norm}${green})${norm}\n" 160 fi 161 return 1;; 162 2) if [ "${running}" -eq 1 ] || [ "${activated}" -eq 1 ]; then 163 if [ "${stop}" -eq 1 ]; then 164 printf "${green}(${white} NO ${norm}${green})${norm}\n" 165 else 166 printf "${green}(${lred} NO ${norm}${green})${norm}\n" 167 fi 168 else 169 printf "${green}(${lred}FAIL${norm}${green})${norm}\n" 170 fi 171 return 2;; 172 3) printf "${green}(${lred}FAIL${norm}${green})${norm}\n" 173 usage 174 return 3;; 175 *) printf "${green}(${yellow} ?? ${norm}${green})${norm}\n" 176 return 2;; 177 esac 178 fi 179 } 180 181 if [ "${service}" = "all" ]; then 182 case ${cmd} in 183 a*d|l*) doservice "${cmd}" "${service}";; 184 a*) find ${BASEDIR}/avail -type f | \ 185 while read -r service; do 186 doservice "${cmd}" "${service##*/}" 187 done;; 188 *) find ${BASEDIR}/run -type l | \ 189 while read -r service; do 190 doservice "${cmd}" "${service##*/}" 191 done 192 case ${cmd} in 193 sto*) stop=1; export stop 194 msg info "Waiting %ss" \ 195 "${STATUSDELAY}" 196 sleep "${STATUSDELAY}" 197 service running all 198 unset stop;; 199 sta*|re*) msg info "Waiting %ss" \ 200 "${STATUSDELAY}" 201 sleep "${STATUSDELAY}" 202 service running all;; 203 *) ;; 204 esac;; 205 esac 206 else 207 doservice "${cmd}" "${service##*/}" 208 fi