Created
September 13, 2011 17:33
-
-
Save malambra/1214442 to your computer and use it in GitHub Desktop.
Script de monitorizacion de sistemas Linux en Python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
""" | |
Copyright: Manolo | |
Web: http://celtha.blogspot.com/ | |
Licencia: Affero GPL V3 | |
Requisitos: Python 2.4 Si se quiere usar el modulo Subprocess en lugar de os | |
Si se ejecuta en python 3.x se debe cambiar la llamada "raw_input" por "input" | |
Script para monitorizar sistemas. | |
Uso: | |
---- | |
Ejecute en una linea de comandos: | |
$ python monitoriza.py -h | |
""" | |
import commands | |
import os | |
import sys | |
#import subprocess | |
import getopt | |
####################################### | |
##Definicion de las funciones empleadas | |
####################################### | |
def ImpSalida(): | |
#Imprime por pantalla el fichero de salida | |
f = open("/tmp/monitoriza_temp", "r") | |
while True: | |
linea = f.readline() | |
if not linea: break | |
print linea | |
f.close() | |
def MandaMailParam(): | |
#Manda el mail solicitando los parametros de envio | |
f = open("/tmp/monitoriza_temp", "r") | |
mssg = f.read() | |
f.close() | |
SENDMAIL = "/usr/sbin/sendmail" | |
p = os.popen("%s -t" % SENDMAIL, "w") | |
mail = raw_input("Indique el mail de destino:") | |
asunto = raw_input("Indique el asunto del mail:") | |
p.write("To: "+mail+"\n") | |
p.write("Subject: "+asunto+"\n") | |
p.write("\n") | |
p.write(mssg) | |
sts = p.close() | |
def MandaMail(): | |
# Obtiene el texto de la Monitorizacion | |
f = open("/tmp/monitoriza_temp", "r") | |
mssg = f.read() | |
f.close() | |
#Genera y manda el mail | |
SENDMAIL = "/usr/sbin/sendmail" | |
p = os.popen("%s -t" % SENDMAIL, "w") | |
p.write("To: XXXX@XXXX.com\n") | |
p.write("Subject: Monitorizacion\n") | |
p.write("\n") | |
p.write(mssg) | |
sts = p.close() | |
#Obtiene la Swap libre y la ocupada y determina si se esta usando o no mas del 50% | |
def ObtConSwap(): | |
result1=commands.getoutput('cat /proc/meminfo|grep "SwapTotal:"|tr -s "'" "'"|cut -d "'" "'" -f 2') | |
result2=commands.getoutput('cat /proc/meminfo|grep "SwapFree:"|tr -s "'" "'"|cut -d "'" "'" -f 2') | |
##mem.ocupada=mem.total-mem.libre | |
result3=int(result1)-int(result2) | |
##Si la mem.ocupada es mayor que la mem.total/2 | |
if int(result3)>int(result1)/2: | |
cont=0 | |
else: | |
cont=1 | |
return cont | |
#Devuelve 1 si encuentra un valor superior a 90 sino devuelve 0 | |
#Al final del comando con sed eliminamos el ultimo caracter que era un '%' por '' | |
def ObtOcuPart(): | |
cont=0 | |
result=commands.getoutput('df -h|tr -s "'" "'"|cut -d "'" "'" -f 5|grep %|sed -e "'"1d"'"|sed "'"s/.$//g"'"') | |
ruta="/tmp/monitoriza_temp2" | |
wfich(str(result),ruta) | |
f=open(ruta,"r") | |
for linea in f.readlines(): | |
if linea[:-1]!="": | |
if int(linea[:-1])>90: | |
cont=1 | |
return cont | |
#Obtiene la media tiempo ocioso de la CPU para 10 iteraciones | |
#Con sed eliminamos las 2 primeras lineas | |
def ObtConCPU(): | |
iter=10 | |
result=commands.getoutput('vmstat 5 '+str(iter)+'|sed -e "'"1,2d"'"|tr -s "'" "'"|cut -d "'" "'" -f 16') | |
ruta="/tmp/monitoriza_temp2" | |
wfich(str(result),ruta) | |
f=open(ruta,"r") | |
s=0 | |
for linea in f.readlines(): | |
if linea!="": | |
s=int(s)+int(linea) | |
result1=int(s)/int(iter) | |
f.close() | |
commands.getoutput('rm -f'+ruta) | |
return result1 | |
#Obtiene el numero de interfaces con errores | |
def ObtEstInterfaces(): | |
result=commands.getoutput('/sbin/ifconfig -a|grep errors|tr -s "'" "'"|cut -d "'" "'" -f 4|grep -v errors:0|wc -l') | |
return result | |
#Obtiene el numero de interfaces con colisiones | |
def ObtEstInterfaces2(): | |
result=commands.getoutput('/sbin/ifconfig -a|grep collisions|tr -s "'" "'"|cut -d "'" "'" -f 2|grep -v collisions:0|wc -l') | |
return result | |
#Obtiene el nombre de la maquina | |
def ObtNom(): | |
result=commands.getoutput('uname -a') | |
return result | |
#Obtiene la fecha y hora de la maquina | |
def ObtFecha(): | |
result=commands.getoutput('date') | |
return result | |
#Obtiene el % de memoria usada | |
def checkmem(): | |
result1 = commands.getoutput('free|grep Mem:|tr -s "'" "'" |cut -d "'" "'" -f 2') | |
result2 = commands.getoutput('free|grep Mem:|tr -s "'" "'" |cut -d "'" "'" -f 3') | |
result3=int(result2)*100/int(result1) | |
return result3 | |
#Escribe machacando el contenido en un fichero | |
def wfich(linea,fichero): | |
fich_maquinas=open(fichero, "w") | |
fich_maquinas.write(linea) | |
fich_maquinas.close() | |
#Escribe anyadiendo el contenido al final de en un fichero | |
def afich(linea,fichero): | |
fich_maquinas=open(fichero, "a") | |
fich_maquinas.write(linea) | |
fich_maquinas.close() | |
def Monitor(): | |
#Ruta del fichero temporal a generar con los resultados de la monitorizacion | |
ruta1="/tmp/monitoriza_temp" | |
#Escribe a fichero la fecha de la monitorizacion, iniciando el fichero, creandolo o machacandolo | |
fech=ObtFecha() | |
fech1=str(fech)+'\n\n' | |
wfich(str(fech1),ruta1) | |
#Escribe a fichero el nombre de la maquina, iniciando el fichero para anyadir al final | |
nom=ObtNom() | |
nom1=str(nom)+'\n\n' | |
afich(str(nom1),ruta1) | |
#Si el consumo de memoria RAM es superior al 85% escribe un aviso si es menor otro | |
mem=checkmem() | |
if int(mem)>85: | |
afich('ERROR - Ocupacion de memoria ELEVADA ->'+str(mem)+'%\n\n',ruta1) | |
else: | |
afich('OK - Ocupacion de memoria Correcta ->'+str(mem)+'%\n\n',ruta1) | |
#Si el numero de interfaces con errores es superior a 0 escribe un aviso si es =0 escribe otro | |
inter=ObtEstInterfaces() | |
if int(inter)>0: | |
afich('ERROR - Existen errores en algunas interfaces\n\n',ruta1) | |
else: | |
afich('OK - Todas las interfaces sin errores\n\n',ruta1) | |
#Si el numero de interfaces con colisiones es superior a 0 escribe un aviso si es =0 escribe otro | |
inter=ObtEstInterfaces2() | |
if int(inter)>0: | |
afich('ERROR - Existen colisiones en algunas interfaces\n\n',ruta1) | |
else: | |
afich('OK - Todas las interfaces sin colisiones\n\n',ruta1) | |
#Si el consumo de CPU es mayor de 75 escribe un aviso si no lo da como correcto | |
id=ObtConCPU() | |
if int(id)<75: | |
afich('ERROR - El consumo de CPU es demasiado elevado ->'+str(id)+'% id\n\n',ruta1) | |
else: | |
afich('OK - El consumo de CPU es correcto ->'+str(id)+'% id\n\n',ruta1) | |
#Si la ocupacion de una particion supera el 90% deja un aviso sino lo da como correcto | |
part=ObtOcuPart() | |
if int(part)==1: | |
afich('ERROR - Hay particiones con una ocupacion mayor al 90%\n\n',ruta1) | |
else: | |
if int(part)==0: | |
afich('OK - Ocupacion de las particiones correcta\n\n',ruta1) | |
else: | |
afich('Error al monitotizar las particiones\n\n',ruta1) | |
#Determina si se esta usando mas del 50% de la Swap | |
sw=ObtConSwap() | |
if sw==0: | |
afich('ERROR - Mas del 50% de la Swap esta siendo usada\n\n',ruta1) | |
else: | |
if sw==1: | |
afich('OK - El uso de la Swap es correcto menor al 50%\n\n',ruta1) | |
else: | |
afich('Error al monitotizar la Swap\n\n',ruta1) | |
#Lanza un print's especificando los parametros aceptados. | |
def Uso(): | |
print "Los parametros permitos son los siguientes:" | |
print "" | |
print "1: '-h' '--help' --> Muestra los parametros permitidos" | |
print "2: '-m' '--mail' --> Monitoriza el sistema y manda el resumen por correo" | |
print "3: '-s' '--screen' --> Monitoriza el sistema y muestra el resumen por pantalla" | |
print "3: '-x' '--mailcarta' --> Monitoriza el sistema y manda el resumen por correo solicitando los parametros de envio" | |
# | |
def main(argv): | |
try: | |
opts, args = getopt.getopt(argv, "hg:d,m,s,x", ["help", "mail", "screen","mailcarta"]) | |
except getopt.GetoptError: | |
Uso() | |
sys.exit() | |
print "Use '-h' para ver los parametros aceptados" | |
print "" | |
for opt, arg in opts: | |
if opt in ("-h", "--help"): | |
Uso() | |
sys.exit() | |
elif opt in ("-s", "--screen"): | |
print "Screen" | |
Monitor() | |
ImpSalida() | |
elif opt in ("-m", "--mail"): | |
print "Mail" | |
Monitor() | |
MandaMail() | |
elif opt in ("-x", "--mailcarta"): | |
print "MailCarta" | |
Monitor() | |
MandaMailParam() | |
#Llamamos a Main pasandole la lista de parametros, obiando el primero que es el | |
#nombre del script. | |
main(sys.argv[1:]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment