import torrus 1.0.9
[freeside.git] / torrus / perllib / Torrus / DevDiscover / CiscoIOS_Docsis.pm
diff --git a/torrus/perllib/Torrus/DevDiscover/CiscoIOS_Docsis.pm b/torrus/perllib/Torrus/DevDiscover/CiscoIOS_Docsis.pm
new file mode 100644 (file)
index 0000000..8118a65
--- /dev/null
@@ -0,0 +1,285 @@
+#  Copyright (C) 2002  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., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+# $Id: CiscoIOS_Docsis.pm,v 1.1 2010-12-27 00:03:46 ivan Exp $
+# Stanislav Sinyagin <ssinyagin@yahoo.com>
+
+# DOCSIS interface, Cisco specific
+
+package Torrus::DevDiscover::CiscoIOS_Docsis;
+
+use strict;
+use Torrus::Log;
+
+# Sequence number is 600 - we depend on RFC2670_DOCS_IF and CiscoIOS
+
+$Torrus::DevDiscover::registry{'CiscoIOS_Docsis'} = {
+    'sequence'     => 600,
+    'checkdevtype' => \&checkdevtype,
+    'discover'     => \&discover,
+    'buildConfig'  => \&buildConfig
+    };
+
+$Torrus::DevDiscover::RFC2863_IF_MIB::knownSelectorActions{
+    'DocsisMacModemsMonitor'} = 'CiscoIOS_Docsis';
+
+$Torrus::DevDiscover::RFC2863_IF_MIB::knownSelectorActions{
+    'DocsisUpUtilMonitor'} = 'CiscoIOS_Docsis';
+$Torrus::DevDiscover::RFC2863_IF_MIB::knownSelectorActions{
+    'DocsisUpSlotsMonitor'} = 'CiscoIOS_Docsis';
+
+
+our %oiddef =
+    (
+     # CISCO-DOCS-EXT-MIB:cdxIfUpstreamChannelExtTable
+     'cdxIfUpChannelMaxUGSLastFiveMins' => '1.3.6.1.4.1.9.9.116.1.4.1.1.14'
+     );
+
+
+sub checkdevtype
+{
+    my $dd = shift;
+    my $devdetails = shift;
+
+    if( $devdetails->isDevType('CiscoIOS') and
+        $devdetails->isDevType('RFC2670_DOCS_IF') )
+    {
+        return 1;
+    }
+
+    return 0;
+}
+
+
+sub discover
+{
+    my $dd = shift;
+    my $devdetails = shift;
+
+    my $data = $devdetails->data();
+    
+    if( $dd->checkSnmpTable( 'cdxIfUpChannelMaxUGSLastFiveMins' ) )
+    {
+        $devdetails->setCap('cdxIfUpChannelMaxUGSLastFiveMins');
+    }
+
+    push( @{$data->{'docsConfig'}{'docsCableMaclayer'}{'templates'}},
+          'CiscoIOS_Docsis::cisco-docsis-mac-subtree' );
+
+    foreach my $ifIndex ( @{$data->{'docsCableMaclayer'}} )
+    {
+        my $interface = $data->{'interfaces'}{$ifIndex};
+
+        push( @{$interface->{'docsTemplates'}},
+              'CiscoIOS_Docsis::cisco-docsis-mac-util' );
+    }
+
+    foreach my $ifIndex ( @{$data->{'docsCableUpstream'}} )
+    {
+        my $interface = $data->{'interfaces'}{$ifIndex};
+
+        push( @{$interface->{'docsTemplates'}},
+              'CiscoIOS_Docsis::cisco-docsis-upstream-util' );
+    }
+    
+    return 1;
+}
+
+
+sub buildConfig
+{
+    my $devdetails = shift;
+    my $cb = shift;
+    my $devNode = shift;
+
+    my $data = $devdetails->data();
+
+    if( $devdetails->hasCap('cdxIfUpChannelMaxUGSLastFiveMins') )
+    {
+        $cb->setVar( $devNode, 'CiscoIOS_Docsis::ugs-supported', 'true' );
+    }
+
+    if( scalar( @{$data->{'docsCableMaclayer'}} ) > 0 )
+    {
+        # Build All_Modems summary graph
+        my $param = {
+            'ds-type'              => 'rrd-multigraph',
+            'ds-names'             => 'total,active,registered',
+            'graph-lower-limit'    => '0',
+            'precedence'           => '1000',
+            'comment'              =>
+                'Registered, Active and Total modems on CMTS',
+                
+                'vertical-label'       => 'Modems',
+                
+                'graph-legend-total'   => 'Total',
+                'line-style-total'     => '##totalresource',
+                'line-color-total'     => '##totalresource',
+                'line-order-total'     => '1',
+                
+                'graph-legend-active'  => 'Active',
+                'line-style-active'    => '##resourcepartusage',
+                'line-color-active'    => '##resourcepartusage',
+                'line-order-active'    => '2',
+                
+                'graph-legend-registered'  => 'Registered',
+                'line-style-registered'    => '##resourceusage',
+                'line-color-registered'    => '##resourceusage',
+                'line-order-registered'    => '3',
+                'descriptive-nickname'     => '%system-id%: All modems'
+            };
+        
+        my $first = 1;
+        foreach my $ifIndex ( @{$data->{'docsCableMaclayer'}} )
+        {
+            my $interface = $data->{'interfaces'}{$ifIndex};
+            
+            my $intf = $interface->{$data->{'nameref'}{'ifSubtreeName'}};
+            
+            if( $first )
+            {
+                $param->{'ds-expr-total'} =
+                    '{' . $intf . '/Modems_Total}';
+                $param->{'ds-expr-active'} =
+                    '{' . $intf . '/Modems_Active}';
+                $param->{'ds-expr-registered'} =
+                    '{' . $intf . '/Modems_Registered}';
+                $first = 0;
+            }
+            else
+            {
+                $param->{'ds-expr-total'} .=
+                    ',{' . $intf . '/Modems_Total},+';
+                $param->{'ds-expr-active'} .=
+                    ',{' . $intf . '/Modems_Active},+';
+                $param->{'ds-expr-registered'} .=
+                    ',{' . $intf . '/Modems_Registered},+';
+            }
+        }
+
+        my $macNode =
+            $cb->getChildSubtree( $devNode,
+                                  $data->{'docsConfig'}{
+                                      'docsCableMaclayer'}{
+                                          'subtreeName'} );
+        if( defined( $macNode ) )
+        {
+            $cb->addLeaf( $macNode, 'All_Modems', $param, [] );
+        }
+        else
+        {
+            Error('Could not find the MAC layer subtree');
+            exit 1;
+        }
+        
+        # Apply selector actions
+        foreach my $ifIndex ( @{$data->{'docsCableMaclayer'}} )
+        {
+            my $interface = $data->{'interfaces'}{$ifIndex};
+            
+            my $intf = $interface->{$data->{'nameref'}{'ifSubtreeName'}};
+            
+            my $monitor =
+                $interface->{'selectorActions'}{'DocsisMacModemsMonitor'};
+            if( defined( $monitor ) )
+            {
+                my $intfNode = $cb->getChildSubtree( $macNode, $intf );
+                $cb->addLeaf( $intfNode, 'Modems_Registered',
+                              {'monitor' => $monitor } );
+            }
+        }
+    }
+
+    if( scalar( @{$data->{'docsCableUpstream'}} ) > 0 )
+    {
+        my $upstrNode =
+            $cb->getChildSubtree( $devNode,
+                                  $data->{'docsConfig'}{'docsCableUpstream'}{
+                                      'subtreeName'} );
+        
+        foreach my $ifIndex ( @{$data->{'docsCableUpstream'}} )
+        {
+            my $interface = $data->{'interfaces'}{$ifIndex};
+            
+            my $intf = $interface->{$data->{'nameref'}{'ifSubtreeName'}};
+            
+            my $monitor =
+                $interface->{'selectorActions'}{'DocsisUpUtilMonitor'};
+            if( defined( $monitor ) )
+            {
+                my $intfNode = $cb->getChildSubtree( $upstrNode, $intf );
+                $cb->addLeaf( $intfNode, 'Util',
+                              {'monitor' => $monitor } );
+            }
+
+            $monitor =
+                $interface->{'selectorActions'}{'DocsisUpSlotsMonitor'};
+            if( defined( $monitor ) )
+            {
+                my $intfNode = $cb->getChildSubtree( $upstrNode, $intf );
+                $cb->addLeaf( $intfNode, 'ContSlots',
+                              {'monitor' => $monitor } );
+            }
+        }
+
+        # Override the overview shortcus defined in rfc2670.docsis-if.xml
+        
+        my $shortcuts = 'snr,fec,freq,modems,util';
+        if( $devdetails->hasCap('cdxIfUpChannelMaxUGSLastFiveMins') )
+        {
+            $shortcuts .= ',ugs';
+        }
+        
+        my $param = {        
+            'overview-shortcuts' =>
+                $shortcuts,
+                
+                'overview-subleave-name-modems' => 'Modems',
+                'overview-direct-link-modems' => 'yes',
+                'overview-direct-link-view-modems' => 'expanded-dir-html',
+                'overview-shortcut-text-modems' => 'All modems',
+                'overview-shortcut-title-modems'=>
+                'Show modem quantities in one page',
+                'overview-page-title-modems' => 'Modem quantities',
+                
+                'overview-subleave-name-util' => 'Util_Summary',
+                'overview-direct-link-util' => 'yes',
+                'overview-direct-link-view-util' => 'expanded-dir-html',
+                'overview-shortcut-text-util' => 'All utilization',
+                'overview-shortcut-title-util' => 'All upstream utilization',
+                'overview-page-title-util' => 'Upstream utilization',
+                
+                'overview-subleave-name-ugs' => 'Active_UGS',
+                'overview-direct-link-ugs' => 'yes',
+                'overview-direct-link-view-ugs' => 'expanded-dir-html',
+                'overview-shortcut-text-ugs' => 'All UGS',
+                'overview-shortcut-title-ugs' => 'Show all UGS in one page',
+                'overview-page-title-ugs' => 'UGS Statistics'
+            };
+
+        $cb->addParams( $upstrNode, $param );
+    }
+}
+
+
+1;
+
+
+# Local Variables:
+# mode: perl
+# indent-tabs-mode: nil
+# perl-indent-level: 4
+# End: