aboutsummaryrefslogtreecommitdiffstats
path: root/clients
diff options
context:
space:
mode:
authorKristian Lyngstol <kristian@bohemians.org>2016-04-12 18:01:32 +0200
committerKristian Lyngstol <kristian@bohemians.org>2016-04-12 18:01:32 +0200
commit09ea945c3908fd42e90eb64c194d9af11d174206 (patch)
tree8bcf0f98113ea4a92effa1c39344730c7e6f50b0 /clients
parentc3ebdbda43c23ade1e49dfd9f546fba1d15f9941 (diff)
Actual initial import
Fetched from tgmanage.
Diffstat (limited to 'clients')
-rwxr-xr-xclients/dhcptail.pl59
-rwxr-xr-xclients/ping.pl100
-rwxr-xr-xclients/snmpfetchng.pl141
3 files changed, 300 insertions, 0 deletions
diff --git a/clients/dhcptail.pl b/clients/dhcptail.pl
new file mode 100755
index 0000000..9c2111f
--- /dev/null
+++ b/clients/dhcptail.pl
@@ -0,0 +1,59 @@
+#! /usr/bin/perl
+use DBI;
+use POSIX;
+use lib '../include';
+use nms;
+use strict;
+use Data::Dumper;
+use warnings;
+
+BEGIN {
+ require "../include/config.pm";
+ eval {
+ require "../include/config.local.pm";
+ };
+}
+
+my $year = $nms::config::tgname;
+$year =~ s/tg/20/; # hihi
+
+my %months = (
+ Jan => 1,
+ Feb => 2,
+ Mar => 3,
+ Apr => 4,
+ May => 5,
+ Jun => 6,
+ Jul => 7,
+ Aug => 8,
+ Sep => 9,
+ Oct => 10,
+ Nov => 11,
+ Dec => 12
+);
+
+my $realtime = 0;
+my ($dbh, $q,$check);
+$dbh = nms::db_connect();
+$q = $dbh->prepare("INSERT INTO dhcp (switch,time,ip,mac) VALUES((SELECT switch FROM switches WHERE ?::inet << subnet4 ORDER BY sysname LIMIT 1),?,?,?)");
+$check = $dbh->prepare("SELECT max(time)::timestamp - ?::timestamp < '0s'::interval as doit FROM dhcp;");
+
+open(SYSLOG, "tail -n 9999999 -F /var/log/syslog |") or die "Unable to tail syslog: $!";
+while (<SYSLOG>) {
+ /(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d+)\s+(\d+:\d+:\d+).*DHCPACK on (\d+\.\d+\.\d+\.\d+) to (\S+) / or next;
+ my $date = $year . "-" . $months{$1} . "-" . $2 . " " . $3 . " Europe/Oslo";
+ my $machine = $5;
+ my $via = $6;
+ $check->execute($date);
+ $dbh->commit;
+ my $cond = $check->fetchrow_hashref();
+ if (!defined($cond) or !defined($cond->{'doit'}) or $cond->{'doit'} eq '1') {
+ if ($realtime != 1) {
+ $realtime = 1;
+ print "real time achieved...\n";
+ }
+ $q->execute($4,$date,$4,$machine);
+ $dbh->commit;
+ }
+}
+close SYSLOG;
diff --git a/clients/ping.pl b/clients/ping.pl
new file mode 100755
index 0000000..d945917
--- /dev/null
+++ b/clients/ping.pl
@@ -0,0 +1,100 @@
+#! /usr/bin/perl
+use DBI;
+use POSIX;
+use Time::HiRes;
+use Net::Oping;
+use strict;
+use warnings;
+use Data::Dumper;
+
+use lib '../include';
+use nms;
+
+$|++;
+my $dbh = nms::db_connect();
+$dbh->{AutoCommit} = 0;
+$dbh->{RaiseError} = 1;
+
+my $q = $dbh->prepare("SELECT switch,host(mgmt_v4_addr) as ip,host(mgmt_v6_addr) as secondary_ip FROM switches WHERE mgmt_v4_addr is not null ORDER BY random()");
+my $lq = $dbh->prepare("SELECT linknet,addr1,addr2 FROM linknets WHERE addr1 is not null and addr2 is not null");
+
+while (1) {
+ # ping loopbacks
+ my $ping = Net::Oping->new;
+ $ping->timeout(0.3);
+
+ $q->execute;
+ my %ip_to_switch = ();
+ my %secondary_ip_to_switch = ();
+ while (my $ref = $q->fetchrow_hashref) {
+ my $switch = $ref->{'switch'};
+
+ my $ip = $ref->{'ip'};
+ $ping->host_add($ip);
+ $ip_to_switch{$ip} = $switch;
+
+ my $secondary_ip = $ref->{'secondary_ip'};
+ if (defined($secondary_ip)) {
+ $ping->host_add($secondary_ip);
+ $secondary_ip_to_switch{$secondary_ip} = $switch;
+ }
+ }
+ my $result = $ping->ping();
+ my %dropped = %{$ping->get_dropped()};
+ die $ping->get_error if (!defined($result));
+
+ $dbh->do('COPY ping (switch, latency_ms) FROM STDIN'); # date is implicitly now.
+ my $drops = 0;
+ while (my ($ip, $latency) = each %$result) {
+ my $switch = $ip_to_switch{$ip};
+ next if (!defined($switch));
+
+ if (!defined($latency)) {
+ $drops += $dropped{$ip};
+ }
+ $latency //= "\\N";
+ $dbh->pg_putcopydata("$switch\t$latency\n");
+ }
+ if ($drops > 0) {
+ print "$drops ";
+ }
+ $dbh->pg_putcopyend();
+
+ $dbh->do('COPY ping_secondary_ip (switch, latency_ms) FROM STDIN'); # date is implicitly now.
+ while (my ($ip, $latency) = each %$result) {
+ my $switch = $secondary_ip_to_switch{$ip};
+ next if (!defined($switch));
+
+ $latency //= "\\N";
+ $dbh->pg_putcopydata("$switch\t$latency\n");
+ }
+ $dbh->pg_putcopyend();
+
+ $dbh->commit;
+ # ping linknets
+ $ping = Net::Oping->new;
+ $ping->timeout(0.3);
+
+ $lq->execute;
+ my @linknets = ();
+ while (my $ref = $lq->fetchrow_hashref) {
+ push @linknets, $ref;
+ $ping->host_add($ref->{'addr1'});
+ $ping->host_add($ref->{'addr2'});
+ }
+ if (@linknets) {
+ $result = $ping->ping();
+ die $ping->get_error if (!defined($result));
+
+ $dbh->do('COPY linknet_ping (linknet, latency1_ms, latency2_ms) FROM STDIN'); # date is implicitly now.
+ for my $linknet (@linknets) {
+ my $id = $linknet->{'linknet'};
+ my $latency1 = $result->{$linknet->{'addr1'}} // '\N';
+ my $latency2 = $result->{$linknet->{'addr2'}} // '\N';
+ $dbh->pg_putcopydata("$id\t$latency1\t$latency2\n");
+ }
+ $dbh->pg_putcopyend();
+ }
+ $dbh->commit;
+}
+
diff --git a/clients/snmpfetchng.pl b/clients/snmpfetchng.pl
new file mode 100755
index 0000000..2f5e785
--- /dev/null
+++ b/clients/snmpfetchng.pl
@@ -0,0 +1,141 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use DBI;
+use POSIX;
+#use Time::HiRes qw(time);
+use SNMP;
+use Data::Dumper;
+use lib '../include';
+use nms;
+
+SNMP::initMib();
+SNMP::addMibDirs("/srv/tgmanage/mibs/StandardMibs");
+SNMP::addMibDirs("/srv/tgmanage/mibs/JuniperMibs");
+SNMP::addMibDirs("/srv/tgmanage/mibs");
+SNMP::loadModules('ALL');
+
+our $dbh = nms::db_connect();
+$dbh->{AutoCommit} = 0;
+$dbh->{RaiseError} = 1;
+
+my $qualification = <<"EOF";
+(last_updated IS NULL OR now() - last_updated > poll_frequency)
+AND (locked='f' OR now() - last_updated > '15 minutes'::interval)
+AND mgmt_v4_addr is not null
+EOF
+
+# Borrowed from snmpfetch.pl
+our $qswitch = $dbh->prepare(<<"EOF")
+SELECT
+ sysname,switch,host(mgmt_v4_addr) as ip,community,
+ DATE_TRUNC('second', now() - last_updated - poll_frequency) AS overdue
+FROM
+ switches
+WHERE
+$qualification
+ORDER BY
+ overdue DESC
+LIMIT ?
+EOF
+ or die "Couldn't prepare qswitch";
+our $qlock = $dbh->prepare("UPDATE switches SET locked='t', last_updated=now() WHERE switch=?")
+ or die "Couldn't prepare qlock";
+our $qunlock = $dbh->prepare("UPDATE switches SET locked='f', last_updated=now() WHERE switch=?")
+ or die "Couldn't prepare qunlock";
+my @switches = ();
+
+my $sth = $dbh->prepare("INSERT INTO snmp (switch,data) VALUES((select switch from switches where sysname=?), ?)");
+
+sub mylog
+{
+ my $msg = shift;
+ my $time = POSIX::ctime(time);
+ $time =~ s/\n.*$//;
+ printf STDERR "[%s] %s\n", $time, $msg;
+}
+
+sub populate_switches
+{
+ @switches = ();
+ my $limit = $nms::config::snmp_max;
+ $qswitch->execute($limit)
+ or die "Couldn't get switch";
+ $dbh->commit;
+ while (my $ref = $qswitch->fetchrow_hashref()) {
+ push @switches, {
+ 'sysname' => $ref->{'sysname'},
+ 'id' => $ref->{'switch'},
+ 'mgtip' => $ref->{'ip'},
+ 'community' => $ref->{'community'}
+ };
+ }
+}
+
+sub inner_loop
+{
+ populate_switches();
+ my $poll_todo = "";
+ for my $refswitch (@switches) {
+ my %switch = %{$refswitch};
+ $poll_todo .= "$switch{'sysname'} ";
+
+ $switch{'start'} = time;
+ $qlock->execute($switch{'id'})
+ or die "Couldn't lock switch";
+ $dbh->commit;
+ my $s = SNMP::Session->new(DestHost => $switch{'mgtip'},
+ Community => $switch{'community'},
+ UseEnums => 1,
+ Version => '2');
+ my $ret = $s->bulkwalk(0, 10, @nms::config::snmp_objects, sub{ callback(\%switch, @_); });
+ if (!defined($ret)) {
+ mylog("Fudge: ". $s->{'ErrorStr'});
+ }
+ }
+ mylog( "Polling " . @switches . " switches: $poll_todo");
+ SNMP::MainLoop(10);
+}
+
+sub callback{
+ my @top = $_[1];
+ my %switch = %{$_[0]};
+ my %tree;
+ my %ttop;
+ my %nics;
+ my @nicids;
+
+ for my $ret (@top) {
+ for my $var (@{$ret}) {
+ for my $inner (@{$var}) {
+ my ($tag,$type,$name,$iid, $val) = ( $inner->tag ,$inner->type , $inner->name, $inner->iid, $inner->val);
+ if ($tag eq "ifPhysAddress") {
+ next;
+ }
+ $tree{$iid}{$tag} = $val;
+ if ($tag eq "ifIndex") {
+ push @nicids, $iid;
+ }
+ }
+ }
+ }
+
+ my %tree2;
+ for my $nic (@nicids) {
+ $tree2{'ports'}{$tree{$nic}{'ifName'}} = $tree{$nic};
+ delete $tree{$nic};
+ }
+ for my $iid (keys %tree) {
+ for my $key (keys %{$tree{$iid}}) {
+ $tree2{'misc'}{$key}{$iid} = $tree{$iid}{$key};
+ }
+ }
+ $sth->execute($switch{'sysname'}, JSON::XS::encode_json(\%tree2));
+ $qunlock->execute($switch{'id'})
+ or die "Couldn't unlock switch";
+ $dbh->commit;
+ mylog( "Polled $switch{'sysname'} in " . (time - $switch{'start'}) . "s.");
+}
+while (1) {
+ inner_loop();
+}