#! /usr/bin/perl # multimonitor.pl # monitor http,https,smtp on remote servers. use strict; my (@rwebhost,@rswebhost,@rmailhost,$key,%host); # http %host = (); push @rwebhost,"coolsite.com","notcoolsite.com","sheepydeepy.com"; foreach (@rwebhost) { %host = ($_ => &getips($_)); foreach $key (keys %host) { &scan_httpd($host{$key},$key); } } # https push @rswebhost,"secure.coolsite.com"; foreach (@rswebhost) { %host = ($_ => &getips($_)); foreach $key (keys %host) { &scan_httpsd($host{$key},$key); } } # smtp push @rmailhost,"mail.sheepydeepy.com"; foreach (@rmailhost) { %host = ($_ => &getips($_)); foreach $key (keys %host) { &scan_smtp($host{$key},$key); } } sub getips() { my $host = shift; my ($name,$aliases,$addrtype,$length,@addrs,@ips); (($name, $aliases, $addrtype, $length, @addrs) = gethostbyname($host)) || &email_resolution_error($host); foreach (@addrs) { @ips = join('.',unpack('C4',$_)),"\n"; return @ips; } } # =================================== sub scan_httpd() { # Scan for HTTP service. my @ips = shift; my @hostname = shift; my $port = "80"; for (my $i = 0; $i < @ips; $i++) { my @results = `/usr/bin/nmap -P0 -p$port -oG - $ips[$i] | grep \"Status: Up\"`; for (@results) { &email_connection_error($hostname[$i]) if $_ =~ $ips[$i]; } } } sub scan_httpsd() { # Scan for HTTPS service. my @ips = shift; my @hostname = shift; my $port = "443"; for (my $i = 0; $i < @ips; $i++) { my @results = `/usr/bin/nmap -P0 -p$port -oG - $ips[$i] | grep \"Status: Up\"`; for (@results) { &email_connection_error($hostname[$i]) if $_ =~ $ips[$i]; } } } sub scan_smtp() { # Scan for SMTP service. my @ips = shift; my @hostname = shift; my $port = "25"; for (my $i = 0; $i < @ips; $i++) { my @results = `/usr/bin/nmap -P0 -p$port -oG - $ips[$i] | grep \"Status: Up\"`; for (@results) { &email_connection_error($hostname[$i]) if $_ =~ $ips[$i]; } } } sub email_resolution_error() { my $rnode = shift; my $hostname = `/bin/uname -n`; chomp($hostname); open(SENDMAIL, "|/usr/lib/sendmail -oi -t") or die "Cannot fork for sendmail: $!\n"; print SENDMAIL < To: System Admin ,somemobile\@otherdomain.net Subject: The domain $rnode cannot be resolved! This email is generated by the Multi-Monitor script on $hostname... WARNING: The domain $rnode cannot be resolved! EOF close(SENDMAIL) or warn "Oops, sendmail did not close nicely"; } sub email_connection_error() { my $hostname = `/bin/uname -n`; my $remote_server = shift; chomp($hostname); chomp($remote_server); # switch $remote_server back to a hostname. open(SENDMAIL, "|/usr/lib/sendmail -oi -t") or die "Cannot fork for sendmail: $!\n"; print SENDMAIL < To: System Admin ,somemobile\@otherdomain.net Subject: Connection Trouble on $remote_server! This email is generated by the Mulit-Monitor script on $hostname... WARNING: $remote_server cannot be contacted! EOF close(SENDMAIL) or warn "Oops, sendmail did not close nicely"; }