import torrus 1.0.9
[freeside.git] / torrus / perllib / Torrus / DevDiscover / RFC1628_UPS_MIB.pm
diff --git a/torrus/perllib/Torrus/DevDiscover/RFC1628_UPS_MIB.pm b/torrus/perllib/Torrus/DevDiscover/RFC1628_UPS_MIB.pm
new file mode 100644 (file)
index 0000000..890843f
--- /dev/null
@@ -0,0 +1,180 @@
+#  Copyright (C) 2008  Jon Nistor
+#
+#  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.
+
+# $Id: RFC1628_UPS_MIB.pm,v 1.1 2010-12-27 00:03:56 ivan Exp $
+# Jon Nistor <nistor at snickers dot org>
+
+# Discovery module for UPS-MIB (RFC 1628)
+#
+# Tested with:
+#     ConnectUPS Web/SNMP Card V4.20 [powerware 9390]
+#
+# Issues with:
+#     ConnectUPS Web/SNMP Card V3.16 [powerware 9155]
+#      - InputFrequency and InputTruePower are missing from RFC UPS-MIB
+#
+
+package Torrus::DevDiscover::RFC1628_UPS_MIB;
+
+use strict;
+use Torrus::Log;
+
+
+$Torrus::DevDiscover::registry{'RFC1628_UPS_MIB'} = {
+    'sequence'     => 100,
+    'checkdevtype' => \&checkdevtype,
+    'discover'     => \&discover,
+    'buildConfig'  => \&buildConfig
+    };
+
+
+our %oiddef =
+    (
+     # UPS-MIB
+     'upsIdent'                     => '1.3.6.1.2.1.33.1.1',
+     'upsIdentManufacturer'         => '1.3.6.1.2.1.33.1.1.1.0',
+     'upsIdentModel'                => '1.3.6.1.2.1.33.1.1.2.0',
+     'upsIdentUPSSoftwareVersion'   => '1.3.6.1.2.1.33.1.1.3.0',
+     'upsIdentAgentSoftwareVersion' => '1.3.6.1.2.1.33.1.1.4.0',
+     'upsIdentName'                 => '1.3.6.1.2.1.33.1.1.5.0',
+
+     'upsInputNumLines'             => '1.3.6.1.2.1.33.1.3.2.0',
+     'upsOutputNumLines'            => '1.3.6.1.2.1.33.1.4.3.0',
+     'upsBypassNumLines'            => '1.3.6.1.2.1.33.1.5.2.0'
+     );
+
+
+
+sub checkdevtype
+{
+    my $dd = shift;
+    my $devdetails = shift;
+
+    my $session = $dd->session();
+    my $data = $devdetails->data();
+
+    return $dd->checkSnmpTable( 'upsIdent' );
+}
+
+
+sub discover
+{
+    my $dd = shift;
+    my $devdetails = shift;
+
+    my $data = $devdetails->data();
+    my $session = $dd->session();
+
+    my $upsInfo = $dd->retrieveSnmpOIDs('upsIdentManufacturer',
+                  'upsIdentModel', 'upsIdentUPSSoftwareVersion',
+                  'upsIdentAgentSoftwareVersion', 'upsIdentName',
+                  'upsInputNumLines', 'upsOutputNumLines', 'upsBypassNumLines');
+
+    $data->{'param'}{'comment'} = $upsInfo->{'upsIdentManufacturer'} . " " .
+                            $upsInfo->{'upsIdentModel'} . " " . 
+                            $upsInfo->{'upsIdentUPSSoftwareVersion'};
+
+    # PROG: Discover number of lines (in,out,bypass)...
+    $data->{'numInput'}  = $upsInfo->{'upsInputNumLines'};
+    $data->{'numOutput'} = $upsInfo->{'upsOutputNumLines'};
+    $data->{'numBypass'} = $upsInfo->{'upsBypassNumLines'};
+
+    Debug("UPS Lines  Input: " . $data->{'numInput'} .
+                  ", Output: " . $data->{'numOutput'} .
+                  ", Bypass: " . $data->{'numBypass'} );
+
+    if( $devdetails->param('RFC1628_UPS::disable-input') ne 'yes' )
+    {
+        $devdetails->setCap('UPS-input');
+    }
+
+    if( $devdetails->param('RFC1628_UPS::disable-output') ne 'yes' )
+    {
+        $devdetails->setCap('UPS-output');
+    }
+
+    if( $devdetails->param('RFC1628_UPS::disable-bypass') ne 'yes' )
+    {
+        $devdetails->setCap('UPS-bypass');
+    }
+
+    return 1;
+}
+
+
+sub buildConfig
+{
+    my $devdetails = shift;
+    my $cb = shift;
+    my $devNode = shift;
+    my $data = $devdetails->data();
+
+    # PROG: Add static battery information
+    $cb->addSubtree( $devNode, 'Battery',
+                   { 'precedence' => 999 },
+                   [ 'RFC1628_UPS_MIB::battery-subtree' ] );
+    
+    if( $devdetails->hasCap('UPS-input') )
+    {
+        my $nodeInput = $cb->addSubtree( $devNode, 'Input',
+                                  { 'comment' => 'Input feeds' },
+                                  [ 'RFC1628_UPS_MIB::ups-input-subtree' ] );
+
+        foreach my $INDEX ( 1 .. $data->{'numInput'} )
+        {
+            $cb->addSubtree( $nodeInput, sprintf('Phase_%d', $INDEX),
+                             { 'ups-input-idx' => $INDEX },
+                             [ 'RFC1628_UPS::ups-input-leaf' ] );
+        }
+    }
+
+    if( $devdetails->hasCap('UPS-output') )
+    {
+        my $nodeOutput = $cb->addSubtree( $devNode, 'Output',
+                                   { 'comment' => 'Output feeds' },
+                                   [ 'RFC1628_UPS_MIB::ups-output-subtree' ] );
+
+        foreach my $INDEX ( 1 .. $data->{'numOutput'} )
+        {
+            $cb->addSubtree( $nodeOutput, sprintf('Phase_%d', $INDEX),
+                             { 'ups-output-idx' => $INDEX },
+                             [ 'RFC1628_UPS::ups-output-leaf' ] );
+        }
+    }
+
+    if( $devdetails->hasCap('UPS-bypass') )
+    {
+        my $nodeBypass = $cb->addSubtree( $devNode, 'Bypass',
+                                   { 'comment' => 'Bypass feeds' },
+                                   [ 'RFC1628_UPS_MIB::ups-bypass-subtree' ] );
+
+        foreach my $INDEX ( 1 .. $data->{'numBypass'} )
+        {
+            $cb->addSubtree( $nodeBypass, sprintf('Phase_%d', $INDEX),
+                             { 'ups-bypass-idx' => $INDEX },
+                             [ 'RFC1628_UPS::ups-bypass-leaf' ] );
+        }
+    }
+
+}
+
+1;
+
+# Local Variables:
+# mode: perl
+# indent-tabs-mode: nil
+# perl-indent-level: 4
+# End: