Skip to content

Instantly share code, notes, and snippets.

@malambra
Created September 13, 2011 17:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save malambra/1214442 to your computer and use it in GitHub Desktop.
Save malambra/1214442 to your computer and use it in GitHub Desktop.
Script de monitorizacion de sistemas Linux en Python
#!/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