#!/bin/sh
# WARNING: This file was auto-generated. Do not edit!
# $Log: svps.in,v $
# 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
#
# 
# $Id: svps.in,v 1.11 2021-07-26 11:31:08+05:30 Cprogrammer Exp mbhangui $
#

doit()
{
option=$1
max=$2

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

mod=$(stat --printf="%Y\n" $pidfile)
now=$(date +%s)
diff=$(expr $now - $mod)

line=$(ps ax|grep "svscan"|egrep -v "grep|multilog")
set $line
echo "------------ svscan ---------------"
printf "%-"$max"s up   %7d secs  pid %7d\n" "$5 $6" $diff $1

if [ "$option" = "all" -o "$option" = "main" ] ; then
	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

	egrep -w 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

	egrep -w "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
fi

if [ "$option" = "all" -o "$option" = "logs" ] ; then
	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
	egrep "/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
fi
}

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
    ;;
    -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
/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
	egrep -v "\.\.|^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 [ -n "$PAGER" ] ; then
	doit $option $max | $PAGER
else
	doit $option $max
fi

/bin/rm -f /tmp/svps.$$
