#!/bin/sh # # jstatus # Dump the output of svstat to a html page for viewing on the web. # Customized for jabber server status. # AUTHOR="Mike Arnold " VERSION="200212031739" # ############################################################ # README # # set $SERVICE_DIR/$SERVICE/supervise to chmod go+rx # set $SERVICE_DIR/$SERVICE/supervise/ok to chmod go+rw # -or- # run this program as root # # HTML can be customized via jstatus.css # crontab entry: */10 * * * * /path/to/jstatus # ############################################################ # VARIABLES SERVERNAME="jabber.domain.org" SERVICE_DIR="/service" SERVICE="jabberd jabberd-aim jabberd-icq jabberd-jud jabberd-msn jabberd-muc jabberd-yahoo" OUTFILE_DIR="/var/www/htdocs" OUTFILE="${OUTFILE_DIR}/status.html" ############### NOTHING TO MODIFY BELOW HERE ############### PATH=/usr/local/bin:$PATH # FUNCTIONS # Format the time unit (sets plurality) # expects: TIME_VALUE UNIT (ie "6" "day") # returns: formatted OUT mkstring () { TIME_VALUE=$1 UNIT=$2 if [ $TIME_VALUE -eq 0 ]; then OUT="" elif [ $TIME_VALUE -eq 1 ]; then OUT="1 $UNIT, " else OUT="$TIME_VALUE ${UNIT}s, " fi echo "$OUT" } # Convert seconds to week/day/hour/minute convert_seconds () { INPUT=$1 TEMP0=`expr $INPUT / 60` SECOND=`expr $INPUT - $TEMP0 \* 60` TEMP1=`expr $TEMP0 / 60` MINUTE=`expr $TEMP0 - $TEMP1 \* 60` TEMP2=`expr $TEMP1 / 24` HOUR=`expr $TEMP1 - $TEMP2 \* 24` TEMP3=`expr $TEMP2 / 7` DAY=`expr $TEMP2 - $TEMP3 \* 7` WEEK=$TEMP3 # Build the output string STRING="`mkstring $WEEK week`" STRING="$STRING`mkstring $DAY day`" STRING="$STRING`mkstring $HOUR hour`" STRING="$STRING`mkstring $MINUTE minute`" STRING="$STRING`mkstring $SECOND second`" # Remove the trailing comma STRING=`echo $STRING | sed 's/,$//'` # Print it out echo "$STRING" } print_service () { #echo "1 = $1 2 = $2 3 = $3" if [ "$1" = "UP" ]; then echo "" >> $OUTFILE.$$ echo " $2" >> $OUTFILE.$$ echo " up for `convert_seconds $3`" >> $OUTFILE.$$ echo "" >> $OUTFILE.$$ elif [ "$1" = "DOWN" ]; then echo "" >> $OUTFILE.$$ echo " $2" >> $OUTFILE.$$ echo " down for `convert_seconds $3`" >> $OUTFILE.$$ echo "" >> $OUTFILE.$$ elif [ "$1" = "ERR" ]; then echo "" >> $OUTFILE.$$ echo " $2" >> $OUTFILE.$$ echo " error: $3" >> $OUTFILE.$$ echo "" >> $OUTFILE.$$ else echo "print_service is broken" fi } # MAIN # get_users # $SERVICE_DIR/jabberd/run must have this filter in it: # exec setuidgid jablog multilog s1000000 n10 ./main \ # '-*' '+* * * *:*:* * usercount *' ./main/usercount USER_CONN=`tail -1 $SERVICE_DIR/jabberd/log/main/usercount/current | awk '{print $7}'` # We assume your jabber server-to-server communications are over port 5269 SERVER_CONN=`expr \`netstat -n | grep 5269 | grep -v LISTEN | wc -l | awk '{print $1}'\` / 2` # print_header cat << EOF > $OUTFILE.$$ $SERVERNAME Server Status

$SERVERNAME Server Status

EOF # print_status for SVC in $SERVICE do VAR=`svstat ${SERVICE_DIR}/$SVC | awk '$2 ~ /^up$/ {print $1,$2,$5} $2 ~ \ /^down$/ {print $1,$2,$3,$5,$6,$7} $2 !~ /^up$/ && $2 !~ /^down$/ \ {print $0}' | sed -e 's/\/var\/services\///' -e 's/://'` A2=`echo $VAR | awk '{print $2}'` A3=`echo $VAR | awk '{print $3,$4,$5,$6,$7,$8,$9}'` if [ "$A2" = "up" ]; then print_service UP $SVC "$A3" elif [ "$A2" = "down" ]; then print_service DOWN $SVC "$A3" else print_service ERR $SVC "$A2 $A3" fi done # print_users print_update print_footer cat << EOF >> $OUTFILE.$$
Users Connected: $USER_CONN Servers Connected: $SERVER_CONN Last Update: `date +"%T (UTC%z)"`

Created by: jstatus v.$VERSION

EOF mv $OUTFILE.$$ $OUTFILE