PDA

View Full Version : Plugin Homemade


overider
30th March 2009, 16:36
J'avais crée un plugin python. Celui-ci marchait trés bien avant que je refonde l'entiereté de centreon il y a quelque jours. ci dessous le code



#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
permets d'evaluer une requete sql passé en paramètre. compare le nombre d'enreg retourné avec les valeurs critical et warn et renvoi le select dans le Status information de nagios.

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
permets d'evaluer une requete sql passé en paramètre. compare le nombre d'enreg retourné avec les valeurs critical et warn.ngg
renvoi le résultat dans l'adiotionnal info nagios

"""

"""
__author__ = "Emerik Nicole (eni@scan-eco.com)"
__version__ = "$Revision: 1.4 $"
__date__ = "$Date: 2008/08/29 15:07:07 $"
__copyright__ = "Copyright (c) 2008 Scan-Eco"
__license__ = "Private"
__name__ = "check_strquery.py"
__description__ = "Ce check permets d'executer une requete , compare le résultat avec les valeurs warnings et critical, renvie le résultat de la requete en sortie standard"
import MySQLdb, sys

if sys.argv[1] == "--help" or sys.argv[1] == "-h":
print 'Check:', __name__,'. Version:',__version__
print 'Description:',__description__
print 'Utilisation: python ',__name__,' -c=<valeur critical>{default=0} -w=<valeur warning>{default=0} -h=<serveur BDD> -u=<utilisateur BDD> -p=<password BDD> -D=<bases> -P=<port de connexion> -e="<requete à executer>"'
print '!!!! Attention : tous les arguments sont obligatoires. Les doubles quotes autour de la valeur après -e= sont obliatoires!!!!'
sys.exit()


retour = 0
#print "MCSLC"
if len(sys.argv) == 9:
for arg in sys.argv[1:]:
if arg[0:3] == "-c=":
critical_value = int(arg[3:])
elif arg[0:3] == "-w=":
warning_value = int(arg[3:])
elif arg[0:3] == "-h=":
elif arg[0:3] == "-h=":
host_value = arg[3:]
elif arg[0:3] == "-u=":
user_value = arg[3:]
elif arg[0:3] == "-p=":
password_value = arg[3:]
elif arg[0:3] == "-D=":
database_value = arg[3:]
elif arg[0:3] == "-P=":
port_value = int(arg[3:])
elif arg[0:3] == "-e=":
query_value = arg[3:]
elif arg[0:3] == "-d=":
debug_option = arg[3:]
else:
print arg, 'non prévu'
retour = 3
#print locals()
try:
connector = MySQLdb.connect(host_value,user_value,password_val ue, database_value,port_value)
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
retour = 3
if 'critical_value' not in locals():
critical_value=0
if 'warning_value' not in locals():
warning_value=0
#print 'bool(retour)',bool(retour)
if bool(retour) == False:
stt = connector.cursor()
try:
stt.execute(query_value)

#print query_value
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
retour = 3
#print 'stt.rowcount:',stt.rowcount
#print 'critical_value:',critical_value
#print 'warning_value:',warning_value
if int(stt.rowcount) > critical_value:
#print 'critical'
retour = 2
#print stt.fetchall()
elif int(stt.rowcount) > warning_value:
#print 'warning'
retour = 1
#print stt.fetchall()
else:
print 'RAS'
#print 'toto',retour

print stt.fetchall()
connector.close()
else:
print "retour invalide"
retour = 3
else:
retour = 3
print 'Nombre d argument invalide. Donne = ',len(sys.argv),' Attendu = 9'
#print query_value
#print "retour",retour
sys.exit(retour)

voici la définition de ma checkcommand. La requête en elle-même ne va pas trop vous aider vu que c'est sur des bases internes mais normalement elle devrait marcher pour n'importe qu'elle requete.

define command{
command_name sce_check_transferdata_off
command_line python $USER1$/sce_check_strquery.py -P=3306 -c=1 -w=1 -h=bdd0101 -u=$USER5$ -p=$USER6$ -D=central -e="select CASE count(*) WHEN '0' THEN CONCAT('$HOSTNAME$',' n est pas bloque.') ELSE CONCAT(srv_RemoteHost,' semble etre bloque. Derniere execution :',FROM_UNIXTIME(s2p_TimeLastCnx)) END from central.ftp_Server fser, central.ftp_ServerPathCnx fspc,central.ftp_Path fpth LEFT JOIN central.ftp_Path2Freq fpfr ON fpth.pth_Key=fpfr.pth_Key LEFT JOIN central.ftp_Freq ffrq on fpfr.i_FtpFreqKey=ffrq.i_FtpFreqKey where fser.srv_RemoteHost like '$HOSTALIAS$%' and fser.srv_Key=fspc.srv_Key and fspc.pth_key=fpth.pth_key and s2p_TimeLastCnx <= (select IF(i_FrequencyFtpFreq IS NULL,(UNIX_TIMESTAMP()-120),UNIX_TIMESTAMP()-round((i_FrequencyFtpFreq/100*125))) from central.ftp_Freq ffrq2 where ffrq2.i_FtpFreqKey=ffrq.i_FtpFreqKey and ( DATE_FORMAT(NOW(),'%w')=en_DayFtpFreq or en_DayFtpFreq='99') and DATE_FORMAT(NOW(),'%H%i%s') between vc_HourBegRangeFtpFreq and vc_HourEndRangeFtpFreq)"
}

un deuxième exemple pour verifier les job bacula
define command{
command_name sce_check_bacula
command_line python $USER1$/sce_check_strquery.py -P=3306 -c=2 -w=1 -h=$HOSTADDRESS$ -u=$USER5$ -p="$USER6$" -D=bacula -e="SELECT CONCAT(JobId , lower(C.Name),lower(P.Name), SchedTime) FROM bacula.Job J, bacula.Client C, bacula.Pool P WHERE J.ClientId=C.ClientId and J.PoolId=P.PoolId and JobStatus ='f' and SchedTime >= DATE_FORMAT(NOW() - interval 1 month,'%Y-%m-%d %H:%i:%s')
}

voici les droits sur ces fichiers :

-rwxr-xr-x 1 nagios nagios 3348 mar 26 13:16 sce_check_strquery.py
-rwxr-xr-x 1 nagios nagios 2605 mar 26 13:12 sce_check_simplequery.py




J'avais également crée un autre plugin dans le même style pour faire des requetes simples:
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
permets d'evaluer une requete sql passé en paramètre.
renvoi le résultat dans le status information du check nagios

"""
__author__ = "Emerik Nicole (eni@scan-eco.com)"
__version__ = "$Revision: 1.4 $"
__date__ = "$Date: 2008/08/29 15:07:07 $"
__copyright__ = "Copyright (c) 2008 Scan-Eco"
__license__ = "Private"
__name__ = "check_strquery.py"
__description__ = "Ce check permets d'executer une requete , compare le résultat avec les valeurs warnings et critical, renvie le résultat de la requete en sortie standard"
import MySQLdb, sys

if sys.argv[1] == "--help" or sys.argv[1] == "-h":
print 'Check:', __name__,'. Version:',__version__
print 'Description:',__description__
print 'Utilisation: python ',__name__,' -h=<serveur BDD> -u=<utilisateur BDD> -p=<password BDD> -D=<bases> -P=<port de connexion> -e="<requete à executer>"'
print '!!!! Attention : tous les arguments sont obligatoires. Les doubles quotes autour de la valeur après -e= sont obliatoires!!!!'
sys.exit()


retour = 0
#print "MCSLC"
if len(sys.argv) == 7:
for arg in sys.argv[1:]:
if arg[0:3] == "-c=":
critical_value = int(arg[3:])
elif arg[0:3] == "-w=":
warning_value = int(arg[3:])
elif arg[0:3] == "-h=":
host_value = arg[3:]
elif arg[0:3] == "-u=":
user_value = arg[3:]
elif arg[0:3] == "-p=":
password_value = arg[3:]
elif arg[0:3] == "-D=":
database_value = arg[3:]
elif arg[0:3] == "-P=":
port_value = int(arg[3:])
elif arg[0:3] == "-e=":
query_value = arg[3:]
elif arg[0:3] == "-d=":
debug_option = arg[3:]
else:
print arg, 'non prévu'
retour = 3
#print locals()
try:
connector = MySQLdb.connect(host_value,user_value,password_val ue, database_value,port_value)
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
retour = 3
if bool(retour) == False:
stt = connector.cursor()
try:
stt.execute(query_value)

#print query_value
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0], e.args[1])
retour = 3

print stt.fetchall()
connector.close()
else:
print "retour invalide"
retour = 3
else:
retour = 3
print 'Nombre d argument invalide. Donne = ',len(sys.argv),' Attendu = 7'

sys.exit(retour)


et la commande associé était ça

define command{
command_name sce_check_mysql_version
command_line python $USER1$/sce_check_simplequery.py -P=3306 -h=$HOSTADDRESS$ -u=$USER5$ -p="$USER6$" -D=digital_prod -e="select version();"
}

Bien sur quand je les lance à la main pas de soucis il me renvoie bien ce qu'il faut.



Quelqu'un pourrait il le tester chez lui svp ?

overider
30th March 2009, 18:18
Auto résolu cela venait pour la plupart de mes check d'un ; dans ma requete sql

Merci à tous