. @package archires @author Nelly Mahu-Lasson, Xavier Caillaud @copyright Copyright (c) 2016-2018 Archires plugin team @license AGPL License 3.0 or (at your option) any later version http://www.gnu.org/licenses/agpl-3.0-standalone.html @link https://forge.glpi-project.org/projects/archires @since version 2.2 -------------------------------------------------------------------------- */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access directly to this file"); } class PluginArchiresNetworkEquipmentQuery extends CommonDBTM { static $rightname = "plugin_archires"; protected $usenotepad = true; static function getTypeName($nb=0) { return _n('Network equipment', 'Network equipments', 1, 'archires'); } function cleanDBonPurge() { $querytype = new PluginArchiresQueryType; $querytype->deleteByCriteria(['plugin_archires_queries_id' => $this->fields['id']]); } function rawSearchOptions() { $tab = []; $tab[] = ['id' => 'common', 'name' => self::getTypeName(2)]; $tab[] = ['id' => '1', 'table' => $this->getTable(), 'field' =>'name', 'name' => __('Name'), 'datatype' => 'itemlink', 'itemlink_type' => $this->getType()]; $tab[] = ['id' => '2', 'table' => 'glpi_networkequipments', 'field' => 'name', 'name' => _n('Network equipment', 'Network equipments', 1, 'archires'), 'datatype' => 'dropdown']; $tab[] = ['id' => '3', 'table' => 'glpi_networks', 'field' => 'name', 'name' => __('Network'), 'datatype' => 'dropdown']; $tab[] = ['id' => '4', 'table' => 'glpi_states', 'field' => 'name', 'name' => __('State'), 'datatype' => 'dropdown']; $tab[] = ['id' => '5', 'table' => 'glpi_groups', 'field' => 'completename', 'name' => __('Group'), 'datatype' => 'dropdown']; $tab[] = ['id' => '6', 'table' => 'glpi_vlans', 'field' => 'name', 'name' => __('VLAN'), 'datatype' => 'dropdown']; $tab[] = ['id' => '7', 'table' => 'glpi_plugin_archires_views', 'field' => 'name', 'name' => PluginArchiresView::getTypeName(1), 'datatype' => 'dropdown']; $tab[] = ['id' => '30', 'table' => $this->getTable(), 'field' => 'id', 'name' => __('ID'), 'datatype' => 'number']; $tab[] = ['id' => '80', 'table' => 'glpi_entities', 'field' => 'completename', 'name' => __('Entity'), 'datatype' => 'dropdown']; return $tab; } function prepareInputForAdd($input) { if (!isset ($input["plugin_archires_views_id"]) || ($input["plugin_archires_views_id"] == 0)) { Session::addMessageAfterRedirect(__('Thanks to specify a default used view', 'archires'), false, ERROR); return []; } return $input; } function defineTabs($options=[]) { $ong = []; $this->addDefaultFormTab($ong) ->addStandardTab('PluginArchiresQueryType', $ong, $options) ->addStandardTab('PluginArchiresView', $ong, $options) ->addStandardTab('PluginArchiresPrototype', $ong, $options) ->addStandardTab('Notepad',$ong, $options); return $ong; } function showForm ($ID, $options=[]) { $this->initForm($ID, $options); $this->showFormHeader($options); echo ""; echo "".__('Name').""; echo ""; Html::autocompletionTextField($this,"name"); echo ""; echo "".__('Group').""; Group::dropdown(['name' => "groups_id", 'value' => $this->fields["groups_id"], 'entity' => $this->fields["entities_id"]]); echo ""; echo ""; echo ""._n('Network equipment', 'Network equipments', 1, 'archires').""; NetworkEquipment::dropdown(['name' => "networkequipments_id", 'value' => $this->fields["networkequipments_id"], 'entity' => $this->fields["entities_id"]]); echo ""; echo "".__('VLAN').""; Vlan::dropdown(['name' => "vlans_id", 'value' => $this->fields["vlans_id"]]); echo ""; echo ""; echo "".__('Network').""; Network::dropdown(['name' => "networks_id", 'value' => $this->fields["networks_id"]]); echo ""; echo "".PluginArchiresView::getTypeName(1).""; //View Dropdown::show('PluginArchiresView', ['name' => "plugin_archires_views_id", 'value' => $this->fields["plugin_archires_views_id"]]); echo ""; echo ""; echo "".__('State').""; State::dropdown(['name' => "states_id", 'value' => $this->fields["states_id"]]); echo ""; $this->showFormButtons($options); return true; } function Query($ID,$PluginArchiresView,$for) { global $DB; $dbu = new DbUtils(); $this->getFromDB($ID); $types = []; $devices = []; $ports = []; if ($PluginArchiresView->fields["computer"] != 0) { $types[] = 'Computer'; } if ($PluginArchiresView->fields["printer"] != 0) { $types[] = 'Printer'; } if ($PluginArchiresView->fields["peripheral"] != 0) { $types[] = 'Peripheral'; } if ($PluginArchiresView->fields["phone"] != 0) { $types[]='Phone'; } if ($PluginArchiresView->fields["networking"] != 0) { $types[] = 'NetworkEquipment'; } $query_switch = ['SELECT' => ['glpi_networkports.name', 'glpi_networkports.id'], 'FROM' => 'glpi_networkports', 'LEFT JOIN' => ['glpi_networkequipments' =>['FKEY' => ['glpi_networkports' => 'items_id', 'glpi_networkequipments' => 'id']]], 'WHERE' => ['glpi_networkequipments.is_deleted' => 0, 'is_template' => 0, 'itemtype' => 'NetworkEquipment'] + $dbu->getEntitiesRestrictCriteria('glpi_networkequipments')]; if ($this->fields["networkequipments_id"]) { $query_switch['WHERE']['glpi_networkequipments.id'] = $this->fields["networkequipments_id"]; } if ($result_switch = $DB->request($query_switch)) { while ($ligne = $result_switch->next()) { $port = $ligne['name']; $nw = new NetworkPort_NetworkPort(); $end = $nw->getOppositeContact($ligne['id']); if ($end) { foreach ($types as $key => $val) { $itemtable = $dbu->getTableForItemType($val); $fieldsnp = "`np`.`id`, `np`.`items_id`, `np`.`logical_number`, `np`.`instantiation_type`, `glpi_ipaddresses`.`name` AS ip, `ipn`.`netmask`, `np`.`name` AS namep"; $query = "SELECT `$itemtable`.`id` AS idc, $fieldsnp , `$itemtable`.`name`, `$itemtable`.`".getForeignKeyFieldForTable($dbu->getTableForItemType($val."Type"))."` AS `type`, `$itemtable`.`users_id`, `$itemtable`.`groups_id`, `$itemtable`.`contact`, `$itemtable`.`states_id`, `$itemtable`.`entities_id`,`$itemtable`.`locations_id` FROM `$itemtable`, `glpi_ipnetworks` AS ipn, `glpi_networkports` np"; if ($this->fields["vlans_id"] > "0") { $query .= ", `glpi_networkports_vlans` nv"; } $query .= " LEFT JOIN `glpi_networknames` ON (`glpi_networknames`.`itemtype` = 'NetworkPort' AND `np`.`id` = `glpi_networknames`.`items_id`) LEFT JOIN `glpi_ipaddresses` ON (`glpi_ipaddresses`.`itemtype` = 'NetworkName' AND `glpi_networknames`.`id` = `glpi_ipaddresses`.`items_id`) WHERE `np`.`instantiation_type` = 'NetworkPortEthernet' AND `np`.`itemtype` = '$val' AND `np`.`items_id` = `$itemtable`.`id` AND `np`.`id` ='$end' AND `$itemtable`.`is_deleted` = '0' AND `$itemtable`.`is_template` = '0' ". $dbu->getEntitiesRestrictRequest(" AND", $itemtable); if ($this->fields["vlans_id"] > "0") { $query .= " AND `nv`.`networkports_id` = `np`.`id` AND vlans_id= '".$this->fields["vlans_id"]."'"; } if (($this->fields["networks_id"] > "0") && ($val != 'Phone') && ($val != 'Peripheral')) { $query .= " AND `$itemtable`.`networks_id` = '".$this->fields["networks_id"]."'"; } if ($this->fields["states_id"] > "0") { $query .= " AND `$itemtable`.`states_id` = '".$this->fields["states_id"]."'"; } if ($this->fields["groups_id"] > "0") { $query .= " AND `$itemtable`.`groups_id` = '".$this->fields["groups_id"]."'"; } //types $PluginArchiresQueryType = new PluginArchiresQueryType(); $query .= $PluginArchiresQueryType->queryTypeCheck($this->getType(), $ID, $val); $query .= "GROUP BY `np`.`id` ORDER BY `np`.`id` ASC "; if ($result = $DB->query($query)) { while ($data = $DB->fetch_array($result)) { if ($PluginArchiresView->fields["display_state"] != 0) { $devices[$val][$data["items_id"]]["states_id"] = $data["states_id"]; } $devices[$val][$data["items_id"]]["type"] = $data["type"]; $devices[$val][$data["items_id"]]["name"] = $data["name"]; $devices[$val][$data["items_id"]]["users_id"] = $data["users_id"]; $devices[$val][$data["items_id"]]["groups_id"] = $data["groups_id"]; $devices[$val][$data["items_id"]]["contact"] = $data["contact"]; $devices[$val][$data["items_id"]]["entity"] = $data["entities_id"]; $devices[$val][$data["items_id"]]["locations_id"] = $data["locations_id"]; $ports[$data["id"]]["items_id"] = $data["items_id"]; $ports[$data["id"]]["logical_number"] = $data["logical_number"]; $ports[$data["id"]]["ip"] = $data["ip"]; $ports[$data["id"]]["netmask"] = $data["netmask"]; $ports[$data["id"]]["namep"] = $data["namep"]; $ports[$data["id"]]["idp"] = $data["id"]; $ports[$data["id"]]["itemtype"] = $val; //ip if ($data["ip"]) { if (!empty($devices[$val][$data["items_id"]]["ip"])) { $devices[$val][$data["items_id"]]["ip"] .= " - "; $devices[$val][$data["items_id"]]["ip"] .= $data["ip"]; } else { $devices[$val][$data["items_id"]]["ip"] = $data["ip"]; } } //fin ip } } } } } } //The networking $query = "SELECT `n`.`id` AS `idn`, `np`.`id`, `np`.`items_id`, `np`.`logical_number`, `np`.`instantiation_type`, `glpi_ipaddresses`.`name` AS ip, `np`.`name` AS `namep`, `ipn`.`address` AS `nip`, `ipn`.`netmask`, `n`.`name`, `n`.`networkequipmenttypes_id` AS `type`, `n`.`users_id`, `n`.`groups_id`, `n`.`contact`, `n`.`states_id`, `n`.`entities_id`,`n`.`locations_id` FROM `glpi_networkports` `np`, `glpi_networkequipments` `n`, `glpi_ipnetworks` `ipn`"; if ($this->fields["vlans_id"] > "0") { $query .= ", `glpi_networkports_vlans` nv "; } $query .= " LEFT JOIN `glpi_networknames` ON (`glpi_networknames`.`itemtype` = 'NetworkPort') LEFT JOIN `glpi_ipaddresses` ON (`glpi_ipaddresses`.`itemtype` = 'NetworkName' AND `glpi_networknames`.`id` = `glpi_ipaddresses`.`items_id`) WHERE `np`.`instantiation_type` = 'NetworkPortEthernet' AND `np`.`itemtype` = 'NetworkEquipment' AND `np`.`items_id` = `n`.`id` AND `n`.`is_deleted` = '0' AND `n`.`is_template` = '0' AND `glpi_networknames`.`items_id` = `np`.`id`". $dbu->getEntitiesRestrictRequest(' AND', 'n')." AND `n`.`id` = '".$this->fields["networkequipments_id"]."' "; if ($this->fields["vlans_id"] > "0") { $query .= " AND `nv`.`networkports_id` = `np`.`id` AND vlans_id= '".$this->fields["vlans_id"]."' "; } $query .= " ORDER BY `ip` ASC "; if ($result = $DB->request($query)) { while ($data = $result->next()) { if ($PluginArchiresView->fields["display_state"] != 0) { $devices['NetworkEquipment'][$data["items_id"]]["states_id"] = $data["states_id"]; } $devices['NetworkEquipment'][$data["items_id"]]["name"] = $data["name"]; $devices['NetworkEquipment'][$data["items_id"]]["type"] = $data["type"]; $devices['NetworkEquipment'][$data["items_id"]]["users_id"] = $data["users_id"]; $devices['NetworkEquipment'][$data["items_id"]]["groups_id"] = $data["groups_id"]; $devices['NetworkEquipment'][$data["items_id"]]["contact"] = $data["contact"]; $devices['NetworkEquipment'][$data["items_id"]]["ip"] = $data["nip"]; $devices['NetworkEquipment'][$data["items_id"]]["entity"] = $data["entities_id"]; $devices['NetworkEquipment'][$data["items_id"]]["locations_id"] = $data["locations_id"]; $ports[$data["id"]]["items_id"] = $data["items_id"]; $ports[$data["id"]]["logical_number"] = $data["logical_number"]; $ports[$data["id"]]["ip"] = $data["ip"]; $ports[$data["id"]]["netmask"] = $data["netmask"]; $ports[$data["id"]]["namep"] = $data["namep"]; $ports[$data["id"]]["idp"] = $data["id"]; $ports[$data["id"]]["itemtype"] = 'NetworkEquipment'; } } if ($for) { return $devices; } return $ports; } }