import torrus 1.0.9
[freeside.git] / torrus / perllib / Torrus / DevDiscover / OracleDatabase.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: OracleDatabase.pm,v 1.1 2010-12-27 00:03:49 ivan Exp $
18 # Shawn Ferry <sferry at sevenspace dot com> <lalartu at obscure dot org>
19
20 # Oracle Database MIB
21
22 package Torrus::DevDiscover::OracleDatabase;
23
24 use strict;
25 use Torrus::Log;
26
27
28 $Torrus::DevDiscover::registry{'OracleDatabase'} = {
29     'sequence'     => 600,
30     'checkdevtype' => \&checkdevtype,
31     'discover'     => \&discover,
32     'buildConfig'  => \&buildConfig
33     };
34
35 our %oiddef =
36     (
37      # Oracle Database
38      'oraDb'                            => '1.3.6.1.4.1.111.4.1',
39
40      'oraDbConfigDbBlockSize'           => '1.3.6.1.4.1.111.4.1.7.1.3',
41
42      'oraDbSysTable'                    => '1.3.6.1.4.1.111.4.1.1.1',
43
44      'oraDbTablespace'                  => '1.3.6.1.4.1.111.4.1.2.1',
45      'oraDbTablespaceIndex'             => '1.3.6.1.4.1.111.4.1.2.1.1',
46      'oraDbTablespaceName'              => '1.3.6.1.4.1.111.4.1.2.1.2',
47
48      'oraDbDataFile'                    => '1.3.6.1.4.1.111.4.1.3.1',
49      'oraDbDataFileIndex'               => '1.3.6.1.4.1.111.4.1.3.1.1',
50      'oraDbDataFileName'                => '1.3.6.1.4.1.111.4.1.3.1.2',
51
52      'oraDbLibraryCache'                => '1.3.6.1.4.1.111.4.1.4.1',
53      'oraDbLibraryCacheIndex'           => '1.3.6.1.4.1.111.4.1.4.1.1',
54      'oraDbLibraryCacheNameSpace'       => '1.3.6.1.4.1.111.4.1.4.1.2',
55
56      'oraDbLibraryCacheSumTable'        => '1.3.6.1.4.1.111.4.1.5.1',
57
58      'oraDbSGATable'                    => '1.3.6.1.4.1.111.4.1.6.1',
59
60      );
61
62 my $DbInfoSizeUnits =
63 {
64     1 => '1',                       # bytes
65     2 => '1024',                    # kbytes
66     3 => '1048576',                 # mbytes
67     4 => '1073741824',              # gbytes
68     5 => '1099511627776',           # tbytes
69 };
70
71 sub checkdevtype
72 {
73     my $dd = shift;
74     my $devdetails = shift;
75
76     return $dd->checkSnmpTable('oraDb');
77 }
78
79 sub discover
80 {
81     my $dd = shift;
82     my $devdetails = shift;
83
84     my $session = $dd->session();
85     my $data = $devdetails->data();
86
87     if( not defined( $data->{'param'}{'snmp-oids-per-pdu'} ) )
88     {
89         $data->{'param'}{'snmp-oids-per-pdu'} = '10';
90     }
91     
92     my $dbType = $data->{'ora'};
93
94     # my $oraTableSpaceCols = (
95     #     $dd->oiddef('oraDbTablespaceIndex'),
96     #     $dd->oiddef('oraDbTablespaceName'),
97     #     );
98
99     # my $oraTableSpace = $session->get_entries( -columns => [
100     #         $dd->oiddef('oraDbTablespaceIndex'),
101     #         $dd->oiddef('oraDbTablespaceName'),
102     #         ], );
103
104     my $oraTableSpace = $session->get_table( -baseoid =>
105                                              $dd->oiddef('oraDbTablespace'),
106                                              );
107
108
109     if( defined($oraTableSpace) )
110     {
111         $devdetails->setCap('oraTableSpace');
112         $devdetails->storeSnmpVars($oraTableSpace);
113
114     }
115
116     ##
117
118     # my @oraDbDataFileCols = (
119     #     $dd->oiddef('oraDbDataFileIndex'),
120     #     $dd->oiddef('oraDbDataFileName'),
121     #     );
122
123     # my $oraDbDataFile = $session->get_entries( -columns => [
124     #     @oraDbDataFileCols ], );
125
126     my $oraDbDataFile =
127         $session->get_table( -baseoid => $dd->oiddef('oraDbDataFile') );
128
129     if( defined($oraDbDataFile) )
130     {
131         $devdetails->setCap('oraDbDataFile');
132         $devdetails->storeSnmpVars($oraDbDataFile);
133     }
134
135     ##
136
137     # my @oraDbLibraryCacheCols = (
138     #     $dd->oiddef('oraDbLibraryCacheIndex'),
139     #     $dd->oiddef('oraDbLibraryCacheNameSpace'),
140     #     );
141
142     # my $oraDbLibraryCache = $session->get_entries( -columns => [
143     #     @oraDbLibraryCacheCols ], );
144
145     my $oraDbLibraryCache =
146         $session->get_table( -baseoid => $dd->oiddef('oraDbLibraryCache') );
147
148     if( defined($oraDbLibraryCache) )
149     {
150         $devdetails->setCap('oraDbLibraryCache');
151         $devdetails->storeSnmpVars($oraDbLibraryCache);
152     }
153
154     Debug("Looking For dbNames");
155
156     foreach my $dbName ( keys %{ $dbType } )
157     {
158         Debug("DBName: $dbName");
159
160         my $dbIndex = $dbType->{$dbName}->{'index'};
161         Debug("DBIndex: $dbIndex");
162
163         my $db = {};
164         $dbType->{$dbName} = $db;
165
166         my $oid = $dd->oiddef('oraDbConfigDbBlockSize') . '.' .  $dbIndex;
167         my $result = $session->get_request( -varbindlist => [ $oid ] );
168         
169         
170         if( $session->error_status() == 0 and $result->{$oid} > 0 )
171         {
172             my $blocksize = $result->{$oid};
173             $dbType->{$dbName}->{'dbBlockSize'} = $blocksize;
174             Debug("DB Block Size: $blocksize");
175         }
176         Debug($session->error());
177
178         if( $devdetails->hasCap('oraTableSpace') )
179         {
180             my $ref = {};
181             $db->{'oraTableSpace'} = $ref;
182
183             # Table Space
184             foreach my $tsIndex
185                 ( $devdetails->
186                   getSnmpIndices( $dd->oiddef('oraDbTablespaceIndex') .
187                                   '.' . $dbIndex ) )
188             {
189                 my $tsName =
190                     $devdetails->snmpVar( $dd->oiddef('oraDbTablespaceName') .
191                                           '.' . $dbIndex . '.' . $tsIndex );
192                 
193                 $ref->{$tsName} = $tsIndex;
194             }
195         }
196
197         if( $devdetails->hasCap('oraDbDataFile') )
198         {
199             my $ref = {};
200             $db->{'oraDbDataFile'} = $ref;
201
202             # Data File
203             foreach my $dfIndex
204                 ( $devdetails->
205                   getSnmpIndices( $dd->oiddef('oraDbDataFileIndex') .
206                                   '.' . $dbIndex ) )
207             {
208                 my $dfName =
209                     $devdetails->snmpVar( $dd->oiddef('oraDbDataFileName') .
210                                           '.' . $dbIndex . '.' . $dfIndex );
211
212                 $ref->{$dfName} = $dfIndex;
213             }
214         }
215         
216         if( $devdetails->hasCap('oraDbLibraryCache') )
217         {
218             my $ref = {};
219             $db->{'oraDbLibraryCache'} = $ref;
220
221             # Library Cache
222             foreach my $lcIndex
223                 ( $devdetails->
224                   getSnmpIndices( $dd->oiddef('oraDbLibraryCacheIndex') .
225                                   '.' . $dbIndex ) )
226             {
227                 my $lcName =
228                     $devdetails->
229                     snmpVar( $dd->oiddef('oraDbLibraryCacheNameSpace') .
230                              '.' . $dbIndex . '.' . $lcIndex );
231                 
232                 $ref->{$lcName} = $lcIndex;
233             }
234         }
235     }
236     
237     return 1;
238 }
239
240
241 sub buildConfig
242 {
243     my $devdetails = shift;
244     my $cb = shift;
245     my $devNode = shift;
246     my $data = $devdetails->data();
247
248     my $dbType = $data->{'ora'};
249
250     my $appNode = $cb->addSubtree($devNode, 'Applications' );
251     my $vendorNode = $cb->addSubtree($appNode, 'Oracle' );
252
253     foreach my $dbName ( keys %{ $dbType } )
254     {
255         my $db = $dbType->{$dbName};
256         my $dbIndex = $dbType->{$dbName}->{'index'};
257         my $dbBlockSize = $dbType->{$dbName}->{'dbBlockSize'};
258
259         my $dbNick = $dbName;
260         $dbNick =~ s/^\///;
261         $dbNick =~ s/\W/_/g;
262         $dbNick =~ s/_+/_/g;
263
264         my $dbParam = {
265             'dbName' => $dbName,
266             'precedence' => sprintf("%d", 10000 - $dbIndex),
267             'vendor' => 'Oracle',
268             'dbNick' => $dbNick,
269         };
270
271         my @dbTemplates = (
272                            'OracleDatabase::Sys',
273                            'OracleDatabase::CacheSum',
274                            'OracleDatabase::SGA',
275                            );
276
277         my $dbNode = $cb->addSubtree($vendorNode, "Vendor_Oracle_DB_$dbNick",
278                                      $dbParam, [ @dbTemplates ] );
279
280         if( $devdetails->hasCap('oraTableSpace') )
281         {
282             my $tsParam = {
283                 'comment' => "Table space for $dbName",
284                 'precedence' => "600",
285             };
286
287             my $tsNode = $cb->addSubtree($dbNode, 'Table_Space', $tsParam );
288
289             foreach my $tsName ( keys %{ $db->{'oraTableSpace'} } )
290             {
291                 my $INDEX = $db->{'oraTableSpace'}->{$tsName};
292
293                 my $nick = $tsName;
294                 $nick =~ s/^\///;
295                 $nick =~ s/\W/_/g;
296                 $nick =~ s/_+/_/g;
297
298                 my $title = '%system-id%' . " $dbName $tsName";
299
300                 my $tsParam = {
301                     'comment'   => "Table Space: $tsName",
302                     'precedence' => sprintf("%d", 10000 - $INDEX),
303                     'table-space-nick' => $nick,
304                     'table-space-name' => $tsName,
305                     'graph-title' => $title,
306                     'descriptive-nickname' => $title,
307                 };
308
309                 $cb->addSubtree( $tsNode, $nick, $tsParam,
310                                  [ 'OracleDatabase::table-space' ] );
311                 Debug("Will add TableSpace: $tsName");
312             }
313         }
314
315         if( $devdetails->hasCap('oraDbDataFile') )
316         {
317             my $dfParam = {
318                 'comment' => "Data Files for $dbName",
319                 'precedence' => "500",
320             };
321
322             my $dfNode = $cb->addSubtree($dbNode, 'Data_Files', $dfParam );
323
324             foreach my $dfName ( keys %{ $db->{'oraDbDataFile'} } )
325             {
326                 my $INDEX = $db->{'oraDbDataFile'}->{$dfName};
327
328                 my $nick = $dfName;
329                 $nick =~ s/^\///;
330                 $nick =~ s/\W/_/g;
331                 $nick =~ s/_+/_/g;
332
333                 my $title = '%system-id%' . " $dbName $dfName";
334
335
336                 my $dfParam = {
337                     'comment'   => "Data File: $dfName",
338                     'precedence' => sprintf("%d", 10000 - $INDEX),
339                     'data-file-nick' => $nick,
340                     'data-file-name' => $dfName,
341                     'graph-title' => $title,
342                     'dbBlockSize' => $dbBlockSize,
343                 };
344
345                 $cb->addSubtree( $dfNode, $nick, $dfParam,
346                                  ['OracleDatabase::data-file' ] );
347                 Debug("Will add DataFile: $dfName");
348             }
349         }
350
351         if( $devdetails->hasCap('oraDbLibraryCache') )
352         {
353             my $lcParam = {
354                 'comment' => "Library Cache for $dbName",
355                 'precedence' => "400",
356             };
357
358             my $lcNode = $cb->addSubtree($dbNode, 'Library_Cache', $lcParam );
359
360             foreach my $lcName ( keys %{ $db->{'oraDbLibraryCache'} } )
361             {
362                 my $INDEX = $db->{'oraDbLibraryCache'}->{$lcName};
363
364                 my $nick = $lcName;
365                 $nick =~ s/^\///;
366                 $nick =~ s/\W/_/g;
367                 $nick =~ s/_+/_/g;
368
369                 my $title = '%system-id%' . " $dbName $lcName";
370
371                 my $lcParam = {
372                     'comment'   => "Library Cache: $lcName",
373                     'precedence' => sprintf("%d", 10000 - $INDEX),
374                     'library-cache-nick' => $nick,
375                     'library-cache-name' => $lcName,
376                     'graph-title' => $title,
377                 };
378
379                 $cb->addSubtree( $lcNode, $nick, $lcParam,
380                                  ['OracleDatabase::library-cache'] );
381                 Debug("Will add LibraryCache: $lcName");
382             }
383         }
384     }
385 }
386
387
388 1;
389
390
391 # Local Variables:
392 # mode: perl
393 # indent-tabs-mode: nil
394 # perl-indent-level: 4
395 # End: