]> git.sesse.net Git - nms/blob - web/tempfetch.pl
Merge.
[nms] / web / tempfetch.pl
1 #! /usr/bin/perl
2 #use BER;
3 use Data::Dumper;
4 use DBI;
5 use POSIX;
6 use Time::HiRes;
7 use lib '../include';
8 use nms;
9 use strict;
10 use warnings;
11
12 # Tweak timeouit og sjekk med :support||:net hva passord vil bli
13 my $location = 'skipet';
14
15 my $dbh = nms::db_connect();
16 $dbh->{AutoCommit} = 0;
17
18 my $qswitch = $dbh->prepare(<<"EOF")
19 SELECT 
20   *
21 FROM
22   switches
23   NATURAL LEFT JOIN switchtypes
24 WHERE
25   (locked='f' OR now() - last_updated > '15 minutes'::interval)
26 LIMIT 1
27 FOR UPDATE OF switches
28 EOF
29         or die "Couldn't prepare qswitch";
30 my $qlock = $dbh->prepare("UPDATE switches SET locked='t', last_updated=now() WHERE switch=?")
31         or die "Couldn't prepare qlock";
32 my $qunlock = $dbh->prepare("UPDATE switches SET locked='f', last_updated=now() WHERE switch=?")
33         or die "Couldn't prepare qunlock";
34 my $qpoll = $dbh->prepare("INSERT INTO temppoll (time, switch, temp) VALUES (timeofday()::timestamp,?::text::int,?::text::float)")
35         or die "Couldn't prepare qpoll";
36
37 while (1) {
38         # Find a switch to grab
39         $qswitch->execute()
40                 or die "Couldn't get switch";
41         my $switch = $qswitch->fetchrow_hashref();
42
43         if (!defined($switch)) {
44                 $dbh->commit;
45                 mylog("No available switches in pool, sleeping.");
46                 sleep 60;
47                 next;
48         }
49
50         $qlock->execute($switch->{'switch'})
51                 or die "Couldn't lock switch";
52         $dbh->commit;
53
54         if ($switch->{'locked'}) {
55                 mylog("WARNING: Lock timed out on $switch->{'ip'}, breaking lock");
56         }
57
58         my $msg;
59         if (defined($switch->{'overdue'})) {
60                 $msg = sprintf "Polling temp on %s (%s), %s overdue.",
61                         $switch->{'ip'}, $switch->{'sysname'}, $switch->{'overdue'};
62         } else {
63                 $msg = sprintf "Polling temp on %s (%s), never polled before.",
64                         $switch->{'ip'}, $switch->{'sysname'};
65         }
66         mylog($msg);
67
68         my $ip = $switch->{'ip'};
69         my $start = [Time::HiRes::gettimeofday];
70         eval {
71                 my $conn = nms::switch_connect($ip);
72                 if (!defined($conn)) {
73                         print "Could not connect to switch ".$switch->{'switch'}."\n";
74                 }
75                 my @data = nms::switch_exec('sys monitor status', $conn);
76                 my @fields = split(/\s+/, $data[2]);
77                 # The temp fields are 6, 7, 8
78                 my $avgtemp = ($fields[6] + $fields[7] + $fields[8]) / 3;
79                 print $avgtemp." avgtemp\n";
80                 $qpoll->execute($switch->{'switch'},
81                                 $avgtemp) or die "Could not exec qpoll";
82         };
83         my $elapsed = Time::HiRes::tv_interval($start);
84         $msg = sprintf "Polled $switch->{'ip'} in %5.3f seconds.", $elapsed;
85         mylog($msg);
86
87         $qunlock->execute($switch->{'switch'})
88                 or die "Couldn't unlock switch";
89         sleep 1;
90         $dbh->commit;
91 }
92
93 sub mylog {
94         my $msg = shift;
95         my $time = POSIX::ctime(time);
96         $time =~ s/\n.*$//;
97         printf STDERR "[%s] %s\n", $time, $msg;
98 }