diff options
Diffstat (limited to 'torrus/perllib/Torrus/DevDiscover/EmpireSystemedge.pm')
-rw-r--r-- | torrus/perllib/Torrus/DevDiscover/EmpireSystemedge.pm | 798 |
1 files changed, 798 insertions, 0 deletions
diff --git a/torrus/perllib/Torrus/DevDiscover/EmpireSystemedge.pm b/torrus/perllib/Torrus/DevDiscover/EmpireSystemedge.pm new file mode 100644 index 000000000..f796920be --- /dev/null +++ b/torrus/perllib/Torrus/DevDiscover/EmpireSystemedge.pm @@ -0,0 +1,798 @@ +# Copyright (C) 2003 Shawn Ferry +# +# 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: EmpireSystemedge.pm,v 1.1 2010-12-27 00:03:55 ivan Exp $ +# Shawn Ferry <sferry at sevenspace dot com> <lalartu at obscure dot org> + +package Torrus::DevDiscover::EmpireSystemedge; + +use strict; +use Torrus::Log; + + +$Torrus::DevDiscover::registry{'EmpireSystemedge'} = { + 'sequence' => 500, + 'checkdevtype' => \&checkdevtype, + 'discover' => \&discover, + 'buildConfig' => \&buildConfig + }; + + +# define the oids that are needed to determine support, +# capabilities and information about the device +our %oiddef = + ( + 'empire' => '1.3.6.1.4.1.546', + + 'sysedge_opmode' => '1.3.6.1.4.1.546.1.1.1.17.0', + 'empireSystemType' => '1.3.6.1.4.1.546.1.1.1.12.0', + + # Empire Cpu Table + 'empireCpuStatsTable' => '1.3.6.1.4.1.546.13.1.1', + 'empireCpuStatsIndex' => '1.3.6.1.4.1.546.13.1.1.1', + 'empireCpuStatsDescr' => '1.3.6.1.4.1.546.13.1.1.2', + + # Empire Cpu Totals + 'empireCpuTotalWait' => '1.3.6.1.4.1.546.13.5.0', + + # Empire Swap Counters + 'empireNumPageSwapIns' => '1.3.6.1.4.1.546.1.1.7.8.18.0', + + # Empire Load Average + 'empireLoadAverage' => '1.3.6.1.4.1.546.1.1.7.8.26.0', + + # Empire Device Table and Oids + 'empireDevTable' => '1.3.6.1.4.1.546.1.1.1.7.1', + 'empireDevIndex' => '1.3.6.1.4.1.546.1.1.1.7.1.1', + 'empireDevMntPt' => '1.3.6.1.4.1.546.1.1.1.7.1.3', + 'empireDevBsize' => '1.3.6.1.4.1.546.1.1.1.7.1.4', + 'empireDevTblks' => '1.3.6.1.4.1.546.1.1.1.7.1.5', + 'empireDevType' => '1.3.6.1.4.1.546.1.1.1.7.1.10', + 'empireDevDevice' => '1.3.6.1.4.1.546.1.1.1.7.1.2', + + # Empire Device Stats Table and Oids + 'empireDiskStatsTable' => '1.3.6.1.4.1.546.12.1.1', + 'empireDiskStatsIndex' => '1.3.6.1.4.1.546.12.1.1.1', + 'empireDiskStatsHostIndex' => '1.3.6.1.4.1.546.12.1.1.9', + 'hrDeviceDescr' => '1.3.6.1.2.1.25.3.2.1.3', + + # Empire Performance and related oids + 'empirePerformance' => '1.3.6.1.4.1.546.1.1.7', + 'empireNumTraps' => '1.3.6.1.4.1.546.1.1.7.8.15.0', + + # Empire Process Stats + 'empireRunq' => '1.3.6.1.4.1.546.1.1.7.8.4.0', + 'empireDiskWait' => '1.3.6.1.4.1.546.1.1.7.8.5.0', + 'empirePageWait' => '1.3.6.1.4.1.546.1.1.7.8.6.0', + 'empireSwapActive' => '1.3.6.1.4.1.546.1.1.7.8.7.0', + 'empireSleepActive' => '1.3.6.1.4.1.546.1.1.7.8.8.0', + + # Empire Extensions NTREGPERF + 'empireNTREGPERF' => '1.3.6.1.4.1.546.5.7', + + 'empireDnlc' => '1.3.6.1.4.1.546.1.1.11', + 'empireRpc' => '1.3.6.1.4.1.546.8.1', + 'empireNfs' => '1.3.6.1.4.1.546.8.2', + 'empireMon' => '1.3.6.1.4.1.546.6.1.1', + 'empirePmon' => '1.3.6.1.4.1.546.15.1.1', + 'empireLog' => '1.3.6.1.4.1.546.11.1.1', + ); + +our %storageDescTranslate = ( '/' => {'subtree' => 'root' } ); + +# template => 1 if specific templates for the name explicitly exist, +# othewise the template used is based on ident +# +# Generally only hosts that have been directly observed should have +# templates, the "unix" and "nt" templates are generally aiming for the +# lowest common denominator. +# +# templates also need to be added to devdiscover-config.pl +# +# Templated "names" require a specific template for each of the +# following base template types: +# <template name="empire-swap-counters-NAME"> +# <template name="empire-counters-NAME"> +# <template name="empire-total-cpu-NAME"> +# <template name="empire-total-cpu-raw-NAME"> +# <template name="empire-cpu-NAME"> +# <template name="empire-cpu-raw-NAME"> +# <template name="empire-disk-stats-NAME"> +# +# i.e. +# <template name="empire-swap-counters-solarisSparc"> +# <template name="empire-counters-solarisSparc"> +# <template name="empire-total-cpu-solarisSparc"> +# <template name="empire-total-cpu-raw-solarisSparc"> +# <template name="empire-cpu-solarisSparc"> +# <template name="empire-cpu-raw-solarisSparc"> +# <template name="empire-disk-stats-solarisSparc"> +# + + +our %osTranslate = + ( + 1 => { 'name' => 'unknown', 'ident' => 'unknown', 'template' => 0, }, + 2 => { 'name' => 'solarisSparc', 'ident' => 'unix', 'template' => 1, }, + 3 => { 'name' => 'solarisIntel', 'ident' => 'unix', 'template' => 0, }, + 4 => { 'name' => 'solarisPPC', 'ident' => 'unix', 'template' => 0, }, + 5 => { 'name' => 'sunosSparc', 'ident' => 'unix', 'template' => 0, }, + 6 => { 'name' => 'hpux9Parisc', 'ident' => 'unix', 'template' => 0, }, + 7 => { 'name' => 'hpux10Parisc', 'ident' => 'unix', 'template' => 0, }, + 8 => { 'name' => 'nt351Intel', 'ident' => 'nt', 'template' => 0, }, + 9 => { 'name' => 'nt351Alpha', 'ident' => 'nt', 'template' => 0, }, + 10 => { 'name' => 'nt40Intel', 'ident' => 'nt', 'template' => 1, }, + 11 => { 'name' => 'nt40Alpha', 'ident' => 'nt', 'template' => 0, }, + 12 => { 'name' => 'irix62Mips', 'ident' => 'unix', 'template' => 0, }, + 13 => { 'name' => 'irix63Mips', 'ident' => 'unix', 'template' => 0, }, + 14 => { 'name' => 'irix64Mips', 'ident' => 'unix', 'template' => 0, }, + 15 => { 'name' => 'aix41RS6000', 'ident' => 'unix', 'template' => 0, }, + 16 => { 'name' => 'aix42RS6000', 'ident' => 'unix', 'template' => 0, }, + 17 => { 'name' => 'aix43RS6000', 'ident' => 'unix', 'template' => 0, }, + 18 => { 'name' => 'irix65Mips', 'ident' => 'unix', 'template' => 0, }, + 19 => { 'name' => 'digitalUNIX', 'ident' => 'unix', 'template' => 0, }, + 20 => { 'name' => 'linuxIntel', 'ident' => 'unix', 'template' => 1, }, + 21 => { 'name' => 'hpux11Parisc', 'ident' => 'unix', 'template' => 0, }, + 22 => { 'name' => 'nt50Intel', 'ident' => 'nt', 'template' => 1, }, + 23 => { 'name' => 'nt50Alpha', 'ident' => 'nt', 'template' => 0, }, + 25 => { 'name' => 'aix5RS6000', 'ident' => 'unix', 'template' => 1, }, + 26 => { 'name' => 'nt52Intel', 'ident' => 'nt', 'template' => 0, }, + ); + +# Solaris Virtual Interface Filtering +our $interfaceFilter; +my %solarisVirtualInterfaceFilter; + +%solarisVirtualInterfaceFilter = ( + 'Virtual Interface (iana 62)' => { + 'ifType' => 62, # Obsoleted + 'ifDescr' => '^\w+:\d+$', # Virtual Interface in the form xxx:1 + # e.g. eri:1 eri1:2 + }, + + 'Virtual Interface' => { + 'ifType' => 6, + 'ifDescr' => '^\w+:\d+$', # Virtual Interface in the form xxx:1 + # e.g. eri:1 eri1:2 + }, + ); + +our $storageGraphTop; +our $storageHiMark; +our $shortTemplate; +our $longTemplate; + +sub checkdevtype +{ + my $dd = shift; + my $devdetails = shift; + + my $session = $dd->session(); + my $data = $devdetails->data(); + + my $session = $dd->session(); + + if( not $dd->checkSnmpTable( 'empire' ) ) + { + return 0; + } + + my $result = $dd->retrieveSnmpOIDs( 'sysedge_opmode', + 'empireSystemType' ); + if( $result->{'sysedge_opmode'} == 2 ) + { + Error("Sysedge Agent NOT Licensed"); + $devdetails->setCap('SysedgeNotLicensed'); + } + + # Empire OS Type (Needed here for interface filtering) + + my $empireOsType = $result->{'empireSystemType'}; + if( defined($empireOsType) and $empireOsType > 0 ) + { + $devdetails->setCap('EmpireSystemedge::' . + $osTranslate{$empireOsType}{ident} ); + + $devdetails->{'os_ident'} = $osTranslate{$empireOsType}{ident}; + + + $devdetails->setCap('EmpireSystemedge::' . + $osTranslate{$empireOsType}{name} ); + + $devdetails->{'os_name'} = $osTranslate{$empireOsType}{name}; + + $devdetails->{'os_name_template'} = + $osTranslate{$empireOsType}{template}; + } + + # Exclude Virtual Interfaces on Solaris + if( $devdetails->{'os_name'} =~ /solaris/i ) { + + $interfaceFilter = \%solarisVirtualInterfaceFilter; + &Torrus::DevDiscover::RFC2863_IF_MIB::addInterfaceFilter + ($devdetails, $interfaceFilter); + } + + return 1; +} + + +sub discover +{ + my $dd = shift; + my $devdetails = shift; + + my $data = $devdetails->data(); + my $session = $dd->session(); + + + if( $dd->checkSnmpOID('empireCpuTotalWait') ) + { + $devdetails->setCap('EmpireSystemedge::CpuTotal::Wait'); + } + + # Empire Dev Stats Table + + my $empireDiskStatsTable = + $session->get_table( -baseoid => + $dd->oiddef('empireDiskStatsTable') ); + + my $hrDeviceDescr = $session->get_table( -baseoid => + $dd->oiddef('hrDeviceDescr') ); + + if( defined($empireDiskStatsTable) and defined($hrDeviceDescr) ) + { + $devdetails->setCap('EmpireSystemedge::DiskStats'); + $devdetails->storeSnmpVars( $empireDiskStatsTable ); + $devdetails->storeSnmpVars( $hrDeviceDescr ); + + my $ref= {'indices' => []}; + $data->{'empireDiskStats'} = $ref; + + foreach my $INDEX + ( $devdetails-> + getSnmpIndices( $dd->oiddef('empireDiskStatsIndex') ) ) + { + next if( $INDEX < 1 ); + + my $hrindex = + $devdetails->snmpVar( $dd->oiddef('empireDiskStatsHostIndex') . + '.' . $INDEX ); + + next if( $hrindex < 1 ); + + push( @{ $ref->{'indices'} }, $INDEX ); + + my $descr = $devdetails->snmpVar($dd->oiddef('hrDeviceDescr') . + '.' . $hrindex ); + + my $ref = { 'param' => {}, 'templates' => [] }; + $data->{'empireDiskStats'}{$INDEX} = $ref; + my $param = $ref->{'param'}; + + + $param->{'comment'} = $descr; + + $param->{'HRINDEX'} = $hrindex; + + if ( not defined $descr ) + { + $descr = "Index $hrindex"; + } + $param->{'disk-stats-description'} = $descr; + + $descr =~ s/^\///; + $descr =~ s/\W/_/g; + $param->{'disk-stats-nick'} = $descr; + + } + } # end empireDiskStatsTable + + # Empire Dev Table + + my $empireDevTable = $session->get_table( -baseoid => + $dd->oiddef('empireDevTable') ); + + if( defined( $empireDevTable ) ) + { + + $devdetails->setCap('EmpireSystemedge::Devices'); + $devdetails->storeSnmpVars( $empireDevTable ); + + my $ref= {}; + $data->{'empireDev'} = $ref; + + foreach my $INDEX + ( $devdetails->getSnmpIndices($dd->oiddef('empireDevIndex') ) ) + { + next if( $INDEX < 1 ); + + + my $type = $devdetails->snmpVar( $dd->oiddef('empireDevType') . + '.' . $INDEX ); + + my $descr = $devdetails->snmpVar($dd->oiddef('empireDevMntPt') . + '.' . $INDEX ); + + my $bsize = $devdetails->snmpVar($dd->oiddef('empireDevBsize') . + '.' . $INDEX ); + + # NFS has a block size of 0, it will be skipped + if( $bsize and defined( $descr ) ) + { + push( @{ $data->{'empireDev'}->{'indices'} }, $INDEX); + + my $ref = { 'param' => {}, 'templates' => [] }; + $data->{'empireDev'}{$INDEX} = $ref; + my $param = $ref->{'param'}; + + $param->{'storage-description'} = $descr; + $param->{'storage-device'} = + $devdetails->snmpVar($dd->oiddef('empireDevDevice') + . '.' . $INDEX ); + + my $comment = $type; + if( $descr =~ /^\// ) + { + $comment .= ' (' . $descr . ')'; + } + $param->{'comment'} = $comment; + + if( $storageDescTranslate{$descr}{'subtree'} ) + { + $descr = $storageDescTranslate{$descr}{'subtree'}; + } + $descr =~ s/^\///; + $descr =~ s/\W/_/g; + $param->{'storage-nick'} = $descr; + + my $units = $bsize; + + $param->{'collector-scale'} = sprintf('%d,*', $units); + + my $size = + $devdetails->snmpVar + ($dd->oiddef('empireDevTblks') . '.' . $INDEX); + + if( $size ) + { + if( $storageGraphTop > 0 ) + { + $param->{'graph-upper-limit'} = + sprintf('%e', + $units * $size * $storageGraphTop / 100 ); + } + + if( $storageHiMark > 0 ) + { + $param->{'upper-limit'} = + sprintf('%e', + $units * $size * $storageHiMark / 100 ); + } + } + + } + } + + $devdetails->clearCap( 'hrStorage' ); + + } # end empireDevTable + + + # Empire Per - Cpu Table + + my $empireCpuStatsTable = + $session->get_table( -baseoid => + $dd->oiddef('empireCpuStatsTable') ); + + if( defined( $empireCpuStatsTable ) ) + { + $devdetails->setCap('EmpireSystemedge::CpuStats'); + $devdetails->storeSnmpVars( $empireCpuStatsTable ); + + my $ref= {}; + $data->{'empireCpuStats'} = $ref; + + foreach my $INDEX + ( $devdetails-> + getSnmpIndices( $dd->oiddef('empireCpuStatsIndex') ) ) + { + next if( $INDEX < 1 ); + + push( @{ $ref->{'indices'} }, $INDEX); + + my $descr = + $devdetails->snmpVar( $dd->oiddef('empireCpuStatsDescr') . + '.' . $INDEX ); + + my $ref = { 'param' => {}, 'templates' => [] }; + $data->{'empireCpuStats'}{$INDEX} = $ref; + my $param = $ref->{'param'}; + + $param->{'cpu'} = 'CPU' . $INDEX; + $param->{'descr'} = $descr; + $param->{'INDEX'} = $INDEX; + $param->{'comment'} = $descr . ' (' . 'CPU ' . $INDEX . ')'; + } + } + + # Empire Load Average + + if( $dd->checkSnmpOID('empireLoadAverage') ) + { + $devdetails->setCap('EmpireSystemedge::LoadAverage'); + } + + # Empire Swap Counters + + if( $dd->checkSnmpOID('empireNumPageSwapIns') ) + { + $devdetails->setCap('EmpireSystemedge::SwapCounters'); + } + + # Empire Counter Traps + + if( $dd->checkSnmpOID('empireNumTraps') ) + { + $devdetails->setCap('EmpireSystemedge::CounterTraps'); + } + + # Empire Performance + + my $empirePerformance = + $session->get_table( -baseoid => $dd->oiddef('empirePerformance') ); + + if( defined( $empirePerformance ) ) + { + $devdetails->setCap('EmpireSystemedge::Performance'); + $devdetails->storeSnmpVars( $empirePerformance ); + + if( defined $devdetails->snmpVar($dd->oiddef('empireRunq') ) ) + { + $devdetails->setCap('EmpireSystemedge::RunQ'); + } + + if( defined $devdetails->snmpVar($dd->oiddef('empireDiskWait') ) ) + { + $devdetails->setCap('EmpireSystemedge::DiskWait'); + } + + if( defined $devdetails->snmpVar($dd->oiddef('empirePageWait') ) ) + { + $devdetails->setCap('EmpireSystemedge::PageWait'); + } + + if( defined $devdetails->snmpVar($dd->oiddef('empireSwapActive') ) ) + { + $devdetails->setCap('EmpireSystemedge::SwapActive'); + } + + if( defined $devdetails->snmpVar($dd->oiddef('empireSleepActive') ) ) + { + $devdetails->setCap('EmpireSystemedge::SleepActive'); + } + } + + my $empireNTREGPERF = + $session->get_table( -baseoid => $dd->oiddef('empireNTREGPERF') ); + if( defined $empireNTREGPERF ) + { + $devdetails->setCap('empireNTREGPERF'); + $devdetails->storeSnmpVars( $empireNTREGPERF ); + + my $ref = {}; + $data->{'empireNTREGPERF'} = $ref; + foreach my $INDEX + ( $devdetails->getSnmpIndices($dd->oiddef('empireNTREGPERF') ) ) + { + # This is all configured on a per site basis. + # The xml will be site specific + push( @{ $ref->{'indices'} }, $INDEX); + my $template = {}; + $Torrus::ConfigBuilder::templateRegistry-> + {'EmpireSystemedge::NTREGPERF_' . $INDEX} = $template; + $template->{'name'}='EmpireSystemedge::NTREGPERF_' . $INDEX; + $template->{'source'}='vendor/empire.systemedge.ntregperf.xml'; + + } + } + +#NOT CONFIGURED## Empire DNLC +#NOT CONFIGURED# my $empireDnlc = $session->get_table( -baseoid => +#NOT CONFIGURED# $dd->oiddef('empireDnlc') ); +#NOT CONFIGURED# if( defined $empirePerformance ) +#NOT CONFIGURED# { +#NOT CONFIGURED# # don't do this until we use the data +#NOT CONFIGURED# #$devdetails->setCap('empirednlc'); +#NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireDnlc ); +#NOT CONFIGURED# } +#NOT CONFIGURED# +#NOT CONFIGURED## Empire RPC +#NOT CONFIGURED# my $empireRpc = $session->get_table( -baseoid => +#NOT CONFIGURED# $dd->oiddef('empireRpc') ); +#NOT CONFIGURED# if( defined $empireRpc ) +#NOT CONFIGURED# { +#NOT CONFIGURED# # don't do this until we use the data +#NOT CONFIGURED# #$devdetails->setCap('empirerpc'); +#NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireRpc ); +#NOT CONFIGURED# } +#NOT CONFIGURED# +#NOT CONFIGURED## Empire NFS +#NOT CONFIGURED# my $empireNfs = $session->get_table( -baseoid => +#NOT CONFIGURED# $dd->oiddef('empireNfs') ); +#NOT CONFIGURED# if( defined $empireRpc ) +#NOT CONFIGURED# { +#NOT CONFIGURED# # don't do this until we use the data +#NOT CONFIGURED# #$devdetails->setCap('empirenfs'); +#NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireNfs ); +#NOT CONFIGURED# } +#NOT CONFIGURED# +#NOT CONFIGURED## Empire Mon Entries +#NOT CONFIGURED# my $empireMon = $session->get_table( -baseoid => +#NOT CONFIGURED# $dd->oiddef('empireMon') ); +#NOT CONFIGURED# if( ref( $empireMon ) ) +#NOT CONFIGURED# { +#NOT CONFIGURED# # don't do this until we use the data +#NOT CONFIGURED# #$devdetails->setCap('empiremon'); +#NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireMon ); +#NOT CONFIGURED# } +#NOT CONFIGURED# +#NOT CONFIGURED## Empire Process Monitor Entries +#NOT CONFIGURED# my $empirePmon = $session->get_table( -baseoid => +#NOT CONFIGURED# $dd->oiddef('empirePmon') ); +#NOT CONFIGURED# if( ref( $empirePmon ) ) +#NOT CONFIGURED# { +#NOT CONFIGURED# # don't do this until we use the data +#NOT CONFIGURED# #$devdetails->setCap('empirePmon'); +#NOT CONFIGURED# #$devdetails->storeSnmpVars( $empirePmon ); +#NOT CONFIGURED# } +#NOT CONFIGURED# +#NOT CONFIGURED## Empire Log Monitor Entries +#NOT CONFIGURED# my $empireLog = $session->get_table( -baseoid => +#NOT CONFIGURED# $dd->oiddef('empireLog') ); +#NOT CONFIGURED# if( ref( $empireLog ) ) +#NOT CONFIGURED# { +#NOT CONFIGURED# # don't do this until we use the data +#NOT CONFIGURED# #$devdetails->setCap('empireLog'); +#NOT CONFIGURED# #$devdetails->storeSnmpVars( $empireLog ); +#NOT CONFIGURED# } + + return 1; +} + + +sub buildConfig +{ + my $devdetails = shift; + my $cb = shift; + my $devNode = shift; + my $data = $devdetails->data(); + + my $mononlyTree = "Mon_Only"; + my $monParam = { + 'precedence' => '-100000', + 'comment' => 'Place to Stash Monitoring Data ', + 'hidden' => 'yes', + }; + + my $monNode = $cb->addSubtree( $devNode, $mononlyTree, $monParam ); + $cb->addTemplateApplication + ( $monNode, 'EmpireSystemedge::sysedge_opmode' ); + + if( $devdetails->hasCap('SysedgeNotLicensed') ) + { + return 1; + } + + my $os_target; + if( $devdetails->{'os_name_template'} ) + { + $os_target = $devdetails->{'os_name'}; + } + else + { + $os_target = $devdetails->{'os_ident'}; + Warn("Using Generic OS Templates '$os_target' for os: " + . $devdetails->{'os_name'} ); + } + + my $subtreeName = "Storage"; + + my $param = { + 'precedence' => '-1000', + 'comment' => 'Storage Information', + }; + + my $StorageNode = $cb->addSubtree( $devNode, $subtreeName, $param ); + + # Empire Devices(Storage) + if( $devdetails->hasCap('EmpireSystemedge::Devices') ) + { + my $subtreeName = "VolumeInfo"; + + my $param = { + 'precedence' => '-1000', + 'comment' => 'Physical/Logical Volume Information', + }; + + my $subtreeNode = + $cb->addSubtree( $StorageNode, $subtreeName, $param, + [ 'EmpireSystemedge::empire-device-subtree' ] ); + + foreach my $INDEX ( sort {$a<=>$b} @{$data->{'empireDev'}{'indices'}} ) + { + my $ref = $data->{'empireDev'}{$INDEX}; + + # Display in index order + $ref->{'param'}->{'precedence'} = sprintf("%d", 2000 - $INDEX); + + $cb->addSubtree( $subtreeNode, $ref->{'param'}{'storage-nick'}, + $ref->{'param'}, + [ 'EmpireSystemedge::empire-device' ] ); + } + } + + # Empire Device Stats + if( $devdetails->hasCap('EmpireSystemedge::DiskStats') ) + { + my $subtreeName = "DiskInfo"; + + my $param = { + 'precedence' => '-1000', + 'comment' => 'Physical/Logical Disk Information', + }; + + my $subtreeNode = + $cb->addSubtree( $StorageNode, $subtreeName, $param, + ['EmpireSystemedge::empire-disk-stats-subtree']); + + foreach my $INDEX + ( sort {$a<=>$b} @{$data->{'empireDiskStats'}{'indices'}} ) + { + my $ref = $data->{'empireDiskStats'}{$INDEX}; + # Display in index order + $ref->{'param'}->{'precedence'} = sprintf("%d", 1000 - $INDEX); + + $cb->addSubtree( $subtreeNode, $ref->{'param'}{'disk-stats-nick'}, + $ref->{'param'}, + [ 'EmpireSystemedge::empire-disk-stats-' . + $os_target, ] ); + } + } + + + # Performance Subtree + my $subtreeName= "System_Performance"; + + my $param = { + 'precedence' => '-900', + 'comment' => 'System, CPU and memory statistics' + }; + + my @perfTemplates = (); + + # Empire Load Average + if( $devdetails->hasCap('EmpireSystemedge::LoadAverage') ) + { + push( @perfTemplates, 'EmpireSystemedge::empire-load' ); + } + + # Empire Performance + if( $devdetails->hasCap('EmpireSystemedge::Performance') ) + { + push( @perfTemplates, 'EmpireSystemedge::empire-memory' ); + } + + push( @perfTemplates, + 'EmpireSystemedge::empire-counters-' . $os_target, + 'EmpireSystemedge::empire-swap-counters-' . $os_target, + 'EmpireSystemedge::empire-total-cpu-' . $os_target, + 'EmpireSystemedge::empire-total-cpu-raw-' . $os_target, + ); + + if( $devdetails->hasCap('EmpireSystemedge::RunQ') ) + { + push( @perfTemplates, 'EmpireSystemedge::empire-runq' ); + } + + if( $devdetails->hasCap('EmpireSystemedge::DiskWait') ) + { + push( @perfTemplates, 'EmpireSystemedge::empire-diskwait' ); + } + + if( $devdetails->hasCap('EmpireSystemedge::PageWait') ) + { + push( @perfTemplates, 'EmpireSystemedge::empire-pagewait' ); + } + + if( $devdetails->hasCap('EmpireSystemedge::SwapActive') ) + { + push( @perfTemplates, 'EmpireSystemedge::empire-swapactive' ); + } + + if( $devdetails->hasCap('EmpireSystemedge::SleepActive') ) + { + push( @perfTemplates, 'EmpireSystemedge::empire-sleepactive' ); + } + + my $PerformanceNode = $cb->addSubtree( $devNode, $subtreeName, + $param, \@perfTemplates ); + + # Empire CPU Stats + if( $devdetails->hasCap('EmpireSystemedge::CpuStats') ) + { + my $ref = $data->{'empireCpuStats'}; + + my $subtreeName = "CpuStats"; + + my $param = { + 'precedence' => '-1100', + 'comment' => 'Per-CPU Statistics', + }; + + my $subtreeNode = + $cb->addSubtree( $PerformanceNode, $subtreeName, $param, + [ 'EmpireSystemedge::empire-cpu-subtree' ] ); + + foreach my $INDEX + ( sort {$a<=>$b} @{$data->{'empireCpuStats'}{'indices'} } ) + { + my $ref = $data->{'empireCpuStats'}{$INDEX}; + + # Display in index order + $ref->{'param'}->{'precedence'} = sprintf("%d", 1000 - $INDEX); + + $cb->addSubtree + ( $subtreeNode, $ref->{'param'}{'cpu'}, + $ref->{'param'}, + ['EmpireSystemedge::empire-cpu-' . $os_target, + 'EmpireSystemedge::empire-cpu-raw-' . $os_target], + ); + } + } + + if( $devdetails->hasCap('empireNTREGPERF') ) + { + Debug("NTREGPERF"); + my $ntregTree = "NT_REG_PERF"; + my $ntregParam = { + 'precedence' => '-10000', + 'comment' => 'NT Reg Perf', + }; + my $ntregnode = + $cb->addSubtree( $devNode, $ntregTree, $ntregParam ); + + foreach my $INDEX + ( sort {$a<=>$b} @{$data->{'empireNTREGPERF'}{'indices'} } ) + { + my $ref = $data->{'empireNTREGPERF'}{$INDEX}; + $cb->addTemplateApplication + ( $ntregnode, 'EmpireSystemedge::NTREGPERF_' . $INDEX ); + + } + + } +} + + +1; + + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# perl-indent-level: 4 +# End: |