#!/bin/sh
##
## Setup a supervised Cyrus SASL saslauthd service
## Copyright (c) 2012 SATOH Fumiyasu @ OSS Technology, Inc.
##               <http://www.osstech.co.jp/>
##               <https://github.com/fumiyas/>
##
## License: GNU General Public License version 2 or later
## Date: 2012-03-09, since 2012-03-09
##

set -u
umask 0022

pdie()
{
  echo "$0: ERROR: $1" 1>&2
  exit 1
}

## Options
## ======================================================================

sv_cmd="/opt/osstech/sbin/saslauthd"
sv_sysconfdir="/opt/osstech/etc/sasl2"
sv_env="
  WORKINGDIR
  NICE
  IONICE
  MEMORYLIMIT
  DATALIMIT
  STACKLIMIT
  OPENFILELIMIT
  COREFILELIMIT
  COMMAND
  ARGV0
  OPTIONS
  GROUP
  AUTHMECHANISM
  AUTHMECHANISMOPTION
  MUXDIR
  THREADS
  CACHESIZE
  CACHETTL
  CACHE
  VERBOSE
"

if [ $# -lt 1 ] || [ $# -gt 3 ]; then
  echo "Usage: $0 /SVDIR [AUTHMECHANISM [AUTHMECHANISMOPTION]]" 1>&2
  exit 1
fi

sv_dir="$1"; shift
sv_authmech="${1-}"; ${1+shift}
sv_authmechopt="${1-}"; ${1+shift}

## Create service directory
## ======================================================================

mkdir "$sv_dir" || exit 1
mkdir "$sv_dir/env" || exit 1

## The "once" is an OSSTech-specific file and is used by
## /etc/init.d/svinit, not for supervise(8).
touch "$sv_dir/down" "$sv_dir/once" || exit 1

for env in $sv_env; do
  touch "$sv_dir/env/$env" || exit 1
done
echo "$sv_cmd" >"$sv_dir/env/COMMAND" || exit 1
echo "$sv_authmech" >"$sv_dir/env/AUTHMECHANISM" || exit 1
echo "$sv_authmechopt" >"$sv_dir/env/AUTHMECHANISMOPTION" || exit 1

## NOTE: $OPENFDLIMIT is for backward compatibility
cat <<'EOT_SV_RUN' >"$sv_dir/run" || exit 1
#!/bin/sh
exec 2>&1
exec envdir ./env sh -c '
  ${WORKINGDIR:+cd} ${WORKINGDIR:+"$WORKINGDIR"}
  echo "PID: $$"
  env |sort |sed "s/^/Environment: /"
  set -- \
    ${NICE:+nice} ${NICE:+-n} ${NICE:+"$NICE"} \
    ${IONICE:+ionice} ${IONICE:+-n} ${IONICE:+"$IONICE"} \
    softlimit \
      ${MEMORYLIMIT:+"-m$MEMORYLIMIT"} \
      ${DATALIMIT:+"-d$DATALIMIT"} \
      ${STACKLIMIT:+"-s$STACKLIMIT"} \
      ${OPENFILELIMIT:+"-o$OPENFILELIMIT"} \
      ${OPENFDLIMIT:+"-o$OPENFDLIMIT"} \
      ${COREFILELIMIT:+"-c$COREFILELIMIT"} \
    argv0 \
    "$COMMAND" \
    "${ARGV0:-sv:`pwd`}" \
      -f \
      -a "${AUTHMECHANISM:-pam}" \
      ${AUTHMECHANISMOPTION:+"-O$AUTHMECHANISMOPTION"} \
      ${MUXDIR:+"-m$MUXDIR"} \
      ${THREADS:+"-n$THREADS"} \
      ${CACHESIZE:+"-s$CACHESIZE"} \
      ${CACHETTL:+"-t$CACHETTL"} \
      ${CACHE:+"-c"} \
      ${VERBOSE:+"-V"} \
      $OPTIONS \
    ;
  ## ksh: Ensure that all commands in the pipeline are terminated
  wait
  echo "Execute: $@"
  exec "$@"
'
EOT_SV_RUN
chmod 0755 "$sv_dir/run" || exit 1

exit 0

