X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=gopher.sh;h=56fe265365b16ec7e29ce6272f09764cdea3d22b;hb=bb019694215fbf7f676a13296707cfef20291d78;hp=ea93fbe4da004341280f3853880bc17d88142170;hpb=82e110d3bf009801f4cdcc07465e57fdabfdc011;p=gofetch.git diff --git a/gopher.sh b/gopher.sh index ea93fbe..56fe265 100755 --- a/gopher.sh +++ b/gopher.sh @@ -1,79 +1,117 @@ -#!/bin/bash +#!/bin/sh -# Note: bash is required, sh will fail to output anything to the client -# Probably related to interactions beteween & and output redirections -# -# It seems the timeout on netcat does not work when listening... -# So you will have to either kill the process or make a last connection -# (which will not be processed) +SERVER="$1" +SELECTOR="$2" +PORT="$3" +MODE="$4" -# $0 [prog] ([port]) -# You can use the evironment variable $QUERY_STRING for the query +# Defaults: +[ "$PORT" = "" ] && PORT=70 +if [ "$MODE" = "" ]; then + # "" or dir-like selector? -> 1 ; if not -> 0 + echo "$SELECTOR" | grep "/$" >/dev/null && MODE=1 || MODE=0 + [ "$SELECTOR" = "" ] && MODE=1 +fi -[ "$ADDR" = "" ] && ADDR=127.0.0.1 -[ "$LOG" = "" ] && LOG=/tmp/gopher.service.err -[ "$PIDF" = "" ] && PIDF="`mktemp`" -[ "$TIMEOUT" = "" ] && TIMEOUT=10 -[ "$MAXCON" = "" ] && MAXCON=1024 +if [ "$SERVER" = "" ]; then + echo "Syntax error: $0 [SERVER] ([SELECTOR]) ([PORT]) ([MODE])" >&2 + exit 2 +fi -prog="$1" -port="$2" -defn="$3" -[ "$port" = "" ] && port=70 +LINK_COLOR=2 # can be empty for no escape sequences -if [ "$prog" = "" ]; then - rm "$PIDF" - echo "Syntax: $0 [prog] ([port]) (default non-7)" >&2 - echo ' You can use the evironment variable $QUERY_STRING for the query' >&2 - echo ' The default port is 70' >&2 - echo ' A default message for non-service (7) request can be given' >&2 - echo ' A filename will be displayed, you can delete it to stop the service' >&2 - echo ' (you still have to make a last connection on $port)' >&2 - exit 1 +# Start and end link tags +SL= +EL= +if [ "$LINK_COLOR" != "" ]; then + SL="`tput setf $LINK_COLOR``tput setaf $LINK_COLOR`" + EL="`tput init`"; fi -tmpd=`mktemp -t -d .gopher-service.XXXXXX` -if [ ! -d "$tmpd" ]; then - rm "$PIDF" - echo "Cannot create temporary directory, aborting..." >&2 - exit 2 -fi +# $0 [FILE] +# Display a gopher menu for the given resource +cat_menu() { + i=0 + cat "$1" | grep '^[i0-9]' | while read ln; do + ln="`echo "$ln" | cut -f1`" + if echo "$ln" | grep "^i" >/dev/null 2>&1; then + echo "$ln" | sed "s:^.: :g" + elif echo "$ln" | grep "^[0-9]" >/dev/null 2>&1; then + i=`expr $i + 1` + i=`printf %2.f $i` + field="`echo "$ln" | cut -c1`" + case "$field" in + 0) typ='TXT';; + 1) typ='DIR';; + 7) typ='(?)';; + 8) typ='TEL';; + *) typ='!!!';; + esac + echo "$ln" | sed "s:^.\\(.*\\):$typ $i $SL\\1$EL:g" + #else + # Bad line + fi + done +} -echo "#/bin/sh -# PID: $$ -# PID File (this file): $PIDF -# You can stop the service by deleting this file then making a last -# connection (which will not be processed) to the service: -rm \"$PIDF\" -nc -q0 $ADDR $port 2>/dev/null "$PIDF" +# $0 [FILE] [INDEX] [FIELD] +# Get a field from the given-by-index link in FILE +# +# Fields: +# 1 = type/name +# 2 = selector +# 3 = server +# 4 = port +getsel() { + cat "$1" | grep '^[0-9]' | tail -n+"$2" | head -n 1 | cut -f"$3" +} -chmod u+rx "$PIDF" +tmp="`mktemp -t gofetch.current_page.XXXXXX`" +finish() { + rm -rf "$tmp" +} +trap finish EXIT -echo "$PIDF" +if [ $MODE = 1 ]; then + echo "$SELECTOR" | nc "$SERVER" "$PORT" | sed 's:\r::g' > "$tmp" +else + echo "$SELECTOR" | nc "$SERVER" "$PORT" > "$tmp" +fi -i=0 -while [ -e "$PIDF" ]; do - i=`expr $i + 1` - [ $i -gt "$MAXCON" ] && i=1 - fifo="$tmpd/fifo.$i" - rm -f "$fifo" 2>/dev/null - mkfifo "$fifo" - < "$fifo" nc -l -q0 -w"$TIMEOUT" "$ADDR" -p "$port" | ( - if [ -e "$PIDF" ]; then - read -r query - selector="`echo "$query" | cut -f1 -d' ' | sed 's:[\r\n]::g'`" - query="`echo "$query" | cut -f2 -d' ' | sed 's:[\r\n]::g'`" - if [ "$query" = "" ]; then - if [ "$defn" = "" ]; then - echo "7Search $selector $ADDR $port" - else - echo "$defn" - fi - else - QUERY_STRING="$query" "$prog" 2>> "$LOG" & - fi +case "$MODE" in +0) + cat "$tmp" | less +;; +1) + CHOICE=start + while [ "$CHOICE" != "" ]; do + cat_menu "$tmp" | less + read -p "[$SELECTOR]: " CHOICE + index="`expr 1 \* "$CHOICE" 2>/dev/null`" + if [ "$index" != "" ]; then + goto_server="`getsel "$tmp" $index 3`" + goto_sel="`getsel "$tmp" $index 2`" + goto_port="`getsel "$tmp" $index 4`" + goto_mode="`getsel "$tmp" $index 1 | cut -c1`" + sh "$0" "$goto_server" "$goto_sel" "$goto_port" "$goto_mode" fi - ) > "$fifo" -done -rm -rf "$tmpd" 2>/dev/null + done +;; +7) + read -p "Query: " SEARCH + selQuery="$SELECTOR $SEARCH" + + exec sh "$0" "$SERVER" "$selQuery" "$PORT" 1 +;; +8) + telnet -l "$SELECTOR" "$SERVER" "$PORT" + read DUMMY +;; +9) + echo "" | less +;; +*) + echo "unknwon selector mode: <$MODE>" | less + exit 3 +;; +esac