%PDF- %PDF-
Direktori : /var/www/projetos/suporte.iigd.com.br/src/Inventory/Asset/ |
Current File : //var/www/projetos/suporte.iigd.com.br/src/Inventory/Asset/Unmanaged.php |
<?php /** * --------------------------------------------------------------------- * * GLPI - Gestionnaire Libre de Parc Informatique * * http://glpi-project.org * * @copyright 2015-2024 Teclib' and contributors. * @copyright 2003-2014 by the INDEPNET Development Team. * @licence https://www.gnu.org/licenses/gpl-3.0.html * * --------------------------------------------------------------------- * * LICENSE * * This file is part of GLPI. * * 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 3 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, see <https://www.gnu.org/licenses/>. * * --------------------------------------------------------------------- */ namespace Glpi\Inventory\Asset; use Glpi\Inventory\Conf; use Glpi\Inventory\Request; use Glpi\Toolbox\Sanitizer; use NetworkPortInstantiation; use RefusedEquipment; use RuleMatchedLog; use Transfer; class Unmanaged extends MainAsset { private $management_ports = []; protected $extra_data = [ 'hardware' => null, 'network_device' => null, ]; public function prepare(): array { parent::prepare(); $val = $this->data[0]; $raw_data = $this->raw_data; if (!is_array($raw_data)) { $raw_data = [$raw_data]; } if (isset($this->extra_data['network_device'])) { $this->prepareForNetworkDevice($val); } //remove useless properties // DOMAIN are not managed yet for Unmanaged item if (property_exists($val, 'domains_id')) { unset($val->domains_id); } if (property_exists($val, 'workgroup')) { unset($val->workgroup); } $this->data[0] = $val; return $this->data; } /** * Prepare network device information * * @param \stdClass $val * * @return void */ protected function prepareForNetworkDevice(\stdClass $val): void { if (isset($this->extra_data['network_device'])) { $device = (object)$this->extra_data['network_device']; $dev_mapping = [ 'mac' => 'mac', 'name' => 'name', 'ips' => 'ips' ]; foreach ($dev_mapping as $origin => $dest) { if (property_exists($device, $origin)) { $device->$dest = $device->$origin; } } foreach ($device as $key => $property) { $val->$key = $property; } if (property_exists($device, 'ips')) { $portkey = 'management'; $port = new \stdClass(); if (property_exists($device, 'mac')) { $port->mac = $device->mac; } $port->name = 'Management'; $port->netname = __('internal'); $port->instantiation_type = 'NetworkPortAggregate'; $port->is_internal = true; $port->logical_number = 0; $port->ipaddress = []; //add internal port(s) foreach ($device->ips as $ip) { if ($ip != '127.0.0.1' && $ip != '::1' && !in_array($ip, $port->ipaddress)) { $port->ipaddress[] = $ip; } } $this->management_ports[$portkey] = $port; } } } /** * After rule engine passed, update task (log) and create item if required * * @param integer $items_id id of the item (0 if new) * @param string $itemtype Item type * @param integer $rules_id Matched rule id, if any * @param array $ports_id Matched port ids, if any */ public function rulepassed($items_id, $itemtype, $rules_id, $ports_id = []) { $key = $this->current_key; $val = &$this->data[$key]; $entities_id = $this->entities_id; $val->is_dynamic = 1; $val->entities_id = $entities_id; // append data from RuleImportEntity foreach ($this->ruleentity_data as $attribute => $value) { $val->{$attribute} = $value; } // append data from RuleLocation foreach ($this->rulelocation_data as $attribute => $value) { $known_key = md5($attribute . $value); $this->known_links[$known_key] = $value; $val->{$attribute} = $value; } $orig_glpiactive_entity = $_SESSION['glpiactive_entity'] ?? null; $orig_glpiactiveentities = $_SESSION['glpiactiveentities'] ?? null; $orig_glpiactiveentities_string = $_SESSION['glpiactiveentities_string'] ?? null; //set entity in session $_SESSION['glpiactiveentities'] = [$entities_id]; $_SESSION['glpiactiveentities_string'] = $entities_id; $_SESSION['glpiactive_entity'] = $entities_id; if ($items_id != 0) { $this->item->getFromDB($items_id); } //handleLinks relies on $this->data; update it before the call $this->handleLinks(); $need_to_add = false; if ($items_id == 0) { //before add check if an asset already exist with mac //if found, the Unmanaged device has been converted if (property_exists($val, "mac")) { $result = NetworkPortInstantiation::getUniqueItemByMac( $val->mac, $entities_id ); //manage converted object if (!empty($result)) { $converted_object = new $result['itemtype'](); if ($converted_object->getFromDB($result['id'])) { $this->item = $converted_object; $items_id = $result['id']; $itemtype = $result['itemtype']; } else { $need_to_add = true; } } else { $need_to_add = true; } } else { $need_to_add = true; } if ($need_to_add) { //else add it $input = $this->handleInput($val, $this->item); unset($input['ap_port']); unset($input['firmware']); $items_id = $this->item->add(Sanitizer::sanitize($input)); $this->setNew(); } } // compute states_id after check / get for 'real' asset (converted or not) $default_states_id = $this->states_id_default ?? 0; if ($items_id != 0 && $default_states_id != '-1') { $val->states_id = $default_states_id; } elseif ($items_id == 0) { //if create mode default states_id can't be '-1' put 0 if needed $val->states_id = $default_states_id > 0 ? $default_states_id : 0; } //do not update itemtype / items_id Agent from Unmanaged item //just keep related items_id and entities_id for the rest of the process //like Printer or NetworkEquipment process $this->agent->fields['items_id'] = $items_id; $this->agent->fields['entities_id'] = $entities_id; //check for any old agent to remove only if it an unmanaged //to prevent agentdeletion from another asset handle by another agent if ($need_to_add) { $agent = new \Agent(); $agent->deleteByCriteria([ 'itemtype' => $this->item->getType(), 'items_id' => $items_id, 'NOT' => [ 'id' => $this->agent->fields['id'] ] ]); } $val->id = $this->item->fields['id']; if ($entities_id == -1) { $entities_id = $this->item->fields['entities_id']; } $val->entities_id = $entities_id; if ($entities_id != $this->item->fields['entities_id']) { //asset entity has changed in rules; do transfer $doTransfer = \Entity::getUsedConfig('transfers_strategy', $this->item->fields['entities_id'], 'transfers_id', 0); $transfer = new Transfer(); if ($doTransfer > 0 && $transfer->getFromDB($doTransfer)) { $item_to_transfer = [$this->itemtype => [$items_id => $items_id]]; $transfer->moveItems($item_to_transfer, $entities_id, $transfer->fields); //and set new entity in session $_SESSION['glpiactiveentities'] = [$entities_id]; $_SESSION['glpiactiveentities_string'] = $entities_id; $_SESSION['glpiactive_entity'] = $entities_id; } else { //no transfert so revert to old entities_id $val->entities_id = $this->item->fields['entities_id']; } } $this->handlePorts(); $input = $this->handleInput($val, $this->item); $this->item->update(Sanitizer::sanitize($input)); if (!($this->item instanceof RefusedEquipment)) { $this->handleAssets(); } $rulesmatched = new RuleMatchedLog(); $inputrulelog = [ 'date' => date('Y-m-d H:i:s'), 'rules_id' => $rules_id, 'items_id' => $items_id, 'itemtype' => $itemtype, 'agents_id' => $this->agent->fields['id'], 'method' => $this->request_query ?? Request::INVENT_QUERY ]; $rulesmatched->add($inputrulelog, [], false); $rulesmatched->cleanOlddata($items_id, $itemtype); //keep trace of inventoried assets, but not APs. if (!$this->isAccessPoint($val)) { $this->inventoried[] = clone $this->item; } //Restore entities in session if ($orig_glpiactive_entity !== null) { $_SESSION['glpiactive_entity'] = $orig_glpiactive_entity; } if ($orig_glpiactiveentities !== null) { $_SESSION['glpiactiveentities'] = $orig_glpiactiveentities; } if ($orig_glpiactiveentities_string !== null) { $_SESSION['glpiactiveentities_string'] = $orig_glpiactiveentities_string; } } public function handleLinks(array $data = null) { if ($this->current_key !== null) { $data = [$this->data[$this->current_key]]; } else { $data = $this->data; } return parent::handleLinks(); } public function getManagementPorts() { return $this->management_ports; } public function setManagementPorts(array $ports): Unmanaged { $this->management_ports = $ports; return $this; } protected function getModelsFieldName(): string { return ""; } protected function getTypesFieldName(): string { return ""; } public function checkConf(Conf $conf): bool { $this->conf = $conf; $this->states_id_default = $conf->states_id_default; return $conf->import_unmanaged == 1; } public function getItemtype(): string { return \Unmanaged::class; } }