#!/bin/sh
#####################################################################
# tirph - Generate TIR gophermap from file system on SDF
#
# Copyright 2010 David Meyer. All rights reserved. +JMJ
#
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
# PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
# OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#####################################################################
# Identification ####################################################
PROGRAM='tirph'
VERSION=1.0
COPYRIGHT='Copyright 2010 David Meyer'
DESCRIPTION='Generate TIR gophermap from file system on SDF'
USAGE="Usage: $PROGRAM [-CPVh] [-n NUM] [-o OUTFILE] [-p PHLOGDIR] [DIR]"
CONTACT='David Meyer <
[email protected]>'
# Initialize environment ############################################
IFS="
"
PATH=/bin:/usr/bin:/usr/pkg/bin
SERVER=sdf.org
PORT=70
NEXUSSEL=/users/$USER
NEXUSPATH=/ftp/pub/users/$USER
FORTUNE=/usr/games/fortune
# Arguments #########################################################
while getopts CPn:o:p:Vh option; do
case $option in
C ) NOCONTENTS=1 ;;
P ) NOPHLOG=1 ;;
n ) NUM=$OPTARG ;;
o ) OUTFN=$OPTARG ;;
p ) PHLOGDIR=$OPTARG ;;
V ) echo "$PROGRAM $VERSION"
echo $COPYRIGHT
exit 0
;;
h ) cat << ENDHELP
$USAGE
$DESCRIPTION.
DIR ...
Options are as follows:
-p PHLOGDIR
-n NUM
-o OUTFN
-C Suppress output of directory contents section.
-P Suppress output of phlog section.
-V Display version number
-h Display this help message
Files:
DIR/.title
DIR/.descripton
DIR/.gophhead
DIR/.gophfoot
DIR/.exits
Report bugs to $CONTACT.
ENDHELP
exit 0
;;
* ) echo $USAGE >&2
exit 1
;;
esac
done
shift $(( $OPTIND-1 ))
DIR=${1:-""}
: ${NUM:=10}
: ${OUTFN:=gophermap}
: ${PHLOGDIR:=""}
# Functions #########################################################
# ftitle() - Return title for file or subdirectory
ftitle() {
bn=$(basename $1)
if [ -d $1 ]; then
if [ -f $1/.title ]; then
ftitle=$(cat $1/.title)
else
ftitle=$bn
fi
else
fn=${bn%.*}
fext=${bn##*.}
case $fext in
txt | org | blink )
ftitle=$(head -n 1 $1)
;;
html | htm | shtml )
ftitle=$(grep -i "\<h1\>" $1 | head -n 1 | sed -e "s;</*[hH]1>;;g")
: ${ftitle:=$fn}
;;
* )
ftitle=$bn
;;
esac
fi
echo $ftitle
}
# gtype() - Return Gopher item type
gtype() {
if [ -d $1 ]; then
gtype=1
else
fext=${1##*.}
case $fext in
txt | org ) gtype=0 ;;
html | htm | shtml | blink ) gtype=h ;;
jpg | jpeg | png ) gtype=I ;;
gif ) gtype=g ;;
* ) gtype=0 ;;
esac
fi
echo $gtype
}
# blink_map() - Output gopher menu entry for blink file
blink_map() {
bfile=$1
btpre=${2:-""}
btpost=${3:-""}
btitle=""
buri=""
cat $bfile | while read bline; do
if [ -z "$btitle" ]; then
btitle=$bline
if [ "$btpre" ]; then btitle="$btpre $btitle"; fi
if [ "$btpost" ]; then btitle="$btitle $btpost"; fi
elif [ -z "$buri" ]; then
buri=$bline
echo "h$btitle URL:$buri" >>$OUTFILE
else
if [ "$buri" -a "$bline" ]; then
echo $bline >>$OUTFILE
fi
fi
done
}
# Main driver #######################################################
if [ "$DIR" ]; then
DIRPATH=$NEXUSPATH/$DIR
DIRSEL=$NEXUSSEL/$DIR
else
DIRPATH=$NEXUSPATH
DIRSEL=$NEXUSSEL
fi
OUTFILE=$DIRPATH/$OUTFN
# Backup output file ...
if [ -f $OUTFILE ]; then
mv $OUTFILE $OUTFILE~
touch $OUTFILE
chmod 750 $OUTFILE
fi
# Directory title ...
if [ -f $DIRPATH/.title ]; then
cat $DIRPATH/.title >>$OUTFILE
echo "" >>$OUTFILE
fi
# Directory description ...
if [ -f $DIRPATH/.description ]; then
cat $DIRPATH/.description >>$OUTFILE
echo "" >>$OUTFILE
fi
# Link to nexus directory (top) ...
if [ "$DIR" ]; then
echo "1(to nexus) $NEXUSSEL $SERVER $PORT" >>$OUTFILE
echo "" >>$OUTFILE
fi
# Gopher-specific header ...
if [ -f $DIRPATH/.gophhead ]; then
cat $DIRPATH/.gophhead >>$OUTFILE
fi
# Phlog ...
if [ -z "$NOPHLOG" ]; then
if [ "$PHLOGDIR" ]; then
PHLOGPATH=$NEXUSPATH/$PHLOGDIR
PHLOGSEL=$NEXUSSEL/$PHLOGDIR
else
PHLOGPATH=$NEXUSPATH
PHLOGSEL=$NEXUSSEL
fi
ls -lt $(find $PHLOGPATH -type f -name "[^\.]*") | grep -Ev "~$|#.*#$|gophermap$" | head -n $NUM | while read perm lc own gr sz t1 t2 t3 fn; do
if [ -z "$phloginit" ]; then
echo "" >>$OUTFILE
echo "RECENT ACTIVITY:" >>$OUTFILE
phloginit=1
fi
ft=$(ftitle $fn)
loc=$(basename $(dirname $fn))
case $fn in
*.blink )
blink_map $fn "$t1 $t2 $t3" "[$loc]" >>$OUTFILE
;;
* )
echo "0$t1 $t2 $t3 $ft [$loc] $PHLOGSEL${fn#$PHLOGPATH}" >>$OUTFILE
;;
esac
done
fi
# Directory contents ...
if [ -z "$NOCONTENTS" ]; then
ls $DIRPATH | grep -Ev "~$|^#.*#$|^gophermap$" | while read fn; do
if [ -z "$continit" ]; then
echo "" >>$OUTFILE
echo "YOU SEE HERE:" >>$OUTFILE
continit=1
fi
case $fn in
*.blink )
blink_map $DIRPATH/$fn
;;
* )
type=$(gtype $DIRPATH/$fn)
title=$(ftitle $DIRPATH/$fn)
echo "$type$title $DIRSEL/$fn $SERVER $PORT" >>$OUTFILE
;;
esac
done
fi
# Exits ...
if [ -f $DIRPATH/.exits ]; then
cat $DIRPATH/.exits | while read exit tag; do
if [ -z "$exitinit" ]; then
echo "" >>$OUTFILE
echo "OBVIOUS EXITS:" >>$OUTFILE
exitinit=1
fi
if [ "$exit" -a -d $NEXUSPATH/$exit ]; then
title=$(ftitle $NEXUSPATH/$exit)
if [ "$tag" ]; then
title="($tag) "$title
fi
echo "1$title $NEXUSSEL/$exit $SERVER $PORT" >>$OUTFILE
fi
done
fi
# Gopher-specific footer ...
if [ -f $DIRPATH/.gophfoot ]; then
echo "" >>$OUTFILE
cat $DIRPATH/.gophfoot >>$OUTFILE
fi
# Link to nexus directory (bottom) ...
if [ "$DIR" ]; then
echo "" >>$OUTFILE
echo "1(to nexus) $NEXUSSEL $SERVER $PORT" >>$OUTFILE
fi
# Fortune cookie ...
if [ "$FORTUNE" ]; then
echo "" >>$OUTFILE
$FORTUNE >>$OUTFILE
fi
exit 0