• Jueves 28 de Marzo de 2024, 22:31

Autor Tema:  [SCRIPT] Alerta en caso de sobrecarga del sistema *nix.  (Leído 2158 veces)

ryuz

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: ar
  • :)
    • Ver Perfil
[SCRIPT] Alerta en caso de sobrecarga del sistema *nix.
« en: Viernes 10 de Mayo de 2013, 11:41 »
0
Hola  :nosweat:

Aun no tengo un nombre real para este código ya que este fin de semana lo reharé pero con clases para que este mejor formado...

El programa se basa en la lectura de unos datos recibidos por dos comandos de sistema, y en el caso de que esos valores sean inferiores o superiores dependiendo de CPU o memoria, pues se alertara al usuario con un mensaje en el correo electrónico o un sms/creacion de evento en el calendario.

He utilizado la API que Google ofrece para implementar el calendario/funciones de este, en nuestros programas.

Código: [Seleccionar]
#!/usr/bin/python
#importamos librerias requeridas
import atom
import gdata.calendar
import gdata.calendar.service
import random
import time
import smtplib
import math
import commands
import logging
from email.mime.text import MIMEText
#variables globales
LOGFILE = "checkServer.log"
cpu_mail_level = 3
cpu_sms_level = 5
mem_mail_level = 2.5
mem_sms_level = 0.5
email = "******@gmail.com"
email_password = "*******"
#funciones
def check_cpu():
fObj = open("/proc/loadavg","r")
        fData = fObj.readline()
        fObj.close()
        cpu_status = math.ceil(float(fData.split()[0]))
return cpu_status
def check_mem():
status,mTotal = commands.getstatusoutput("free -m | grep Mem | cut -f11 -d' '")
status,mFree = commands.getstatusoutput("free -m | grep Mem | cut -f26 -d' '")
mFree = math.ceil((float(mFree)*100)/float(mTotal))
return mFree
def is_saturated():
logging.basicConfig(filename=LOGFILE,level=logging.DEBUG,format="%(asctime)s - %(name)s::%(levelname)s %(message)s")
cpu_level = check_cpu()
mem_level = check_mem()
print "Nivel de CPU: %s -- Nivel de Mem: %s" % (cpu_level,mem_level)
print "Nivel mail CPU: %s -- Nivel sms CPU: %s" % (cpu_mail_level,cpu_sms_level)
print "Nivel mail Mem: %s -- Nivel sms Mem: %s" % (mem_mail_level,mem_sms_level)
if( (cpu_level >= cpu_mail_level) and (cpu_level < cpu_sms_level) ): sendmail(cpu_level,"CPU")
elif(cpu_level >= cpu_sms_level):
sendsms(cpu_level,"CPU")
sendmail(cpu_level,"CPU")
else:
print "CPU funcionando correctamente."
logging.debug("CPU: OK")
if( (mem_level <= mem_mail_level) and (mem_level > mem_sms_level) ): sendmail(mem_level,"Memoria")
elif(mem_level <= mem_sms_level):
sendsms(mem_level,"Memoria")
sendmail(mem_level,"Memoria")
else:
print "Memoria funcionando correctamente."
logging.debug("Memory: OK")
def sendmail(nstatus,by):
sFrom = email
sTo = email
headers = ["From: "+sFrom,"Subject: Alerta PROLIANTG6 saturado.","To: "+sTo,"MIME-Version: 1.0","Content-Type: text/html"]
headers = "\r\n".join(headers)
msg = "El servidor PROLIANTG6 se encuentra al nivel %s de saturacion de %s." % (nstatus,by)
sObj = smtplib.SMTP("smtp.gmail.com",587)
sObj.ehlo()
sObj.starttls()
sObj.ehlo()
sObj.login(sFrom,email_password)
try: sObj.sendmail(sFrom,sTo,headers+"\r\n\r\n"+msg)
except: print "No se pudo enviar el correo."
else:
print "Se envio el correo correctamente."
logging.debug(by+" Email sent.")
sObj.close()
def sendsms(nstatus,by):
cs = gdata.calendar.service.CalendarService()
cs.email = email
cs.password = email_password
cs.source = "GoogleSMSCalender_" + str(random.randint(0, 10000))
cs.ProgrammaticLogin()
event = gdata.calendar.CalendarEventEntry()
event.title = atom.Title(text="Alerta PROLIANTG6 saturado.")
texto = "El servidor PROLIANTG6 se encuentra al nivel %s de saturacion de %s." % (nstatus,by)
event.content = atom.Content(text=texto)
event.where.append(gdata.calendar.Where(value_string="Repuestos Gualsan"))
start_time = time.strftime("%Y-%m-%dT%H:%M:%S.000Z", time.gmtime(time.time() + 2 * 60))
when = gdata.calendar.When(start_time=start_time, end_time=start_time)
reminder = gdata.calendar.Reminder(minutes=1, extension_attributes={"method":"sms"})
when.reminder.append(reminder)
event.when.append(when)
try: new_event = cs.InsertEvent(event, "/calendar/feeds/default/private/full")
except: print "No se pudo enviar el sms."
else:
print "SMS enviado correctamente."
logging.debug(by+" SMS sent.")
if __name__ == "__main__":
is_saturated()

Para quien no lo sepa, Google activo hace tiempo una función de SMS por alerta de eventos, por lo que en la configuración de Google Calendar deben tener el número asociado.

Tambien puede servir tener alguna aplicacion de Google Calendar en el telefono por lo que recibirian la alerta de un modo u otro.

Para la proxima versión tengo pensado:
  • POO
  • Procesamiento de procesos huerfanos
  • ¿?
Hay algunas lineas de más que imprimen texto por ejemplo que era más que nada de referencia.

ryuz

  • Miembro activo
  • **
  • Mensajes: 29
  • Nacionalidad: ar
  • :)
    • Ver Perfil
Re:[SCRIPT] Alerta en caso de sobrecarga del sistema *nix.
« Respuesta #1 en: Lunes 13 de Mayo de 2013, 16:58 »
0
Una pequeña actualización y por ende considere que se merecia un post aparte para diferenciar bien.
Paradigma POO.

Más orden y control del Debug.

En la línea 91, se debe especificar el correo y su correspondiente clave.
El la línea 92, si se especifica el valor 1 se permite el Debug y por ende la creación de un fichero log.

He considerado que con poca frecuencia se crean los procesos huerfanos por lo que no lo agrege aun.

Voy a estudiar un poco mas el manejo de procesos con Python.
Tambien añadire más opciones para el control del programa (argumentos,verbose)

Y si puedo curses, pero dependerá de si tengo tiempo.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.