Seite 1 von 1

Webserver monitoring

Verfasst: Mittwoch 15. August 2007, 17:22
von pycodein
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)


Verfasst: Mittwoch 15. August 2007, 19:07
von veers
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. 

Verfasst: Mittwoch 15. August 2007, 20:20
von Rebecca
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:

Verfasst: Mittwoch 15. August 2007, 22:36
von veers
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

Verfasst: Donnerstag 16. August 2007, 01:01
von pycodein
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)

Verfasst: Donnerstag 16. August 2007, 01:37
von veers
Den Timeout kannst du selber setzen, schau dir mal socket.setdefaulttimeout an ;) Alternativ könntest du zumindest unter Unix noch alarm() verwenden.

Verfasst: Donnerstag 16. August 2007, 11:50
von pycodein
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)


Verfasst: Donnerstag 16. August 2007, 12:22
von veers

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]

Verfasst: Donnerstag 16. August 2007, 12:30
von pycodein
ja das ist schwachsinn natürlich, zuweit eingerückt.

Verfasst: Dienstag 15. Januar 2008, 12:41
von Bartolomeo
Danke für die Information

Verfasst: Dienstag 15. Januar 2008, 13:27
von Y0Gi
Ich werfe mal mon ein.