per-agent configuration of batch processors, #71837
[freeside.git] / torrus / perllib / Torrus / DevDiscover / RFC1697_RDBMS.pm
1 #  Copyright (C) 2003  Shawn Ferry
2 #
3 #  This program is free software; you can redistribute it and/or modify
4 #  it under the terms of the GNU General Public License as published by
5 #  the Free Software Foundation; either version 2 of the License, or
6 #  (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software
15 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
16
17 # $Id: RFC1697_RDBMS.pm,v 1.1 2010-12-27 00:03:52 ivan Exp $
18 # Shawn Ferry <sferry at sevenspace dot com> <lalartu at obscure dot org>
19
20 # RDBMS MIB
21
22 package Torrus::DevDiscover::RFC1697_RDBMS;
23
24 use strict;
25 use Torrus::Log;
26
27
28 $Torrus::DevDiscover::registry{'RFC1697_RDBMS'} = {
29     'sequence'     => 100,
30     'checkdevtype' => \&checkdevtype,
31     'discover'     => \&discover,
32     'buildConfig'  => \&buildConfig
33     };
34
35 our %oiddef =
36     (
37      # RDBMS-MIB
38      'rdbms'                            => '1.3.6.1.2.1.39',
39
40      'rdbmsDbTable'                     => '1.3.6.1.2.1.39.1.1.1',
41      'rdbmsDbIndex'                     => '1.3.6.1.2.1.39.1.1.1.1',
42      'rdbmsDbVendorName'                => '1.3.6.1.2.1.39.1.1.1.3',
43      'rdbmsDbName'                      => '1.3.6.1.2.1.39.1.1.1.4',
44      'rdbmsDbContact'                   => '1.3.6.1.2.1.39.1.1.1.5',
45      'rdbmsDbPrivateMIBOID'             => '1.3.6.1.2.1.39.1.1.1.2',
46
47      'rdbmsDbInfoTable'                 => '1.3.6.1.2.1.39.1.2.1',
48      'rdbmsDbInfoProductName'           => '1.3.6.1.2.1.39.1.2.1.1',
49      'rdbmsDbInfoVersion'               => '1.3.6.1.2.1.39.1.2.1.2',
50      'rdbmsDbInfoSizeUnits'             => '1.3.6.1.2.1.39.1.2.1.3',
51
52      # currently ignored, generally identical to rdbmsDb for oracle
53      'rdbmsSrvTable'                    => '1.3.6.1.2.1.39.1.5.1',
54      'rdbmsSrvVendorName'               => '1.3.6.1.2.1.39.1.5.1.2',
55      'rdbmsSrvProductName'              => '1.3.6.1.2.1.39.1.5.1.3',
56      'rdbmsSrvContact'                  => '1.3.6.1.2.1.39.1.5.1.4',
57      'rdbmsSrvPrivateMIBOID'            => '1.3.6.1.2.1.39.1.5.1.1',
58
59      # Oracle MIB base
60      'ora'                              => '1.3.6.1.4.1.111',
61
62      );
63
64
65
66
67 sub checkdevtype
68 {
69     my $dd = shift;
70     my $devdetails = shift;
71
72     return $dd->checkSnmpTable('rdbms');
73 }
74
75 sub discover
76 {
77     my $dd = shift;
78     my $devdetails = shift;
79
80     my $session = $dd->session();
81     my $data = $devdetails->data();
82
83     my $DbInfoSizeUnits = {
84         1 => '1',                       # bytes
85         2 => '1024',                    # kbytes
86         3 => '1048576',                 # mbytes
87         4 => '1073741824',              # gbytes
88         5 => '1099511627776',           # tbytes
89     };
90
91     my $dbTypes = {
92         ora => $dd->oiddef('ora'),
93     };
94
95
96     my $rdbmsDbTable = $session->get_table( -baseoid =>
97                                             $dd->oiddef('rdbmsDbTable') );
98
99     my $rdbmsDbInfoTable =
100         $session->get_table( -baseoid =>
101                              $dd->oiddef('rdbmsDbInfoTable') );
102
103     if( defined( $rdbmsDbTable ) )
104     {
105         $devdetails->storeSnmpVars($rdbmsDbTable);
106         $devdetails->setCap('RDBMS::DbTable');
107
108         if( defined( $rdbmsDbInfoTable ) )
109         {
110             $devdetails->storeSnmpVars($rdbmsDbInfoTable);
111             $devdetails->setCap('RDBMS::DbInfoTable');
112         }
113         else
114         {
115             Debug("No Actively Opened Instances");
116         }
117
118         my $ref = {};
119         $ref->{'indices'} = [];
120         $data->{'DbTable'} = $ref;
121
122         foreach my $INDEX
123             ( $devdetails->getSnmpIndices( $dd->oiddef('rdbmsDbIndex') ) )
124         {
125             
126             push( @{$ref->{'indices'}}, $INDEX );
127             
128             my $vendor =
129                 $devdetails->snmpVar( $dd->oiddef('rdbmsDbVendorName') .
130                                       '.' . $INDEX );
131
132             my $product =
133                 $devdetails->snmpVar( $dd->oiddef('rdbmsDbInfoProductName') .
134                                       '.' . $INDEX );
135
136             my $version =
137                 $devdetails->snmpVar( $dd->oiddef('rdbmsDbInfoVersion') .
138                                       '.' . $INDEX );
139
140             my $sizeUnits =
141                 $devdetails->snmpVar( $dd->oiddef('rdbmsDbInfoSizeUnits') .
142                                       '.' . $INDEX );
143             $sizeUnits = $DbInfoSizeUnits->{$sizeUnits};
144
145             my $dbName =
146                 $devdetails->snmpVar( $dd->oiddef('rdbmsDbName') .
147                                       '.' . $INDEX );
148
149             my $dbContact =
150                 $devdetails->snmpVar( $dd->oiddef('rdbmsDbContact') .
151                                       '.' . $INDEX );
152
153             my $dbMIBOID =
154                 $devdetails->snmpVar( $dd->oiddef('rdbmsDbPrivateMIBOID')
155                                       . '.' . $INDEX );
156
157             my $nick = "Vendor_" . $vendor . "_DB_" . $dbName;
158             $nick =~ s/^\///;
159             $nick =~ s/\W/_/g;
160             $nick =~ s/_+/_/g; 
161
162             my $descr = "Vendor: $vendor DB: $dbName";
163             $descr .= " Contact: $dbContact" if $dbContact;
164             $descr .= " Version: $version" if $version;
165
166             my $param = {};
167             $ref->{$INDEX}->{'param'} = $param;
168             $param->{'vendor'} = $vendor;
169             $param->{'product'} = $product;
170             $param->{'dbVersion'} = $version;
171             $param->{'dbSizeUnits'} = $sizeUnits;
172             $param->{'dbName'} = $dbName;
173             $param->{'dbMIBOID'} = $dbMIBOID;
174             $param->{'nick'} = $nick;
175             $param->{'comment'} = $descr;
176             $param->{'precedence'} = 1000 - $INDEX;
177
178             foreach my $dbType ( keys %{ $dbTypes } )
179             {
180                 if( Net::SNMP::oid_base_match
181                     ( $dbTypes->{$dbType}, $dbMIBOID ) )
182                 {
183                     if( not exists $data->{$dbType} )
184                     {
185                         $data->{$dbType} = {};
186                     }
187                     $data->{$dbType}->{$dbName}->{'index'} = $INDEX;
188                     Debug(" Added $dbName -> $INDEX to $dbType ");
189                     last;
190                 }
191             }
192
193         }
194
195     }
196
197     return 1;
198 }
199
200
201 sub buildConfig
202 {
203     my $devdetails = shift;
204     my $cb = shift;
205     my $devNode = shift;
206     my $data = $devdetails->data();
207
208     return unless $devdetails->isDevType("RDBMS");
209
210     my $appParam = {
211         'precedence'    =>  -100000,
212     };
213
214     my $appNode = $cb->addSubtree( $devNode, 'Applications', $appParam );
215
216     my $param = { };
217     my $oraNode = $cb->addSubtree( $appNode, 'Oracle', $param );
218
219     if( $devdetails->hasCap('RDBMS::DbTable') )
220     {
221         my $ref = $data->{'DbTable'};
222
223         foreach my $INDEX ( @{ $ref->{'indices'} } )
224         {
225             my $param = $ref->{$INDEX}->{'param'};
226             $cb->addSubtree( $oraNode, $param->{'nick'}, $param,
227                              [ 'RFC1697_RDBMS::rdbms-dbtable' ], );
228         }
229
230     }
231 }
232
233
234 1;
235
236
237 # Local Variables:
238 # mode: perl
239 # indent-tabs-mode: nil
240 # perl-indent-level: 4
241 # End: