[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Problema en script de inicio de 'stunnel4'



   Buenas tardes.

   Me he encontrado con un error en uno de mis servidores y por muchas
vueltas que le dé a la cabeza no consigo encontrar el error.

   El problema es con el paquete 'stunnel4', concretamente con el
script de inicio (start/stop/restart/reload):

----------------------------------------------------------------------------
cat /etc/init.d/stunnel4

#! /bin/sh -e
### BEGIN INIT INFO
# Provides:          stunnel4
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Should-Start:      $syslog
# Should-Stop:       $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start or stop stunnel 4.x (SSL tunnel for network daemons)
# Description:       Starts or stops all configured SSL network
tunnels. Each *.conf file in
#                    /etc/stunnel/ will spawn a separate stunnel
process. The list of files
#                    can be overriden in /etc/default/stunnel, and
that same file can be used
#                    to completely disable *all* tunnels.
### END INIT INFO

DEFAULTPIDFILE="var/run/stunnel4.pid"
DAEMON=/usr/bin/stunnel4
NAME=stunnel
DESC="SSL tunnels"
OPTIONS=""
ENABLED=0

get_pids() {
   local file=$1
   if test -f $file; then
     CHROOT=`grep "^chroot" $file|sed "s;.*= *;;"`
     PIDFILE=`grep "^pid" $file|sed "s;.*= *;;"`
     if [ "$PIDFILE" = "" ]; then
       PIDFILE=$DEFAULTPIDFILE
     fi
     if test -f $CHROOT/$PIDFILE; then
       cat $CHROOT/$PIDFILE
     fi
   fi
}

startdaemons() {
  if ! [ -d /var/run/stunnel4 ]; then
    rm -rf /var/run/stunnel4
    install -d -o stunnel4 -g stunnel4 /var/run/stunnel4
  fi
  for file in $FILES; do
    if test -f $file; then
      ARGS="$file $OPTIONS"
      PROCLIST=`get_pids $file`
      if [ "$PROCLIST" ] && kill -s 0 $PROCLIST 2>/dev/null; then
        echo -n "[Already running: $file] "

      elif $DAEMON $ARGS; then
        echo -n "[Started: $file] "
      else
        echo "[Failed: $file]"
        echo "You should check that you have specified the pid= in you
configuration file"
        exit 1
      fi
    fi
  done;
}

killdaemons()
{
  SIGNAL=${1:-TERM}
  for file in $FILES; do
    PROCLIST=`get_pids $file`
    if [ "$PROCLIST" ] && kill -s 0 $PROCLIST 2>/dev/null; then
       kill -s $SIGNAL $PROCLIST
       echo -n "[stopped: $file] "
    fi
  done
}

if [ "x$OPTIONS" != "x" ]; then
  OPTIONS="-- $OPTIONS"
fi

test -f /etc/default/stunnel4 && . /etc/default/stunnel4
if [ "$ENABLED" = "0" ] ; then
  echo "$DESC disabled, see /etc/default/stunnel4"
  exit 0
fi

# If the user want to manage a single tunnel, the conf file's name
# is in $2. Otherwise, respect /etc/default/stunnel4 setting. If no
# setting there, use /etc/stunnel/*.conf
if [ -n "${2:-}" ]; then
  if [ -e "/etc/stunnel/$2.conf" ]; then
    FILES="/etc/stunnel/$2.conf"
  else
    echo >&2 "/etc/stunnel/$2.conf does not exist."
    exit 1
  fi
else
  if [ -z "$FILES" ]; then
    FILES="/etc/stunnel/*.conf"
  fi
fi

test -x $DAEMON || exit 0


set -e

case "$1" in
  start)
        echo -n "Starting $DESC: "
        startdaemons
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        killdaemons
        echo "$NAME."
        ;;
  reopen-logs)
        echo -n "Reopening log files $DESC: "
        killdaemons USR1
        echo "$NAME."
        ;;
  force-reload|reload)
        echo -n "Reloading configuration $DESC: "
        killdaemons HUP
        echo "$NAME."
        ;;
  restart)
        echo -n "Restarting $DESC: "
        killdaemons
        sleep 5
        startdaemons
        echo "$NAME."
        ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N {start|stop|reload|reopen-logs|restart}
[<stunnel instance>]" >&2
        exit 1
        ;;
esac

exit 0
----------------------------------------------------------------------------

   En resumidas cuentas, por lo que alcanzo a entender, el script:

   - Busca todos los archivos de configuración (.conf) ubicados en
/etc/stunnel4/, y por cada uno de ellos, extrae unos parámetros
(CHROOT y PIDFILE). Si éstos existen, usa la función get_pids() para
obtener el pid del proceso stunnel. En caso contrario, devuelve un
valor vacío.

   - Si se pide un 'START', comprueba si existe un pid activo y no es
así, lo levanta.

   - Si se pide un 'STOP', lo contrario, etc.

   El asunto es que, cada vez que lanzo un /etc/init.d/stunnel4
(start/stop/restart), me aparece el error:

Starting SSL tunnels : [started: test: 32: /var/lib/stunnel4]
unexpected operator

   Tras comprobar los logs me consta que el script lee correctamente
mi fichero de configuración '/etc/stunnel4/stunnel.conf'.

   He 'destripado' el script y he podido ratificar que, extrayendo
línea a línea y probándolo en la shell, todo funciona como debería
(toma correctamente los valores 'chroot = /var/lib/stunnel4/' y 'pid =
/stunnel.pid' del fichero de configuración). En cambio, si utilizo el
script tal cual, no funciona.

   Como ejemplo, he probado un pequeño 'hack' en el que he modificado
la función get_pids(), evitando las comprobaciones y forzando los
valores de este modo:

get_pids() {
#   local file=$1
#   if test -f $file; then
#     CHROOT=`grep "^chroot" $file|sed "s;.*= *;;"`
#     PIDFILE=`grep "^pid" $file|sed "s;.*= *;;"`
#     if [ "$PIDFILE" = "" ]; then
#       PIDFILE=$DEFAULTPIDFILE
#     fi
#     if test -f $CHROOT/$PIDFILE; then
#       cat $CHROOT/$PIDFILE
#     fi
#   fi
    if test -f /var/lib/stunnel4/stunnel.pid; then
        cat /var/lib/stunnel4/stunnel.pid
    fi
}

   Y el caso es que así, funciona.

   ¿Dónde puedo estar metiendo la pata?

   Perdón por el ladrillo, toda sugerencia será bienvenida.

   Saludos.


   P.D: Sé que no se trata de un bug del paquete, pues en otra máquina
el script funciona perfectamente, con idéntica configuración.


Reply to: