Мониторинг сайтов и уведомление по почте без установленного почтового сервера

По независящим от нас причинам упал сайт, спустя несколько часов только узнали об этом, поэтому было решено, для “быстрого реагирования”, сделать мониторинг на локальном сервере, одна беда, он в интранете и почтового сервера на нем нет. В результате был сделан несложный скрипт, позволяющий отправлять отчеты о падении с любого доступного вам почтового адреса (gmail.com, mail.ru, yandex.ru). Поддерживается TLS авторизация для SMTP и HTTPS для протокола мониторинга.

По независящим от нас причинам упал сайт, спустя несколько часов только узнали об этом, поэтому было решено, для “быстрого реагирования”, сделать мониторинг на локальном сервере, одна беда, он в интранете и почтового сервера на нем нет. В результате был сделан несложный скрипт, позволяющий отправлять отчеты о падении с любого доступного вам почтового адреса (gmail.com, mail.ru, yandex.ru). Поддерживается TLS авторизация для SMTP и HTTPS для протокола мониторинга.

Инструкция по эксплуатации:

Usage: site_down_notifier.py -s http://site.com -n email@site.com
Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -s SITE, --site=SITE  define site for monitoring (url like http://site.com/)
  -n EMAILS, --notify=EMAILS
                        emails for notification (comma separated)
  -r STR, --str=STR     phrase for checking on your site page
  -t TLS, --mailtls=TLS
                        use secure email connection (True/1, False/0)
  -m SERVER, --mailserver=SERVER
                        mail server (smtp.gmail.com)
  -p PORT, --mailport=PORT
                        smtp port of mail server (25)
  -w PASSWORD, --mailpass=PASSWORD
                        password for mail server
  -b EMAIL, --mailbox=EMAIL
                        account for mail server

Исходный код скрипта:


#! /usr/bin/python

import smtplib
import httplib
import sys
import re
from optparse import OptionParser
from pprint import pprint

class GMailer:
    
    def __init__(self, server, port, login, password, tls = False):
        if tls:            
            self._server = smtplib.SMTP_SSL(server, port)
        else:
            self._server = smtplib.SMTP(server, port)
            
        self._login = login
        self._server.set_debuglevel(1)        
        self._server.login(login, password)
        
    def send(self, to, subject, message):
        msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n%s"
               % (self._login, to, subject, message))
        
        return self._server.sendmail(self._login, to, msg) 

    def close(self):
        self._server.quit()

parser = OptionParser(usage = "%prog -s http://site.com -n email@site.com", version="%prog 1.0")
parser.add_option("-s", "--site", dest="site",help="define site for monitoring (url like http://site.com/)", metavar="SITE")
parser.add_option("-n", "--notify", dest="emails", help="emails for notification (comma separated)", metavar="EMAILS")
parser.add_option("-r", "--str", dest="sitestr", help="phrase for checking on your site page", metavar="STR", default = "")
parser.add_option("-t", "--mailtls", dest="tls", help="use secure email connection (True/1, False/0)", metavar="TLS", default=False)
parser.add_option("-m", "--mailserver", dest="mailserver", help="mail server (smtp.gmail.com)", metavar="SERVER")
parser.add_option("-p", "--mailport", dest="mailport", help="smtp port of mail server (25)", metavar="PORT", default=25)
parser.add_option("-w", "--mailpass", dest="mailpass", help="password for mail server", metavar="PASSWORD")
parser.add_option("-b", "--mailbox", dest="mailbox", help="account for mail server", metavar="EMAIL")

(options, args) = parser.parse_args()

if options.site and options.emails and options.mailserver and options.mailpass:
    error = ""
        
    result = re.search("^(http|https)://([\w.-]*)(.*)", options.site)
    
    
    if result.lastindex < 3:
        print("Wrong url: %s" % (options.site))
        exit()
    else:                                    
        try:
            if result.group(1) == "https":
                conn = httplib.HTTPSConnection(result.group(2), timeout=100)
            else:
                conn = httplib.HTTPConnection(result.group(2), timeout=100)
            conn.request("GET", result.group(3))
            r1 = conn.getresponse()    
            
            if(r1.status != 200):
                error = "host unavailable"
            elif (options.sitestr != "") and (r1.read().find(options.sitestr) <= 0):
                error = "wrong content on home"
        except:
            error = "host not found"
            
        if error != "":
            mailer = GMailer(options.mailserver, options.mailport, options.mailbox, options.mailpass, options.tls)
            for email in options.emails.split(","):
                if mailer.send(email, "psycare", error):
                    print("Report to %s sent" % (email))                
            mailer.close()
            print("errors sent")
        else:
            print("everything is ok")
else:
    print "not enough parameters"    

Comments

comments

10 thoughts on “Мониторинг сайтов и уведомление по почте без установленного почтового сервера”

  1. ээээ, а зачем такие сложности?

    >man mail

    NAME
    mail, Mail, mailx — send and receive mail

    SYNOPSIS
    mail [-dEiInv] [-s subject] [-c cc-addr] [-b bcc-addr] [-F]

    зы: ну и банальный пхп мейл делает это в двух строках кода :)

  2. Ну, что делает mail я знаю, а теперь смотри что делает эта штука:
    – дергает сайт по http / https
    – проверяет наличие тестовой фразы (может там вместо ошибка отдалась но по http)
    – если что-то не так, то шлет письма с пояснениями в чем была проблема пользуя smtp (включая поддержку tsl)
    – работает на любой платформе (win/nix), т.е. – технически может работать на десктопе под виндой, периодически стартуя.

    Так что, давайте пример банального пхпмейла в студию :)

  3. На PHP / bash всё это тоже делается, только в ущерб объему / читабельности, потому, собственно, и код привел.

  4. И как это автору не влом столько времени на написание статей тратить, мы конечно очень благодарны, но вот я на такой альтруизм не способен :)

  5. А не проще пользоваться готовим сервисом, без ненужной установки кодов и скриптов?
    Вот новый сервис для мониторинга сервера: http://webpinger.ru/
    Автоматическая проверка сайтов на доступность

  6. Отвечу, – учтановить и настроить довольно просто. Лично меня привлекает безграничная гибкость моего решения по сравнению с неповоротливостью коммерческих продуктов. Тем более, что мне не так уж и много надо.

Leave a Reply