From ccb361e758752ccbefd7bcaaf0c99f61aae47b0d Mon Sep 17 00:00:00 2001 From: KatolaZ Date: Fri, 13 Jul 2018 23:14:46 +0100 Subject: first commit --- gprsh | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ gprsh_serve | 1 + 2 files changed, 122 insertions(+) create mode 100755 gprsh create mode 120000 gprsh_serve diff --git a/gprsh b/gprsh new file mode 100755 index 0000000..f93cf29 --- /dev/null +++ b/gprsh @@ -0,0 +1,121 @@ +#!/bin/sh + +## +## === gprsh === +## +## gprsh is a simple gopher server in a POSIX shell script: +## +## $ ./gprsh [ [] +## +## If PORT is not specified, the default is 70. If GOPHERDIR is not +## specified, "./" is assumed +## +## +## (c) 2018 Vincenzo 'KatolaZ' Nicosia +## +## + +###################### + +## +## If the script is called with basename "gprsh", launch the netcat +## server... +## + +MYNAME=$(basename $0) + +if [ -z "${MYNAME#gprsh}" ]; then + ## we are called as gprsh -- launch the server + + PORT=${1:-70} + GOPHERDIR=${2:-"./"} + + while [ 1 -eq 1 ]; do + netcat -vv -k -l -p ${PORT} -c "./gprsh_serve ${GOPHERDIR}" + ret=$? + done + exit 0 +fi + + +###################### + +## +## ...otherwise, serve a request +## + + +## function +invalid_selector(){ + sel="$1" + echo "iInvalid selector: \"$sel\"" + echo "." + exit 1 +} + +## function +serve_selector(){ + sel="$1" + + cat "${sel}" + echo "." + exit 0 +} + + +### transform a .gph file into a gophermap +## function +serve_index(){ + IDX=$1 + IFS=' +' + while read line; do + rline=$(echo $line | sed -r -e 's/\r//g') + case $rline in + '['*) + echo $rline | sed -r -e 's/\[//g;s/\]//g;s/\|/\t/g;s/\t//;s/$/\r/g' + ;; + *) + echo $line + esac + done < $IDX + exit 0 +} + + + +GOPHERDIR=${1:-"./"} + +read selector + +selector=$(echo $selector | sed -r 's:\r::g' ) + +echo "iGOPHERDIR: ${GOPHERDIR}" +echo "iselector: \"${selector}\"" + +case $selector in + /*|"") + RP1=$(realpath "${GOPHERDIR}"/"${selector}" || "") + RP2=$(realpath "${GOPHERDIR}")"${selector}" + echo "iRP1: ${RP1}" + echo "iRP2: ${RP2}" + #echo "." + + if [ "${RP1}" = "${RP2}" ]; then + if [ -f "${RP1}" ]; then + serve_selector "${RP1}" + elif [ -d "${RP1}" ]; then + [ -f "${RP1}/gophermap" ] && serve_selector "${RP1}/gophermap" + [ -f "${RP1}/index.gph" ] && serve_index "${RP1}/index.gph" + else + echo "3Err Unable to find file ${selector}" + fi + fi + invalid_selector "$selector" + ;; + *) + [ -f "${GOPHERDIR}/gophermap" ] && cat "${GOPHERDIR}/gophermap" && echo "." && exit 0 + invalid_selector "/" + ;; +esac + diff --git a/gprsh_serve b/gprsh_serve new file mode 120000 index 0000000..c280e5b --- /dev/null +++ b/gprsh_serve @@ -0,0 +1 @@ +gprsh \ No newline at end of file -- cgit v1.2.3