#!/bin/sh
#
# File:         install
#
# Author:       Ulli Horlacher (framstag@rus.uni-stuttgart.de)
#
# Contribs:	Stefan Zehl (sec@42.org)
#               Michael Neumayer (eumel@42.org)
#
# History:      
#
#  1995-09-18 Framstag		initial version (insserv)
#  1995-10-24 Framstag		changed SAFT-port
#  1995-11-25 Framstag		new version: install
#  1995-12-18 Framstag		better error checking
#  1995-12-21 Framstag		new default for nosendfile: 
# 				/usr/local/etc/
#  1996-03-24 Framstag		added utf7encode binary
#  1996-04-04 Framstag		better HP-UX support
#  1996-06-23 Framstag		added INLOG and OUTLOG
#  1996-09-13 Framstag		added $BINDIR to check_sendfile
#                       	better /etc/inetd.conf parsing
#  1997-02-24 Framstag		fixed MANDIR
#  1997-03-20 Framstag		added Amiga support
#  1997-06-18 Framstag		added check for new sendfile.cf
#  1997-09-30 Framstag		better (own) spool free-space check
#  1997-11-22 Framstag		added sfconf
#  1997-11-23 Framstag		moved NOSENDFILE to ALLOW and DENY files
#				added sfdconf
#  1998-01-05 Framstag		better sfdconf installation
#  1998-02-27 sec		added reinstall option
#  1998-03-01 sec		fixed "text file busy"
#  1998-03-06 Framstag		better man sections locations
#  1998-03-13 Eumel		fixed rm-logfile-bug
#  1998-04-17 sec		better man-section detection
#  1998-09-29 Framstag		added ewl
#  1999-01-28 Framstag		added symlinks: sf sm rf
#  2005-05-30 Framstag		added xinetd detection
#
# Shell script to install the server, the clients and the man-pages for the 
# sendfile service. It also configures /etc/inetd.conf, /etc/xinetd.d/sendfile,
# /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_dirs() {
  mkdir_recursive $BINDIR
  mkdir_recursive $MANDIR/man1
  mkdir_recursive $SERVERDIR
  mkdir_recursive `dirname $DENY`
  mkdir_recursive `dirname $CONFIG`
  mkdir $MANDIR/man$manmisc $MANDIR/man$manadmin 2>/dev/null
}

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.$2 >$MANDIR/man$3/$1.$3
}

install_man() {
  make_man sendfile 1 1
  make_man sendmsg 1 1
  make_man receive 1 1
  make_man fetchfile 1 1
  make_man fetchfile 7 $manmisc
  make_man sendfiled 8 $manadmin
  cp doc/wlock.1 doc/utf7encode.1 $MANDIR/man1
  (cd $MANDIR/man1; ln -s utf7encode.1 utf7decode.1 2>/dev/null)
}

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

if [ -f /etc/xinetd.conf -a -d /etc/xinetd.d ]; then
  INETDCONF=/etc/xinetd.d/sendfile
fi  

case "$SYSTEM" in
  *BSD*) manmisc=7; manadmin=8;;
      *) manmisc=5; manadmin=1m;;
esac

# purge old logfiles (bug from sendfile revision < 19980310)
rm -f $SPOOL*/.sendfile*.log

if [ "$2"  = "reinstall" ] ; then
	umask 022
	cd src || exit 1
	make_dirs
	cp sendfile sendmsg receive utf7encode fetchfile wlock $BINDIR/
	[ -x $SERVERDIR/sendfiled ] && mv $SERVERDIR/sendfiled $SERVERDIR/sendfiled.old && rm -f $SERVERDIR/sendfiled.old
	cp sendfiled $SERVERDIR
	cd ../etc
	cp sfconf sfdconf $BINDIR/
	cd ..
	install_man
	echo Done.
	exit 0
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 -f $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"
make_dirs

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
 ln -s sendfile sf 2>/dev/null
 ln -s sendmsg  sm 2>/dev/null
 ln -s receive  rf 2>/dev/null
 chmod 755 sfconf sfdconf <sf_cleanup check_sendfile \
           sendfile sendmsg receive fetchfile utf7encode)

echo "installing the man-pages in $MANDIR/*"
install_man

echo "installing the sendfile-daemon in $SERVERDIR"
[ -x $SERVERDIR/sendfiled ] && mv $SERVERDIR/sendfiled $SERVERDIR/sendfiled.old && rm -f $SERVERDIR/sendfiled.old
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

case "$INETDCONF" in
  *xinetd*) 
    if [ -f $INETDCONF ]; then
      echo $INETDCONF does already exist -skipping
    else
      echo installing $INETDCONF
      sed "s:/usr/local/sbin/sendfiled:$SERVERDIR/sendfiled:" etc/xinetd >$INETDCONF
      RESTART=true
    fi
    SENDFILED=`awk '/[ \t]*server[ \t]*=/ { print $3 }' $INETDCONF`
    ;;  
  *) 
    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" = "" ]; 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
    ;;  
esac

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

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/csh.login
  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
  if [ -f /etc/init.d/xinetd ]; then
    echo reloading xinetd:
    if fgrep reload\) /etc/init.d/xinetd >/dev/null; then
      /etc/init.d/xinetd reload
    else
      /etc/init.d/xinetd stop
      /etc/init.d/xinetd start
    fi
  else
    echo
    echo "please restart now your inetd ( or simply reboot :-) )"
    echo
  fi
fi
