1 # Copyright (C) 2003 Shawn Ferry
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.
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.
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.
17 # $Id: EmpireSystemedge.pm,v 1.1 2010-12-27 00:03:55 ivan Exp $
18 # Shawn Ferry <sferry at sevenspace dot com> <lalartu at obscure dot org>
20 package Torrus::DevDiscover::EmpireSystemedge;
26 $Torrus::DevDiscover::registry{'EmpireSystemedge'} = {
28 'checkdevtype' => \&checkdevtype,
29 'discover' => \&discover,
30 'buildConfig' => \&buildConfig
34 # define the oids that are needed to determine support,
35 # capabilities and information about the device
38 'empire' => '1.3.6.1.4.1.546',
40 'sysedge_opmode' => '1.3.6.1.4.1.546.1.1.1.17.0',
41 'empireSystemType' => '1.3.6.1.4.1.546.1.1.1.12.0',
44 'empireCpuStatsTable' => '1.3.6.1.4.1.546.13.1.1',
45 'empireCpuStatsIndex' => '1.3.6.1.4.1.546.13.1.1.1',
46 'empireCpuStatsDescr' => '1.3.6.1.4.1.546.13.1.1.2',
49 'empireCpuTotalWait' => '1.3.6.1.4.1.546.13.5.0',
51 # Empire Swap Counters
52 'empireNumPageSwapIns' => '1.3.6.1.4.1.546.1.1.7.8.18.0',
55 'empireLoadAverage' => '1.3.6.1.4.1.546.1.1.7.8.26.0',
57 # Empire Device Table and Oids
58 'empireDevTable' => '1.3.6.1.4.1.546.1.1.1.7.1',
59 'empireDevIndex' => '1.3.6.1.4.1.546.1.1.1.7.1.1',
60 'empireDevMntPt' => '1.3.6.1.4.1.546.1.1.1.7.1.3',
61 'empireDevBsize' => '1.3.6.1.4.1.546.1.1.1.7.1.4',
62 'empireDevTblks' => '1.3.6.1.4.1.546.1.1.1.7.1.5',
63 'empireDevType' => '1.3.6.1.4.1.546.1.1.1.7.1.10',
64 'empireDevDevice' => '1.3.6.1.4.1.546.1.1.1.7.1.2',
66 # Empire Device Stats Table and Oids
67 'empireDiskStatsTable' => '1.3.6.1.4.1.546.12.1.1',
68 'empireDiskStatsIndex' => '1.3.6.1.4.1.546.12.1.1.1',
69 'empireDiskStatsHostIndex' => '1.3.6.1.4.1.546.12.1.1.9',
70 'hrDeviceDescr' => '1.3.6.1.2.1.25.3.2.1.3',
72 # Empire Performance and related oids
73 'empirePerformance' => '1.3.6.1.4.1.546.1.1.7',
74 'empireNumTraps' => '1.3.6.1.4.1.546.1.1.7.8.15.0',
76 # Empire Process Stats
77 'empireRunq' => '1.3.6.1.4.1.546.1.1.7.8.4.0',
78 'empireDiskWait' => '1.3.6.1.4.1.546.1.1.7.8.5.0',
79 'empirePageWait' => '1.3.6.1.4.1.546.1.1.7.8.6.0',
80 'empireSwapActive' => '1.3.6.1.4.1.546.1.1.7.8.7.0',
81 'empireSleepActive' => '1.3.6.1.4.1.546.1.1.7.8.8.0',
83 # Empire Extensions NTREGPERF
84 'empireNTREGPERF' => '1.3.6.1.4.1.546.5.7',
86 'empireDnlc' => '1.3.6.1.4.1.546.1.1.11',
87 'empireRpc' => '1.3.6.1.4.1.546.8.1',
88 'empireNfs' => '1.3.6.1.4.1.546.8.2',
89 'empireMon' => '1.3.6.1.4.1.546.6.1.1',
90 'empirePmon' => '1.3.6.1.4.1.546.15.1.1',
91 'empireLog' => '1.3.6.1.4.1.546.11.1.1',
94 our %storageDescTranslate = ( '/' => {'subtree' => 'root' } );
96 # template => 1 if specific templates for the name explicitly exist,
97 # othewise the template used is based on ident
99 # Generally only hosts that have been directly observed should have
100 # templates, the "unix" and "nt" templates are generally aiming for the
101 # lowest common denominator.
103 # templates also need to be added to devdiscover-config.pl
105 # Templated "names" require a specific template for each of the
106 # following base template types:
107 # <template name="empire-swap-counters-NAME">
108 # <template name="empire-counters-NAME">
109 # <template name="empire-total-cpu-NAME">
110 # <template name="empire-total-cpu-raw-NAME">
111 # <template name="empire-cpu-NAME">
112 # <template name="empire-cpu-raw-NAME">
113 # <template name="empire-disk-stats-NAME">
116 # <template name="empire-swap-counters-solarisSparc">
117 # <template name="empire-counters-solarisSparc">
118 # <template name="empire-total-cpu-solarisSparc">
119 # <template name="empire-total-cpu-raw-solarisSparc">
120 # <template name="empire-cpu-solarisSparc">
121 # <template name="empire-cpu-raw-solarisSparc">
122 # <template name="empire-disk-stats-solarisSparc">
128 1 => { 'name' => 'unknown', 'ident' => 'unknown', 'template' => 0, },
129 2 => { 'name' => 'solarisSparc', 'ident' => 'unix', 'template' => 1, },
130 3 => { 'name' => 'solarisIntel', 'ident' => 'unix', 'template' => 0, },
131 4 => { 'name' => 'solarisPPC', 'ident' => 'unix', 'template' => 0, },
132 5 => { 'name' => 'sunosSparc', 'ident' => 'unix', 'template' => 0, },
133 6 => { 'name' => 'hpux9Parisc', 'ident' => 'unix', 'template' => 0, },
134 7 => { 'name' => 'hpux10Parisc', 'ident' => 'unix', 'template' => 0, },
135 8 => { 'name' => 'nt351Intel', 'ident' => 'nt', 'template' => 0, },
136 9 => { 'name' => 'nt351Alpha', 'ident' => 'nt', 'template' => 0, },
137 10 => { 'name' => 'nt40Intel', 'ident' => 'nt', 'template' => 1, },
138 11 => { 'name' => 'nt40Alpha', 'ident' => 'nt', 'template' => 0, },
139 12 => { 'name' => 'irix62Mips', 'ident' => 'unix', 'template' => 0, },
140 13 => { 'name' => 'irix63Mips', 'ident' => 'unix', 'template' => 0, },
141 14 => { 'name' => 'irix64Mips', 'ident' => 'unix', 'template' => 0, },
142 15 => { 'name' => 'aix41RS6000', 'ident' => 'unix', 'template' => 0, },
143 16 => { 'name' => 'aix42RS6000', 'ident' => 'unix', 'template' => 0, },
144 17 => { 'name' => 'aix43RS6000', 'ident' => 'unix', 'template' => 0, },
145 18 => { 'name' => 'irix65Mips', 'ident' => 'unix', 'template' => 0, },
146 19 => { 'name' => 'digitalUNIX', 'ident' => 'unix', 'template' => 0, },
147 20 => { 'name' => 'linuxIntel', 'ident' => 'unix', 'template' => 1, },
148 21 => { 'name' => 'hpux11Parisc', 'ident' => 'unix', 'template' => 0, },
149 22 => { 'name' => 'nt50Intel', 'ident' => 'nt', 'template' => 1, },
150 23 => { 'name' => 'nt50Alpha', 'ident' => 'nt', 'template' => 0, },
151 25 => { 'name' => 'aix5RS6000', 'ident' => 'unix', 'template' => 1, },
152 26 => { 'name' => 'nt52Intel', 'ident' => 'nt', 'template' => 0, },
155 # Solaris Virtual Interface Filtering
156 our $interfaceFilter;
157 my %solarisVirtualInterfaceFilter;
159 %solarisVirtualInterfaceFilter = (
160 'Virtual Interface (iana 62)' => {
161 'ifType' => 62, # Obsoleted
162 'ifDescr' => '^\w+:\d+$', # Virtual Interface in the form xxx:1
166 'Virtual Interface' => {
168 'ifDescr' => '^\w+:\d+$', # Virtual Interface in the form xxx:1
173 our $storageGraphTop;
181 my $devdetails = shift;
183 my $session = $dd->session();
184 my $data = $devdetails->data();
186 my $session = $dd->session();
188 if( not $dd->checkSnmpTable( 'empire' ) )
193 my $result = $dd->retrieveSnmpOIDs( 'sysedge_opmode',
194 'empireSystemType' );
195 if( $result->{'sysedge_opmode'} == 2 )
197 Error("Sysedge Agent NOT Licensed");
198 $devdetails->setCap('SysedgeNotLicensed');
201 # Empire OS Type (Needed here for interface filtering)
203 my $empireOsType = $result->{'empireSystemType'};
204 if( defined($empireOsType) and $empireOsType > 0 )
206 $devdetails->setCap('EmpireSystemedge::' .
207 $osTranslate{$empireOsType}{ident} );
209 $devdetails->{'os_ident'} = $osTranslate{$empireOsType}{ident};
212 $devdetails->setCap('EmpireSystemedge::' .
213 $osTranslate{$empireOsType}{name} );
215 $devdetails->{'os_name'} = $osTranslate{$empireOsType}{name};
217 $devdetails->{'os_name_template'} =
218 $osTranslate{$empireOsType}{template};
221 # Exclude Virtual Interfaces on Solaris
222 if( $devdetails->{'os_name'} =~ /solaris/i ) {
224 $interfaceFilter = \%solarisVirtualInterfaceFilter;
225 &Torrus::DevDiscover::RFC2863_IF_MIB::addInterfaceFilter
226 ($devdetails, $interfaceFilter);
236 my $devdetails = shift;
238 my $data = $devdetails->data();
239 my $session = $dd->session();
242 if( $dd->checkSnmpOID('empireCpuTotalWait') )
244 $devdetails->setCap('EmpireSystemedge::CpuTotal::Wait');
247 # Empire Dev Stats Table
249 my $empireDiskStatsTable =
250 $session->get_table( -baseoid =>
251 $dd->oiddef('empireDiskStatsTable') );
253 my $hrDeviceDescr = $session->get_table( -baseoid =>
254 $dd->oiddef('hrDeviceDescr') );
256 if( defined($empireDiskStatsTable) and defined($hrDeviceDescr) )
258 $devdetails->setCap('EmpireSystemedge::DiskStats');
259 $devdetails->storeSnmpVars( $empireDiskStatsTable );
260 $devdetails->storeSnmpVars( $hrDeviceDescr );
262 my $ref= {'indices' => []};
263 $data->{'empireDiskStats'} = $ref;
267 getSnmpIndices( $dd->oiddef('empireDiskStatsIndex') ) )
269 next if( $INDEX < 1 );
272 $devdetails->snmpVar( $dd->oiddef('empireDiskStatsHostIndex') .
275 next if( $hrindex < 1 );
277 push( @{ $ref->{'indices'} }, $INDEX );
279 my $descr = $devdetails->snmpVar($dd->oiddef('hrDeviceDescr') .
282 my $ref = { 'param' => {}, 'templates' => [] };
283 $data->{'empireDiskStats'}{$INDEX} = $ref;
284 my $param = $ref->{'param'};
287 $param->{'comment'} = $descr;
289 $param->{'HRINDEX'} = $hrindex;
291 if ( not defined $descr )
293 $descr = "Index $hrindex";
295 $param->{'disk-stats-description'} = $descr;
299 $param->{'disk-stats-nick'} = $descr;
302 } # end empireDiskStatsTable
306 my $empireDevTable = $session->get_table( -baseoid =>
307 $dd->oiddef('empireDevTable') );
309 if( defined( $empireDevTable ) )
312 $devdetails->setCap('EmpireSystemedge::Devices');
313 $devdetails->storeSnmpVars( $empireDevTable );
316 $data->{'empireDev'} = $ref;
319 ( $devdetails->getSnmpIndices($dd->oiddef('empireDevIndex') ) )
321 next if( $INDEX < 1 );
324 my $type = $devdetails->snmpVar( $dd->oiddef('empireDevType') .
327 my $descr = $devdetails->snmpVar($dd->oiddef('empireDevMntPt') .
330 my $bsize = $devdetails->snmpVar($dd->oiddef('empireDevBsize') .
333 # NFS has a block size of 0, it will be skipped
334 if( $bsize and defined( $descr ) )
336 push( @{ $data->{'empireDev'}->{'indices'} }, $INDEX);
338 my $ref = { 'param' => {}, 'templates' => [] };
339 $data->{'empireDev'}{$INDEX} = $ref;
340 my $param = $ref->{'param'};
342 $param->{'storage-description'} = $descr;
343 $param->{'storage-device'} =
344 $devdetails->snmpVar($dd->oiddef('empireDevDevice')
348 if( $descr =~ /^\// )
350 $comment .= ' (' . $descr . ')';
352 $param->{'comment'} = $comment;
354 if( $storageDescTranslate{$descr}{'subtree'} )
356 $descr = $storageDescTranslate{$descr}{'subtree'};
360 $param->{'storage-nick'} = $descr;
364 $param->{'collector-scale'} = sprintf('%d,*', $units);
368 ($dd->oiddef('empireDevTblks') . '.' . $INDEX);
372 if( $storageGraphTop > 0 )
374 $param->{'graph-upper-limit'} =
376 $units * $size * $storageGraphTop / 100 );
379 if( $storageHiMark > 0 )
381 $param->{'upper-limit'} =
383 $units * $size * $storageHiMark / 100 );
390 $devdetails->clearCap( 'hrStorage' );
392 } # end empireDevTable
395 # Empire Per - Cpu Table
397 my $empireCpuStatsTable =
398 $session->get_table( -baseoid =>
399 $dd->oiddef('empireCpuStatsTable') );
401 if( defined( $empireCpuStatsTable ) )
403 $devdetails->setCap('EmpireSystemedge::CpuStats');
404 $devdetails->storeSnmpVars( $empireCpuStatsTable );
407 $data->{'empireCpuStats'} = $ref;
411 getSnmpIndices( $dd->oiddef('empireCpuStatsIndex') ) )
413 next if( $INDEX < 1 );
415 push( @{ $ref->{'indices'} }, $INDEX);
418 $devdetails->snmpVar( $dd->oiddef('empireCpuStatsDescr') .
421 my $ref = { 'param' => {}, 'templates' => [] };
422 $data->{'empireCpuStats'}{$INDEX} = $ref;
423 my $param = $ref->{'param'};
425 $param->{'cpu'} = 'CPU' . $INDEX;
426 $param->{'descr'} = $descr;
427 $param->{'INDEX'} = $INDEX;
428 $param->{'comment'} = $descr . ' (' . 'CPU ' . $INDEX . ')';
432 # Empire Load Average
434 if( $dd->checkSnmpOID('empireLoadAverage') )
436 $devdetails->setCap('EmpireSystemedge::LoadAverage');
439 # Empire Swap Counters
441 if( $dd->checkSnmpOID('empireNumPageSwapIns') )
443 $devdetails->setCap('EmpireSystemedge::SwapCounters');
446 # Empire Counter Traps
448 if( $dd->checkSnmpOID('empireNumTraps') )
450 $devdetails->setCap('EmpireSystemedge::CounterTraps');
455 my $empirePerformance =
456 $session->get_table( -baseoid => $dd->oiddef('empirePerformance') );
458 if( defined( $empirePerformance ) )
460 $devdetails->setCap('EmpireSystemedge::Performance');
461 $devdetails->storeSnmpVars( $empirePerformance );
463 if( defined $devdetails->snmpVar($dd->oiddef('empireRunq') ) )
465 $devdetails->setCap('EmpireSystemedge::RunQ');
468 if( defined $devdetails->snmpVar($dd->oiddef('empireDiskWait') ) )
470 $devdetails->setCap('EmpireSystemedge::DiskWait');
473 if( defined $devdetails->snmpVar($dd->oiddef('empirePageWait') ) )
475 $devdetails->setCap('EmpireSystemedge::PageWait');
478 if( defined $devdetails->snmpVar($dd->oiddef('empireSwapActive') ) )
480 $devdetails->setCap('EmpireSystemedge::SwapActive');
483 if( defined $devdetails->snmpVar($dd->oiddef('empireSleepActive') ) )
485 $devdetails->setCap('EmpireSystemedge::SleepActive');
489 my $empireNTREGPERF =
490 $session->get_table( -baseoid => $dd->oiddef('empireNTREGPERF') );
491 if( defined $empireNTREGPERF )
493 $devdetails->setCap('empireNTREGPERF');
494 $devdetails->storeSnmpVars( $empireNTREGPERF );
497 $data->{'empireNTREGPERF'} = $ref;
499 ( $devdetails->getSnmpIndices($dd->oiddef('empireNTREGPERF') ) )
501 # This is all configured on a per site basis.
502 # The xml will be site specific
503 push( @{ $ref->{'indices'} }, $INDEX);
505 $Torrus::ConfigBuilder::templateRegistry->
506 {'EmpireSystemedge::NTREGPERF_' . $INDEX} = $template;
507 $template->{'name'}='EmpireSystemedge::NTREGPERF_' . $INDEX;
508 $template->{'source'}='vendor/empire.systemedge.ntregperf.xml';
513 #NOT CONFIGURED## Empire DNLC
514 #NOT CONFIGURED# my $empireDnlc = $session->get_table( -baseoid =>
515 #NOT CONFIGURED# $dd->oiddef('empireDnlc') );
516 #NOT CONFIGURED# if( defined $empirePerformance )
518 #NOT CONFIGURED# # don't do this until we use the data
519 #NOT CONFIGURED# #$devdetails->setCap('empirednlc');
520 #NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireDnlc );
523 #NOT CONFIGURED## Empire RPC
524 #NOT CONFIGURED# my $empireRpc = $session->get_table( -baseoid =>
525 #NOT CONFIGURED# $dd->oiddef('empireRpc') );
526 #NOT CONFIGURED# if( defined $empireRpc )
528 #NOT CONFIGURED# # don't do this until we use the data
529 #NOT CONFIGURED# #$devdetails->setCap('empirerpc');
530 #NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireRpc );
533 #NOT CONFIGURED## Empire NFS
534 #NOT CONFIGURED# my $empireNfs = $session->get_table( -baseoid =>
535 #NOT CONFIGURED# $dd->oiddef('empireNfs') );
536 #NOT CONFIGURED# if( defined $empireRpc )
538 #NOT CONFIGURED# # don't do this until we use the data
539 #NOT CONFIGURED# #$devdetails->setCap('empirenfs');
540 #NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireNfs );
543 #NOT CONFIGURED## Empire Mon Entries
544 #NOT CONFIGURED# my $empireMon = $session->get_table( -baseoid =>
545 #NOT CONFIGURED# $dd->oiddef('empireMon') );
546 #NOT CONFIGURED# if( ref( $empireMon ) )
548 #NOT CONFIGURED# # don't do this until we use the data
549 #NOT CONFIGURED# #$devdetails->setCap('empiremon');
550 #NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireMon );
553 #NOT CONFIGURED## Empire Process Monitor Entries
554 #NOT CONFIGURED# my $empirePmon = $session->get_table( -baseoid =>
555 #NOT CONFIGURED# $dd->oiddef('empirePmon') );
556 #NOT CONFIGURED# if( ref( $empirePmon ) )
558 #NOT CONFIGURED# # don't do this until we use the data
559 #NOT CONFIGURED# #$devdetails->setCap('empirePmon');
560 #NOT CONFIGURED# #$devdetails->storeSnmpVars( $empirePmon );
563 #NOT CONFIGURED## Empire Log Monitor Entries
564 #NOT CONFIGURED# my $empireLog = $session->get_table( -baseoid =>
565 #NOT CONFIGURED# $dd->oiddef('empireLog') );
566 #NOT CONFIGURED# if( ref( $empireLog ) )
568 #NOT CONFIGURED# # don't do this until we use the data
569 #NOT CONFIGURED# #$devdetails->setCap('empireLog');
570 #NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireLog );
579 my $devdetails = shift;
582 my $data = $devdetails->data();
584 my $mononlyTree = "Mon_Only";
586 'precedence' => '-100000',
587 'comment' => 'Place to Stash Monitoring Data ',
591 my $monNode = $cb->addSubtree( $devNode, $mononlyTree, $monParam );
592 $cb->addTemplateApplication
593 ( $monNode, 'EmpireSystemedge::sysedge_opmode' );
595 if( $devdetails->hasCap('SysedgeNotLicensed') )
601 if( $devdetails->{'os_name_template'} )
603 $os_target = $devdetails->{'os_name'};
607 $os_target = $devdetails->{'os_ident'};
608 Warn("Using Generic OS Templates '$os_target' for os: "
609 . $devdetails->{'os_name'} );
612 my $subtreeName = "Storage";
615 'precedence' => '-1000',
616 'comment' => 'Storage Information',
619 my $StorageNode = $cb->addSubtree( $devNode, $subtreeName, $param );
621 # Empire Devices(Storage)
622 if( $devdetails->hasCap('EmpireSystemedge::Devices') )
624 my $subtreeName = "VolumeInfo";
627 'precedence' => '-1000',
628 'comment' => 'Physical/Logical Volume Information',
632 $cb->addSubtree( $StorageNode, $subtreeName, $param,
633 [ 'EmpireSystemedge::empire-device-subtree' ] );
635 foreach my $INDEX ( sort {$a<=>$b} @{$data->{'empireDev'}{'indices'}} )
637 my $ref = $data->{'empireDev'}{$INDEX};
639 # Display in index order
640 $ref->{'param'}->{'precedence'} = sprintf("%d", 2000 - $INDEX);
642 $cb->addSubtree( $subtreeNode, $ref->{'param'}{'storage-nick'},
644 [ 'EmpireSystemedge::empire-device' ] );
648 # Empire Device Stats
649 if( $devdetails->hasCap('EmpireSystemedge::DiskStats') )
651 my $subtreeName = "DiskInfo";
654 'precedence' => '-1000',
655 'comment' => 'Physical/Logical Disk Information',
659 $cb->addSubtree( $StorageNode, $subtreeName, $param,
660 ['EmpireSystemedge::empire-disk-stats-subtree']);
663 ( sort {$a<=>$b} @{$data->{'empireDiskStats'}{'indices'}} )
665 my $ref = $data->{'empireDiskStats'}{$INDEX};
666 # Display in index order
667 $ref->{'param'}->{'precedence'} = sprintf("%d", 1000 - $INDEX);
669 $cb->addSubtree( $subtreeNode, $ref->{'param'}{'disk-stats-nick'},
671 [ 'EmpireSystemedge::empire-disk-stats-' .
677 # Performance Subtree
678 my $subtreeName= "System_Performance";
681 'precedence' => '-900',
682 'comment' => 'System, CPU and memory statistics'
685 my @perfTemplates = ();
687 # Empire Load Average
688 if( $devdetails->hasCap('EmpireSystemedge::LoadAverage') )
690 push( @perfTemplates, 'EmpireSystemedge::empire-load' );
694 if( $devdetails->hasCap('EmpireSystemedge::Performance') )
696 push( @perfTemplates, 'EmpireSystemedge::empire-memory' );
699 push( @perfTemplates,
700 'EmpireSystemedge::empire-counters-' . $os_target,
701 'EmpireSystemedge::empire-swap-counters-' . $os_target,
702 'EmpireSystemedge::empire-total-cpu-' . $os_target,
703 'EmpireSystemedge::empire-total-cpu-raw-' . $os_target,
706 if( $devdetails->hasCap('EmpireSystemedge::RunQ') )
708 push( @perfTemplates, 'EmpireSystemedge::empire-runq' );
711 if( $devdetails->hasCap('EmpireSystemedge::DiskWait') )
713 push( @perfTemplates, 'EmpireSystemedge::empire-diskwait' );
716 if( $devdetails->hasCap('EmpireSystemedge::PageWait') )
718 push( @perfTemplates, 'EmpireSystemedge::empire-pagewait' );
721 if( $devdetails->hasCap('EmpireSystemedge::SwapActive') )
723 push( @perfTemplates, 'EmpireSystemedge::empire-swapactive' );
726 if( $devdetails->hasCap('EmpireSystemedge::SleepActive') )
728 push( @perfTemplates, 'EmpireSystemedge::empire-sleepactive' );
731 my $PerformanceNode = $cb->addSubtree( $devNode, $subtreeName,
732 $param, \@perfTemplates );
735 if( $devdetails->hasCap('EmpireSystemedge::CpuStats') )
737 my $ref = $data->{'empireCpuStats'};
739 my $subtreeName = "CpuStats";
742 'precedence' => '-1100',
743 'comment' => 'Per-CPU Statistics',
747 $cb->addSubtree( $PerformanceNode, $subtreeName, $param,
748 [ 'EmpireSystemedge::empire-cpu-subtree' ] );
751 ( sort {$a<=>$b} @{$data->{'empireCpuStats'}{'indices'} } )
753 my $ref = $data->{'empireCpuStats'}{$INDEX};
755 # Display in index order
756 $ref->{'param'}->{'precedence'} = sprintf("%d", 1000 - $INDEX);
759 ( $subtreeNode, $ref->{'param'}{'cpu'},
761 ['EmpireSystemedge::empire-cpu-' . $os_target,
762 'EmpireSystemedge::empire-cpu-raw-' . $os_target],
767 if( $devdetails->hasCap('empireNTREGPERF') )
770 my $ntregTree = "NT_REG_PERF";
772 'precedence' => '-10000',
773 'comment' => 'NT Reg Perf',
776 $cb->addSubtree( $devNode, $ntregTree, $ntregParam );
779 ( sort {$a<=>$b} @{$data->{'empireNTREGPERF'}{'indices'} } )
781 my $ref = $data->{'empireNTREGPERF'}{$INDEX};
782 $cb->addTemplateApplication
783 ( $ntregnode, 'EmpireSystemedge::NTREGPERF_' . $INDEX );
796 # indent-tabs-mode: nil
797 # perl-indent-level: 4