# shell-script-helper - logging
# Copyright (c) 2023 Raphaël Halimi <raphael.halimi@gmail.com>
# Licence: GPL-3+
# vim: ft=sh

###############################################################################
# Variables
###############################################################################

# Logging
LOG_SYSLOG=0
LOG_TOFILE=0
LOG_HOSTNAME="$(hostname)"
LOG_TAG="$SCRIPT_NAME"

# Log file permissions (Debian defaults)
LOG_FILE_OWNER="root:adm"
LOG_FILE_PERMS="0640"


###############################################################################
# Functions
###############################################################################

# Initialize log
# ARGS: none
init_log () {
  LOG_DEST="STDOUT"
  if [ $LOG_SYSLOG -eq 1 ] ; then
    init_syslog
  elif [ $LOG_TOFILE -eq 1 ] ; then
    init_logfile
  fi
  debug_var LOG_DEST
  if ( ( [ $LOG_SYSLOG -eq 1 ] || [ $LOG_TOFILE -eq 1 ] ) && [ "$LOG_DEST" = "STDOUT" ] ) ; then
    print_message err "No log available, logging to stdout/stderr"
    return 1
  fi
}

# Initialize syslog
# ARGS: none
init_syslog () {
  LOG_DEST="STDOUT"
  print_message info "Trying to log to system log"
  check_bin logger
  if [ -n "$LOGGER_BIN" ] ; then
    # Version < 2.26 had only "--id", >= 2.26 introduced optional "--id[=id]"
    LOGGER_VER="$($LOGGER_BIN -V | sed -E 's/.* ([0-9]+\.[0-9]+).*$/\1/')"
    LOGGER_VER_MAJ="${LOGGER_VER%.*}"
    LOGGER_VER_MIN="${LOGGER_VER#*.}"
    if ( [ $LOGGER_VER_MAJ -gt 2 ] || ( [ $LOGGER_VER_MAJ -eq 2 ] && [ $LOGGER_VER_MIN -ge 26 ] )) ; then
      LOG_ID="=$$"
    fi
    print_message info "Logging to system log"
    LOG_DEST="SYSLOG"
    return 0
  else
    print_message err "Missing binary 'logger', cannot log to system log"
    return 1
  fi
}

# Initialize log file
# ARGS: none
init_logfile () {
  LOG_DEST="STDOUT"
  print_message info "Trying to log to file '${LOG_FILE:=/var/log/$SCRIPT_NAME.log}'"
  if [ ! -e "$LOG_FILE" ] ; then
    touch "$LOG_FILE"
    if [ $? -ne 0 ] ; then
      print_message err "Cannot create logfile '$LOG_FILE'"
      return 1
    else
      [ -n "$LOG_FILE_OWNER" ] && chown "$LOG_FILE_OWNER" "$LOG_FILE"
      [ -n "$LOG_FILE_PERMS" ] && chmod "$LOG_FILE_PERMS" "$LOG_FILE"
    fi
  fi
  exec 3>> "$LOG_FILE"
  if [ $? -eq 0 ] ; then
    print_message info "Logging to file '$LOG_FILE'"
    LOG_DEST="FILE"
    return 0
  else
    print_message err "Cannot open log file '$LOG_FILE' for writing, cannot log to file"
    return 1
  fi
}

# Close log file
# ARGS: none
close_logfile () {
  if [ "$LOG_DEST" = "FILE" ] ; then
    if [ -n "$LOG_FILE" ] ; then
      print_message info "Closing file descriptor 3 (file '$LOG_FILE')"
    else
      print_message warning "Closing file descriptor 3, but 'LOG_FILE variable is empty, something went wrong"
    fi
    exec 3>&-
    LOG_DEST="STDOUT"
  fi
}
