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