#!/bin/bash

CONFFILE=/etc/syslogd.conf
DATASYNC=0
LOGDIR=/var/log
PIDFILE=/run/syslogd.pid
RESTART=0

classify() {
  if (( LEVEL > 6 )); then
    FACILITY=debug
  elif [[ $FACILITY == auth* ]]; then
    FACILITY=auth
  elif [[ $FACILITY != @(kern|mail) ]]; then
    FACILITY=daemon
  fi
}

log() {
  if [[ ! -d $LOGDIR/$FACILITY ]]; then
    [[ $FACILITY == debug ]] && return
    mkdir -m 0700 -p "$LOGDIR/$FACILITY"
  fi
  printf '%s %s\n' "$TIME" "$ENTRY" >>"$LOGDIR/$FACILITY/$DATE"
  (( DATASYNC )) && sync -d "$LOGDIR/$FACILITY/$DATE"
}

while getopts :d:f:kp:s OPTION; do
  case $OPTION in
    d)
      LOGDIR=$OPTARG
      ;;
    f)
      CONFFILE=$OPTARG
      ;;
    k)
      classify() (( PEERPID ))
      log() {
        printf '<%d>%s\n' $((LEVEL + 24)) "$ENTRY" >>/dev/kmsg
      }
      ;;
    p)
      PIDFILE=$OPTARG
      ;;
    s)
      DATASYNC=1
      ;;
  esac
done

if [[ -f $CONFFILE ]] && ! source "$CONFFILE"; then
  exit 1
fi

if [[ ${*:$OPTIND} != "-" ]]; then
  if { exec 3>>"$PIDFILE" && flock -n 3; } 2>/dev/null; then
    exec daemon syslog "$0" "${@:1:OPTIND - 1}" -
    rm -f "$PIDFILE"
  else
    echo "Failed to lock $PIDFILE; is ${0##*/} already running?" >&2
  fi
  exit 1
fi

trap 'RESTART=0 && exit' SIGTERM
trap 'RESTART=1 && exit' SIGHUP SIGINT SIGUSR1 SIGUSR2
trap '(( RESTART )) && exec "$0" "$@" || rm -f "$PIDFILE"' EXIT

echo $PPID >"$PIDFILE"
exec 3>&-

while read -r PEERPID PEERUID PEERGID FACILITY LEVEL DATE TIME ENTRY; do
  classify && log
done
