How to push additional content in my inventory

Additional content

You can use additional-content configuration parameter (alternatively, –additional-content command-line options) to inject arbitary XML content into inventory result.

For instance, to add some manually installed software, unknown from the packaging system database:

$> cat /tmp/foo.xml
<?xml version="1.0" encoding="UTF-8" ?>
<REQUEST>
  <CONTENT>
      <SOFTWARES>
          <NAME>foo</NAME>
          <VERSION>bar</VERSION>
      </SOFTWARES>
  </CONTENT>
</REQUEST>
$> fusioninventory-agent --additional-content /tmp/foo.xml

Perl module (Agent side)

You can extend FusionInventory by creating a custom Perl module, and installing it anywhere under ‘lib/FusionInventory/Agent/Task/Inventory’ directory. It will be automatically loaded and executed at run time.

Example: http://forum.fusioninventory.org/viewtopic.php?id=2248 (French)

If you want to add some content which isn’t curently in FusionInventory, follow this Oracle integration procedure for AIX:

Create a perl module named “Oracle.pm”:

package FusionInventory::Agent::Task::Inventory::Input::AIX::Oracle;
use strict;
use warnings;
use English qw(-no_match_vars);
sub isEnabled {
   return 1;
}
sub doInventory {
    my (%params) = @_;
    my $inventory = $params{inventory};
    
    #[ADD CUSTOM CONTENT HERE]
        
    #Call this function to add an XML block
    addOracle(inventory => $inventory, entry => {
        'INSTANCE' => $nomInstance,
        'VERSION'  => $version,
        'URL'      => $url,
        'PORT'     => $port,
        'PATH'     => $path,
        'STATE'    => $state,
    });
}
sub addOracle {
    my (%params) = @_;
    my $entry = $params{entry};
    $params{inventory}->addEntry(section => 'ORACLE', entry => $entry);
}
1;

Put this file into: ./fusioninventory-agent_aix-6.1-ppc_2.2.7-4/perl/agent/FusionInventory/Agent/Task/Inventory/Input/AIX/ (Old version)
./FusionInventory-Agent-2.3.17/lib/FusionInventory/Agent/Task/Inventory/AIX (New version)

Then, you can modify “fusioninventory-agent_aix-6.1-ppc_2.2.7-4/perl/agent/FusionInventory/Agent/Task/Inventory/Inventory.pm” in order to add a new field for Oracle.

my %fields = (   
    […]
ORACLE      => [ qw/INSTANCE VERSION URL PORT PATH STATE/],

Add content: Server side

You can create a new PHP class “Oracle.class.php” into ./glpi/plugins/fusioninventory/inc/ if you want to visualise it on GLPI.

On the same repository, modify “formatconvert.class.php” file so that the server understands the new xml block:

static function XMLtoArray($xml) {
// Hack for some sections
$a_fields = array('SOUNDS', 'VIDEOS', 'CONTROLLERS', 'CPUS', 'DRIVES', 'MEMORIES', 'NETWORKS', 'SOFTWARE', 'USERS',
'VIRTUALMACHINES', 'ANTIVIRUS', 'MONITORS', 'PRINTERS', 'USBDEVICES', 'PHYSICAL_VOLUMES', 'VOLUME_GROUPS',
'LOGICAL_VOLUMES', 'BATTERIES', 'LICENSEINFOS', 'STORAGES', 'INPUTS', 'ORACLE');  
    […]
$_a_inventory['oracleinstance'] = array();
    if (isset($array['ORACLE'])){
        foreach ($array['ORACLE'] as $a_oracle) {
            $array_tmp = $thisc->addValues($a_oracle,
            array(
              'INSTANCE' => 'name',
              'URL' => 'url',
              'PORT' => 'port',
              'VERSION' => 'version',
              'PATH' => 'path',
              'STATE' => 'state'));
          $a_inventory['oracleinstance'] [] = $array_tmp;
        }
    }
}

Uppercase fields = XML fields
Lowercase fields = Database fields

Add database interactions:

Now, the server can interpret the new XML datas but still can’t add it into our GLPI database. So you need to add content in “inventorycomputerlib.class.php” file.

function updateComputer($a_computerinventory, $computers_id, $no_history, $setdynamic=0) {
    […]
    $pfOracle = new PluginFusioninventoryOracle();
    […]
    // * CUSTOM: Oracle
    $db_oracleinstance = array(); // Recover the datas from database
        if ($no_history === FALSE) {
            $query = "SELECT `id`, `name`, `url`, `port`, `version`
                      FROM `glpi_plugin_fusioninventory_oracles`
                      WHERE `computers_id` = '$computers_id'";
            $result = $DB->query($query);
            while ($data = $DB->fetch_assoc($result)) {
                $idtmp = $data['id'];
                unset($data['id']);
                $data1 = Toolbox::addslashes_deep($data);
                $data2 = array_map('strtolower', $data1);
                $db_oracleinstance[$idtmp] = $data2;
            }
        }
        foreach ($a_computerinventory['oracleinstance'] as $key => $arrays) { /* We don't want to deal with the parameters already in database */
            $arrayslower = array_map('strtolower', $arrays); // XML CONVERTED
            foreach ($db_oracleinstance as $keydb => $arraydb) {
                if ($arrayslower == $arraydb) { // if XML and DB matched, then nothing to do
                    unset($a_computerinventory['oracleinstance'][$key]);
                    unset($db_oracleinstance[$keydb]);
                    break;
                }
            }
        }
        if (count($a_computerinventory['oracleinstance']) == 0 AND count($db_oracleinstance) == 0) {
            // Nothing to do.
        } else {
            if (count($db_oracleinstance) != 0) { // if there is still DB parameters.
                foreach ($db_oracleinstance as $idtmp => $data) {
                    $pfOracle->delete(array('id'=>$idtmp), 1); // delete attribute ID
                }
            }
            if (count($a_computerinventory['oracleinstance']) != 0) {
                foreach($a_computerinventory['oracleinstance'] as $a_oracle) {
                    $a_oracle['computers_id'] = $computers_id;
                    $pfOracle->add($a_oracle, array(), FALSE);    // add attribute to array.
                }
            }
        }
    [...]    
}

Create the associate table into database: “glpi_plugin_fusioninventory_oracles”

The table name must always ends with a plural.