svc

Управљање сервисима
git clone https://git.sr.ht/~strahinja/svc
Дневник | Датотеке | Референце | ПРОЧИТАЈМЕ | ЛИЦЕНЦА

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