diff --git a/response.sh b/response.sh index 3bc640d..c283505 100755 --- a/response.sh +++ b/response.sh @@ -1,6 +1,8 @@ #!/bin/bash -settingsfile=$1 +ssl="$2" + +settingsfile="$1" eval "$(cat $settingsfile)" # declare settings array . misc.sh @@ -61,7 +63,7 @@ while true; do if test $first = 1; then server[requestMethod]="$(echo "$header" | awk '{ print $1 }')" server[http]="$(echo "$header" | awk '{ print $3 }' | awk -F/ '{ print $2} ')" - server[https]="off" + server[https]="$ssl" server[serverProtocol]="$(echo "$header" | awk '{ print $3 }')" server[request_unchecked]=$(echo "$header" | awk '{ print $2 }') server[requestURI]="$(realpath -sm "${server[request_unchecked]}")" @@ -329,7 +331,7 @@ fi length=$(printf "%s" "$content" | wc -c) if test "${settings[verbose]}" -ge "0"; then - echo "$(date --rfc-3339=ns) - ${server[remoteAddress]}:${server[remotePort]} - ${headers[Host]}${server[queryURI]} - $type - $status - $length bytes" 1>&2 + echo "$(date --rfc-3339=ns) - ${server[remoteAddress]}:${server[remotePort]} - ${headers[Host]}${server[requestURI]} - $type - $status - $length bytes" 1>&2 fi echo -en "HTTP/1.1 $status $(./statusString.sh $status)\r\n" diff --git a/server.sh b/server.sh index e91ce37..760c45d 100755 --- a/server.sh +++ b/server.sh @@ -3,18 +3,31 @@ EXIT_FAILURE=1 EXIT_SUCCESS=0 -port=-1 progname="server" +home="./home/" +name="localhost" +admin="admin@localhost" + +httpPort=-1 +httpsPort=-1 +cert="./server.pem" + help() { cat << EOF -usage: $progname [OPTIONS] --port=PORT +usage: $progname [OPTIONS] Options: - -p, --port=PORT set port - -h, --home=HOME set home directory - -v, --verbose set to verbose mode - -q, --quiet don't output anything + -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. EOF } @@ -27,20 +40,18 @@ echoOnVerbose() { progname="$0" -OPTS=$(getopt -o "p:vqh:n:" -l "port:,verbose,quiet,home:,name:admin:" -- $@) +OPTS=$(getopt -o "p:vqh:n:s:c:" -l "http-port:,verbose,quiet,home:,name:,admin:,https-port:,cert:" -- $@) if test $? != 0; then exit $EXIT_FAILURE fi eval set -- "$OPTS" -home="./home/" -name="localhost" -admin="admin@localhost" - while true; do case "$1" in - -p|--port) port=$2; shift 2;; + -p|--http-port) httpPort=$2; shift 2;; + -s|--https-port) httpsPort=$2; shift 2;; + -c|--cert) cert=$2; shift 2;; -v|--verbose) verboselevel=$(($verboselevel+1)); shift;; -q|--quiet) verboselevel=-1; shift;; -h|--home) home=$2; shift 2;; @@ -50,14 +61,20 @@ while true; do esac done -if test "$port" -lt 1; then +if test "$httpPort" -lt 1 -a "$httpsPort" -lt 1; then help exit $EXIT_FAILURE fi -settingsfile="/dev/shm/wserver-$$" +settingsfile="/dev/shm/wserver-$$.settings" + +logfile="/dev/shm/wserver-$$.log" + +echo -n > "$logfile" + declare -A settings settings[serverDirectory]="$(pwd)" +settings[logFile]="$logfile" settings[home]="$home" settings[name]="$name" settings[admin]="$admin" @@ -69,9 +86,15 @@ settings[server]="ShellSpider V1" settings[index]="true" declare -p settings > $settingsfile -echo "Starting... " -socat $(echoOnVerbose 2 "-vv") tcp-listen:$port,reuseaddr,fork SYSTEM:"./response.sh $settingsfile" > /dev/null - -if test $? != 0; then - exit $EXIT_FAILURE +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 & +fi + +while true; do + tail -f $logfile +done