X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=torrus%2Fperllib%2FTorrus%2FDevDiscover%2FCiscoIOS_Docsis.pm;fp=torrus%2Fperllib%2FTorrus%2FDevDiscover%2FCiscoIOS_Docsis.pm;h=8118a6542e6a79e60ac80c6d46d9543a09113de3;hb=74e058c8a010ef6feb539248a550d0bb169c1e94;hp=0000000000000000000000000000000000000000;hpb=35359a73152b3d7a9ad5e3d37faf81f6fedb76e8;p=freeside.git diff --git a/torrus/perllib/Torrus/DevDiscover/CiscoIOS_Docsis.pm b/torrus/perllib/Torrus/DevDiscover/CiscoIOS_Docsis.pm new file mode 100644 index 000000000..8118a6542 --- /dev/null +++ b/torrus/perllib/Torrus/DevDiscover/CiscoIOS_Docsis.pm @@ -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 + +# 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: