#!/bin/sh
#
# File:         install
#
# Author:       Ulli Horlacher (framstag@rus.uni-stuttgart.de)
#
# History:      
#
#  18 Sep 95   Framstag		initial version (insserv)
#  24 Oct 95   Framstag		changed SAFT-port
#  25 Nov 95   Framstag		new version: install
#  18 Dec 95   Framstag		better error checking
#  21 Dec 95   Framstag		new default for nosendfile: 
# 				/usr/local/etc/
#  24 Mar 96   Framstag		added utf7encode binary
#   4 Apr 96   Framstag		better HP-UX support
#  23 Jun 96   Framstag		added INLOG and OUTLOG
#  13 Sep 96   Framstag		added $BINDIR to check_sendfile
#                       	better /etc/inetd.conf parsing
#  24 Feb 97   Framstag		fixed MANDIR
#  20 Mar 97   Framstag		added Amiga support
#  18 Jun 97   Framstag		added check for new sendfile.cf
#  30 Sep 97   Framstag		better (own) spool free-space check
#  22 Nov 97   Framstag		added sfconf
#  23 Nov 97   Framstag		moved NOSENDFILE to ALLOW and DENY files
#				added sfdconf
#   5 Jan 98   Framstag		better sfdconf installation
#
# Shell script to install the server, the clients and the man-pages for the 
# sendfile service. It also configures /etc/inetd.conf, /etc/services,
# /etc/profile and /etc/csh.login
# This script is called by make.
#
# If you want to change the default directories look in file build.
# You should not edit this file!
#
# This file is covered by the GNU General Public License


mkdir_recursive() {
  if [ ! -d $1 ]; then
    mkdir `echo $1 | 
           awk -F/ '{ for (i=2; $i!=""; i++)
                      { for (j=2; j<=i; j++) printf("/"$j)
  		        printf(" ") } }'
          ` 2>/dev/null
  fi
}


make_man() {
  sed "s:/usr/local/etc/sendfile.allow:$ALLOW:
       s:/usr/local/etc/sendfile.deny:$DENY:
       s:/usr/local/etc/sendfile.cf:$CONFIG:
       s:/var/spool/sendfile:$SPOOL:
      " doc/$1 >$MANDIR/$2/$1
}


SYSTEM=$1
RESTART=false

if [ "$SYSTEM" = "" ]; then 
  echo "To invoke install, type: make install"
  exit
fi

if [ "$LOGNAME" != root ]; then
  if [ "`whoami`" != root ]; then
    echo
    echo "You are not root! You probably run into problems now..."
    echo
  fi
fi

eval `awk -F\" '/define BINDIR/    {print "BINDIR="$2} 
                /define MANDIR/    {print "MANDIR="$2} 
                /define SERVERDIR/ {print "SERVERDIR="$2}
                /define SPOOL/     {print "SPOOL="$2}
                /define CONFIG/    {print "CONFIG="$2}
                /define DENY/	   {print "DENY="$2}
                /define ALLOW/	   {print "ALLOW="$2}
                /define ALIASES/   {print "ALIASES="$2}
                /define INLOG/     {print "INLOG="$2}
                /define OUTLOG/    {print "OUTLOG="$2}
	       ' src/globals.h`

if [ "$BINDIR" = "" ]; then	BINDIR=/usr/local/bin; fi
if [ "$MANDIR" = "" ]; then	MANDIR=/usr/local/man; fi
if [ "$SERVERDIR" = "" ]; then	SERVERDIR=/usr/local/sbin; fi
if [ "$CONFIG" = "" ]; then	CONFIG=/usr/local/etc/sendfile.cf; fi
if [ "$DENY" = "" ]; then	DENY=/usr/local/etc/sendfile.deny; fi
if [ "$ALLOW" = "" ]; then	ALLOW=/usr/local/etc/sendfile.allow; fi
if [ "$ALIASES" = "" ]; then	ALIASES=/usr/local/etc/sendfile.aliases; fi
if [ "$SPOOL" = "" ]; then	SPOOL=/var/spool/sendfile; fi
if [ "$INLOG" = "" ]; then	INLOG=$SPOOL/LOG/in; fi
if [ "$OUTLOG" = "" ]; then	OUTLOG=$SPOOL/LOG/out; fi
if [ "$INETDCONF" = "" ]; then	INETDCONF=/etc/inetd.conf; fi
if [ "$SERVICES" = "" ]; then	SERVICES=/etc/services; fi

cat <<EOD
WARNING: this sendfile install script will create or write to:

	spool directory =	$SPOOL
	binary directory =	$BINDIR
	manual directory =	$MANDIR
	sendfiled directory =	$SERVERDIR
	configuration files =	$CONFIG
				$DENY

In /etc/services and /etc/inetd.conf apropriate ads will be inserted.
In /etc/profile and /etc/csh.login a call to sendfile_check will be added.

To deinstall the sendfile-daemon, simply type: 	rm $SERVERDIR/sendfiled

EOD
echo 'If you are satisfied with these defaults, then type "ok" now:'
read answer
if [ "$answer" != ok ]; then
  echo
  echo "You can install sendfile manually, too. Please type: more doc/README"
  echo
  exit
fi

umask 022

echo "checking for directories"
mkdir_recursive $BINDIR
mkdir_recursive $MANDIR/man1
mkdir_recursive $SERVERDIR
mkdir_recursive `dirname $DENY`
mkdir_recursive `dirname $CONFIG`
mkdir $MANDIR/man7 $MANDIR/man8 2>/dev/null

echo "installing the clients in $BINDIR"
cd etc || exit 1
sed "s:/usr/local/etc/sendfile.cf:$CONFIG:
     s:/var/spool/sendfile:$SPOOL:" sf_cleanup \
     > $BINDIR/sf_cleanup
sed "s:SPOOL=/var/spool/sendfile:SPOOL=$SPOOL:
     s:INLOG=/var/spool/sendfile/LOG/in:INLOG=$INLOG:
     s:OUTLOG=/var/spool/sendfile/LOG/in:OUTLOG=$OUTLOG:
     s:CONFIG=/usr/local/etc/sendfile.cf:CONFIG=$CONFIG:
     s:ALIASES=/usr/local/etc/sendfile.aliases:ALIASES=$ALIASES:
     s:DENY=/usr/local/etc/sendfile.deny:DENY=$DENY:
     s:ALLOW=/usr/local/etc/sendfile.allow:ALLOW=$ALLOW:
    " sfdconf \
    | awk '{if ($0 != "CONFIG") print $0; else system("cat sendfile.cf")}' \
    > $BINDIR/sfdconf
sed "s:/var/spool/sendfile:$SPOOL:" sfconf >$BINDIR/sfconf
sed "s:receive :$BINDIR/receive :" check_sendfile >$BINDIR/check_sendfile
cd ../src || exit 1
cp sendfile sendmsg receive utf7encode fetchfile wlock $BINDIR/
cd ..
(cd $BINDIR
 ln -s utf7encode utf7decode 2>/dev/null
 chmod 755 sfconf sfdconf <sf_cleanup check_sendfile \
           sendfile sendmsg receive fetchfile utf7encode)

echo "installing the man-pages in $MANDIR/*"
make_man sendfile.1 man1
make_man sendmsg.1 man1
make_man receive.1 man1
make_man fetchfile.1 man1
make_man fetchfile.7 man7
make_man sendfiled.8 man8

SENDFILED=`awk '/^saft/ { sfd=$6;
                          if (index($7,"/sendfiled")>0) sfd=$7;
                          if (substr(sfd,1,1)=="?") sfd=substr(sfd,2);
                          print sfd;
                        }' $INETDCONF`
if [ "$SENDFILED" != "$SERVERDIR/sendfiled" -a "$SENDFILED" != "" ]; then
  echo "WARNING: you have specified $SENDFILED in $INETDCONF, but"
  echo "         there is $SERVERDIR/sendfiled in makeconfig! Check it!"
fi
echo "installing the sendfile-daemon in $SERVERDIR"
cp src/sendfiled $SERVERDIR  || exit 1

NOSENDFILE=`dirname $DENY 2>/dev/null`/nosendfile
if [ -f $NOSENDFILE ]; then 
  if grep ^allow-only $NOSENDFILE >/dev/null; then 
    echo "Information: $NOSENDFILE is now $ALLOW (autoconverted)"
    grep -v ^allow-only $NOSENDFILE > $ALLOW
  else  
    echo "Information: $NOSENDFILE is now $DENY (autoconverted)"
    mv $NOSENDFILE $DENY
  fi
fi
if [ ! -f $DENY -a ! -f $ALLOW ]; then 
  echo "installing the sendfile deny file as $DENY"
  cp etc/sendfile.deny $DENY
  chmod 644 $DENY
fi

if [ ! -f $CONFIG ]; then 
  echo "installing the global sendfile config file as $CONFIG"
  cp etc/sendfile.cf $CONFIG
  chmod 644 $CONFIG
else 
  if [ "`diff etc/sendfile.cf $CONFIG`" ]; then
    echo "Warning: `pwd`/etc/sendfile.cf differs from $CONFIG !"
    echo "Please take a look what has been changed!"
  fi
fi

if [ "$SYSTEM" = NEXT ]; then
  SERVICE="`nidump services . | awk '/[ \t]487\/tcp/'`"
else
  SERVICE="`awk '/[ \t]487\/tcp/' /etc/services`"
fi
if [ "$SERVICE" != "" ]; then
  case "$SERVICE" in 
    saft*)	;;
    *)		echo "ERROR: tcp-port 487 is already in use!"; exit 1;;
  esac
else
  if [ "$SYSTEM" = NEXT ]; then
    echo "configuring services"
    echo "saft	487/tcp		# simple asynchronous file transfer" | niload services .
  else
    echo "configuring $SERVICES"
    echo "#" >>$SERVICES
    echo "saft	487/tcp		# simple asynchronous file transfer" >>$SERVICES
  fi
fi

if [ "$SENDFILED" = "" ]; then
  if [ -f /usr/sbin/tcpd ]; then 
    SFD="/usr/sbin/tcpd $SERVERDIR/sendfiled"
  else
    SFD="$SERVERDIR/sendfiled sendfiled"
  fi
  RESTART=true
  echo "configuring $INETDCONF"
  echo "#" >>$INETDCONF
  echo "# simple asynchronous file transfer" >>$INETDCONF
  echo "saft	stream	tcp	nowait	root	$SFD" >>$INETDCONF
fi

if [ -f /etc/inetd.sec ]; then
  if [ "`grep '^saft' /etc/inetd.sec`" = "" ]; then
    echo >> /etc/inetd.sec
    echo "saft allow" >> /etc/inetd.sec
  fi
fi

if [ -f /etc/profile ]; then
  if [ "`grep check_sendfile /etc/profile`" = "" ]; then
    echo "adding check_sendfile to /etc/profile"
    echo >>/etc/profile
    echo test -x $BINDIR/check_sendfile && $BINDIR/check_sendfile >>/etc/profile
  fi
fi
if [ -f /etc/csh.login ]; then
  if [ "`grep check_sendfile /etc/csh.login`" = "" ]; then
    echo "adding check_sendfile to /etc/csh.login"
    echo >>/etc/csh.login
    echo test -x $BINDIR/check_sendfile && $BINDIR/check_sendfile >>/etc/profile
  fi
fi
				
if [ ! -d "$SPOOL/OUTGOING" ]; then
  echo "creating $SPOOL"
  mkdir_recursive $SPOOL/OUTGOING
  chmod 755  $SPOOL || exit 1
  chmod 1777 $SPOOL/OUTGOING
fi
if [ ! -d `dirname "$INLOG"` ]; then 
  mkdir_recursive `dirname $INLOG`
  chmod 700 `dirname $INLOG`
fi
if [ ! -d `dirname "$OUTLOG"` ]; then 
  mkdir_recursive `dirname $OUTLOG`
  chmod 700 `dirname $OUTLOG`
fi
if [ ! -f "$INLOG" ]; then 
  echo "# use \"utf7decode $INLOG\" to view this file" > $INLOG
  echo >> $INLOG
  chmod 600 $INLOG
fi
if [ ! -f "$OUTLOG" ]; then 
  echo "# use \"utf7decode $OUTLOG\" to view this file" > $OUTLOG
  echo >> $OUTLOG
  chmod 600 $OUTLOG
fi

free=`$SERVERDIR/sendfiled -f`
minfree=`awk '/minfree =/{print $3}' $CONFIG`
if [ "$free" -le "$minfree" ]; then
  cat <<EOD
		! WARNING ! 
You have not enough free disk space in $SPOOL !
Either give the spool directory more space or lower the value for the 
minfree option in $CONFIG
EOD
fi

echo
echo "You may want to add the following line to your system bootup script:"
echo "    $SERVERDIR/sendfiled -Q"
echo "This will start an outgoing spooling sendfile daemon on boot time"
echo "which processes any old files in the outgoing spool."
echo

if [ "$RESTART" = true ]; then
  echo
  echo "please restart now your inetd ( or simply reboot :-) )"
  echo
fi
