Webserver monitoring

Code-Stücke können hier veröffentlicht werden.
pycodein
User
Beiträge: 10
Registriert: Dienstag 12. Juni 2007, 15:48

Webserver monitoring

Beitragvon pycodein » Mittwoch 15. August 2007, 17:22

Hi

Ich habe ein paar Webserver die ich gerne überwachen würde und habe mir ein kleines Script geschrieben das eine Liste von Servern mit nmap überprüft ob sie erreichbar sind und wenn nicht dann mittels zenity (erzeugt Gtk+ Dialog boxen) mir eine Fehlermeldungs Box ausgibt.

Das ganze ist gedacht von einen Cronjob regelmässig ausgeführt zu werden.

Da ich mich als Anfänger bezeichnen würde wär ich für Tipps sehr dankbar.


Code: Alles auswählen

#!/usr/bin/python
# check if a list of webservers are running.

import subprocess, re, sys
from time import sleep
from os import path

servers = ['server1.at', 'server2.at', 'server3.at']
interval = 60 #seconds

#check if nmap is installed
if not path.exists("/usr/bin/nmap"):
    sys.exit("""You must install the package "nmap" first!""")

#check for "verbose" parameter
try:
    if 'verbose' in sys.argv[1]:
        verbose = True
    else:
        verbose = False
except:
    verbose = False

def getOnlinestatus(server):
    """ scan with nmap port 80 and search for the "open"-string """
    cmd = "nmap %s -p 80" % server
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    process.wait()
    msg = process.stdout.read()
    pattern = re.compile("80/tcp open  http")
    return pattern.search(msg)

def sendAlarm(server):
    """ send a error-message window with zenity """
    cmd = "env DISPLAY=:0 zenity --error --title='ERROR %s is down!' --text='ERROR %s is down!'" % (server, server)
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    process.wait()

for server in servers:
    if verbose:
        print "\n+------------------------------+"
        print "check: " + server
    if getOnlinestatus(server):
        if verbose:
            print "%s is up." % server
    else:
        if verbose:
            print "%s have maybe a problem!" % server
        if verbose:
            print "wait %d and checking after again." % interval
        sleep(interval)
        #try again
        if verbose:
            print "wakeup, check again %s." % server
        if getOnlinestatus(server):
            if verbose:
                print "%s looks now ok." % server
        else:
            #alarm
            if verbose:
                print "%s not up send alert!" % server
                sendAlarm(server)

Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Mittwoch 15. August 2007, 19:07

Wieso verwendest du nmap und scannst nicht selber? Am besten einfach mit urllib ein HEAD absetzen, dann weist du auch gleich ob der Webserver noch halbwegs gesund ist ;)

Wieso wartest du auf die Prozesse? Auf Zenity brauchst du nicht zu warten und bei nmap ist ja schon das read() da :)

Wieso machst du da 2 if Abfragen?

Code: Alles auswählen

        if verbose:
            print "%s have maybe a problem!" % server
        if verbose:
            print "wait %d and checking after again." % interval


"%s have maybe a problem" tönt komisch, wie wäre es mit "There might be a problem with %s"

Code: Alles auswählen

try:
    if 'verbose' in sys.argv[1]:
        verbose = True
    else:
        verbose = False
except:
    verbose = False

Das geht kürzer:

Code: Alles auswählen

verbose = 'verbose' in sys.argv


Warum ist das kein docstring?

Code: Alles auswählen

# check if a list of webservers are running.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Mittwoch 15. August 2007, 20:20

nmap? Ist das nicht eins von diesen boesen Hackertools? Ab ins Gefaengnis mit euch!

Seit dem Wochenende mach ich mich wahrscheinlich dauernd strafbar. Ich lade Hackertools herunter, getarnt als Debian-Online-Update... :evil: :evil: :evil:
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Mittwoch 15. August 2007, 22:36

Rebecca hat geschrieben:nmap? Ist das nicht eins von diesen boesen Hackertools? Ab ins Gefaengnis mit euch!
Sieht aus als währe er Östreicher :þ
Und ich nehme an die dürfen das, genauso wie wir Schweizer!

Hah! Bald gibt es eine Digitale Invasion auf der wehrlose Deutschland! Mit pöösen h4x0rt00lz :D
pycodein
User
Beiträge: 10
Registriert: Dienstag 12. Juni 2007, 15:48

Beitragvon pycodein » Donnerstag 16. August 2007, 01:01

Ich muß mir anschauen wie das geht mit urllib und HEAD absetzen, ich hab mit httplib angefangen ein GET abzusetzen aber das timeout hat bis zu 2 Minuten gedauert wenn der Server down war. Bei nmap dauert es nur ein paar Sekunden.

Ich würde eine nicht nmap und nicht zenity Lösung sogar sehr bevorzugen da man es auch auf allen Plattformen einsetzen könnte. Vielleicht mit Tkinter und urllib mal schauen.

Bei subprocess wait() hab ich mir gedacht das muß immer angegeben werden, werde ich nachlesen warum nicht.

Ich bin ein evil h4x0r darum nutze ich ja nmap!
Nein war nur Spaß bevor mich noch das BKA abholt.
Und wie es veers vermutet bin ich Österreicher und da gibt es den § noch nicht.

hier noch mal mein überarbeitetes Script und danke veers, solche Tipps helfen mir enorm! alleine das mit verbose :)


Code: Alles auswählen

#!/usr/bin/python
""" check if a list of webservers are running. """

import subprocess, re, sys
from time import sleep
from os import path

servers = ['server1.at', 'server2.at', 'server3.at']
interval = 60 #seconds

#check if nmap is installed
if not path.exists("/usr/bin/nmap"):
    sys.exit("""You must install the package "nmap" first!""")

#check for "verbose" parameter
verbose = 'verbose' in sys.argv

def getOnlinestatus(server):
    """ scan with nmap port 80 and search for the "open"-string """
    cmd = "nmap %s -p 80" % server
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    process.wait()
    msg = process.stdout.read()
    pattern = re.compile("80/tcp open  http")
    return pattern.search(msg)

def sendAlarm(server):
    """ send a error-message window with zenity """
    cmd = "env DISPLAY=:0 zenity --error --title='ERROR %s is down!' --text='ERROR %s is down!'" % (server, server)
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    process.wait()

for server in servers:
    if verbose:
        print "\n+------------------------------+"
        print "check: " + server
    if getOnlinestatus(server):
        if verbose:
            print "%s is up." % server
    else:
        if verbose:
            print "there might be a problem with %s!" % server
            print "wait %d and checking after again." % interval
        sleep(interval)
        #try again
        if verbose:
            print "wakeup, check again %s." % server
        if getOnlinestatus(server):
            if verbose:
                print "%s looks now ok." % server
        else:
            #alarm
            if verbose:
                print "%s not up send alert!" % server
                sendAlarm(server)
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Donnerstag 16. August 2007, 01:37

Den Timeout kannst du selber setzen, schau dir mal socket.setdefaulttimeout an ;) Alternativ könntest du zumindest unter Unix noch alarm() verwenden.
pycodein
User
Beiträge: 10
Registriert: Dienstag 12. Juni 2007, 15:48

Beitragvon pycodein » Donnerstag 16. August 2007, 11:50

ok ohne h4x0r tool nmap :)
ist try bei "getOnlinestatus()" so richtig angesetzt oder würdet ihr das anders machen?

socket.setdefaulttimeout() ist ne feine Sache.

Code: Alles auswählen

#!/usr/bin/python
""" check if a list of webservers are running. """

import subprocess, re, sys
from time import sleep
from urllib2 import urlopen
import socket

servers = ['server1.at', 'server2.at', 'server3.at']
interval = 60 #seconds

socket.setdefaulttimeout(20) #seconds

#check for "verbose" parameter
verbose = 'verbose' in sys.argv

def getOnlinestatus(server):
    """ try do open the webserver """
    try:
        u = urlopen('http://' + server)
    except:
        return False
    else:
        return True

def sendAlarm(server):
    """ send a error-message window with zenity """
    cmd = "env DISPLAY=:0 zenity --error --title='ERROR %s is down!' --text='ERROR %s is down!'" % (server, server)
    process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

for server in servers:
    if verbose:
        print "\n+------------------------------+"
        print "check: " + server
    if getOnlinestatus(server):
        if verbose:
            print "%s is up." % server
    else:
        if verbose:
            print "there might be a problem with %s!" % server
            print "wait %d and checking after again." % interval
        sleep(interval)
        #try again
        if verbose:
            print "wakeup, check again %s." % server
        if getOnlinestatus(server):
            if verbose:
                print "%s looks now ok." % server
        else:
            #alarm
            if verbose:
                print "%s not up send alert!" % server
                sendAlarm(server)

Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Beitragvon veers » Donnerstag 16. August 2007, 12:22

Code: Alles auswählen

        if getOnlinestatus(server):
            if verbose:
                print "%s looks now ok." % server
        else:
            #alarm
            if verbose:
                print "%s not up send alert!" % server
                sendAlarm(server)

Warum nicht

Code: Alles auswählen

if getOnlinestatus(server) and verbose:
            print "%s looks now ok." % server
        elif verbose:
            #alarm
             print "%s not up send alert!" % server
             sendAlarm(server)

Wobei ich mich frage warum der Alarm nur ausgeloest werden soll wenn verbose True ist (:[/code]
pycodein
User
Beiträge: 10
Registriert: Dienstag 12. Juni 2007, 15:48

Beitragvon pycodein » Donnerstag 16. August 2007, 12:30

ja das ist schwachsinn natürlich, zuweit eingerückt.
Benutzeravatar
Bartolomeo
User
Beiträge: 1
Registriert: Dienstag 15. Januar 2008, 12:28

Beitragvon Bartolomeo » Dienstag 15. Januar 2008, 12:41

Danke für die Information
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Dienstag 15. Januar 2008, 13:27

Ich werfe mal mon ein.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder