import torrus 1.0.9
[freeside.git] / torrus / perllib / Torrus / DevDiscover / BetterNetworks.pm
1 #  Copyright (C) 2004 Marc Haber
2 #  Copyright (C) 2005 Stanislav Sinyagin
3 #
4 #  This program is free software; you can redistribute it and/or modify
5 #  it under the terms of the GNU General Public License as published by
6 #  the Free Software Foundation; either version 2 of the License, or
7 #  (at your option) any later version.
8 #
9 #  This program is distributed in the hope that it will be useful,
10 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 #  GNU General Public License for more details.
13 #
14 #  You should have received a copy of the GNU General Public License
15 #  along with this program; if not, write to the Free Software
16 #  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 # $Id: BetterNetworks.pm,v 1.1 2010-12-27 00:03:55 ivan Exp $
19 # Marc Haber <mh+torrus-devel@zugschlus.de>
20 # Redesigned by Stanislav Sinyagin
21
22 # Better Networks Ethernet Box
23
24 package Torrus::DevDiscover::BetterNetworks;
25
26 use strict;
27 use Torrus::Log;
28
29
30 $Torrus::DevDiscover::registry{'BetterNetworks'} = {
31     'sequence'     => 500,
32     'checkdevtype' => \&checkdevtype,
33     'discover'     => \&discover,
34     'buildConfig'  => \&buildConfig
35     };
36
37
38 our %oiddef =
39     (
40      'BNEversion'          => '1.3.6.1.4.1.14848.2.1.1.1.0',
41      'BNElocation'         => '1.3.6.1.4.1.14848.2.1.1.2.0',
42      'BNEtempunit'         => '1.3.6.1.4.1.14848.2.1.1.3.0',
43      'BNEuptime'           => '1.3.6.1.4.1.14848.2.1.1.7.0',
44      'BNEsensorTable'      => '1.3.6.1.4.1.14848.2.1.2',
45      'BNEsensorName'       => '1.3.6.1.4.1.14848.2.1.2.1.2',
46      'BNEsensorType'       => '1.3.6.1.4.1.14848.2.1.2.1.3',
47      'BNEsensorValid'      => '1.3.6.1.4.1.14848.2.1.2.1.7',
48      );
49
50
51 our %sensorTypes =
52     (
53      1 => {
54          'comment' => 'Temperature sensor',
55      },
56      2 => {
57          'comment' => 'Brightness sensor',
58          'label' => 'Lux',
59      },
60      3 => {
61          'comment' => 'Humidity sensor',
62          'label' => 'Percent RH',
63      },
64      4 => {
65          'comment' => 'Switch contact',
66      },
67      5 => {
68          'comment' => 'Voltage meter',
69      },
70      6 => {
71          'comment' => 'Smoke sensor',
72      },
73      );
74
75 our %tempUnits =
76     (
77      0 => 'Celsius',
78      1 => 'Fahrenheit',
79      2 => 'Kelvin'
80      );
81
82
83 sub checkdevtype
84 {
85     my $dd = shift;
86     my $devdetails = shift;
87
88     if( not $dd->checkSnmpOID( 'BNEuptime' ) )
89     {
90         return 0;
91     }
92
93     return 1;
94 }
95
96
97 sub discover
98 {
99     my $dd = shift;
100     my $devdetails = shift;
101
102     my $data = $devdetails->data();
103     my $session = $dd->session();
104
105     my $unitInfo = $dd->retrieveSnmpOIDs('BNEversion',
106                                          'BNElocation',
107                                          'BNEtempunit');
108     if( not defined( $unitInfo ) )
109     {
110         Error('Error retrieving Better Networks Ethernet Box device details');
111         return 0;
112     }
113     
114     # sensor support
115     my $sensorTable = $session->get_table( -baseoid =>
116                                            $dd->oiddef('BNEsensorTable') );
117     if( defined( $sensorTable ) )
118     {
119         $devdetails->storeSnmpVars( $sensorTable );
120
121         # store the sensor names to guarantee uniqueness
122         my %sensorNames;
123             
124         foreach my $INDEX
125             ( $devdetails->getSnmpIndices($dd->oiddef('BNEsensorName') ) )
126         {
127             if( $devdetails->snmpVar( $dd->oiddef('BNEsensorValid') .
128                                       '.' . $INDEX ) == 0 )
129             {
130                 next;
131             }
132                 
133             my $type = $devdetails->snmpVar( $dd->oiddef('BNEsensorType') .
134                                              '.' . $INDEX );
135             my $name = $devdetails->snmpVar( $dd->oiddef('BNEsensorName')
136                                              . '.' . $INDEX );
137
138             if( $sensorNames{$name} )
139             {
140                 Warn('Duplicate sensor names: ' . $name);
141                 $sensorNames{$name}++;
142             }
143             else
144             {
145                 $sensorNames{$name} = 1;
146             }
147
148             if( $sensorNames{$name} > 1 )
149             {
150                 $name .= sprintf(' %d', $sensorNames{$name});
151             }
152             
153             my $leafName = $name;
154             $leafName =~ s/\W/_/g;
155
156             my $param = {
157                 'bne-sensor-index' => $INDEX,
158                 'node-display-name' => $name,
159                 'precedence' => sprintf('%d', 1000 - $INDEX)
160                 };
161             
162             if( defined( $sensorTypes{$type} ) )
163             {
164                 $param->{'comment'} =
165                     sprintf('%s: %s', $sensorTypes{$type}{'comment'}, $name);
166                 if( $type != 1 )
167                 {
168                     if( defined( $sensorTypes{$type}{'label'} ) )
169                     {
170                         $param->{'vertical-label'} =
171                             $sensorTypes{$type}{'label'};
172                     }
173                 }
174                 else
175                 {
176                     $param->{'vertical-label'} =
177                         $tempUnits{$unitInfo->{'BNEtempunit'}};
178                 }
179             }
180             else
181             {
182                 $param->{'comment'} = 'Unknown sensor type';
183             }
184
185             $data->{'BNEsensor'}{$INDEX}{'param'} = $param;
186             $data->{'BNEsensor'}{$INDEX}{'leafName'} = $leafName;            
187         }
188
189         if( scalar( %{$data->{'BNEsensor'}} ) > 0 )
190         {
191             $devdetails->setCap('BNEsensor');
192
193             my $devComment = 
194                 'BetterNetworks EthernetBox, ' . $unitInfo->{'BNEversion'};
195             if( $unitInfo->{'BNElocation'} =~ /\w/ )
196             {
197                 $devComment .= ', Location: ' . 
198                     $unitInfo->{'BNElocation'};
199             }
200             $data->{'param'}{'comment'} = $devComment;
201         }
202     }
203     
204     return 1;
205 }
206
207
208 sub buildConfig
209 {
210     my $devdetails = shift;
211     my $cb = shift;
212     my $devNode = shift;
213
214     my $data = $devdetails->data();
215
216     if( $devdetails->hasCap('BNEsensor') )
217     {
218         foreach my $INDEX ( sort {$a<=>$b} keys %{$data->{'BNEsensor'}} )
219         {
220             my $param = $data->{'BNEsensor'}{$INDEX}{'param'};
221             my $leafName = $data->{'BNEsensor'}{$INDEX}{'leafName'};
222             
223             $cb->addLeaf( $devNode, $leafName, $param,
224                           ['BetterNetworks::betternetworks-sensor'] );
225         }
226     }
227 }
228
229
230
231 1;
232
233
234 # Local Variables:
235 # mode: perl
236 # indent-tabs-mode: nil
237 # perl-indent-level: 4
238 # End: