#!/bin/sh
# WARNING: This file was auto-generated. Do not edit!
# 
# $Id: svps.in,v 1.15 2022-11-09 20:15:01+05:30 Cprogrammer Exp mbhangui $
#

doit()
{
svpid=$1
option=$2
max=$3
mod=$4

now=$(date +%s)
diff=$(expr $now - $mod)
words=$(ps ax|head -1|wc -w)
words=$(expr $words - 1)

echo "------------ svscan ---------------"
ps ax|grep "sbin/svscan"|grep -Ev "grep|multilog|supervise" | while read line
do
	set $line
	pid=$1
	shift $words
	printf "%-"$max"s up   %7d secs  pid %7d\n" "$*" $diff $pid
done

case "$option" in
	all|main)
	echo
	echo "------------ main -----------------"

	grep -w down /tmp/svps.$$ | grep -v "normally down" | sort -n -k3 | grep -v "/log" | while read line
	do
		set $line
		name=`echo $1|cut -d: -f1`
		if [ "$5" = "normally" ] ; then
			printf "%-"$max"s down %7d secs spid %7d\n" $name $3 $8
		else
			printf "%-"$max"s down %7d secs spid %7d\n" $name $3 $6
		fi
		if [ $? -ne 0 ] ; then
			break
		fi
	done

	grep -Ew wait /tmp/svps.$$ | sort -n -k3 | grep -v "/log" | while read line
	do
		set $line
		name=`echo $1|cut -d: -f1`
		if [ $# -eq 9 ] ; then
			printf "%-"$max"s wait %7d secs  pid %7d remaining %7d seconds\n" $name $3 $6 $8
		else
			printf "%-"$max"s wait %7d secs  pid %7d\n" $name $3 $6
		fi
		if [ $? -ne 0 ] ; then
			break
		fi
	done

	grep -Ew "up" /tmp/svps.$$ | grep -v "normally up" | sort -n -k3 | grep -v "/log" | while read line
	do
		set $line
		name=`echo $1|cut -d: -f1`
		if [ "$5" = "normally" ] ; then
			printf "%-"$max"s up   %7d secs  pid %7d\n" $name $3 $8
		else
			printf "%-"$max"s up   %7d secs  pid %7d\n" $name $3 $6
		fi
		if [ $? -ne 0 ] ; then
			break
		fi
	done
	;;
esac

case "$option" in
	all|logs)
	echo
	echo "------------ logs -----------------"

	set `grep "/service/\.svscan/log" /tmp/svps.$$`
	name=`echo $1|cut -d: -f1`
	printf "%-"$max"s up   %7d secs  pid %7d\n" $name $3 $6
	grep -E "/service/.*/log" /tmp/svps.$$ | sort -n -k3 | grep -v "\.svscan" | while read line
	do
		set $line
		name=`echo $1|cut -d: -f1`
		printf "%-"$max"s up   %7d secs  pid %7d\n" $name $3 $6
		if [ $? -ne 0 ] ; then
			break
		fi
	done
	;;
esac
case "$option" in
	hup)
	if [ ! -f $pidfile ] ; then
		echo "$pidfile: No such file or directory" 1>&2
		exit 1
	else
		echo "Sending HUP to svscan with PID $svpid"
		kill -1 $svpid
		if [ $? -ne 0 ] ; then
			echo "Failed to send HUP signal to pid $svpid" 1>&2
		fi
	fi
	;;
esac
}

if [ -x /usr/bin/less ] ; then
	PAGER=/usr/bin/less
elif [ -x /usr/bin/more ] ; then
	PAGER=/usr/bin/more
fi
option=main
while test $# -gt 0; do
    case "$1" in
    -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'`
	;;
    *) optarg=
	;;
    esac

    case "$1" in
    -a|--all)
	option=all
    ;;
	-h|--hup)
	option=hup
	;;
    -m|--main)
	option=main
    ;;
    -l|--logs)
	option=logs
    ;;
    -n|--no-pager)
	PAGER=""
    ;;
    *)
    echo "invalid option [$1]" 1>&2
	echo "svps [--all | --main | --logs]" 1>&2
    read key
	exit 1
    ;;
    esac

    shift
done

ID=$(id -u)

if [ $ID -ne 0 ] ; then
  echo "You are not root" 1>&2
  exit 1
fi
if [ -d /run/svscan ] ; then
	pidfile=/run/svscan/.svscan.pid
elif [ -d /var/run/svscan ] ; then
	pidfile=/var/run/svscan/.svscan.pid
else
	pidfile=/service/.svscan.pid
fi
svpid=$(sed -n '$p' $pidfile)
SYSTEM=$(uname -s)
case "$SYSTEM" in
	Darwin|FreeBSD)
	mod=$(stat -f "%m" $pidfile)
	;;
	*)
	if [ -f /etc/alpine-release ] ; then
		mod=$(stat -c "%Y" $pidfile)
	else
		mod=$(stat --printf="%Y\n" $pidfile)
	fi
esac

/usr/bin/svstat /service/* /service/*/log \
	/service/.svscan/log 2>/tmp/svpserr.$$ > /tmp/svps_tmp.$$
status=$?
if [ $status -ne 0 ] ; then
	if [ -s /tmp/svpserr.$$ ] ; then
		cat /tmp/svpserr.$$
	fi
	/bin/rm -f /tmp/svpserr.$$ /tmp/svps_tmp.$$
	exit $status
else
	grep -Ev "\.\.|^wait until" /tmp/svps_tmp.$$ > /tmp/svps.$$
	/bin/rm -f /tmp/svpserr.$$ /tmp/svps_tmp.$$
fi
max=0
while read line
do
	if [ -z "$line" ] ; then
		continue
	fi
	set $line
	len=`echo $1 | cut -d: -f1|wc -c`
	if [ $len -gt $max ] ; then
		max=$len
	fi
done < /tmp/svps.$$

if [ "$option" = "hup" ] ; then
	PAGER=""
fi
if [ -n "$PAGER" ] ; then
	doit $svpid $option $max $mod | $PAGER
else
	doit $svpid $option $max $mod
fi

/bin/rm -f /tmp/svps.$$
#
# $Log: svps.in,v $
# Revision 1.15  2022-11-09 20:15:01+05:30  Cprogrammer
# replaced deprecated egrep with grep -E
#
# Revision 1.14  2022-05-24 12:15:48+05:30  Cprogrammer
# fix for alpine linux
#
# revision 1.13  2022-03-18 09:17:35+05:30  cprogrammer
# added -h, hup option to send hup to svscan
#
# revision 1.12  2022-03-06 18:50:50+05:30  cprogrammer
# fix for freebsd (stat command usage)
#
# revision 1.11  2021-07-26 11:31:08+05:30  cprogrammer
# added --no-pager, -n option to disable pager
#
# revision 1.10  2020-11-29 16:26:02+05:30  cprogrammer
# use portable way to use while loop
#
# revision 1.9  2020-11-27 17:30:27+05:30  cprogrammer
# set status variable
#
# Revision 1.8  2020-11-26 23:01:52+05:30  Cprogrammer
# remove PIPESTATUS as it is not portable
#
# Revision 1.7  2020-11-12 11:28:09+05:30  Cprogrammer
# fixed output for normally up and normally down status
#
# Revision 1.6  2020-11-11 18:23:28+05:30  Cprogrammer
# display uptime of svscan
#
# Revision 1.5  2020-11-11 18:05:14+05:30  Cprogrammer
# display error if not running as root
#
# Revision 1.4  2020-11-11 18:01:37+05:30  Cprogrammer
# send output through pager
#
# Revision 1.3  2020-11-10 19:14:47+05:30  Cprogrammer
# display supervise process pid when service is down
#
# Revision 1.2  2020-11-10 16:53:38+05:30  Cprogrammer
# added getopt style options
#
# Revision 1.1  2020-11-09 09:19:58+05:30  Cprogrammer
# Initial revision
#
