Ajude a adaptar o initscript Courier-authdaemon

2

Eu poderia usar a ajuda para adaptar o padrão do correio-authdaemon initscript.

Eu executo um servidor de pequena empresa com postfix, correio, mariadb, amavisd-new com clamav e spamassassin e sasl. Após a atualização para o xenial, tive problemas porque a configuração se recusou a autenticar o sasl como antes. Eu aprendi a pesquisar isso foi o resultado de uma libpam-mysql seriamente quebrada no xenial. Felizmente, é possível autenticar contra rotinas de autenticação de correios em courier-authdaemon, então eu mudei meu postfix smtpd.conf para apontar para isso. O courier-authdaemon é controlado por um initscript (em /et/init.d) da seguinte forma:

#! /bin/sh -e
#
### BEGIN INIT INFO
# Provides:          courier-authdaemon
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

prefix="/usr"
exec_prefix=${prefix}
sysconfdir="/etc/courier"
sbindir="${exec_prefix}/sbin"
daemonscript="${sbindir}/authdaemond"
rundir_courier="/var/run/courier"
rundir="/var/run/courier/authdaemon"
pidfile="${rundir}/pid"

. /lib/lsb/init-functions

# Check for a leftover init script
if [ ! -x $daemonscript ]; then
    exit 0
fi

case "$1" in
start)
    # Start daemon.
    cd /
    log_daemon_msg "Starting Courier authentication services" "authdaemond"
    if [ ! -d "$rundir_courier" ]; then
        mkdir -m 0775 $rundir_courier
        chown daemon:daemon $rundir_courier
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir_courier
    fi
    if [ ! -d "$rundir" ]; then
        mkdir -m 0750 $rundir 
        chown daemon:daemon $rundir
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir
    fi
    $daemonscript start
    log_end_msg 0
    ;;
stop)
    # Stop daemon.
    cd /
    log_daemon_msg "Stopping Courier authentication services" "authdaemond"
    $daemonscript stop
    log_end_msg 0
    ;;
restart|force-reload)
    $0 stop
    $0 start
    ;;
status)
    status_of_proc -p "$pidfile" "" "authdaemond" && exit 0 || exit $?
    ;;
*)
    echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
    exit 2
    ;;
esac
exit 0

Próxima edição: Tenho o postfix em execução em uma jaula chroot, que não pode acessar o soquete courier-authdaemon padrão. Então eu encontrei isto:

service courier-authdaemon stop
rm -rf /var/run/courier/authdaemon/ /var/spool/postfix/var/run/courier/authdaemon/
mkdir -p /var/spool/postfix/var/run/courier/authdaemon/
ln -s /var/spool/postfix/var/run/courier/authdaemon/ /var/run/courier/authdaemon
service courier-authdaemon start
postfix reload

O que basicamente para o daemon de autenticação, remove o material antigo no diretório atual e o no chroot postfix e os configura novamente e define o link de fora para dentro do chroot jail e inicia tudo de volta novamente . Que funciona. O que ele não faz, é tornar essas alterações permanentes, porque depois de uma reinicialização (ou uma atualização / atualização de correio) courier configura tudo de novo, então eu tenho que refazer a correção acima.

Então, obviamente, eu estava tentando descobrir se alguém teria encontrado algo para aplicar a correção na inicialização. Acontece que havia alguém, e ele reescreveu o authdaemon initscript como segue

! /bin/sh -e
#
### BEGIN INIT INFO
# Provides:          courier-authdaemon
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

prefix="/usr"
exec_prefix=${prefix}
sysconfdir="/etc/courier"
sbindir="${exec_prefix}/sbin"
daemonscript="${sbindir}/authdaemond"
rundir_courier="/var/run/courier"
rundir="/var/run/courier/authdaemon"
pidfile="${rundir}/pid"

. /lib/lsb/init-functions

# Check for a leftover init script
if [ ! -x $daemonscript ]; then
    exit 0
fi

#== Postfix chrooted ==#+20131117 <[email protected]>
postfix_check() {
  local PFINIT=/etc/init.d/postfix
  local PFMASTER=/etc/postfix/master.cf
  local PFSMTPD=/etc/postfix/sasl/smtpd.conf

  if [ -s $PFINIT ] && [ -s $PFMASTER ] ; then
    # Use Postfix
    if [ "$(/usr/bin/awk '$1~/^smtp$/ && $8~/smtpd/ {print $5}
             ' $PFMASTER)0" != "n0" ]
    then # chroot: Yes
      if [ -s $PFSMTPD ] && [ "0$(/bin/sed -n \
-e '/^authdaemond_path:/s,.\+:\s*,,p' $PFSMTPD)" = "0$rundir/socket" ] &&
         [ ! -L $rundir ]
      then
        /bin/rm -fr $rundir &&
        /bin/ln -s /var/spool/postfix/$rundir $rundir_courier
      fi
    else # chroot: No
      if [ -L $rundir ] ;then
        /bin/rm -fr $rundir
      fi
    fi # Postfix chrooted ?
  fi # Use Postfix
} # postfix_check()
#-- Postfix chrooted --#

case "$1" in
start)
    # Start daemon.
    cd /
    log_daemon_msg "Starting Courier authentication services" "authdaemond"
    if [ ! -d "$rundir_courier" ]; then
        mkdir -m 0775 $rundir_courier
        chown daemon:daemon $rundir_courier
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir_courier
    fi
postfix_check
    if [ ! -d "$rundir" ]; then
        mkdir -m 0750 $rundir 
        chown daemon:daemon $rundir
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir
    fi
    $daemonscript start
    log_end_msg 0
    ;;
stop)
    # Stop daemon.
    cd /
    log_daemon_msg "Stopping Courier authentication services" "authdaemond"
    $daemonscript stop
    log_end_msg 0
    ;;
restart|force-reload)
    $0 stop
    $0 start
    ;;
status)
    status_of_proc -p "$pidfile" "" "authdaemond" && exit 0 || exit $?
    ;;
*)
    echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
    exit 2
    ;;
esac
exit 0

O problema é: parece que não funciona, e minhas habilidades em expressões regulares não são de tal forma que eu possa depurar isso. Eu tenho uma suspeita que tem a ver com locais de arquivos, mas não tenho certeza. Existe alguém que possa me apontar na direção certa para que eu não precise me lembrar de aplicar os comandos após uma reinicialização?

    
por martin lentink 10.09.2016 / 17:38

1 resposta

0

O problema é que o Xenial 16.04 quebrou o PAM E mudou para a inicialização do systemd. O script init.d que você editou para que o courier-authdaemon execute o chrooted nunca é executado. Eu descobri isso da maneira mais difícil.

Eu agora executo uma configuração semelhante a você (postfix chrooted plus authentication contra courier, enquanto anteriormente eu usava o SASL PAM em 14.04 Trusty).

Aqui está minha configuração atual:

  • configure para autenticar contra correio

vi /etc/postfix/sasl/smtpd.conf

#pwcheck_method: saslauthd
#mech_list: plain login
#allow_plaintext: true
pwcheck_method: authdaemond
authdaemond_path: /var/run/courier/authdaemon/socket
mech_list: plain login
log_level: 9
  • crie um script de inicialização para criar o diretório chroot e os links simbólicos

vi /etc/systemd/system/courier-authdaemon.sh

#! /bin/sh -e
#
# Starts:          courier-authdaemon

prefix="/usr"
exec_prefix=${prefix}
sysconfdir="/etc/courier"
sbindir="${exec_prefix}/sbin"
daemonscript="${sbindir}/authdaemond"
rundir_courier="/var/run/courier"
rundir="/var/run/courier/authdaemon"
rundir_chroot="/var/spool/postfix/var/run/courier/authdaemon"
pidfile="${rundir}/pid"
/bin/echo "Checkpoint 1 Courier authentication services" "authdaemond" >/log.txt

# Check for a leftover init script
if [ ! -x $daemonscript ]; then
        exit 0
fi
/bin/echo "Checkpoint 2 Courier authentication services" "authdaemond" >>/log.txt

        # Start daemon.
        cd /
        /bin/echo "Starting Courier authentication services" "authdaemond" >>/log.txt
        # RAH 20170123. Change to chroot postfix setup
        if [ ! -d "$rundir_courier" ]; then
                /bin/echo  "making parent location" "authdaemond" >>/log.txt
                /bin/mkdir -m 0775 $rundir_courier
                /bin/chown daemon:daemon $rundir_courier
        # set file context for SELinux (#668564)
        [ -x /sbin/restorecon ] && /sbin/restorecon $rundir_courier
        fi
        # clean up chroot location
        if [ -d "$rundir_chroot" ]; then
                /bin/echo  "Cleaning chroot location" "authdaemond" >>/log.txt
                /bin/rm -rf "$rundir_chroot"
        fi
        # remove traditional directory if it exists
        if [ -L "$rundir" ]; then
                /bin/echo  "Unlinking traditional location" "authdaemond" >>/log.txt
                /usr/bin/unlink "$rundir"
        fi
        if [ -d "$rundir" ]; then
                /bin/echo  "Cleaning traditional location" "authdaemond" >>/log.txt
                /bin/rm -rf "$rundir"
        fi
        # make new chroot location
        if [ ! -d "$rundir_chroot" ]; then
                /bin/echo  "making chroot location" "authdaemond" >>/log.txt
                /bin/mkdir -p "$rundir_chroot"
                # /bin/echo mkdir -p "$rundir_chroot"
                /bin/chown daemon:daemon "$rundir_chroot"
                [ -x /sbin/restorecon ] && /sbin/restorecon $rundir_chroot
        fi
        # link chroot location to the original location
        if [ ! -L "$rundir" ]; then
                /bin/echo  "linking chroot location" "authdaemond" >>/log.txt
                /bin/ln -sn "$rundir_chroot" "$rundir"
                # /bin/echo /bin/ln -sfn "$rundir_chroot" "$rundir"
        fi
#       $daemonscript start

exit 0
  • crie uma substituição para a inicialização via systemd

    sudo systemctl edit courier-authdaemon
    
  • edite o conteúdo da substituição do systemd para acionar o script de shell acima:

    $ more /etc/systemd/system/courier-authdaemon.service.d/override.conf

    [Service]
    ExecStartPre=/etc/systemd/system/courier-authdaemon.sh
    
por RayH 30.01.2017 / 09:02