#!/bin/sh
# Copyright (C) 2002-2003 Ulric Eriksson <ulric@siag.nu>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston,
# MA 02111-1307, USA.
PENCTL=penctl
#set -x
header()
{
if test -z "$1"; then
TITLE=Penctl
else
TITLE="$1"
fi
cat << EOF
<html>
<head>
<title>$TITLE</title>
</head>
<body bgcolor="#ffffff">
<h1>$TITLE</h1>
EOF
}
footer()
{
cat << EOF
</body>
</html>
EOF
}
errorpage()
{
header "Error"
echo "$1"
footer
exit 0
}
get_query()
{
echo "$QUERY_STRING"|tr '&' '\n'|grep "^$1="|cut -f 2 -d =|sed -e 's,%2F,/,g' -e 's,%..,,g'
}
statuspage()
{
test -z "$SERVER" && errorpage "No server"
test -z "$PORT" && errorpage "No port"
$PENCTL $SERVER:$PORT status 2> /tmp/penctl.cgi
if test "$?" != "0"; then
errorpage "`cat /tmp/penctl.cgi`"
fi
}
# testmode modelist setting
testmode()
{
echo "$1"|grep "no+$2" > /dev/null 2>&1
if test "$?" = "0"; then
echo "no"
else
echo "yes"
fi
}
# setmode setting old new
setmode()
{
if test "$2" != "$3"; then
if test "$3" = "yes"; then
$PENCTL $SERVER:$PORT $1
else
$PENCTL $SERVER:$PORT no $1
fi
fi
}
settingspage()
{
test -z "$SERVER" && errorpage "No server"
test -z "$PORT" && errorpage "No port"
OLDMODE=`get_query oldmode`
if test ! -z "$OLDMODE"; then
BLACKLIST=`get_query blacklist`
test -z "$BLACKLIST" || $PENCTL $SERVER:$PORT blacklist $BLACKLIST
DEBUG=`get_query debug`
test -z "$DEBUG" || $PENCTL $SERVER:$PORT debug $DEBUG
LOG=`get_query log`
test -z "$LOG" || $PENCTL $SERVER:$PORT log $LOG
TIMEOUT=`get_query timeout`
test -z "$TIMEOUT" || $PENCTL $SERVER:$PORT timeout $TIMEOUT
TRACKING=`get_query tracking`
test -z "$TRACKING" || $PENCTL $SERVER:$PORT tracking $TRACKING
WEB_STATS=`get_query web_stats`
test -z "$WEB_STATS" || $PENCTL $SERVER:$PORT web_stats $WEB_STATS
x=`testmode "$OLDMODE" block`
BLOCK=`get_query block`
setmode "$OLDMODE" "$x" "$BLOCK"
x=`testmode "$OLDMODE" delayed_forward`
DFORWARD=`get_query dforward`
setmode "$OLDMODE" "$x" "$DFORWARD"
x=`testmode "$OLDMODE" hash`
HASH=`get_query hash`
setmode "$OLDMODE" "$x" "$HASH"
HTTP=`get_query http`
setmode "$OLDMODE" "$x" "$HTTP"
x=`testmode "$OLDMODE" roundrobin`
ROUNDROBIN=`get_query roundrobin`
setmode "$OLDMODE" "$x" "$ROUNDROBIN"
x=`testmode "$OLDMODE" stubborn`
STUBBORN=`get_query stubborn`
setmode "$OLDMODE" "$x" "$STUBBORN"
fi
cat << EOF 1>&2
BLOCK="$BLOCK"
DFORWARD="$DFORWARD"
HASH="$HASH"
ROUNDROBIN="$ROUNDROBIN"
STUBBORN="$STUBBORN"
EOF
header "Global Settings"
BLACKLIST=`$PENCTL $SERVER:$PORT blacklist`
CLIENTS_MAX=`$PENCTL $SERVER:$PORT clients_max`
CONN_MAX=`$PENCTL $SERVER:$PORT conn_max`
DEBUG=`$PENCTL $SERVER:$PORT debug`
LISTEN=`$PENCTL $SERVER:$PORT listen`
LOG=`$PENCTL $SERVER:$PORT log`
MODE=`$PENCTL $SERVER:$PORT mode`
BLOCK=`testmode "$MODE" block`
DFORWARD=`testmode "$MODE" delayed_forward`
HASH=`testmode "$MODE" hash`
ROUNDROBIN=`testmode "$MODE" roundrobin`
STUBBORN=`testmode "$MODE" stubborn`
PID=`$PENCTL $SERVER:$PORT pid`
TIMEOUT=`$PENCTL $SERVER:$PORT timeout`
TRACKING=`$PENCTL $SERVER:$PORT tracking`
WEB_STATS=`$PENCTL $SERVER:$PORT web_stats`
cat << EOF
<form>
<table bgcolor="#c0c0c0">
<tr><td bgcolor="#80f080">Blacklist time</td><td><input size=5 type="text" name="blacklist" value="$BLACKLIST"></td></tr>
<tr><td bgcolor="#80f080">Max # of clients</td><td>$CLIENTS_MAX</td></tr>
<tr><td bgcolor="#80f080">Max # of connections</td><td>$CONN_MAX</td></tr>
<tr><td bgcolor="#80f080">Debug level</td><td><input size=5 type="text" name="debug" value="$DEBUG"></td></tr>
<tr><td bgcolor="#80f080">Listening port</td><td>$LISTEN</td></tr>
<tr><td bgcolor="#80f080">Logging destination</td><td><input type="text" name="log" value="$LOG"></td></tr>
<tr><td bgcolor="#80f080">Blocking</td><td><input type="checkbox" name="block" value="yes"></td></tr>
<tr><td bgcolor="#80f080">Delayed forward</td><td><input type="checkbox" name="dforward" value="yes"></td></tr>
<tr><td bgcolor="#80f080">Hash</td><td><input type="checkbox" name="hash" value="yes"></td></tr>
<tr><td bgcolor="#80f080">HTTP</td><td><input type="checkbox" name="http" value="yes"></td></tr>
<tr><td bgcolor="#80f080">Roundrobin</td><td><input type="checkbox" name="roundrobin" value="yes"></td></tr>
<tr><td bgcolor="#80f080">Stubborn</td><td><input type="checkbox" name="stubborn" value="yes"></td></tr>
<tr><td bgcolor="#80f080">Process ID</td><td>$PID</td></tr>
<tr><td bgcolor="#80f080">Connect timeout</td><td><input size=5 type="text" name="timeout" value="$TIMEOUT"></td></tr>
<tr><td bgcolor="#80f080">Client tracking</td><td><input size=5 type="text" name="tracking" value="$TRACKING"></td></tr>
<tr><td bgcolor="#80f080">Web status report</td><td><input type="text" name="web_stats" value="$WEB_STATS"></td></tr>
</table>
<input type="hidden" name="oldmode" value="$MODE">
<input type="hidden" name="server" value="$SERVER">
<input type="hidden" name="port" value="$PORT">
<input type="submit" name="mode" value="Settings">
<input type="submit" name="mode" value="Main">
</form>
EOF
footer
}
managepage()
{
test -z "$SERVER" && errorpage "No server"
test -z "$PORT" && errorpage "No port"
N=0
A=`get_query "A.$N"`
while test ! -z "$A"; do
P=`get_query "P.$N"`
M=`get_query "M.$N"`
H=`get_query "H.$N"`
T=`get_query "T.$N"`
x=""
test -z "$A" || x="$x address $A"
test -z "$P" || x="$x port $P"
test -z "$M" || x="$x max $M"
test -z "$H" || x="$x hard $H"
test -z "$T" || x="$x blacklist $T"
test -z "$x" || $PENCTL $SERVER:$PORT server $N $x
N=`echo $N+1|bc`
A=`get_query "A.$N"`
done
header "Manage Servers"
cat << EOF
<form><table bgcolor="#c0c0c0">
<tr>
<td bgcolor="#80f080">Server
<td bgcolor="#80f080">Address
<td bgcolor="#80f080">Port
<td bgcolor="#80f080">Conn
<td bgcolor="#80f080">Max
<td bgcolor="#80f080">Hard
<td bgcolor="#80f080">Sx
<td bgcolor="#80f080">Rx
<td bgcolor="#80f080">Blacklist
EOF
$PENCTL $SERVER:$PORT servers | while read N a A p P c C m M h H s S r R; do
cat << EOF
<tr>
<td>$N
<td><input type="text" name="A.$N" value="$A">
<td><input size=5 type="text" name="P.$N" value="$P">
<td>$C
<td><input size=5 type="text" name="M.$N" value="$M">
<td><input size=5 type="text" name="H.$N" value="$H">
<td>$S
<td>$R
<td><input size=5 type="text" name="T.$N" value="$T">
EOF
done
cat << EOF
</table>
<input type="hidden" name="server" value="$SERVER">
<input type="hidden" name="port" value="$PORT">
<input type="submit" name="mode" value="Manage">
<input type="submit" name="mode" value="Main">
</form>
EOF
}
mainpage()
{
header
cat << EOF
<form><table bgcolor="#c0c0c0">
<tr><td bgcolor="#80f080">Server<td><input type="text" name="server" value="$SERVER">
<tr><td bgcolor="#80f080">Port<td><input type="text" name="port" value="$PORT">
</table>
<input type="submit" name="mode" value="Status">
<input type="submit" name="mode" value="Manage">
<input type="submit" name="mode" value="Settings">
</form>
EOF
footer
}
echo Content-type: text/html
echo
SERVER=`get_query server`
PORT=`get_query port`
MODE=`get_query mode`
case "$MODE" in
Status )
statuspage
;;
Manage )
managepage
;;
Settings )
settingspage
;;
* )
mainpage
;;
esac
syntax highlighted by Code2HTML, v. 0.9.1