%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/projetos/suporte.iigd.com.br/plugins/glpiinventory/inc/
Upload File :
Create Path :
Current File : //var/www/projetos/suporte.iigd.com.br/plugins/glpiinventory/inc/toolbox.class.php

<?php

/**
 * ---------------------------------------------------------------------
 * GLPI Inventory Plugin
 * Copyright (C) 2021 Teclib' and contributors.
 *
 * http://glpi-project.org
 *
 * based on FusionInventory for GLPI
 * Copyright (C) 2010-2021 by the FusionInventory Development Team.
 *
 * ---------------------------------------------------------------------
 *
 * LICENSE
 *
 * This file is part of GLPI Inventory Plugin.
 *
 * GLPI Inventory Plugin is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * GLPI Inventory Plugin 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with GLPI Inventory Plugin. If not, see <https://www.gnu.org/licenses/>.
 * ---------------------------------------------------------------------
 */

if (!defined('GLPI_ROOT')) {
    die("Sorry. You can't access directly to this file");
}

/**
 * Manage the functions used in many classes.
 **/
class PluginGlpiinventoryToolbox
{
   /**
    * Log if extra debug enabled
    *
    * @param string $file
    * @param string $message
    */
    public static function logIfExtradebug($file, $message)
    {
        $config = new PluginGlpiinventoryConfig();
        if (PluginGlpiinventoryConfig::isExtradebugActive()) {
            if (is_array($message)) {
                $message = print_r($message, true);
            }
            Toolbox::logInFile($file, $message . "\n", true);
        }
    }


   /**
    * Format XML, ie indent it for pretty printing
    *
    * @param object $xml simplexml instance
    * @return string
    */
    public static function formatXML($xml)
    {
        $string     = str_replace("><", ">\n<", $xml->asXML());
        $token      = strtok($string, "\n");
        $result     = '';
        $pad        = 0;
        $matches    = [];
        $indent     = 0;

        while ($token !== false) {
           // 1. open and closing tags on same line - no change
            if (preg_match('/.+<\/\w[^>]*>$/', $token, $matches)) {
                $indent = 0;
                // 2. closing tag - outdent now
            } elseif (preg_match('/^<\/\w/', $token, $matches)) {
                $pad = $pad - 3;
               // 3. opening tag - don't pad this one, only subsequent tags
            } elseif (preg_match('/^<\w[^>]*[^\/]>.*$/', $token, $matches)) {
                $indent = 3;
            } else {
                $indent = 0;
            }

            $line    = Toolbox::str_pad($token, strlen($token) + $pad, '  ', STR_PAD_LEFT);
            $result .= $line . "\n";
            $token   = strtok("\n");
            $pad    += $indent;
            $indent = 0;
        }

        return $result;
    }


   /**
    * Add AUTHENTICATION string to XML node
    *
    * @param integer $p_id Authenticate id
    **/
    public function addAuth($p_id)
    {
        $node = [];
        $credentials = new SNMPCredential();
        if ($credentials->getFromDB($p_id)) {
            $node = [
            'AUTHENTICATION' => [
               'ID' => $p_id,
               'VERSION' => $credentials->getRealVersion()
            ]
            ];

            if ($credentials->fields['snmpversion'] == '3') {
                $node['AUTHENTICATION']['USERNAME'] = $credentials->fields['username'];
                if ($credentials->fields['authentication'] != '0') {
                    $node['AUTHENTICATION']['AUTHPROTOCOL'] = $credentials->getAuthProtocol();
                }
                $node['AUTHENTICATION']['AUTHPASSPHRASE'] = (new GLPIKey())->decrypt($credentials->fields['auth_passphrase']);
                if ($credentials->fields['encryption'] != '0') {
                    $node['AUTHENTICATION']['PRIVPROTOCOL'] = $credentials->getEncryption();
                }
                $node['AUTHENTICATION']['PRIVPASSPHRASE'] = (new GLPIKey())->decrypt($credentials->fields['priv_passphrase']);
            } else {
                $node['AUTHENTICATION']['COMMUNITY'] = $credentials->fields['community'];
            }
        }

        return $node;
    }


   /**
    * Get IP for device
    *
    * @param string $itemtype
    * @param integer $items_id
    * @return array
    */
    public static function getIPforDevice($itemtype, $items_id)
    {
        $NetworkPort = new NetworkPort();
        $networkName = new NetworkName();
        $iPAddress   = new IPAddress();

        $a_ips = [];
        $a_ports = $NetworkPort->find(
            ['itemtype'           => $itemtype,
             'items_id'           => $items_id,
            'instantiation_type' => ['!=',
            'NetworkPortLocal']]
        );
        foreach ($a_ports as $a_port) {
            $a_networknames = $networkName->find(
                ['itemtype' => 'NetworkPort',
                'items_id' => $a_port['id']]
            );
            foreach ($a_networknames as $a_networkname) {
                 $a_ipaddresses = $iPAddress->find(
                     ['itemtype' => 'NetworkName',
                     'items_id' => $a_networkname['id']]
                 );
                foreach ($a_ipaddresses as $data) {
                    if (
                        $data['name'] != '127.0.0.1'
                           && $data['name'] != '::1'
                    ) {
                        $a_ips[$data['name']] = $data['name'];
                    }
                }
            }
        }
        return array_unique($a_ips);
    }


   // *********************** Functions used for inventory *********************** //

   /**
    *  This function fetch rows from a MySQL result in an array with each table as a key
    *
    *  example:
    *  $query =
    *     "SELECT table_a.*,table_b.* ".
    *     "FROM table_b ".
    *     "LEFT JOIN table_a ON table_a.id = table_b.linked_id";
    *  $result = mysqli_query( $query );
    *  print_r( fetchTableAssoc( $result ) )
    *
    *  output:
    *  $results = Array
    *     (
    *        [0] => Array
    *           (
    *              [table_a] => Array
    *                 (
    *                    [id] => 1
    *                 )
    *              [table_b] => Array
    *                 (
    *                    [id] => 2
    *                    [linked_id] => 1
    *                 )
    *           )
    *           ...
    *     )
    *
    * @param object $mysql_result
    * @return array
    */
    public static function fetchAssocByTable($mysql_result)
    {
        $results = [];
       //get fields header infos
        $fields = mysqli_fetch_fields($mysql_result);
       //associate row data as array[table][field]
        while ($row = mysqli_fetch_row($mysql_result)) {
            $result = [];
            for ($i = 0; $i < count($row); $i++) {
                $tname = $fields[$i]->table;
                $fname = $fields[$i]->name;
                if (!isset($result[$tname])) {
                    $result[$tname] = [];
                }
                $result[$tname][$fname] = $row[$i];
            }
            if (count($result) > 0) {
                $results[] = $result;
            }
        }
        return $results;
    }

    /**
     *  This function fetch rows from a DBMysqlIterator result in an array with each table as a key
     *
     *  example:
     *  $iterator = $DB->request([
     *     'SELECT' => ['table_a.*', 'table_b.*'],
     *     'FROM' => 'table_b'
     *     'LEFT JOIN' => [
     *          'table_a' => [
     *              'ON' => [
     *                  'table_a' => id,
     *                  'table_b' => 'linked_id'
     *              ]
     *          ]
     *      ]
     *  ]);
     *  print_r(fetchTableAssocIterator($iterator))
     *
     *  output:
     *  $results = Array
     *     (
     *        [0] => Array
     *           (
     *              [table_a] => Array
     *                 (
     *                    [id] => 1
     *                 )
     *              [table_b] => Array
     *                 (
     *                    [id] => 2
     *                    [linked_id] => 1
     *                 )
     *           )
     *           ...
     *     )
     *
     * @param DBmysqlIterator $iterator
     * @return array
     */
    public static function fetchAssocByTableIterator(DBmysqlIterator $iterator): array
    {
        $results = [];
        //get fields header infos
        $fields = $iterator->fetchFields();

        //associate row data as array[table][field]
        foreach ($iterator as $row) {
            $result = [];
            $i = 0;
            foreach (array_keys($row) as $col) {
                $tname = $fields[$i]->table;
                $fname = $fields[$i]->orgname;
                if (!isset($result[$tname])) {
                    $result[$tname] = [];
                }
                $result[$tname][$fname] = $row[$col];
                ++$i;
            }

            if (count($result) > 0) {
                $results[] = $result;
            }
        }
        return $results;
    }


    /**
    * Format a json in a pretty json
    *
    * @param string $json
    * @return string
    */
    public static function formatJson($json)
    {
        return json_encode(
            json_decode($json, true),
            JSON_PRETTY_PRINT
        );
    }


   /**
    * Dropdown for display hours
    *
    * @param string $name
    * @param array $options
    * @return string unique html element id
    */
    public static function showHours($name, $options = [])
    {

        $p['value']          = '';
        $p['display']        = true;
        $p['width']          = '80%';
        $p['step']           = 5;
        $p['begin']          = 0;
        $p['end']            = (24 * 3600);

        if (is_array($options) && count($options)) {
            foreach ($options as $key => $val) {
                $p[$key] = $val;
            }
        }
        if ($p['step'] <= 0) {
            $p['step'] = 5;
        }

        $values   = [];

        $p['step'] = $p['step'] * 60; // to have in seconds
        for ($s = $p['begin']; $s <= $p['end']; $s += $p['step']) {
            $values[$s] = PluginGlpiinventoryToolbox::getHourMinute($s);
        }
        return Dropdown::showFromArray($name, $values, $p);
    }


   /**
    * Get hour:minute from number of seconds
    *
    * @param integer $seconds
    * @return string
    */
    public static function getHourMinute($seconds)
    {
        $hour = floor($seconds / 3600);
        $minute = (($seconds - ((floor($seconds / 3600)) * 3600)) / 60);
        return sprintf("%02s", $hour) . ":" . sprintf("%02s", $minute);
    }


   /**
    * Execute a function as as pllugin user
    *
    * @param string|array $function
    * @param array $args
    * @return array the normaly returned value from executed callable
    */
    public function executeAsGlpiinventoryUser($function, array $args = [])
    {

        $config = new PluginGlpiinventoryConfig();
        $user = new User();

       // Backup _SESSION environment
        $OLD_SESSION = [];

        foreach (
            ['glpiID', 'glpiname','glpiactiveentities_string',
            'glpiactiveentities', 'glpiparententities'] as $session_key
        ) {
            if (isset($_SESSION[$session_key])) {
                $OLD_SESSION[$session_key] = $_SESSION[$session_key];
            }
        }

       // Configure impersonation
        $users_id  = $config->getValue('users_id');
        $user->getFromDB($users_id);

        $_SESSION['glpiID']   = $users_id;
        $_SESSION['glpiname'] = $user->getField('name');
        $_SESSION['glpiactiveentities'] = getSonsOf('glpi_entities', 0);
        $_SESSION['glpiactiveentities_string'] =
         "'" . implode("', '", $_SESSION['glpiactiveentities']) . "'";
        $_SESSION['glpiparententities'] = [];

       // Execute function with impersonated SESSION
        $result = call_user_func_array($function, $args);

       // Restore SESSION
        foreach ($OLD_SESSION as $key => $value) {
            $_SESSION[$key] = $value;
        }
       // Return function results
        return $result;
    }


   /**
   * Check if an item is inventoried by plugin
   *
   * @since 9.2
   *
   * @param CommonDBTM $item the item to check
   *
   * @return boolean
   */
    public static function isAnInventoryDevice($item)
    {
        switch ($item->getType()) {
            case 'Computer':
            case 'NetworkEquipment':
            case 'Printer':
                return $item->isDynamic();
        }

        return $item->isDynamic()
         && countElementsInTable(
             RuleMatchedLog::getTable(),
             ['itemtype' => $item->getType(), 'items_id' => $item->fields['id']]
         );
    }
}

Zerion Mini Shell 1.0