From 6538c7b98d2e3ef7498b5615b4696891270b271f Mon Sep 17 00:00:00 2001 From: Tom Laermans Date: Fri, 2 Jul 2010 10:28:27 +0000 Subject: [PATCH] add option to dropdown the list of locations in the menu git-svn-id: http://www.observium.org/svn/observer/trunk@1282 61d68cd4-352d-0410-923a-c4978735b2b8 --- config.php.default | 1 + html/includes/print-menubar.php | 29 +++++- scripts/snmpd-ipmi.pl | 179 ++++++++++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 1 deletion(-) create mode 100755 scripts/snmpd-ipmi.pl diff --git a/config.php.default b/config.php.default index 1e6faa536f..2eabdc4ebc 100755 --- a/config.php.default +++ b/config.php.default @@ -101,6 +101,7 @@ $config['int_core'] = 1; # Enable Core Port Types $config['int_l2tp'] = 0; # Enable L2TP Port Types $config['show_locations'] = 1; # Enable Locations on menu +$config['show_locations_dropdown'] = 0; # Enable Locations dropdown on menu $config['show_services'] = 1; # Enable Services on menu $config['ports_page_default'] = "details/"; diff --git a/html/includes/print-menubar.php b/html/includes/print-menubar.php index 077458df43..7cdb3d4429 100644 --- a/html/includes/print-menubar.php +++ b/html/includes/print-menubar.php @@ -103,7 +103,34 @@ if ($_SESSION['userlevel'] >= '10') { } ## Display Locations entry if $config['show_locations'] -if ($config['show_locations']) { echo('
  • Locations
  • '); } +if ($config['show_locations']) +{ + $locations = mysql_query("SELECT DISTINCT location FROM devices ORDER BY location"); +?> +
  • Locations + +
    + +
    + +
  • + diff --git a/scripts/snmpd-ipmi.pl b/scripts/snmpd-ipmi.pl new file mode 100755 index 0000000000..c68eff84ed --- /dev/null +++ b/scripts/snmpd-ipmi.pl @@ -0,0 +1,179 @@ +#!/usr/bin/perl +# -------------------------------------------------------------------- +# Copyright (C) 2010 Tom Laermans +# Based on quagga-snmp-bgpd (C) 2004 Oliver Hitz +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, +# MA 02111-1307, USA. +# -------------------------------------------------------------------- + +use strict; + +# The base OID of this extension. Has to match the OID in snmpd.conf: +my $baseoid = ".1.3.6.1.4.1.21337.15"; + +# Path to ipmitool +my $ipmitool="/usr/bin/ipmitool"; +chomp($ipmitool); + +# Results from the initscript are cached for some seconds so that an +# SNMP walk doesn't result in the script being called hundreds of times: +my $cache_secs = 60; + +# -------------------------------------------------------------------- + +my $stats; +my $infotime; + +# Switch on autoflush +$| = 1; + +while (my $cmd = ) { + chomp $cmd; + + if ($cmd eq "PING") { + print "PONG\n"; + } elsif ($cmd eq "get") { + my $oid_in = ; + + my $oid = get_oid($oid_in); + my $stats = get_ipmi_values(); + + if ($oid != 0 && defined($stats->{$oid})) { + print "$baseoid.$oid\n"; + print $stats->{$oid}[0]."\n"; + print $stats->{$oid}[1]."\n"; + } else { + print "NONE\n"; + } + } elsif ($cmd eq "getnext") { + my $oid_in = ; + + my $oid = get_oid($oid_in); + my $found = 0; + + my $stats = get_ipmi_values(); + my @s = sort { oidcmp($a, $b) } keys %{ $stats }; + for (my $i = 0; $i < @s; $i++) { + if (oidcmp($oid, $s[$i]) == -1) { + print "$baseoid.".$s[$i]."\n"; + print $stats->{$s[$i]}[0]."\n"; + print $stats->{$s[$i]}[1]."\n"; + $found = 1; + last; + } + } + if (!$found) { + print "NONE\n"; + } + } else { + # Unknown command + } +} + +exit 0; + +sub trim +{ + my $string = shift; + for ($string) + { + s/^\s+//; + s/\s+$//; + } + return $string; +} + +sub get_oid +{ + + my ($oid) = @_; + chomp $oid; + + my $base = $baseoid; + $base =~ s/\./\\./g; + + if ($oid !~ /^$base(\.|$)/) { + # Requested oid doesn't match base oid + return 0; + } + + $oid =~ s/^$base\.?//; + return $oid; +} + +sub oidcmp { + my ($x, $y) = @_; + + my @a = split /\./, $x; + my @b = split /\./, $y; + + my $i = 0; + + while (1) { + + if ($i > $#a) { + if ($i > $#b) { + return 0; + } else { + return -1; + } + } elsif ($i > $#b) { + return 1; + } + + if ($a[$i] < $b[$i]) { + return -1; + } elsif ($a[$i] > $b[$i]) { + return 1; + } + + $i++; + } +} + +sub get_ipmi_values +{ + # We cache the results for $cache_secs seconds + if (time - $infotime < $cache_secs) { + return $stats; + } + my %info = (); + + my $index = 1; + open Q, "$ipmitool sensor 2>/dev/null|"; + while (my $l = ) { + if ($l =~ /^(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)\|(.*)/) { + $info{"1." . $index } = [ "integer", $index ]; + $info{"2." . $index } = [ "string", trim($1) ]; + $info{"3." . $index } = [ "integer", trim($2)*1000 ]; # value + $info{"4." . $index } = [ "string", trim($3) ]; # unit + $info{"5." . $index } = [ "string" , trim($4) ]; # state + $info{"6." . $index } = [ "integer", trim($5) eq "na" ? -1 : trim($5)*1000 ]; # low nonrecoverable + $info{"7." . $index } = [ "integer", trim($6) eq "na" ? -1 : trim($6)*1000 ]; # low critical + $info{"8." . $index } = [ "integer", trim($7) eq "na" ? -1 : trim($7)*1000 ]; # low warning + $info{"9." . $index } = [ "integer", trim($8) eq "na" ? -1 : trim($8)*1000 ]; # high warning + $info{"10." . $index } = [ "integer", trim($9) eq "na" ? -1 : trim($9)*1000 ]; # high critical + $info{"11." . $index } = [ "integer", trim($10) eq "na" ? -1 : trim($10)*1000 ]; # high nonrecoverable + $index++; + } + } + close Q; + + + $stats = \%info; + $infotime = time; + return $stats; +}