Blob Blame History Raw
#!/bin/sh
###########################################################################
scriptversion="2.1.4 (Debian @DEB_PKG_VERSION@)"
###########################################################################
##
#W gapd                   The SCSCP package             Alexander Konovalov
#W                                                             Steve Linton
##
## gapd [-h host] [-a] [-l] [-u] [-p port] [-t]
##
## The following options may be used to overwrite the default method to
## specify the hostname to run GAP SCSCP server, stated in scscp/config.g :
##
## 1) if '-h host' is specified, then the server will be started at 'host'.
##    'host' may be given as machine name with or without domain or even as
##    'localhost', though we have -l option for that purpose
##
## 2) if '-a' is specified, then the output of the call to 'hostname' will
##    be used as the SCSCP server address
##
## 3) if '-l' is specified, then the server will be started at localhost
##    and will not accept any incoming connections from the outside
##
## 4) if '-u' is specified, the server will be started in a "universal"
##    mode and will accept all incoming connections
##
## The options 1-4 above are incompatible, so in case several of them will
## be given, only the option with the biggest number will be used
##
## If none of the options 1-4 above is stated, the hostname for the server
## will be taken from the scscp/config.g file
##
## Additionally, you may use the following options:
##
## 5) if '-p port' is specified, this will overwrite the default port for
##    the SCSCP server given in scscp/config.g
##
## 6) if '-t' is specified then the output will be redirected to a
##    temporary file, which name will be displayed on screen during
##    startup. Otherwise, by default it will be redirected to /dev/null
##
###########################################################################
##
##  modified on behalf of Debian by Jerome Benoit <calculus@rezozer.net>
##
###########################################################################
scriptname=${0##*/}
###########################################################################
##
## PART 0. DAEMON VARIABLES
##
###########################################################################
##
CONFDIR=/etc/scscp/gap
LOGDIR=/var/log/gapd
LOGFILE=$LOGDIR/gapd.log
##
###########################################################################

###########################################################################
## USAGE
###########################################################################
##
## usage string formatted with help2man in mind
usage="\
Usage: $scriptname [-h HOST|-a|-l|-u] [-p PORT] [-t [MODE]] \
[--infolevel[-scscp|-master] LEVEL] [--help] [--version]

GAP Daemon - GAP SCSCP server daemon

Options:
   -h HOST\tStart at host HOST: HOST may be given as machine name with or
          \twithout domain or as 'localhost' (see option -l for that purpose).
   -a     \tSet server address to the one given by hostname(1).
   -l     \tStart at localhost: reject incoming any connection from the outside.
   -u     \tStart in \`universal' mode: accept all incoming connections.

   -p PORT\tSet server port to PORT, default port set in \`${CONFDIR}/config.g'.

   -t MODE\tRedirect the server session output according to the following MODEs:
          \tMODE=no sink the output to \`/dev/null' (default behaviour);
          \tMODE=log redirect the output to \`${LOGFILE}';
          \tMODE=yes redirect the output to a temporary file, which name is displayed
          \t(and printed to \`${LOGFILE}' for granted users);
          \tthe implicit mode is MODE=yes for backward compatibility.

   --infolevel-scscp LEVEL  \tSet the GAP InfoLevel for SCSCP to LEVEL.
   --infolevel-master LEVEL \tSet the GAP InfoLevel for MasterWorker to LEVEL.
   --infolevel LEVEL        \tIndiscriminately set the GAP InfoLevel_s to LEVEL.

   --help    \tPrint this help text and exit.
   --version \tOutput version information and exit.

"
##
###########################################################################

###########################################################################
##
## PART 1. MODIFY PATHS IF NEEDED
##
###########################################################################
##
##  Define the local call of GAP and call options, if necessary, for
##  example, memory usage, start with the workspace etc. The path may be
##  relative (to start from this directory) or absolute.
##
CGAP=/usr/bin/gap
GAP="$CGAP -b -r"
##
###########################################################################
##
##  Define the configuration file for the SCSCP server. Note that since GAP
##  reads the configuration file immediately before starting SCSCP server,
##  you may redefine in it all variables that were set to their default
##  values in scscp/config.g and scscp/configpar.g files (explicitly or
##  reading your appropriately modified private copies of that files).
##  The path may be relative (to start from this directory) or absolute.
##
SCSCP_CONFIG=${CONFDIR}/server.g
##
##
###########################################################################

###########################################################################
##
## PART 2. YOU NEED NOT TO MODIFY ANYTHING BELOW
##
###########################################################################
##
##  Parse the arguments.
##
autohost="no"
localhost="no"
unimode="no"
use_temp_file="no"
host=";"
port=";"
infolevel_scscp=0
infolevel_master=0

option="yes"
while [ $option = "yes" ]; do
  option="no"
  case $1 in
    -a) shift; option="yes"; autohost="yes";;
    -h) shift; option="yes"; host=":=\""$1"\";"; shift;;
    -l) shift; option="yes"; localhost="yes";;
    -u) shift; option="yes"; unimode="yes";;
    -p) shift; option="yes"; port=":="$1";"; shift;;
    -t) shift; option="yes";
        if [ 0 -lt $# ]; then
          case "$1" in
            -*) ;;
					  *)
              case "$1" in
                l|lo|log) use_temp_file="log" ;;
                n|no) use_temp_file="no" ;;
                y|ye|yes|*) use_temp_file="yes" ;;
              esac
						  shift
              ;;
          esac
				else
				  use_temp_file="yes"
				fi
				;;
		--infolevel-scscp) shift; option="yes"; infolevel_scscp=$1; shift;;
		--infolevel-master) shift; option="yes"; infolevel_master=$1; shift;;
		--infolevel) shift; option="yes";
				infolevel_scscp=$1; shift; infolevel_master=$infolevel_scscp;;
		--help) echo "$usage"; exit $?;;
		--version) echo "$scriptname $scriptversion"; exit $?;;
  esac
done

if [ -n "${TMPDIR}" -a ! -w "${TMPDIR}" ]; then
	unset TMPDIR
fi

case "$use_temp_file" in
	log)
		OUTFILE=${LOGFILE}
		;;
	yes)
		OUTFILE=$(mktemp --quiet --tmpdir gapd-XXXXXXXXXXX.log)
		if [ -w ${LOGFILE} ]; then
			cat >> ${LOGFILE} <<- EOM
				#############################################################
				#D  log: ${OUTFILE}
				EOM
		fi
		echo "Starting SCSCP server with output to ${OUTFILE}"
		;;
	*)
		OUTFILE="/dev/null"
		;;
esac

if [ $autohost = "yes" ]; then
	host=":=Hostname();"
fi;

if [ $localhost = "yes" ]; then
	host=":=false;"
fi;

if [ $unimode = "yes" ]; then
	host=":=true;"
fi;

if [ $infolevel_scscp -lt 0 ]; then
	infolevel_scscp=0
fi;

if [ $infolevel_master -lt 0 ]; then
	infolevel_master=0
fi;

# Check whether ${OUTFILE} is writable
if [ -e ${OUTFILE} ]; then
	if [ ! -w ${OUTFILE} ]; then
		echo "the GAP daemon gapd can not write to the file ${OUTFILE}" 1>&2
		exit 2
	fi
else
	OUTFOLDER=$(dirname ${OUTFILE})
	if [ ! -w ${OUTFOLDER} ]; then
		echo "the GAP daemon gapd can not write into the folder ${OUTFILE}" 1>&2
		exit 2
	fi
fi

# Check whether the GAP system is available
if [ ! -x $CGAP ]; then
	echo "the GAP command-line interface $CGAP can not be executed" 1>&2
	exit 2
fi

# Check whether the server configuration file is readable
if [ ! -r "${SCSCP_CONFIG}" ]; then
	echo "the GAP SCSCP server configuration file ${SCSCP_CONFIG} can not be read" 1>&2
	exit 2
fi

cat >> ${OUTFILE} <<- EOM
	#############################################################
	#D  script: ${0} (${scriptversion})
	#D  date: $(date -u +%Y%m%dT%H%M%S.%NZ)
	#D  host: $(hostname)
	#D  user: $(id -un)
	#D  infolevel: SCSCP: ${infolevel_scscp}
	#D  infolevel: MasterWorker: ${infolevel_master}
	#D  TMPDIR: ${TMPDIR}
	EOM

exec $GAP -q >> ${OUTFILE} 2>&1 <<-EOGS &
	LoadPackage("scscp");;
	SetInfoLevel(InfoSCSCP,${infolevel_scscp});
	SetInfoLevel(InfoMasterWorker,${infolevel_master});
	SCSCPserverAddress${host};
	SCSCPserverPort${port};
	Read("${SCSCP_CONFIG}");
	if SCSCPserverStatus=fail then
			QUIT_GAP();
	fi;
EOGS

###########################################################################
##
#E
##