Ok, ci sono arrivati i nuovi server HP rx8640 con HPUX 11.31 e dovevamo monitorarli con nagios. Siccome check_by_ssh si è rivelato molto più lento di NRPE+SSL sui nostri vecchi server Solaris, abbiamo stabilito come policy che ogni server sotto il nostro controllo vada monitorato con NRPE.

Ho scoperto che qualcuno aveva già fatto il lavoro sporco di compilarlo e aveva persino creato un depot aggiornato (pacchetto software, nel linguaggio di HPUX) che funziona con 11.31. Però ha un paio di svantaggi: gira tramite inetd, che non è pratico quando si fanno tanti controlli frequenti, ed è compilato senza “–enable-command-args”, e quest’ultimo punto lo rende inutile per le nostre esigenze.

Usando le note di build di Olivier, leggermente modificate, ho compilato NRPE con “–enable-command-args” e ho creato uno script per avviarlo come servizio standalone invece di usare inetd.

Ecco il procedimento:

Nota sui TCP Wrappers

Secondo le note di Olivier, lui ha usato i sorgenti di tcpwrapper inclusi con SSHD (sarà Openssh?) che si trovano in /opt/ssh/src/tcp_wrappers_7.6-ipv6.4. Per poterlo compilare ho dovuto modificare il Makefile, aggiungendo “-DUSE_GETDOMAIN” alla definizione della macro BUGS. Altrimenti ottenevo il seguente errore:

/usr/ccs/bin/ld: Unsatisfied symbols: yp_get_default_domain (code)

Procedura:

vi Makefile <-- add "-DUSE_GETDOMAIN" to BUGS macro definition
make REAL_DAEMON_DIR=/tmp hpux
ls -l libwrap.a

Il fatto è che non ha funzionato…. Dopo averlo compilato e aver usato il libwrap.a generato in fase di compilazione di NRPE, ottenevo:

-------------
utils.c:
ld: Unsatisfied symbol "fromhost" in file nrpe.o
1 errors.
*** Error exit code 1
Stop.
*** Error exit code 1
Stop.
-------------

Tornando al libwrap standard di HPUX, mi è bastato definire in nrpe.c una variabile che gli mancava (rfc931_timeout)

Patch/modifica di NRPE

tar xvf nrpe-2.12.tar
cd nrpe-2.12
vi src/nrpe.c

/* Add syslog facilities that are missing in HPUX */
#define LOG_AUTHPRIV (10<<3) /* security/authorization messages (private) */
#define LOG_FTP (11<<3) /* ftp daemon */
/* Adding variable missing in libwrap */
int rfc931_timeout=15;

Configurazione di NRPE

PATH="$(cat /etc/PATH):/usr/local/bin" ./configure --prefix=/opt/nagios \
   --with-ssl-inc=/opt/openssl/include --with-ssl-lib=/opt/openssl/lib/hpux32 \
   --enable-command-args

Compilazione e installazione

make
make install
mkdir /opt/nagios/etc
cp sample-config/nrpe.cfg /opt/nagios/etc/

Script di init

Ho creato uno script di init per avviare NRPE come servizio, ma a quanto pare wordpress non permette di caricare file arbitrari. Lo caricherò appena possibile.

Aggiornamento: Dato che non riesco a pubblicare file, dovrò includere lo script direttamente qui…. Perché funzioni servono due file, uno per “abilitare” il servizio e lo script di controllo.

/etc/rc.config.d/nrpe

# Nagios Remote Plugin Executor 
ENABLE_NRPE=1

/sbin/init.d/nrpe

#!/usr/bin/bash
# Ciro Iriarte - May 5th, 2010
# some parts taken from SuSE's NRPE init script and xntpd init from HPUX

if [ -f /etc/rc.config ] ; then
        . /etc/rc.config
else
        echo "ERROR: /etc/rc.config defaults file MISSING"
fi

rval=0
set_return() {
        x=$?
        if [ $x -ne 0 ]; then
                echo "EXIT CODE: $x"
                rval=1  # always 1 so that 2 can be used for other reasons
        fi
}

NRPE_BIN=/opt/nagios/bin/nrpe
test -x $NRPE_BIN || { echo "$NRPE_BIN not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }

# Check for existence of needed config file and read it
NRPE_CONFIG=/opt/nagios/etc/nrpe.cfg
test -r $NRPE_CONFIG || { echo "$NRPE_CONFIG not existing";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 6; fi; }

case "$1" in
        start_msg)
                echo -n "Starting Nagios NRPE "
        ;;
        stop_msg)
                echo -n "Shutting down Nagios NRPE "
        ;;
        start)
                if [ $ENABLE_NRPE -eq 1 ]
                then
                        $NRPE_BIN -c $NRPE_CONFIG -d
                        set_return
                        ## $0 start_msg
                        ##if [ $rval -eq 0 ];then echo -e "\t\t[ OK ]";else echo -e "\t\t[ ERR ]";fi 
                else
                        rval=2
                fi
        ;;
        stop)
                if [ $ENABLE_NRPE -ne 1 ]
                then
                        rval=2
                else
                        PID=$(ps -el | awk '( ($NF ~ /nrpe/) && ($4 != mypid) && ($5 != mypid)) { print $4 }' mypid=$$)
                        ##$0 stop_msg
                        if [[ -n $PID ]];then
                                if kill $PID 2/dev/null; then
                                        echo -e "\tService stopped"
                                else
                                        if [ $(ps -fp $PID|grep -v COMMAND|wc -l) -gt 0 ]
                                        then
                                                set_return
                                                ##echo -e "\t\t[ ERR ]"
                                                echo -e "\tCouldn't stop NRPE"
                                        fi
                                fi
                        else
                                set_return
                                ##echo -e "\t\t[ ERR ]"
                                echo -e "\tUnable to stop NRPE, cannot find PID"
                        fi
                fi
        ;;
        restart)
                $0 stop
                $0 start
        ;;
        *)
                echo "Usage: $0 {start|stop|restart}"
                rval=1
        ;;
esac
exit $rval

Dopo aver creato quei file dovrai creare dei link allo script di controllo per poter avviare e fermare il servizio all’avvio e allo spegnimento

/sbin/rc1.d/K500nrpe -/sbin/init.d/nrpe
/sbin/rc3.d/S999nrpe -/sbin/init.d/nrpe

Questi erano i pezzi mancanti…