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 \
 | 
			
		||||
		rc_config.3 rc_deptree.3 rc_find_pids.3 rc_plugin_hook.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 \
 | 
			
		||||
		service.8 start-stop-daemon.8
 | 
			
		||||
 | 
			
		||||
ifeq (${OS},Linux)
 | 
			
		||||
MAN8 += rc-sstat.8
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Handy macro to create symlinks
 | 
			
		||||
# This does rely on correctly formatting our manpages!
 | 
			
		||||
MAKE_LINKS=	suffix=$${man\#*.}; \
 | 
			
		||||
@@ -16,8 +24,6 @@ MAKE_LINKS=	suffix=$${man\#*.}; \
 | 
			
		||||
		fi; \
 | 
			
		||||
		done;
 | 
			
		||||
 | 
			
		||||
MK=		../mk
 | 
			
		||||
include ${MK}/sys.mk
 | 
			
		||||
include ${MK}/gitignore.mk
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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