Add rc-sstat script
The rc-sstat script is written to display status of s6 services and run rc-status to display all services status. This currently only works on Linux.
This commit is contained in:
		
							
								
								
									
										10
									
								
								man/Makefile
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								man/Makefile
									
									
									
									
									
								
							@@ -1,9 +1,17 @@
 | 
				
			|||||||
 | 
					MK=		../mk
 | 
				
			||||||
 | 
					include ${MK}/sys.mk
 | 
				
			||||||
 | 
					include ${MK}/os.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MAN3=		einfo.3 \
 | 
					MAN3=		einfo.3 \
 | 
				
			||||||
		rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.3 \
 | 
							rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.3 \
 | 
				
			||||||
		rc_runlevel.3 rc_service.3 rc_stringlist.3
 | 
							rc_runlevel.3 rc_service.3 rc_stringlist.3
 | 
				
			||||||
MAN8=		rc-service.8 rc-status.8 rc-update.8 openrc.8 openrc-run.8 \
 | 
					MAN8=		rc-service.8 rc-status.8 rc-update.8 openrc.8 openrc-run.8 \
 | 
				
			||||||
		service.8 start-stop-daemon.8
 | 
							service.8 start-stop-daemon.8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq (${OS},Linux)
 | 
				
			||||||
 | 
					MAN8 += rc-sstat.8
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Handy macro to create symlinks
 | 
					# Handy macro to create symlinks
 | 
				
			||||||
# This does rely on correctly formatting our manpages!
 | 
					# This does rely on correctly formatting our manpages!
 | 
				
			||||||
MAKE_LINKS=	suffix=$${man\#*.}; \
 | 
					MAKE_LINKS=	suffix=$${man\#*.}; \
 | 
				
			||||||
@@ -16,8 +24,6 @@ MAKE_LINKS=	suffix=$${man\#*.}; \
 | 
				
			|||||||
		fi; \
 | 
							fi; \
 | 
				
			||||||
		done;
 | 
							done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MK=		../mk
 | 
					 | 
				
			||||||
include ${MK}/sys.mk
 | 
					 | 
				
			||||||
include ${MK}/gitignore.mk
 | 
					include ${MK}/gitignore.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all:
 | 
					all:
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										46
									
								
								man/rc-sstat.8
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								man/rc-sstat.8
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
				
			|||||||
 | 
					.\" Copyright (c) 2015 William Hubbs
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.\" Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					.\" modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					.\" are met:
 | 
				
			||||||
 | 
					.\" 1. Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					.\"    notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					.\" 2. Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					.\"    notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					.\"    documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 | 
				
			||||||
 | 
					.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 | 
				
			||||||
 | 
					.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
				
			||||||
 | 
					.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 | 
				
			||||||
 | 
					.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 | 
				
			||||||
 | 
					.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 | 
				
			||||||
 | 
					.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 | 
				
			||||||
 | 
					.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | 
				
			||||||
 | 
					.\" SUCH DAMAGE.
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.Dd April 24, 2008
 | 
				
			||||||
 | 
					.Dt RC-sstat 8 SMM
 | 
				
			||||||
 | 
					.Os OpenRC
 | 
				
			||||||
 | 
					.Sh NAME
 | 
				
			||||||
 | 
					.Nm rc-sstat
 | 
				
			||||||
 | 
					.Nd show status info about services supervised by s6 then rc-status
 | 
				
			||||||
 | 
					info
 | 
				
			||||||
 | 
					.Sh SYNOPSIS
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					.Sh DESCRIPTION
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					gathers and displays information about the status of services supervised
 | 
				
			||||||
 | 
					by s6 then runs rc-status to show info about nnormal OpenRC services.
 | 
				
			||||||
 | 
					.Pp
 | 
				
			||||||
 | 
					.Sh EXIT STATUS
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					exits 1 if there is an internal error or exits with the same exit codes
 | 
				
			||||||
 | 
					as rc-status.
 | 
				
			||||||
 | 
					.Sh SEE ALSO
 | 
				
			||||||
 | 
					.Xr rc-status 8 ,
 | 
				
			||||||
 | 
					.Xr rc-update 8
 | 
				
			||||||
 | 
					.Sh AUTHORS
 | 
				
			||||||
 | 
					.An William Hubbs <w.d.hubbs@gmail.com>
 | 
				
			||||||
							
								
								
									
										1
									
								
								scripts/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								scripts/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					rc-sstat
 | 
				
			||||||
@@ -1,5 +1,19 @@
 | 
				
			|||||||
 | 
					MK=	../mk
 | 
				
			||||||
 | 
					include ${MK}/os.mk
 | 
				
			||||||
 | 
					
 | 
				
			||||||
DIR=	${LIBEXECDIR}/bin
 | 
					DIR=	${LIBEXECDIR}/bin
 | 
				
			||||||
BIN=	on_ac_power
 | 
					BIN=	on_ac_power
 | 
				
			||||||
 | 
					INSTALLAFTER = _installafter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq (${OS},Linux)
 | 
				
			||||||
 | 
					SRCS+= rc-sstat.in
 | 
				
			||||||
 | 
					BIN+=	rc-sstat
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					_installafter:
 | 
				
			||||||
 | 
					ifeq (${OS},Linux)
 | 
				
			||||||
 | 
						${INSTALL} -d ${DESTDIR}${SBINDIR}
 | 
				
			||||||
 | 
						ln -s ${DIR}/rc-sstat ${DESTDIR}/${SBINDIR}/rc-sstat
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
MK=	../mk
 | 
					 | 
				
			||||||
include ${MK}/scripts.mk
 | 
					include ${MK}/scripts.mk
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										140
									
								
								scripts/rc-sstat.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								scripts/rc-sstat.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,140 @@
 | 
				
			|||||||
 | 
					#!@SHELL@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Define variables
 | 
				
			||||||
 | 
					scandir="/run/openrc/s6-scan"
 | 
				
			||||||
 | 
					statfile=/dev/shm/s6-svstat.${USER}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					color_red='\E[01;31m'
 | 
				
			||||||
 | 
					color_green='\E[32m'
 | 
				
			||||||
 | 
					color_yellow='\E[01;33m'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Time Modules
 | 
				
			||||||
 | 
					uptimeModules() {
 | 
				
			||||||
 | 
						# Given a single integer argument representing seconds of uptime...
 | 
				
			||||||
 | 
						# convert uptime to a friendly human readable string: '2d 16h 58m 46s'
 | 
				
			||||||
 | 
						# define a variable to keep track of the longest length uptime string
 | 
				
			||||||
 | 
						uSec=${1:-0}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						uDay=$(( $uSec / 86400 ))
 | 
				
			||||||
 | 
						uSec=$(( $uSec % 86400 ))
 | 
				
			||||||
 | 
						uHour=$(( $uSec / 3600 ))
 | 
				
			||||||
 | 
						uSec=$(( $uSec % 3600 ))
 | 
				
			||||||
 | 
						uMin=$(( $uSec / 60 ))
 | 
				
			||||||
 | 
						uSec=$(( $uSec % 60 ))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[ $uDay -ne 0 ] && pDay="${uDay}d " || pDay=""
 | 
				
			||||||
 | 
						[ $uHour -ne 0 ] && pHour="${uHour}h " || pHour=""
 | 
				
			||||||
 | 
						[ $uMin -ne 0 ] && pMin="${uMin}m " || pMin=""
 | 
				
			||||||
 | 
						[ $uSec -ne 0 ] && pSec="${uSec}s " || pSec=""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						parsedUptime="$( echo ${pDay}${pHour}${pMin}${pSec} | sed 's#[ \t]*$##' )"
 | 
				
			||||||
 | 
						uCharCount=${#parsedUptime}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Make sure we are running as root
 | 
				
			||||||
 | 
					if [ $(id -u) != 0 ]; then
 | 
				
			||||||
 | 
						printf "This command must be run as root\n"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Make sure scandir exists
 | 
				
			||||||
 | 
					if [ ! -d $scandir ]; then
 | 
				
			||||||
 | 
						printf "%s\n" "$scandir does not exist"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Make sure s6-svscan is running 
 | 
				
			||||||
 | 
					if ! pgrep s6-svscan >/dev/null ; then 
 | 
				
			||||||
 | 
						printf "s6-svscan is not running\n"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# If TERM is undefined (launching sstat through an ssh command) then make it vt100
 | 
				
			||||||
 | 
					if [ -z $TERM -o $TERM = "dumb" ]; then
 | 
				
			||||||
 | 
						export TERM=vt100
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Gather list of candidate services s6-supervise may be supervising
 | 
				
			||||||
 | 
					# filter for folders and symlinks at /run/openrc/s6-scan/* ommiting output starting with '.'
 | 
				
			||||||
 | 
					services="$(find $scandir -maxdepth 1 -mindepth 1 \( -type d -or -type l \) | awk -F'/' '{ if ( $NF !~ "^\\." ) print $NF}')"
 | 
				
			||||||
 | 
					if [ -z "$services" ]; then
 | 
				
			||||||
 | 
						printf "s6 found no services configured for supervision\n"
 | 
				
			||||||
 | 
						exit 1
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Gather status for each service from s6-svstat
 | 
				
			||||||
 | 
					# write to tmp file in memory for non I/O bound repeatative access
 | 
				
			||||||
 | 
					rm -f $statfile 2>/dev/null
 | 
				
			||||||
 | 
					for service in $services ; do
 | 
				
			||||||
 | 
						echo "$service $(s6-svstat ${scandir}/${service})" >> $statfile
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Define longest string from parsed uptime (default to 7 to match string length of 'Up Time')
 | 
				
			||||||
 | 
					timeStringLength=7
 | 
				
			||||||
 | 
					for uptime in $(awk '$2 == "up" {print $5}' $statfile | sort -run)
 | 
				
			||||||
 | 
					do
 | 
				
			||||||
 | 
						uptimeModules $uptime
 | 
				
			||||||
 | 
						[ ${uCharCount} -gt $timeStringLength ] && timeStringLength=$uCharCount
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#   Print the status header like so...
 | 
				
			||||||
 | 
					#                Service Name  State    PID         Up Time           Start Time
 | 
				
			||||||
 | 
					#----------------------------  -----  -----  --------------  -------------------
 | 
				
			||||||
 | 
					printf "\n"
 | 
				
			||||||
 | 
					printf "%28s  %5s  %5s  %${timeStringLength}s  %19s\n" "Service Name" "State" "PID" "Up Time" "Start Time"
 | 
				
			||||||
 | 
					for dashes in 28 5 5 $timeStringLength 19 ; do
 | 
				
			||||||
 | 
						printf "%0.s-" $(seq 1 $dashes) ; echo -n '  '
 | 
				
			||||||
 | 
					done && printf "\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#   sshd up (pid 26300) 80373 seconds
 | 
				
			||||||
 | 
					cat $statfile | \
 | 
				
			||||||
 | 
					while read line
 | 
				
			||||||
 | 
					do
 | 
				
			||||||
 | 
						set $line
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						service=$1
 | 
				
			||||||
 | 
						state=$2
 | 
				
			||||||
 | 
						pid=${4/)/}
 | 
				
			||||||
 | 
						time=$5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# call function to convert time in seconds and define additional variables
 | 
				
			||||||
 | 
						uptimeModules $time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if [ "$state" = up ]; then
 | 
				
			||||||
 | 
							if [ $time -lt 30 ]; then
 | 
				
			||||||
 | 
								# uptime < 30 seconds, color the whole line yellow
 | 
				
			||||||
 | 
								echo -en "$color_yellow"
 | 
				
			||||||
 | 
								# 1st 4 columns are printed with printf for space padding
 | 
				
			||||||
 | 
								printf "%28s  %5s  %5s  %${timeStringLength}s" $service $state $pid "$parsedUptime"
 | 
				
			||||||
 | 
								# 4th column is output from date -d
 | 
				
			||||||
 | 
								echo -e "  $(date -d "${time} seconds ago" "+%F %T")"
 | 
				
			||||||
 | 
								# reset terminal colors
 | 
				
			||||||
 | 
								tput sgr0
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								printf "%28s" $service
 | 
				
			||||||
 | 
								# uptime > 30 seconds, color just the "state" value green
 | 
				
			||||||
 | 
								echo -en "$color_green"
 | 
				
			||||||
 | 
								printf "  %5s" $state
 | 
				
			||||||
 | 
								# reset terminal colors
 | 
				
			||||||
 | 
								tput sgr0
 | 
				
			||||||
 | 
								printf "  %5s" $pid
 | 
				
			||||||
 | 
								printf "  %${timeStringLength}s"  "$parsedUptime"
 | 
				
			||||||
 | 
								echo -e "  $(date -d "${time} seconds ago" "+%F %T")"
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							printf "%28s" $service
 | 
				
			||||||
 | 
							echo -en "$color_red"
 | 
				
			||||||
 | 
							printf "  %5s" $state
 | 
				
			||||||
 | 
							tput sgr0
 | 
				
			||||||
 | 
							echo ""
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Cleanup 
 | 
				
			||||||
 | 
					rm -f $statfile 2>/dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					printf "\n\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rc-status
 | 
				
			||||||
		Reference in New Issue
	
	Block a user