systemadmin.es > Monitorización > moDRACfucker evolution: Check de nagios para los eventos de la DRAC

moDRACfucker evolution: Check de nagios para los eventos de la DRAC

Resulta muy común que una herramienta que se pensó inicialmente para un determinado propósito, acabe realizando otras funciones. El moDRACfucker no es una excepción: “Ya que” se conecta a la DRAC por SSH también podría obtener los eventos, el System Event Log, y parsear el último.

Ya podéis descargar la última versión del moDRACfucker con las mismas instrucciones de instalación que la anterior versión. Como dependencia tiene el libssh, una vez instalado simplemente descomprimimos y compilamos:

cd /usr/local/src
wget systemadmin.es/wp-content/uploads/moDRACfucker-0.0.2.tgz
cd moDRACfucker-0.0.2
make

Al ejecutarlo con los datos de una DRAC, comprueba también si esta configurada la DRAC con el password por defecto y parsea el último evento y nos mostrará según si es critico o no una alerta compatible con Nagios:

# ./modracfucker 1.2.3.4  22 root password
CRITICAL - DRAC 1.2.3.4 - Storage ROMB Battery: battery sensor for Storage, failed was asserted

El código es el siguiente:

#include <libssh/libssh.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define BUFFERRSIZE 256

#define NAGIOSOK 0
#define NAGIOSWARNING 1
#define NAGIOSCRITICAL 2
#define NAGIOSUNKNOWN 3

ssh_session my_ssh_session;

char *severity="Severity:";
int severitystate=0;
char severitytext[BUFFERRSIZE];

char *description="Description:";
int descriptionstate=0;
char descriptiontext [BUFFERRSIZE];


int checkSSH(char *host, int port, char *user, char *password, char* error, int errorsize)
{
        int rc;
        my_ssh_session = ssh_new();

        if (my_ssh_session == NULL)
                return 1;

        ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, host);
        rc = ssh_connect(my_ssh_session);
        if (rc != SSH_OK)
        {
                snprintf(error, errorsize, "Error connecting to localhost: %s\n",
                ssh_get_error(my_ssh_session));
                return 2;
        }

        rc = ssh_userauth_password(my_ssh_session, user, password);
        if (rc != SSH_AUTH_SUCCESS)
        {
                snprintf(error, errorsize, "Error authenticating with password: %s\n",
                ssh_get_error(my_ssh_session));
                ssh_disconnect(my_ssh_session);
                ssh_free(my_ssh_session);
                return 3;
        }

	return 0;
}

int getStringText(char *buffer, int buffsize, char *string, char *text, int textsize, int state)
{
	int pos=0;
	int strsize=strlen(string);
	
	while(pos<buffsize)
	{
		if(state>=strsize)
		{	
			//estem omplint el text
			if(state-strsize<textsize)
			{
				if(buffer[pos]=='\n')
				{
					text[state-strsize]=0;
					state=0;
				}
				else if(((state-strsize)==0)&&((buffer[pos]==' ')||(buffer[pos]=='\t')))
				{
					pos++;
					continue;
				}
				else
				{
					text[state-strsize]=buffer[pos];
					state++;
				}
			}
			// else screwed
		}
		else
		{
			//estic buscant el string
			if(string[state]==buffer[pos])
				state++;
			else
				state=0;
		}
		
		pos++;
	}
	
	return 0;	
}

int getSystemEventLog(char* error, int errorsize)
{
	ssh_channel channel;
	char buffer[BUFFERRSIZE];
	unsigned int nbytes;
	

	//channel = ssh_channel_new(my_ssh_session);
	channel = channel_new(my_ssh_session);
	
	if (channel == NULL)
	{
		snprintf(error, errorsize, "Error ssh_channel_new()\n");
		return 1;
	}

	if (channel_open_session(channel) != SSH_OK)
	{
		snprintf(error, errorsize, "Error ssh_channel_open_session()\n");
		return 1;
	}
	
	if (channel_request_exec(channel, "racadm getsel") != SSH_OK)
	{
		channel_close(channel);
		channel_free(channel);
		snprintf(error, errorsize, "Error ssh_channel_request_exec()\n");
		return 1;
	}
	
	nbytes = channel_read(channel, buffer, sizeof(buffer), 0);
	while (nbytes > 0)
	{
		/*
		if (write(1, buffer, nbytes) != nbytes)
		{
			channel_close(channel);
			channel_free(channel);
			snprintf(error, errorsize, "Error write(stdout)\n");
			return 1;
		}
		*/
		
		getStringText(buffer, nbytes, severity, severitytext, BUFFERRSIZE, severitystate);
		getStringText(buffer, nbytes, description, descriptiontext, BUFFERRSIZE, descriptionstate);
		

		nbytes = channel_read(channel, buffer, sizeof(buffer), 0);
	}

	if (nbytes < 0)
	{
		ssh_channel_close(channel);
		ssh_channel_free(channel);
		snprintf(error, errorsize, "Error channel_read()\n");
		return 1;
	}	

	channel_send_eof(channel);
	channel_close(channel);
	channel_free(channel);

	return 0;
}

void freeSSH()
{
	ssh_disconnect(my_ssh_session);
        ssh_free(my_ssh_session);
}

int main(int argc, char* argv[])
{
	char error_password[BUFFERRSIZE];
	char error_default_password[BUFFERRSIZE];
	
	char *host;
	int port;
	char *user;
	char *password;
	char *password_default="calvin";
	int idx=0;

	error_default_password[0]=0;

	if((argc<5)||(argc>6))
	{
		printf("missing operand\n %s <host> <port> <user> <password> [defaultpassword]\n",argv[0]);	
		exit(NAGIOSUNKNOWN);
	}
	
	host=argv[1];
	port=atoi(argv[2]);
	if(port==0) port=22;
	user=argv[3];
	password=argv[4];
	
	if(argc==6)
		password_default=argv[5];
	
	if(checkSSH(host,port,user,password,error_password,BUFFERRSIZE)==0)
	{
	
		descriptiontext[0]=0;	
		severitytext[0]=0;	
		
		if(getSystemEventLog(error_password,BUFFERRSIZE)!=0)
		{
			printf("CRITICAL - DRAC %s: Error getSEL %s\n",host,error_default_password);
			exit(NAGIOSCRITICAL);
		}
		else
		{
			//printf("## Severity: %s Description: %s\n",severitytext, descriptiontext);
			if((severitytext[0]!=0)&&(severitytext[0]>='0')&&(severitytext[0]<='9')&&(severitytext[0]!='2'))
			{
				//DRAC 5.0
				printf("CRITICAL - DRAC %s - %s\n", host, descriptiontext);
				exit(NAGIOSCRITICAL);

			}
			else if((severitytext[0]!=0)&&(strncmp(severitytext,"Ok",2)!=0))
			{
				//DRAC 5.1
				while(severitytext[idx]!=0)
				{
					if((severitytext[idx]>='a')&&(severitytext[idx]<='z'))
						severitytext[idx]-=('a'-'A');
					idx++;
				}
				printf("%s - DRAC %s - %s\n",severitytext, host, descriptiontext);
				exit(NAGIOSCRITICAL);
			}
		}
		
		freeSSH();

		printf("OK - DRAC %s\n",argv[1]);
		exit(NAGIOSOK);
	}
	else if(checkSSH(host,port,user,password_default,error_default_password,BUFFERRSIZE)==0)
	{
		printf("WARNING - DRAC %s with default password(%s)\n",host,password_default);
		exit(NAGIOSWARNING);	
	}
		
	printf("CRITICAL - DRAC %s: %s\n",host,error_default_password);
	exit(NAGIOSCRITICAL);	
}

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>