2017-11-18 00:26:25 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
|
|
|
EXIT_FAILURE=1
|
|
|
|
EXIT_SUCCESS=0
|
|
|
|
|
|
|
|
progname="server"
|
|
|
|
|
2017-11-24 00:43:59 +00:00
|
|
|
home="./home/"
|
|
|
|
name="localhost"
|
|
|
|
admin="admin@localhost"
|
|
|
|
|
|
|
|
httpPort=-1
|
|
|
|
httpsPort=-1
|
|
|
|
cert="./server.pem"
|
|
|
|
|
2017-11-18 00:26:25 +00:00
|
|
|
help() {
|
|
|
|
cat << EOF
|
2017-11-24 00:43:59 +00:00
|
|
|
usage: $progname [OPTIONS]
|
2017-11-18 00:26:25 +00:00
|
|
|
|
|
|
|
Options:
|
2017-11-24 00:43:59 +00:00
|
|
|
-p, --http-port=PORT set unencrypted port
|
|
|
|
-s, --https-port=PORT set encrypted port
|
|
|
|
-c, --cert=CERT set SSL certificate (pem format) (default: ./server.pem)
|
|
|
|
-h, --home=HOME set home directory (default: ./home/)
|
|
|
|
-n, --name=NAME set the name of the server (e.g. example.com) (default: localhost)
|
|
|
|
--admin=ADMIN set the admin mail address (default: admin@localhost)
|
|
|
|
-v, --verbose set to verbose mode
|
|
|
|
-q, --quiet don't output anything (not implemented)
|
|
|
|
|
|
|
|
Ether an encrypted or an unencrypted port (or both) has to be given.
|
2017-11-18 00:26:25 +00:00
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
verboselevel=0
|
|
|
|
echoOnVerbose() {
|
|
|
|
if test "$verboselevel" -ge $1; then
|
|
|
|
echo -n "$2"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
progname="$0"
|
|
|
|
|
2017-11-24 00:43:59 +00:00
|
|
|
OPTS=$(getopt -o "p:vqh:n:s:c:" -l "http-port:,verbose,quiet,home:,name:,admin:,https-port:,cert:" -- $@)
|
2017-11-18 00:26:25 +00:00
|
|
|
if test $? != 0; then
|
|
|
|
exit $EXIT_FAILURE
|
|
|
|
fi
|
|
|
|
|
|
|
|
eval set -- "$OPTS"
|
|
|
|
|
|
|
|
while true; do
|
|
|
|
case "$1" in
|
2017-11-24 00:43:59 +00:00
|
|
|
-p|--http-port) httpPort=$2; shift 2;;
|
|
|
|
-s|--https-port) httpsPort=$2; shift 2;;
|
|
|
|
-c|--cert) cert=$2; shift 2;;
|
2017-11-18 00:26:25 +00:00
|
|
|
-v|--verbose) verboselevel=$(($verboselevel+1)); shift;;
|
|
|
|
-q|--quiet) verboselevel=-1; shift;;
|
|
|
|
-h|--home) home=$2; shift 2;;
|
2017-11-21 21:33:36 +00:00
|
|
|
-n|--name) name=$2; shift 2;;
|
|
|
|
--admin) admin=$2; shift 2;;
|
2017-11-18 00:26:25 +00:00
|
|
|
--) shift; break;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
2017-11-24 00:43:59 +00:00
|
|
|
if test "$httpPort" -lt 1 -a "$httpsPort" -lt 1; then
|
2017-11-18 00:26:25 +00:00
|
|
|
help
|
|
|
|
exit $EXIT_FAILURE
|
|
|
|
fi
|
|
|
|
|
2017-11-24 00:43:59 +00:00
|
|
|
settingsfile="/dev/shm/wserver-$$.settings"
|
|
|
|
|
|
|
|
logfile="/dev/shm/wserver-$$.log"
|
|
|
|
|
|
|
|
echo -n > "$logfile"
|
|
|
|
|
2017-11-18 00:26:25 +00:00
|
|
|
declare -A settings
|
2017-11-18 22:52:03 +00:00
|
|
|
settings[serverDirectory]="$(pwd)"
|
2017-11-24 00:43:59 +00:00
|
|
|
settings[logFile]="$logfile"
|
2017-11-18 22:52:03 +00:00
|
|
|
settings[home]="$home"
|
2017-11-21 21:33:36 +00:00
|
|
|
settings[name]="$name"
|
|
|
|
settings[admin]="$admin"
|
2017-11-18 00:26:25 +00:00
|
|
|
settings[verbose]=$verboselevel
|
2017-11-21 21:33:36 +00:00
|
|
|
settings[shellExec]="sh"
|
|
|
|
settings[cgiExec]="cgi"
|
|
|
|
settings[phpExec]="php"
|
2017-11-18 00:34:35 +00:00
|
|
|
settings[server]="ShellSpider V1"
|
2017-11-18 00:26:25 +00:00
|
|
|
settings[index]="true"
|
|
|
|
declare -p settings > $settingsfile
|
|
|
|
|
2017-11-24 00:43:59 +00:00
|
|
|
if test ! "$httpPort" -lt 1; then
|
|
|
|
echo "Starting unencrypted on port $httpPort ..."
|
|
|
|
socat $(echoOnVerbose 2 "-vv") tcp-listen:$httpPort,reuseaddr,fork SYSTEM:"./response.sh $settingsfile off" > /dev/null &
|
|
|
|
fi
|
|
|
|
if test ! "$httpsPort" -lt 1; then
|
|
|
|
echo "Starting encrypted on port $httpsPort ..."
|
|
|
|
socat $(echoOnVerbose 2 "-vv") openssl-listen:$httpsPort,verify=0,cert="$cert",reuseaddr,fork SYSTEM:"./response.sh $settingsfile on" > /dev/null &
|
2017-11-18 00:26:25 +00:00
|
|
|
fi
|
2017-11-24 00:43:59 +00:00
|
|
|
|
|
|
|
while true; do
|
|
|
|
tail -f $logfile
|
|
|
|
done
|