Tags

, , , , , , , ,

I have written a perl script (!) which will monitor the network & integrate this script with SMS Server Tools. What it does is check the network in every 5 mins. If any host down sms it to me with host name and down time. If the host up again it sms me the uptime. In the script following perl module are used :

use File::Copy;
use File::stat;
use DBI;
use Net::Ping::External qw(ping);

Hostnames are taken from MySql Database. Database has the followind table structure:

+——————-+———————+———+——-+————-+————————+
| Field               | Type               | Null   | Key | Default    | Extra |
+——————-+———————+———+——-+————-+————————+
| sl_no              | int(11)             | NO    | PRI   | NULL | auto_increment |
| ip_address         | varchar(15)         | YES   |       | NULL |                               |
| flag               | varchar(1)          | YES   |       | NULL |                              |
| description        | varchar(100)        | YES   |       | NULL |                              |
+——————-+———————+———+——-+————-+————————+

Complete perl script:


#!/usr/bin/perl
#———————————————————————————————-
# This script check reachability of remote hosts on a network
# You only need to change the phone no in this file.
#———————————————————————————————-

use Net::Ping;
use File::Copy;
use File::stat;
use DBI;
use Net::Ping::External qw(ping);

#———define the phone no to send sms

my @phone_no =
  qw( 123456789 987654321);

#——-define the mysql variables
my $dsn = ‘dbi:mysql:sms:localhost:3306’;
my $user = “root”;
my $pass = “my_sql_password”;
my $sms_log = “/var/spool/sms/outgoing/output.” . time;

#——-time function
@months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
@weekDays = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
$year = 1900 + $yearOffset;
$theTime = “$hour:$minute $weekDays[$dayOfWeek] $months[$month] $dayOfMonth, $year”;

#——-create connection string
my $dbh = DBI->connect($dsn, $user, $pass) or die “Can not connect to the DB: $DBI::errstrn”;

#——-execute sql query
my $q_sth = $dbh->prepare(“select * from sms_host”);
$q_sth->execute;
while(@row = $q_sth->fetchrow_array()) {
        $alive = ping(hostname => $row[1], count => 6, size => 64, timeout => 100);
        if ($alive eq “1” ) {
                if ($row[2] eq “D”) {
                        my $qd_update = $dbh->prepare(“update sms_host set flag=’U’ where sl_no=’$row[0]’”) or die “Cannot prepare: ” . $dbh->errstr();
                        $qd_update->execute;
                        $qd_update->finish();
                        print “$row[3] UP at $theTimen”;

                        #—————now send the sms 🙂
                        foreach my $phone_no (@phone_no) {
                                open (OUT, “>$sms_log.$phone_no.$row[1]”) or die “Can’t open log-file”;
                                print OUT “To: $phone_non”;
                                print OUT “n”;
                                print OUT “$row[3] UP at $theTimen”;
                                close(OUT);
                        }
                }
                else {
                print “Nothing to Do, Host $row[1] already upn”;
                }
        }
        else {
                if ($row[2] eq “U”) {
                        my $qu_update = $dbh->prepare(“update sms_host set flag=’D’ where sl_no=’$row[0]’”) or die “Cannot prepare: ” . $dbh->errstr();
                        $qu_update->execute;
                        $qu_update->finish();
                        print “$row[3] DOWN at $theTimen”;
                        sleep(1);

                        #—————now send the sms 🙂
                        foreach my $phone_no (@phone_no) {
                                open (OUT, “>$sms_log.$phone_no.$row[1]”) or die “Can’t open log-file”;
                                print OUT “To: $phone_non”;
                                print OUT “n”;
                                print OUT “$row[3] DOWN at $theTime n”;
                                close(OUT);
                        }
                }
                else {
                print “Host $row[1] already DOWNn”;
                }
        }
}