#!/usr/bin/perl use strict; use warnings; use Getopt::Long; use Win32::Service; use Mail::Sendmail; # main-parameeters my %config=( "logmail"=>0, # 1... immer eine LogMail verschicken "service"=>'', # Name des Service; wird keiner angegeben, dann Fehlermail "title_err"=>'name of service', # Betrefftext für die FehlerMail "title_log"=>'name of service', # Betrefftext für die LogMail "message"=>'message in error-mail', # Text für die Fehlerinfo-Email "email_to"=>'', # es kann auch eine Liste von Empfängern angegeben werden, Trennzeichen ";" "email_from"=>'gis-hotline@ebhl.de', # von wem wird die eMail versandt "email_pwd"=>'GH2014wiki', # Anmeldepasswort am Exchange "email_required"=>1, # eine Authorisierung erforderliche? "email_smtp"=>'ma22-ex-002.local.ebhl.de', # Exchange-Server ); GetOptions ( "help|h" => sub{ Usage(); }, "logmail" => sub{ $config{logmail}=1; }, "service=s" => \$config{service}, "terr=s" => \$config{title_err}, "tlog=s" => \$config{title_log}, "message=s" => \$config{message}, "to=s" => \$config{email_to}, ) or Usage(); my $hostname = '127.0.0.1'; # this means local host. my $name_of_this_machine = (gethostbyname ("localhost"))[0]; my $report_text = ''; my $report_subject = $name_of_this_machine." - Service: ".$config{service}." - Statusreport"; my $report_subject_error = "FEHLER - ".$name_of_this_machine." - Service: ".$config{service}; print "Rechnername: ".$name_of_this_machine."\n"; if ($config{email_to} !~ /^([a-zA-Z0-9][a-zA-Z_0-9-\.]*)(\@)([a-zA-Z0-9][a-zA-Z_0-9-\.]*[a-zA-Z0-9])(\.)([a-zA-Z0-9]*)$/) { print "** Es wurde keine gueltige Empfaenger-eMail-Adresse angegeben!!**\n\n"; $report_subject = "** ".$report_subject; $report_text .= "\n\nEs wurde keine gueltige Zieladresse fuer die eMail angegeben!!\n\n"; # bevor es keine Adresse gibt, dann an mich selber schicken - die groesste Chance jemanden zu erreichen $config{email_to} = $config{email_from}; # auf jeden Fall eine eMail verschicken. $config{logmail} = 1; } my %info; # wenn kein Service-Name angegeben, dann wir automatisch eine Mail an den Admin versandt!! if ($config{service} eq "") { print "** Es wurde kein Service angegeben!!**\n\n"; $report_text .= "\n\n\nFataler Fehler in Prueffunktion - es wurde kein Service-Name angegeben !!\n\n"; # Hervorheben der Überschrift $report_subject = "** ".$report_subject; # Zwangsemail wird verschickt $config{logmail} = 1; } else { print "Service zu pruefen: ".$config{service}."\n"; my %state_code = ( 1 => 'not running', 2 => 'start pending', 3 => 'stop pending', 4 => 'running', 5 => 'resume pending', #wieder anhängig 6 => 'pause pending', #pause anhängig 7 => 'paused' ); Win32::Service::GetStatus($hostname,$config{service},\%info); $report_text .= "Service: ".$config{service}."\n"; $report_text .= "Hostname: ".$hostname."\n"; $report_text .= "Status: ".$info{'CurrentState'}." -> ".$state_code{$info{'CurrentState'}}."\n"; #print "\tState: ", $state_code{$info{'CurrentState'}} || $info{'CurrentState'} , "\n"; # nachfolgende Daten werden in die eMail mit aufgenommen ! print "\tStateNo: ".$info{'CurrentState'}."\n"; $report_text .= "PID: $info{'ProcessId'}\n" if ($info{'ProcessId'}); $report_text .= "Exited with code $info{'Win32ExitCode'}.\n" if ($info{'Win32ExitCode'}); $report_text .= "Exited with error; code $info{'ServiceSpecificExitCode'} was logged.\n" if ($info{'ServiceSpecificExitCode'}); $report_text .= "Approx. $info{'WaitHint'} milliseconds until complete.\n" if ($info{'WaitHint'}); $report_text .= "Checkpoint: $info{'CheckPoint'}\n" if ($info{'CheckPoint'}); } # endif-wurde ein Service-Name übergeben? # wenn immer eine eMail an den Admin verschickt werden soll SendReportMail(\%config, $report_text, $report_subject_error) if ($info{'CurrentState'} != 4); # wenn immer eine eMail an den Admin verschickt werden soll SendReportMail(\%config, $report_text, $report_subject) if ($config{logmail} ==1); sub Usage { my( $message ) = @_; if( $message ) { print "$message\n"; } print "******hier muss noch dokumentiert werden ******\n"; print "\t-help this help\n"; print "....\n"; exit 0; # beenden } sub SendReportMail{ my %conf = %{shift()}; my $meldung = shift || "Es wurde keine Meldung bereitgestellt!"; my $betriff = shift || "Meldung vom Monitoring-System!"; my %mail = ( To => $conf{email_to}, From => $conf{email_from}, Message => $report_text, Subject => $report_subject, ); $mail{auth} = {user=>$conf{email_from}, password=>$conf{email_pwd}, required=>$conf{email_required} }; $mail{Smtp} = $conf{email_smtp}; sendmail(%mail) or die $Mail::Sendmail::error; print "OK. Log says:\n", $Mail::Sendmail::log; }#end-SendReportMail