#!/bin/bash
##
## Samba: Run Rsync server (rsyncd) for Samba SYSVOL Replication
## Copyright (c) 2020 SATOH Fumiyasu @ OSS Technology Corp., Japan
##
## License: GNU General Public License version 3
##

set -u

run() {
  if [[ -n ${SAMBA_SYSVOL_REPLICATION_RUN_INFO-set} ]]; then
    echo "$0: INFO: Run: $*"
  fi
  "$@"
}

run_or_die() {
  run "$@" || exit $?
}

debug() {
  sed "s#^#$0: DEBUG: #" 1>&2
}

envdir() {
  local envname_prefix='SAMBA_SYSVOL_REPLICATION_'

  local envdir="$1"; shift
  local envfile envname

  for envfile in "$envdir"/*; do
    [[ -f $envfile ]] || continue
    envname="$envname_prefix${envfile##*/}"
    [[ $envname =~ ^[A-Za-z_][A-Za-z_0-9]*$ ]] || continue
    if [[ -s $envfile ]]; then
      ## Prefer external environment variables to envdir
      if eval '[[ -z ${'"$envname"'+set} ]]'; then
	IFS= read -r "$envname" <"$envfile" || return $?
	export "$envname"
      fi
    else
      unset "$envname"
    fi
  done

  return 0
}

if [[ -n ${SAMBA_SYSVOL_REPLICATION_RUN_DEBUG-} ]]; then
  PS4="$0: DEBUG: "
  set -x
fi

## ======================================================================

envdir="${SAMBA_SYSVOL_REPLICATION_RUN_ENVDIR-/opt/osstech/etc/samba/service/sysvol-replication/env}"

if [[ -n $envdir ]]; then
  run_or_die envdir "$envdir"
fi

## ======================================================================

${SAMBA_SYSVOL_REPLICATION_RUN_PRE:+run_or_die source "$SAMBA_SYSVOL_REPLICATION_RUN_PRE"}

rsyncd_command_default="${SAMBA_SYSVOL_REPLICATION_RSYNCD_COMMAND_DEFAULT:-/usr/bin/rsync}"
rsyncd_conf_default="${SAMBA_SYSVOL_REPLICATION_RSYNCD_CONF_DEFAULT:-/opt/osstech/etc/samba/rsyncd.conf}"
rsyncd_port_default="${SAMBA_SYSVOL_REPLICATION_RSYNCD_PORT_DEFAULT:-60000}"

SAMBA_SYSVOL_REPLICATION_RUN_ARGS=(
  ${SAMBA_SYSVOL_REPLICATION_NO_RUN:+true}
  ${SAMBA_SYSVOL_REPLICATION_NICE:+nice -n "$SAMBA_SYSVOL_REPLICATION_NICE"}
  ${SAMBA_SYSVOL_REPLICATION_IONICE:+ionice ${SAMBA_SYSVOL_REPLICATION_IONICE_CLASS:+-c "$SAMBA_SYSVOL_REPLICATION_IONICE_CLASS"} -n "$SAMBA_SYSVOL_REPLICATION_IONICE"}
  ${SAMBA_SYSVOL_REPLICATION_WRAPPER_COMMAND:+"$SAMBA_SYSVOL_REPLICATION_WRAPPER_COMMAND" ${SAMBA_SYSVOL_REPLICATION_WRAPPER_OPTIONS-}}
  "${SAMBA_SYSVOL_REPLICATION_RSYNCD_COMMAND:-$rsyncd_command_default}"
  --daemon \
  --no-detach \
  --port="${SAMBA_SYSVOL_REPLICATION_RSYNCD_PORT:-$rsyncd_port_default}"
  --config="${SAMBA_SYSVOL_REPLICATION_RSYNCD_CONF:-$rsyncd_conf_default}"
  ${SAMBA_SYSVOL_REPLICATION_RSYNCD_OPTIONS-}
)

## ======================================================================

${SAMBA_SYSVOL_REPLICATION_UMASK:+run_or_die umask "$SAMBA_SYSVOL_REPLICATION_UMASK"}
${SAMBA_SYSVOL_REPLICATION_WORKINGDIR:+run_or_die cd "$SAMBA_SYSVOL_REPLICATION_WORKINGDIR"}

## Seconds
${SAMBA_SYSVOL_REPLICATION_LIMIT_CPU:+run_or_die ulimit -t "$SAMBA_SYSVOL_REPLICATION_LIMIT_CPU"}
## Bytes
${SAMBA_SYSVOL_REPLICATION_LIMIT_FSIZE:+run_or_die ulimit -f "$SAMBA_SYSVOL_REPLICATION_LIMIT_FSIZE"}
## Bytes
${SAMBA_SYSVOL_REPLICATION_LIMIT_DATA:+run_or_die ulimit -d "$SAMBA_SYSVOL_REPLICATION_LIMIT_DATA"}
## Bytes
${SAMBA_SYSVOL_REPLICATION_LIMIT_STACK:+run_or_die ulimit -s "$SAMBA_SYSVOL_REPLICATION_LIMIT_STACK"}
## Bytes
${SAMBA_SYSVOL_REPLICATION_LIMIT_CORE:+run_or_die ulimit -c "$SAMBA_SYSVOL_REPLICATION_LIMIT_CORE"}
## Bytes
${SAMBA_SYSVOL_REPLICATION_LIMIT_RSS:+run_or_die ulimit -m "$SAMBA_SYSVOL_REPLICATION_LIMIT_RSS"}
## Number of File
${SAMBA_SYSVOL_REPLICATION_LIMIT_NOFILE:+run_or_die ulimit -n "$SAMBA_SYSVOL_REPLICATION_LIMIT_NOFILE"}
## Bytes
${SAMBA_SYSVOL_REPLICATION_LIMIT_AS:+run_or_die ulimit -v "$SAMBA_SYSVOL_REPLICATION_LIMIT_AS"}
## Number of Processes
${SAMBA_SYSVOL_REPLICATION_LIMIT_NPROC:+run_or_die ulimit -u "$SAMBA_SYSVOL_REPLICATION_LIMIT_NPROC"}
## Bytes
${SAMBA_SYSVOL_REPLICATION_LIMIT_MEMLOCK:+run_or_die ulimit -l "$SAMBA_SYSVOL_REPLICATION_LIMIT_MEMLOCK"}
## Number of Locks
${SAMBA_SYSVOL_REPLICATION_LIMIT_LOCKS:+run_or_die ulimit -x "$SAMBA_SYSVOL_REPLICATION_LIMIT_LOCKS"}
## Number of Queued Signals
${SAMBA_SYSVOL_REPLICATION_LIMIT_SIGPENDING:+run_or_die ulimit -i "$SAMBA_SYSVOL_REPLICATION_LIMIT_SIGPENDING"}
## Bytes
${SAMBA_SYSVOL_REPLICATION_LIMIT_MSGQUEUE:+run_or_die ulimit -q "$SAMBA_SYSVOL_REPLICATION_LIMIT_MSGQUEUE"}
## Nice Level
${SAMBA_SYSVOL_REPLICATION_LIMIT_NICE:+run_or_die ulimit -e "$SAMBA_SYSVOL_REPLICATION_LIMIT_NICE"}
## Realtime Priority
${SAMBA_SYSVOL_REPLICATION_LIMIT_RTPRIO:+run_or_die ulimit -r "$SAMBA_SYSVOL_REPLICATION_LIMIT_RTPRIO"}

${SAMBA_SYSVOL_REPLICATION_RUN_POST:+run_or_die source "$SAMBA_SYSVOL_REPLICATION_RUN_POST"}

if [[ -n ${SAMBA_SYSVOL_REPLICATION_RUN_DEBUG-} ]]; then
  { umask; pwd; ulimit -a; env; } |debug
fi

run_or_die exec "${SAMBA_SYSVOL_REPLICATION_RUN_ARGS[@]}"
