Service Überwachungs Tool

Hallo,
ich wollte fragen ob jemand ein Monitoring Tool kennt, welches überwacht ob eingetragene Prozesse noch laufen. Schön wär es auch, wenn dieses Programm eine Benachrichtigung per Email schickt, falls ein Service ausfällt.
Außerdem sollte es freeware sein.

Schön wär es außerdem, wenn es nich nur auf einem 2003 Server laufen würde, sondern auch auf XP, dies ist aber nicht zwigend notwendig.
 
re

Hi, wenn das die einzige Aufgabenstellung ist, dann wuerde ich dir sowas schnell in Perl scripten, is auch freeware ;-)

MfG
 
hiho,
danke erstmal für die Antworten!
Das Tool wird dann in kleineren Firmen laufen, aber eben auf einem Windows Server ... für Linux wüsste ich wie ich das einfach bewerkstelligen könnte :)


Also ich hab mir das angeschaut was zimoe gepostet hat, das ist auch so in der Art wie ich es suche, aber eben nicht freeware :)
Zurzeit lerne ich auch Python, damit ich das dann selber schreiben kann... mal schaun was draus wird. Wenn ich fertig bin werde ichs irgendwo zum download stellen.
Aber falls trotzdem noch wer diesen Thread liest, der ein solches Tool kennt bin ich immernoch offen für Vorschläge :D

p.s.:styx-cc, also wenn du soviel Zeit hast und das machen würdest wär das nett :D
 
re

Jap,momentan hab ich Zeit und Lust =)
Setz ich mich geich mal ran.
-Dienste auflisten
-Gucken ob angegebene Dienste laufen
-falls nein, email senden
-falls ja alle x Minuten nochmals von Vorne
 
Jop genau so stelle ich mir das vor :)
Werde morgen auch noch weiter an meiner python-basierten Lösung basteln... mal schaun was da noch so rauskommt.
Danke schonmal im vorraus für die mühen :D
 
re

Holla, ich hab schon mal angefangen, alles funktioniert so weit bis auf das Versenden einer Mail, aber das mach ich morgen. Hier kannst du erstmal ein wenig spielen:

procinfo.plx
Code:
#!/usr/bin/perl -w
use strict;
use Win32::Process::List;
$|++;

my %config = load_config();
my @required_services = split /;/, $config{'procs'};

#main loop
while (1) {
  #get process-list
  my $proc_list = Win32::Process::List->new();
  my %list = $proc_list->GetProcesses();

  #check for missing processes
  my @missing;
  for my $service (@required_services) {
	unless (grep $service eq $list{$_}, keys %list) {
	  push @missing, $service;
	}
  }
print "\rThere're ".$proc_list->GetNProcesses()." running and ".scalar(@missing)." missed processes." if $config{'print_state'};

#send_email(\@missing) if (@missing);
select(undef,undef,undef,$config{'delay'});
}

sub send_email {
  my $missing = shift;
  my $message = "\nThere're some missing processes:\n";
  $message .= join "\n", @$missing;
  print "$message\n\n";
}

sub load_config {
  my %config;
  #arguments wich will accept
  my @args = qw/procs print_state delay host usr pass/;
  #readout configfile
  open(CONF, "<procinfo_conf.conf") or die("Can't open file: $!");
  for (<CONF>) {
    next if ( (/^#/) or (/^\W/) ); #ignore comment-lines
    chomp;
    my @parts = split(/=/, $_);
    my ($var, $value) = @parts;
    for my $option (@args) {	   
      if ($var eq "$option") {
         $config{$var} = $value if $value;
        last;
      }	   
    }
  }
  close CONF;
  return %config;
} #sub load_config()

procinfo_conf.config
Code:
#configuration file for procinfo.plx

#processes which have to watch
procs=calc.exe;mspaint.exe

#print out results (boolean)
print_state=1

#wait time in seconds
delay=5

#emal settings
host=www.example.org
usr=username
pass=password

Wenn du fragen hast, immer frage =)
MfG

------------------------------------------------------------------

Sooo..... habs fertig :-)

procinfo.plx
Code:
#!/usr/bin/perl -w
use strict;
use Win32::Process::List;
use Net::SMTP;
use NET::SMTP_auth;
$|++;

my %config = load_config();
my @required_services = split /;/, $config{'procs'};

#main loop
while (1) {
  #get process-list
  my $proc_list = Win32::Process::List->new();
  my %list = $proc_list->GetProcesses();

  #check for missing processes
  my @missing;
  for my $service (@required_services) {
	unless (grep $service eq $list{$_}, keys %list) {
	  push @missing, $service;
	}
  }
  print_1 ("\rThere're ".$proc_list->GetNProcesses()." running and ".scalar(@missing)." missed processes.");

  send_email(\@missing) if (@missing);
  select(undef,undef,undef,$config{'delay'});
}

sub send_email {
  my $missing = shift;
  print_1 ("\nSending warn mail(!) and waiting 20 minutes.\n");
  my $smtp = Net::SMTP_auth->new($config{'host'});
  $smtp->auth('LOGIN', $config{'usr'}, $config{'pass'}) || die $!;

  my($to, $subject) = ($config{'to'}, 'Process-Warning');
  my $msg = "There're some missing processes:\n" . join("\n", @{$missing} );
  
  $smtp->mail();
  $smtp->to($config{'to'});
  $smtp->data();
  $smtp->datasend("From: $config{'from'}\n");
  $smtp->datasend("To: $config{'to'}\n");
  $smtp->datasend("Subject: $subject\n\n"); # end header
  $smtp->datasend("$msg\n");
  $smtp->dataend();
  $smtp->quit;
  print_1 ("Missing: ". join(',', @{$missing} ) ."\n\n");
  sleep(20*60);
}

sub load_config {
  my %config;
  #arguments wich will accept
  my @args = qw/procs print_state delay host usr pass from to/;
  #readout configfile
  open(CONF, "<procinfo_conf.conf") or die("Can't open file: $!");
  for (<CONF>) {
    next if ( (/^#/) or (/^\W/) ); #ignore comment-lines
    chomp;
    my @parts = split(/=/, $_);
    my ($var, $value) = @parts;
    for my $option (@args) {	   
      if ($var eq "$option") {
         $config{$var} = $value if $value;
        last;
      }	   
    }
  }
  close CONF;
  return %config;
} #sub load_config()

sub print_1 {print "$_[0]" if $config{'print_state'};}

procinfo_conf.conf
Code:
#configuration file for procinfo.plx

#processes which have to watch
procs=calc.exe;mspaint.exe

#print out results (boolean)
print_state=1

#wait time in seconds
delay=3


#email settings

#smpt-server
host=deinServerName.de
#usr to login
usr=username
#pw
pass=passwort
#addressor
from=von@email.adresse
#acceptor
to=an@email.adresse
 
Hiho, danke für deine Mühen, mittlerweile habe ich es aber auch schon in Python gescriptet ^^

Funktionen.py
Code:
# -*- coding: iso-8859-1 -*-

""" 
Written by ftx with a Codesnippet from gerold 
""" 
#Module werden importiert
import sys 
import os 
import re

#Variable für den Pfad, wo die config Datei sitzt
config_pfad="./config.cfg"
def prozess_config():
    cfg = {} # Dictionary initialisierung
    config=open(config_pfad) #Öffnen der Configdatei

    exerex = re.compile('.*\.*') # Regex initialisierung
    
    for line in config:
        line=line.strip() # Leerzeichen am Anfang und Ende entfernen
        if not line:
            continue # Überspringe leere Zeilen
        if line.startswith("#"):
            continue # Überspringe Kommentarzeilen
        if(line == "[Prozesse]"): #Wenn er in er for Schleife auf den String trifft
            for new_line in config: #geht die nächste vorschleife durch
                new_line=new_line.strip() #Leerzeichen entfernen
                if new_line.startswith("#"): #Kommentarzeilen überspringen
                    continue
                
                match=exerex.match(new_line) # Regulärer Ausdruck 
                if new_line.startswith("["): #Wenn neue Kategorie dann raus aus der Schleife
                    break
                if(type(match) is not type(None)): # Wenn der gematchte Type NICHT vom Typ "None" ist,
                    match.group()                  # wird er in die Match-Group aufgenommen
                    variable=match.group()
                    cfg[variable] = 0    # Alle Variablen bekommen den Wert 0
        
    return cfg   # Return des Dictionarys

def email_config():
    email = {} # Dictionary initialisierung
    config=open(config_pfad) #Öffnen der Configdatei
    
    for line in config:
        line=line.strip() # Leerzeichen am Anfang und Ende entfernen
        if not line:
            continue # Überspringe leere Zeilen
        if line.startswith("#"):
            continue # Überspringe Kommentarzeilen
        if(line == "[Email]"): # Wenn er auf den String trifft, wird eine neue
            for new_line in config: # for Schleife initialisiert
                new_line=new_line.strip() # Leerzeichen am Anfang und Ende entfernen
                if new_line.startswith("#"):
                    continue # Überspringe Kommentarzeilen
                match=re.match('(.*?)\s*=\s*(.*?)$', new_line) # Regulärer Ausdruck
                if new_line.startswith("["): # Schleifen-Break wenn neue Kategorie beginnt
                    break
                if(type(match) is not type(None)): # Wenn der gematchte Type NICHT vom Typ "None" ist,
                    variable=match.group(1)        # wird er in die Group aufgenommen
                    wert=match.group(2)
                    email[variable]=wert # Dictionary mit der vorderen Group als Key und der Hinteren als Value
    return email # Rückgabe des Dictionarys

def optional_config():
    optional = {} # Dictionary initialisierung
    config=open(config_pfad) #Öffnen der Configdatei
    
    for line in config:
        line=line.strip() # Leerzeichen am Anfang und Ende entfernen
        if not line:
            continue # Überspringe leere Zeilen
        if line.startswith("#"):
            continue # Überspringe Kommentarzeilen
        if(line == "[Optional]"): # Wenn er auf den String trifft, wird eine neue
            for new_line in config: # for Schleife initialisiert
                new_line=new_line.strip() # Leerzeichen am Anfang und Ende entfernen
                if new_line.startswith("#"):
                    continue # Überspringe Kommentarzeilen
                match=re.match('(.*?)\s*=\s*(.*?)$', new_line) # Regulärer Ausdruck
                if new_line.startswith("["): # Schleifen-Break wenn neue Kategorie beginnt
                    break
                if(type(match) is not type(None)): # Wenn der gematchte Type NICHT vom Typ "None" ist,
                    variable=match.group(1)        # wird er in die Group aufgenommen
                    wert=match.group(2)
                    optional[variable]=wert # Dictionary mit der vorderen Group als Key und der Hinteren als Value
    return optional # Rückgabe des Dictionarys




def get_current_processes(): 

    
    retdict = {} 
    
    if sys.platform.startswith("win"): 
        # tasklist.exe runs on Windows XP and higher. (To parse the ouput of 
        # tasklist.exe is faster than WMI.) 
        import csv 
        csvlines = [] 
        for line in os.popen("tasklist.exe /fo csv /nh"): # Für jede Zeile die der Befehl ausgibt
            line = line.strip()  # Leerzeichen entfernen
            if line: 
                csvlines.append(line) # Die Zeilen werden in einem Dictionary gespeichert
        for line in csv.reader(csvlines): 
            pid = int(line[1]) 
            details = { 
                "name": line[0].decode("cp850"), # to unicode 
                "pid": pid, 
            } 
            value = "".join( 
                char for char in line[4] 
                if char in "0123456789" 
            ) 
            details["size_kb"] = int(value) 
            retdict[pid] = details 

    return retdict or None


prozesse.py

Code:
# -*- coding: iso-8859-1 -*- 

""" 
Written by ftx with a Codesnippet from gerold 
""" 

#Benötigte Module werden importiert

import sys 
import os 
import re
import smtplib
import funktionen

#Funktionsrückgabewerte werden in Variablen gespeichert

email = funktionen.email_config()
optional = funktionen.optional_config()
eintraege = funktionen.get_current_processes().items()
config = funktionen.prozess_config()

#Initialisierung eines Dictionarys für die Überprüfung, ob die Prozesse laufen,
#welche in der Config stehen.

dic={}

#Einfügen der Prozesse, die in der Config stehen, in ein Dictionary welches allen
#automatisch den Value 0 gibt

for k, v in config.iteritems():
    if not (dic.has_key(k)):
        dic[k] = 0  # neuen Eintrag hinzufügen


#For-Schleifen zum Testen, ob es Übereinstimmungen gibt zwischen den laufenden Prozessen
#und den in der CFG-Datei eingetragenen. Wenn übereinstimmung, wird der Value auf 1 gesetzt

for eintrag in eintraege:
    for key in dic.keys():
        for value in dic.values():
            if(str(eintrag[1]["name"]) == str(key)):
                dic[key] = 1

#Das Email Dictionary wird durchgegangen, wenn bestimmte Strings matchen, wird es
#in Variablen geschrieben

for k, v in email.iteritems():
    if(k == "Empfaenger"):
        empfaenger = v
    if(k == "SMTPServer"):
        smtpserver = v
    if(k == "Absender"):
        absender = v

#Das Optional Dictionary wird durchgegagen, wenn bestimmte Strings matchen, wird es
#in Variablen geschrieben
for k, v in optional.iteritems():
    if(k == "Loginname"):
        loginname = v
    if(k == "Passwort"):
        passwort = v

#Mail Server Verbindung wird aufgebaut, sollte loginname&passwort in der CFG-Datei
#eingetragen worden sein, so läuft die Schleife normal durch, wenn nicht wird so
#versucht zum SMTP-Server zu connecten
server = smtplib.SMTP(smtpserver)
try:
    server.login(loginname,passwort)
except:
    smtplib.SMTPAuthenticationError
else:
    ausfall = "Folgende/r Dienst/e sind/ist ausgefallen:"
    allesklar = "Alle Dienste laufen, super!"
    zwisch = 0 # Variablen initialisierung
    err = False # Variablen initialisierung
    format = 0 # Variablen initialisierung
    for k, v in dic.iteritems(): # Wenn es Prozesse gibt, die ausgefallen sind, wird err = True gesetzt
        if(v == 0):
            if(format == 0):
                ausfall = ausfall + " " + k
                err = True
                format = 1
            else:
                ausfall = ausfall + " " + k + ","
    ausfall = ausfall.strip(",")
#Wenn err True ist, wird ein ausfall beklagt, wenn alle Dienste laufen, wird die Var "allesklar" versendet        
    if (err == True):
        server.sendmail(absender,empfaenger,ausfall)
    else:
        server.sendmail(absender,empfaenger,allesklar)
    server.quit() # Server Connection Close

Die dazugehörige config Datei mit dem Namen "config.cfg"

Code:
#Alle Zeilen die mit einer "#" beginnen, sind Kommentarzeilen
#Unter Prozesse werden alle Prozesse eingetragen, die überwacht werden sollen
#Es sollten dabei die Korrekte schreibweise beachtet werden, d.h. der Prozess
#sollte so eingetragen werden, wie er im Taskmanager auftaucht (auch groß/kleinschreibung beachten

[Prozesse]
#Hier Prozessnamen eintragen
explorer.exe   
eclipse.exe

[Email]
#Hier Email Daten einfügen und auf Korrektheit prüfen, wenn diese fehlerhaft sind, wird KEINE Email versendet!
SMTPServer=smtp.****.de  
Empfaenger******@googlemail.com  
Absender=*******@web.de  

[Optional]
#Falls Login beim smtp-Server notwendig ist, hier die Daten rein
Loginname=*******
Passwort=******


Das läuft super, bis jetzt auch keine Bugs gefunden... tolles Programm :D Bin froh das ich das so hinbekommen habe, habe erst vor 3 Tagen angefangen mit Python :)
 
Hallo Leute ,
Ich wollte fragen ob ihr mir helfen könnt:)
Ich wollte das gleiche nur bei mir gehts es um Plesk
wenn ein Service ausfällt z.B. falls Fehler auftauchen oder veränderungen geben will ich benarichtigt werden.
Wenn es möglich ist soll es auch in den Diensten von Windows möglich sein also die überwachung z.B. in
ISS 6
Dateiserver usw.
oder im Plesk wenn sich jemand mehr als 2 mal falsch einloggt oder so soll ich benahrichtigt werden auch das gleiche bei dem VPN verbindung könnt ihr mir Helfen Leute??


mfg
 
Leider noch nix weil ich mich nicht mit Python nicht auskenne :(
habe auch nicht viel zeit weil morgen kriegen wird die zeugnisse und danach ab in den Ferien deshalb brauch ich es dringend daher würde ich dich bitten mir zu helfen.


Mfg
 
Zurück
Oben