commit
ccb361e758
@ -0,0 +1,121 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
## |
||||||
|
## === gprsh === |
||||||
|
## |
||||||
|
## gprsh is a simple gopher server in a POSIX shell script: |
||||||
|
## |
||||||
|
## $ ./gprsh [<PORT> [<GOPHERDIR>] |
||||||
|
## |
||||||
|
## If PORT is not specified, the default is 70. If GOPHERDIR is not |
||||||
|
## specified, "./" is assumed |
||||||
|
## |
||||||
|
## |
||||||
|
## (c) 2018 Vincenzo 'KatolaZ' Nicosia <katolaz@freaknet.org> |
||||||
|
## |
||||||
|
## |
||||||
|
|
||||||
|
###################### |
||||||
|
|
||||||
|
## |
||||||
|
## 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 |
||||||
|
|
@ -0,0 +1 @@ |
|||||||
|
gprsh |
Loading…
Reference in new issue