Monitoring líný chorýš

Z Varhoo
Přejít na: navigace, hledání

Skript pro monitorování serveru a zasílání emailu v případě výpadku

<source lang="python">

  1. !/usr/bin/python
  2. -*- coding: utf-8 -*-

import socket import telnetlib import os import smtplib import time import datetime import urllib

  1. nastavení serverů pro kontrolu

server = {

               'webovastranka.cz':[
                 [21,22,110,443,993,3306,995,80],
                 'http://webovastranka.cz'], #web
  1. 'localhost':8192,8194,8197, #holmes server
               'localhost':8192, #holmes server 
        }
  1. email pro odeslání

emails = ("ja@email.cz","nekdo@email.cz",)

  1. nastavení

limit1 = 9.0 #hranice pro nacítání stránek (load + konektivita) limit2 = 4.5 #hranice pro nacítání stránek (mysql) limit3 = 4.5 #hranice pro nacítání stránek (apache)

TIME_OUT = 3600

  1. cas nacítání strá

def test_url(url):

  		#načení souboru
        timer_http = time.time()
        try:
              htmlpage = urllib.urlopen(url)
              data = htmlpage.read() 
              timer = data.split("\t")
              tim1 = float(timer[0])
              tim2 = float(timer[1])
        except:
              tim1 = 0.0
              tim2 = 0.0
        timer2 = time.time() - timer_http
        return [timer2,tim1,tim2]


timeout_error = []


def islock():

 if os.path.exists("lock"):
   f = open("lock")
   data = f.read()
   if time.time() - float(data) > TIME_OUT:
     return False
   else:    
     return True
     
 return False

def lock():

 if os.path.exists("lock"):
     if islock():

return False

 f = open("lock","w")
 f.write("%f" % time.time())
 f.close()
 return True

def unlock():

 f = open("lock","w")
 f.write("0")
 f.close()
  1. kontrola nacítání všech stránek s port

for host in server.keys():

       if 80 in server[host][0]:
               timer = test_url(server[host][1])
               print timer
               if timer[0] > limit1:
                       text = "%s %s" % ("konektivita",host)
                       timeout_error.append([text,timer[0],limit1])
               if timer[1] > limit2:
                       text = "%s %s" % ("mysql",host)
                       timeout_error.append([text,timer[1],limit2])
               if timer[2] > limit3:
                       text = "%s %s" % ("apache",host)
                       timeout_error.append([text,timer[2],limit3])

error = []

  1. skenování portu

for host in server.keys():

       for port in server[host][0]:
               try:
                       tn = telnetlib.Telnet(host,port)
               except:
                       #print "ERROR",host, port
                       error.append([host,port])

def send_email(body,emails):

   """funkce na odesílání zpráv"""
   # nastavení a odeslání zprávy
   fromaddr = 'server.websites@gmail.com'
   subject = "Vypadek serveru websites.cz"
   username = 'server.websites@gmail.com'
   password = 'server123456'
   for toaddrs in emails:

msg = "\n".join( ("From: %s" % fromaddr, "To: %s" % toaddrs, "Subject: %s" % subject, "", body, "\r\n") )

server = smtplib.SMTP('smtp.gmail.com:587') server.ehlo() #FIX python 2.5 server.starttls() server.ehlo() #FIX python 2.5 server.login(username,password) server.sendmail(fromaddr, toaddrs, msg) server.quit()


  1. neposilat se zpravu

if len(error)==0 and len(timeout_error)==0: if islock(): print emails send_email("Výpadek serveru už pominul..",emails) unlock()

       exit(0)

if islock():

 exit(0)

else:

 lock()
 
  1. vytvorení zprávy pro email

tmp = ["Time: %s " % datetime.datetime.now(),

      "---------------------------------------"]

for item in error:

       tmp.append("Sluzba nefunguje %s:%d" % (item[0],item[1])) 

for item in timeout_error:

       tmp.append(
       "%s presahla limit (%f s.) %f s." % (item[0],item[2],item[1]))

body = "\n".join( tmp )

  1. odesílám zprávy

send_email(body,emails)

</source>

Osobní nástroje