import torrus 1.0.9
[freeside.git] / torrus / perllib / Torrus / DevDiscover / EmpireSystemedge.pm
diff --git a/torrus/perllib/Torrus/DevDiscover/EmpireSystemedge.pm b/torrus/perllib/Torrus/DevDiscover/EmpireSystemedge.pm
new file mode 100644 (file)
index 0000000..f796920
--- /dev/null
@@ -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: