torrus, RT#10574
[freeside.git] / torrus / perllib / Torrus / DevDiscover / MotorolaBSR.pm
1 #
2 #  Discovery module for Motorola Broadband Services Router (formely Riverdelta)
3 #
4 #  Copyright (C) 2006 Stanislav Sinyagin
5 #
6 #  This program is free software; you can redistribute it and/or modify
7 #  it under the terms of the GNU General Public License as published by
8 #  the Free Software Foundation; either version 2 of the License, or
9 #  (at your option) any later version.
10 #
11 #  This program is distributed in the hope that it will be useful,
12 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #  GNU General Public License for more details.
15 #
16 #  You should have received a copy of the GNU General Public License
17 #  along with this program; if not, write to the Free Software
18 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
19
20 # $Id: MotorolaBSR.pm,v 1.1 2010-12-27 00:03:53 ivan Exp $
21 #
22
23
24 # Cisco SCE devices discovery
25 package Torrus::DevDiscover::MotorolaBSR;
26
27 use strict;
28 use Torrus::Log;
29
30
31 $Torrus::DevDiscover::registry{'MotorolaBSR'} = {
32     'sequence'     => 500,
33     'checkdevtype' => \&checkdevtype,
34     'discover'     => \&discover,
35     'buildConfig'  => \&buildConfig
36     };
37
38 # pmodule-dependend OIDs are presented for module #1 only.
39 # currently devices with more than one module do not exist
40
41 our %oiddef =
42     (
43      'rdnProducts' => '1.3.6.1.4.1.4981.4.1',
44      # RDN-CMTS-MIB
45      'rdnCmtsUpstreamChannelTable' => '1.3.6.1.4.1.4981.2.1.2'     
46      );
47
48 sub checkdevtype
49 {
50     my $dd = shift;
51     my $devdetails = shift;
52
53     if( not $dd->oidBaseMatch
54         ( 'rdnProducts',
55           $devdetails->snmpVar( $dd->oiddef('sysObjectID') ) ) or
56         not $devdetails->isDevType('RFC2670_DOCS_IF') )
57     {
58         return 0;
59     }
60                 
61     $devdetails->setCap('interfaceIndexingPersistent');
62
63     return 1;
64 }
65
66 sub discover
67 {
68     my $dd = shift;
69     my $devdetails = shift;
70
71     my $session = $dd->session();
72     my $data = $devdetails->data();
73
74     $data->{'param'}{'ifindex-map'} = '$IFIDX_IFINDEX';
75     Torrus::DevDiscover::RFC2863_IF_MIB::storeIfIndexParams( $devdetails );
76     
77     if( $dd->checkSnmpTable( 'rdnCmtsUpstreamChannelTable' ) )
78     {
79         $devdetails->setCap('rdnCmtsUpstreamChannelTable');
80
81         foreach my $ifIndex ( @{$data->{'docsCableUpstream'}} )
82         {
83             my $interface = $data->{'interfaces'}{$ifIndex};
84             
85             push( @{$interface->{'docsTemplates'}},
86                   'MotorolaBSR::motorola-bsr-docsis-upstream-util' );
87         }
88     }
89     
90     return 1;
91 }
92
93 sub buildConfig
94 {
95     my $devdetails = shift;
96     my $cb = shift;
97     my $devNode = shift;
98     my $data = $devdetails->data();
99
100     if( $devdetails->hasCap('rdnCmtsUpstreamChannelTable') and
101         scalar( @{$data->{'docsCableUpstream'}} ) > 0 )
102     {
103         my $upstrNode =
104             $cb->getChildSubtree( $devNode,
105                                   $data->{'docsConfig'}{'docsCableUpstream'}{
106                                       'subtreeName'} );
107         
108         my $shortcuts = 'snr,fec,freq,modems';
109         
110         my $param = {        
111             'overview-shortcuts' =>
112                 $shortcuts,
113                 
114                 'overview-subleave-name-modems' => 'Modems',
115                 'overview-direct-link-modems' => 'yes',
116                 'overview-direct-link-view-modems' => 'expanded-dir-html',
117                 'overview-shortcut-text-modems' => 'All modems',
118                 'overview-shortcut-title-modems'=>
119                 'Show modem quantities in one page',
120                 'overview-page-title-modems' => 'Modem quantities',
121             };
122
123         $cb->addParams( $upstrNode, $param );
124         
125         # Build All_Modems summary graph
126         
127         my $param = {
128             'ds-type'              => 'rrd-multigraph',
129             'ds-names'             => 'registered,unregistered,offline',
130             'graph-lower-limit'    => '0',
131             'precedence'           => '1000',
132                 
133             'vertical-label'       => 'Modems',
134             'descriptive-nickname'     => '%system-id%: All modems',
135             
136             'ds-expr-registered' => '{Modems_Registered}',
137             'graph-legend-registered' => 'Registered',
138             'line-style-registered' => 'AREA',
139             'line-color-registered' => '##blue',
140             'line-order-registered' => '1',
141             
142             'ds-expr-unregistered' => '{Modems_Unregistered}',
143             'graph-legend-unregistered' => 'Unregistered',
144             'line-style-unregistered' => 'STACK',
145             'line-color-unregistered' => '##crimson',
146             'line-order-unregistered' => '2',
147             
148             'ds-expr-offline' => '{Modems_Offline}',
149             'graph-legend-offline' => 'Offline',
150             'line-style-offline' => 'STACK',
151             'line-color-offline' => '##silver',
152             'line-order-offline' => '3',                
153         };
154         
155         $param->{'comment'} =
156             'Registered, Unregistered and Offline modems on CMTS';
157         
158         $param->{'nodeid'} =
159             $data->{'docsConfig'}{'docsCableUpstream'}{'nodeidCategory'} .
160             '//%nodeid-device%//modems';
161         
162         my $first = 1;
163         foreach my $ifIndex ( @{$data->{'docsCableUpstream'}} )
164         {
165             my $interface = $data->{'interfaces'}{$ifIndex};
166             
167             my $intf = $interface->{$data->{'nameref'}{'ifSubtreeName'}};
168             
169             if( $first )
170             {
171                 $param->{'ds-expr-registered'} =
172                     '{' . $intf . '/Modems_Registered}';
173                 $param->{'ds-expr-unregistered'} =
174                     '{' . $intf . '/Modems_Unregistered}';
175                 $param->{'ds-expr-offline'} =
176                     '{' . $intf . '/Modems_Offline}';
177                 $first = 0;
178             }
179             else
180             {
181                 $param->{'ds-expr-registered'} .=
182                     ',{' . $intf . '/Modems_Registered},+';
183                 $param->{'ds-expr-unregistered'} .=
184                     ',{' . $intf . '/Modems_Unregistered},+';
185                 $param->{'ds-expr-offline'} .=
186                     ',{' . $intf . '/Modems_Offline},+';
187             }
188         }
189
190         my $usNode =
191             $cb->getChildSubtree( $devNode,
192                                   $data->{'docsConfig'}{
193                                       'docsCableUpstream'}{
194                                           'subtreeName'} );
195         if( defined( $usNode ) )
196         {
197             $cb->addLeaf( $usNode, 'All_Modems', $param, [] );
198         }
199         else
200         {
201             Error('Could not find the Upstream subtree');
202             exit 1;
203         }
204     }
205 }
206
207 1;
208
209 # Local Variables:
210 # mode: perl
211 # indent-tabs-mode: nil
212 # perl-indent-level: 4
213 # End: