summaryrefslogtreecommitdiff
path: root/torrus/perllib/Torrus/DevDiscover/BetterNetworks.pm
diff options
context:
space:
mode:
Diffstat (limited to 'torrus/perllib/Torrus/DevDiscover/BetterNetworks.pm')
-rw-r--r--torrus/perllib/Torrus/DevDiscover/BetterNetworks.pm238
1 files changed, 238 insertions, 0 deletions
diff --git a/torrus/perllib/Torrus/DevDiscover/BetterNetworks.pm b/torrus/perllib/Torrus/DevDiscover/BetterNetworks.pm
new file mode 100644
index 000000000..c7187992c
--- /dev/null
+++ b/torrus/perllib/Torrus/DevDiscover/BetterNetworks.pm
@@ -0,0 +1,238 @@
+# Copyright (C) 2004 Marc Haber
+# Copyright (C) 2005 Stanislav Sinyagin
+#
+# 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+# $Id: BetterNetworks.pm,v 1.1 2010-12-27 00:03:55 ivan Exp $
+# Marc Haber <mh+torrus-devel@zugschlus.de>
+# Redesigned by Stanislav Sinyagin
+
+# Better Networks Ethernet Box
+
+package Torrus::DevDiscover::BetterNetworks;
+
+use strict;
+use Torrus::Log;
+
+
+$Torrus::DevDiscover::registry{'BetterNetworks'} = {
+ 'sequence' => 500,
+ 'checkdevtype' => \&checkdevtype,
+ 'discover' => \&discover,
+ 'buildConfig' => \&buildConfig
+ };
+
+
+our %oiddef =
+ (
+ 'BNEversion' => '1.3.6.1.4.1.14848.2.1.1.1.0',
+ 'BNElocation' => '1.3.6.1.4.1.14848.2.1.1.2.0',
+ 'BNEtempunit' => '1.3.6.1.4.1.14848.2.1.1.3.0',
+ 'BNEuptime' => '1.3.6.1.4.1.14848.2.1.1.7.0',
+ 'BNEsensorTable' => '1.3.6.1.4.1.14848.2.1.2',
+ 'BNEsensorName' => '1.3.6.1.4.1.14848.2.1.2.1.2',
+ 'BNEsensorType' => '1.3.6.1.4.1.14848.2.1.2.1.3',
+ 'BNEsensorValid' => '1.3.6.1.4.1.14848.2.1.2.1.7',
+ );
+
+
+our %sensorTypes =
+ (
+ 1 => {
+ 'comment' => 'Temperature sensor',
+ },
+ 2 => {
+ 'comment' => 'Brightness sensor',
+ 'label' => 'Lux',
+ },
+ 3 => {
+ 'comment' => 'Humidity sensor',
+ 'label' => 'Percent RH',
+ },
+ 4 => {
+ 'comment' => 'Switch contact',
+ },
+ 5 => {
+ 'comment' => 'Voltage meter',
+ },
+ 6 => {
+ 'comment' => 'Smoke sensor',
+ },
+ );
+
+our %tempUnits =
+ (
+ 0 => 'Celsius',
+ 1 => 'Fahrenheit',
+ 2 => 'Kelvin'
+ );
+
+
+sub checkdevtype
+{
+ my $dd = shift;
+ my $devdetails = shift;
+
+ if( not $dd->checkSnmpOID( 'BNEuptime' ) )
+ {
+ return 0;
+ }
+
+ return 1;
+}
+
+
+sub discover
+{
+ my $dd = shift;
+ my $devdetails = shift;
+
+ my $data = $devdetails->data();
+ my $session = $dd->session();
+
+ my $unitInfo = $dd->retrieveSnmpOIDs('BNEversion',
+ 'BNElocation',
+ 'BNEtempunit');
+ if( not defined( $unitInfo ) )
+ {
+ Error('Error retrieving Better Networks Ethernet Box device details');
+ return 0;
+ }
+
+ # sensor support
+ my $sensorTable = $session->get_table( -baseoid =>
+ $dd->oiddef('BNEsensorTable') );
+ if( defined( $sensorTable ) )
+ {
+ $devdetails->storeSnmpVars( $sensorTable );
+
+ # store the sensor names to guarantee uniqueness
+ my %sensorNames;
+
+ foreach my $INDEX
+ ( $devdetails->getSnmpIndices($dd->oiddef('BNEsensorName') ) )
+ {
+ if( $devdetails->snmpVar( $dd->oiddef('BNEsensorValid') .
+ '.' . $INDEX ) == 0 )
+ {
+ next;
+ }
+
+ my $type = $devdetails->snmpVar( $dd->oiddef('BNEsensorType') .
+ '.' . $INDEX );
+ my $name = $devdetails->snmpVar( $dd->oiddef('BNEsensorName')
+ . '.' . $INDEX );
+
+ if( $sensorNames{$name} )
+ {
+ Warn('Duplicate sensor names: ' . $name);
+ $sensorNames{$name}++;
+ }
+ else
+ {
+ $sensorNames{$name} = 1;
+ }
+
+ if( $sensorNames{$name} > 1 )
+ {
+ $name .= sprintf(' %d', $sensorNames{$name});
+ }
+
+ my $leafName = $name;
+ $leafName =~ s/\W/_/g;
+
+ my $param = {
+ 'bne-sensor-index' => $INDEX,
+ 'node-display-name' => $name,
+ 'precedence' => sprintf('%d', 1000 - $INDEX)
+ };
+
+ if( defined( $sensorTypes{$type} ) )
+ {
+ $param->{'comment'} =
+ sprintf('%s: %s', $sensorTypes{$type}{'comment'}, $name);
+ if( $type != 1 )
+ {
+ if( defined( $sensorTypes{$type}{'label'} ) )
+ {
+ $param->{'vertical-label'} =
+ $sensorTypes{$type}{'label'};
+ }
+ }
+ else
+ {
+ $param->{'vertical-label'} =
+ $tempUnits{$unitInfo->{'BNEtempunit'}};
+ }
+ }
+ else
+ {
+ $param->{'comment'} = 'Unknown sensor type';
+ }
+
+ $data->{'BNEsensor'}{$INDEX}{'param'} = $param;
+ $data->{'BNEsensor'}{$INDEX}{'leafName'} = $leafName;
+ }
+
+ if( scalar( %{$data->{'BNEsensor'}} ) > 0 )
+ {
+ $devdetails->setCap('BNEsensor');
+
+ my $devComment =
+ 'BetterNetworks EthernetBox, ' . $unitInfo->{'BNEversion'};
+ if( $unitInfo->{'BNElocation'} =~ /\w/ )
+ {
+ $devComment .= ', Location: ' .
+ $unitInfo->{'BNElocation'};
+ }
+ $data->{'param'}{'comment'} = $devComment;
+ }
+ }
+
+ return 1;
+}
+
+
+sub buildConfig
+{
+ my $devdetails = shift;
+ my $cb = shift;
+ my $devNode = shift;
+
+ my $data = $devdetails->data();
+
+ if( $devdetails->hasCap('BNEsensor') )
+ {
+ foreach my $INDEX ( sort {$a<=>$b} keys %{$data->{'BNEsensor'}} )
+ {
+ my $param = $data->{'BNEsensor'}{$INDEX}{'param'};
+ my $leafName = $data->{'BNEsensor'}{$INDEX}{'leafName'};
+
+ $cb->addLeaf( $devNode, $leafName, $param,
+ ['BetterNetworks::betternetworks-sensor'] );
+ }
+ }
+}
+
+
+
+1;
+
+
+# Local Variables:
+# mode: perl
+# indent-tabs-mode: nil
+# perl-indent-level: 4
+# End: