]> git.sesse.net Git - nms/blob - web/tempfetch.pl
3a5c84dfbc49bcb92da7e386099c0063b05eb16a
[nms] / web / tempfetch.pl
1 #! /usr/bin/perl
2 #use BER;
3 use Data::Dumper;
4 use DBI;
5 use Net::Telnet;
6 use POSIX;
7 use Time::HiRes;
8 use lib '../include';
9 use nms;
10 use strict;
11 use warnings;
12 #require 'SNMP_Session.pm';
13
14 # Tweak timeouit og sjekk med :support||:net hva passord vil bli
15 my $password = 'removed';
16 my $timeout = 25;
17 my $location = 'skipet';
18
19 my $dbh = nms::db_connect();
20 $dbh->{AutoCommit} = 0;
21
22 my $qswitch = $dbh->prepare(<<"EOF")
23 SELECT 
24   *
25 FROM
26   switches
27   NATURAL LEFT JOIN switchtypes
28 WHERE
29   (locked='f' OR now() - last_updated > '15 minutes'::interval)
30 LIMIT 1
31 FOR UPDATE OF switches
32 EOF
33         or die "Couldn't prepare qswitch";
34 my $qlock = $dbh->prepare("UPDATE switches SET locked='t', last_updated=now() WHERE switch=?")
35         or die "Couldn't prepare qlock";
36 my $qunlock = $dbh->prepare("UPDATE switches SET locked='f', last_updated=now() WHERE switch=?")
37         or die "Couldn't prepare qunlock";
38 my $qpoll = $dbh->prepare("INSERT INTO temppoll (time, switch, temp) VALUES (timeofday()::timestamp,?::text::int,?::text::float)")
39         or die "Couldn't prepare qpoll";
40
41 while (1) {
42         # Find a switch to grab
43         $qswitch->execute()
44                 or die "Couldn't get switch";
45         my $switch = $qswitch->fetchrow_hashref();
46
47         if (!defined($switch)) {
48                 $dbh->commit;
49                 mylog("No available switches in pool, sleeping.");
50                 sleep 60;
51                 next;
52         }
53
54         $qlock->execute($switch->{'switch'})
55                 or die "Couldn't lock switch";
56         $dbh->commit;
57
58         if ($switch->{'locked'}) {
59                 mylog("WARNING: Lock timed out on $switch->{'ip'}, breaking lock");
60         }
61
62         my $msg;
63         if (defined($switch->{'overdue'})) {
64                 $msg = sprintf "Polling temp on %s (%s), %s overdue.",
65                         $switch->{'ip'}, $switch->{'sysname'}, $switch->{'overdue'};
66         } else {
67                 $msg = sprintf "Polling temp on %s (%s), never polled before.",
68                         $switch->{'ip'}, $switch->{'sysname'};
69         }
70         mylog($msg);
71
72         my $ip = $switch->{'ip'};
73         my $start = [Time::HiRes::gettimeofday];
74         eval {
75                 my $conn = switch_connect($ip);
76                 if (!defined($conn)) {
77                         print "Could not connect to switch ".$switch->{'switch'}."\n";
78                 }
79                 my @data = switch_exec('sys monitor status', $conn);
80                 my @fields = split(/\s+/, $data[2]);
81                 # The temp fields are 6, 7, 8
82                 my $avgtemp = ($fields[6] + $fields[7] + $fields[8]) / 3;
83                 print $avgtemp." avgtemp\n";
84                 $qpoll->execute($switch->{'switch'},
85                                 $avgtemp) or die "Could not exec qpoll";
86         };
87         my $elapsed = Time::HiRes::tv_interval($start);
88         $msg = sprintf "Polled $switch->{'ip'} in %5.3f seconds.", $elapsed;
89         mylog($msg);
90
91         $qunlock->execute($switch->{'switch'})
92                 or die "Couldn't unlock switch";
93         sleep 1;
94         $dbh->commit;
95 }
96
97 sub switch_exec {
98         my ($cmd, $conn) = @_;
99
100         # Send the command and get data from switch
101         my @data = $conn->cmd($cmd);
102         my @lines = ();
103         foreach my $line (@data) {
104                 # Remove escape-7 sequence
105                 $line =~ s/\x1b\x37//g;
106                 push (@lines, $line);
107                 }
108
109         return @lines;
110 }
111
112 sub switch_connect {
113         my ($ip) = @_;
114
115         my $conn = new Net::Telnet(     Timeout => $timeout,
116                                         Dump_Log => '/tmp/dumplog',
117                                         Errmode => 'return',
118                                         Prompt => '/(es3024|e\d+\-\dsw)>/i');
119         my $ret = $conn->open(  Host => $ip);
120         if (!$ret || $ret != 1) {
121                 return (0);
122         }
123         # XXX: Just send the password as text, I did not figure out how to
124         # handle authentication with only password through $conn->login().
125         #$conn->login(  Prompt => '/password[: ]*$/i',
126         #               Name => $password,
127         #               Password => $password);
128         my @data = $conn->cmd($password);
129         # Get rid of banner
130         $conn->get;
131         return ($conn);
132 }
133
134
135 sub mylog {
136         my $msg = shift;
137         my $time = POSIX::ctime(time);
138         $time =~ s/\n.*$//;
139         printf STDERR "[%s] %s\n", $time, $msg;
140 }