#!/bin/bash
#
# /usr/lib/postfix/systemd/update_chroot
#
# Description:
#
##############################################################################
#
# functions
#

warn_user() {
  tput bold
  echo -e "\t*** WARNING ***"
  echo -e "${1}"
  echo -e "\t*** WARNING ***"
  tput sgr0
}

chk_dkim_sock() {
  local -i RET=0
  DKIM_SOCKET=$(awk -F':' '/^Socket(\s|\t)+local/ {print $2}' /etc/opendkim/opendkim.conf)
  
  if [[ -n "${DKIM_SOCKET}" ]]; then
    [[ "${DKIM_SOCKET}" =~ ^/var/run ]] && DKIM_SOCKET="${DKIM_SOCKET#/var}"
    DKIM_SOCKET_DIR="${DKIM_SOCKET%/*}"
    CHR_DKIM_SOCKET="${PF_CHROOT}${DKIM_SOCKET}"
    CHR_DKIM_SOCKET_DIR="${CHR_DKIM_SOCKET%/*}"
    if [[ -S "${DKIM_SOCKET}" ]]; then
      if [[ -d "${CHR_DKIM_SOCKET_DIR}" ]]; then
        if grep "${CHR_DKIM_SOCKET_DIR}" /proc/mounts &> /dev/null; then
          RET=0
        else
          RET=4
        fi
      else
        RET=3
      fi
    else
      RET=2
    fi
  else
    RET=1
  fi
  return "${RET}"
}

chk_mysql_sock() {
  local -i RET=0
  MYSQL_SOCKET=$(awk -F'=' '/--socket/ {print $2}'<<<"$(/usr/bin/my_print_defaults mysqld)")
  
  if [[ -n "${MYSQL_SOCKET}" ]]; then
    # fix for: Can't connect to local MySQL server through socket '/run/mysql/mysql.sock' (2)
    [[ "${MYSQL_SOCKET}" =~ ^/var/run ]] && MYSQL_SOCKET="${MYSQL_SOCKET#/var}"
    MYSQL_SOCKET_DIR="${MYSQL_SOCKET%/*}"
    CHR_MYSQL_SOCKET="${PF_CHROOT}${MYSQL_SOCKET}"
    CHR_MYSQL_SOCKET_DIR="${CHR_MYSQL_SOCKET%/*}"
    if [[ -S "${MYSQL_SOCKET}" ]]; then
      if [[ -d "${CHR_MYSQL_SOCKET_DIR}" ]]; then
        if grep "${CHR_MYSQL_SOCKET_DIR}" /proc/mounts &> /dev/null; then
          RET=0
        else
          RET=4
        fi
      else
        RET=3
      fi
    else
      RET=2
    fi
  else
    RET=1
  fi
  return "${RET}"
}

##############################################################################
#
# vars
#

PF_CHROOT='/var/spool/postfix'

##############################################################################
#
# main script
#

test -f /etc/sysconfig/postfix && . /etc/sysconfig/postfix

if [[ "${POSTFIX_UPDATE_CHROOT_JAIL,,[A-Z]}" != 'no' ]]; then
  # POSTFIX_DKIM
  if [[ "${POSTFIX_DKIM_CONN,,[A-Z]}" == 'socket' ]] && [[ "${POSTFIX_WITH_DKIM,,[A-Z]}" != 'no' ]]; then
    chk_dkim_sock
      case $? in
        1)
warn_user "\t/etc/opendkim/opendkim.conf does not exist!!\n\
\tThis should not happen!\n\
\tPlease check if opendkim is installed."
          exit 1
        ;;
        2)
warn_user "\tDKIM not started\n\
\tPlease check if DKIM is started on boot"
          exit 2
        ;;
        3)
warn_user "\t${CHR_DKIM_SOCKET_DIR} does not exist!!\n\
\tThis should not happen!"
          exit 3
        ;;
        4)
          if ! /bin/mount -o bind "${DKIM_SOCKET_DIR}" "${CHR_DKIM_SOCKET_DIR}" &> /dev/null; then
            echo -n " ... can not mount ${DKIM_SOCKET_DIR} to ${CHR_DKIM_SOCKET_DIR}"
            exit 4
          fi
        ;;
      esac
  fi

  # POSTFIX_MYSQL/MARIADB
  if [[ "${POSTFIX_MYSQL_CONN,,[A-Z]}" == 'socket' ]] && [[ "${POSTFIX_WITH_MYSQL,,[A-Z]}" != 'no' ]]; then
    chk_mysql_sock
      case $? in
        1)
warn_user "\t/etc/my.cnf does not exist!!\n\
\tThis should not happen!\n\
\tPlease check if postfix-mysql is installed and check for package mysql."
          exit 5
        ;;
        2)
warn_user "\tMySQL not started\n\
\tPlease check if MySQL is started on boot"
          exit 6
        ;;
        3)
warn_user "\t${CHR_MYSQL_SOCKET_DIR} does not exist!!\n\
\tThis should not happen!"
          exit 7
        ;;
        4)
          if ! /bin/mount -o bind "${MYSQL_SOCKET_DIR}" "${CHR_MYSQL_SOCKET_DIR}" &> /dev/null; then
            echo -n " ... can not mount ${MYSQL_SOCKET_DIR} to ${CHR_MYSQL_SOCKET_DIR}"
            exit 8
          fi
        ;;
      esac
  fi
fi
exit 0
#
# end /usr/lib/postfix/systemd/update_chroot
