. @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 PluginArchiresPrototype extends CommonDBTM { static $rightname = "plugin_archires"; private static function dotIt($engine, $graph, $format) { $out = ''; $Path = realpath(GLPI_PLUGIN_DOC_DIR."/archires"); $graph_name = tempnam($Path, "txt"); $out_name = tempnam($Path, $format); if (file_put_contents($graph_name, $graph)) { $command = "$engine -T$format -o\"$out_name\" \"$graph_name\" "; $out = shell_exec($command); $out = file_get_contents($out_name); unlink($graph_name); unlink($out_name); } return $out; } function testGraphviz() { $graph = "graph G { a; b; c -- d; a -- c;}"; return self::dotIt('dot', $graph, 'png'); } function CleanField($string) { $string = str_replace(">", " - ", $string); $string = str_replace("&", " - ", $string); return $string; } static function displayTypeAndIP($PluginArchiresView,$itemtype,$device,$generation) { $graph = ""; $PluginArchiresArchires = new PluginArchiresArchires(); if (($PluginArchiresView->fields["display_ip"] != 0) && isset($device["ip"])) { if (($PluginArchiresView->fields["display_type"] != 0) && !empty($device["type"])) { $class = $itemtype."Type"; $typeclass = new $class(); $typeclass->getFromDB($device["type"]); if (!$generation) { $graph = $typeclass->fields["name"] . " " .$device["ip"]; } else { $graph = " - ".$typeclass->fields["name"]. "".$device["ip"].""; } } else { if (!$generation) { $graph = $device["ip"]; } else { $graph ="".$device["ip"].""; } } } else { if (($PluginArchiresView->fields["display_type"] != 0) && !empty($device["type"])) { $class = $itemtype."Type"; $typeclass = new $class(); $typeclass->getFromDB($device["type"]); if (!$generation) { $graph =$typeclass->fields["name"]; } else { $graph ="". $typeclass->fields["name"].""; } } else { if (!$generation) { echo ""; } else { $graph =""; } } } return $graph; } static function displayUsers($url,$device,$generation) { $graph =""; if ($device["users_id"]) { if ($generation) { $graph = "URL=\"".$url."\" tooltip=\"".getUserName($device["users_id"])."\""; } else { $graph = "".getUserName($device["users_id"]).""; } } else if (!$device["users_id"] && $device["groups_id"]) { if ($generation) { $graph = "URL=\"".$url."\" tooltip=\"".Dropdown::getDropdownName("glpi_groups", $device["groups_id"])."\""; } else { $graph = "".Dropdown::getDropdownName("glpi_groups", $device["groups_id"]).""; } } else if (!$device["users_id"] && !$device["groups_id"] && $device["contact"]) { if ($generation) { $graph = "URL=\"".$url."\" tooltip=\"".$device["contact"]."\""; } else { $graph = "".$device["contact"].""; } } else { if ($generation) { $graph = "URL=\"".$url."\" tooltip=\"".$device["name"]."\""; } else { $graph = "".$device["name"].""; } } return $graph; } static function test($item) { global $DB,$CFG_GLPI; $ID = $item->getID(); $type = $item->getType(); $plugin_archires_views_id = $item->fields["plugin_archires_views_id"]; if (!$plugin_archires_views_id) { return false; } $plugin = new Plugin(); $PluginArchiresView = new PluginArchiresView(); if ($plugin->isActivated("appliances")) { $PluginArchiresApplianceQuery = new PluginArchiresApplianceQuery(); } $PluginArchiresLocationQuery = new PluginArchiresLocationQuery(); $PluginArchiresNetworkEquipmentQuery = new PluginArchiresNetworkEquipmentQuery(); $PluginArchiresStateColor = new PluginArchiresStateColor(); $PluginArchiresImageItem = new PluginArchiresImageItem(); $PluginArchiresView->getFromDB($plugin_archires_views_id); $devices = []; $ports = []; echo "
"; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; if ($type == 'PluginArchiresLocationQuery') { $devices = $PluginArchiresLocationQuery->Query($ID, $PluginArchiresView, true); $ports = $PluginArchiresLocationQuery->Query($ID, $PluginArchiresView, false); } else if ($type == 'PluginArchiresNetworkEquipmentQuery') { $devices = $PluginArchiresNetworkEquipmentQuery->Query($ID, $PluginArchiresView, true); $ports = $PluginArchiresNetworkEquipmentQuery->Query($ID, $PluginArchiresView, false); } else if ($type == 'PluginArchiresApplianceQuery') { $devices = $PluginArchiresApplianceQuery->Query($ID, $PluginArchiresView, true); $ports = $PluginArchiresApplianceQuery->Query($ID, $PluginArchiresView, false); } foreach ($devices as $itemtype => $typed_devices) { foreach ($typed_devices as $device_id => $device) { $device_unique_name = $itemtype . "_" . $device_id . "_"; $device_unique_name .= $device["name"]; $image_name = $PluginArchiresImageItem->displayItemImage($device["type"], $itemtype, true); $link = Toolbox::getItemTypeFormURL($itemtype); $url = $link."?id=".$device_id; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; } } echo "
".__('Item')."
".__('Graphviz name', 'archires')."".__('Associated picture', 'archires')."".__('Name of item', 'archires')."".sprintf(__('%1$s / %2$s'), __('Type'), __('IP'))."".__('Status')."".sprintf(__('%1$s / %2$s'), __('User'), sprintf(__('%1$s / %2$s'), __('Group'), __('Contact')))."
$device_unique_name$image_name" . $device["name"].""; echo self::displayTypeAndIP($PluginArchiresView, $itemtype, $device, false); echo ""; if ($PluginArchiresView->fields["display_state"]!=0 && isset($device["states_id"])) { echo $PluginArchiresStateColor->displayColorState($device); } echo ""; echo self::displayUsers($url, $device, false); echo "
"; echo "
"; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; $wires = []; $query = ['SELECT' => ['id', 'networkports_id_1', 'networkports_id_2'], 'FROM' => 'glpi_networkports_networkports']; if ($result = $DB->request($query)) { while ($data = $result->next()) { $wires[$data["id"]]["networkports_id_1"] = $data["networkports_id_1"]; $wires[$data["id"]]["networkports_id_2"] = $data["networkports_id_2"]; } } foreach ($wires as $wire) { if (isset($ports[$wire["networkports_id_1"]]) && !empty($ports[$wire["networkports_id_1"]]) && isset($ports[$wire["networkports_id_2"]]) && !empty($ports[$wire["networkports_id_2"]])) { $items_id1 = $ports[$wire["networkports_id_1"]]["items_id"]; $itemtype1 = $ports[$wire["networkports_id_1"]]["itemtype"]; $logical_number1 = $ports[$wire["networkports_id_1"]]["logical_number"]; $name1 = $ports[$wire["networkports_id_1"]]["namep"]; $ID1 = $ports[$wire["networkports_id_1"]]["idp"]; $ip1 = $ports[$wire["networkports_id_1"]]["ip"]; $device_unique_name1 = $itemtype1 . "_" . $items_id1 . "_"; $device_unique_name1 .= $devices[$itemtype1][$items_id1]["name"]; $items_id2 = $ports[$wire["networkports_id_2"]]["items_id"]; $itemtype2 = $ports[$wire["networkports_id_2"]]["itemtype"]; $logical_number2 = $ports[$wire["networkports_id_2"]]["logical_number"]; $name2 = $ports[$wire["networkports_id_2"]]["namep"]; $ID2 = $ports[$wire["networkports_id_2"]]["idp"]; $ip2 = $ports[$wire["networkports_id_2"]]["ip"]; $device_unique_name2 = $itemtype2 . "_" . $items_id2 . "_"; $device_unique_name2 .= $devices[$itemtype2][$items_id2]["name"]; echo ""; if ($PluginArchiresView->fields["display_ports"]!=0 && $PluginArchiresView->fields["engine"]!=1) { $url_ports = $CFG_GLPI["root_doc"] . "/front/networkport.form.php?id="; echo ""; if ($PluginArchiresView->fields["display_ip"]!=0) { echo ""; } else { echo ""; } echo ""; echo ""; if ($PluginArchiresView->fields["display_ip"]!=0) { echo ""; } else { echo ""; } } else { echo ""; echo ""; } } } echo "
"._n('Link', 'Links', 2, 'archires')."
".__('Graphviz links', 'archires')."".__('IP item 1', 'archires')."".__('Socket item 1', 'archires')."".__('Associated picture', 'archires')."".__('Socket item 2', 'archires')."".__('IP item 2', 'archires')."
".printf(__('%1$s - %2$s'), $device_unique_name1, $device_unique_name2). "".$ip1."".$name1." - ". __('Socket', 'archires')." ".$logical_number1."../pics/socket.png"; echo "".$name2." - ". __('Socket', 'archires')." ".$logical_number2."".$ip2."".$device_unique_name1." -- ".$device_unique_name2 ."     
"; echo "
"; echo ""; echo ""; echo "
".__('Test Graphviz', 'archires')."
"; echo ""; echo "
"; echo "
"; } function graphItems($device,$device_id,$itemtype,$format,$image_name,$url,$PluginArchiresView) { global $DB; $PluginArchiresStateColor = new PluginArchiresStateColor(); $device_unique_name = $itemtype . "_" . $device_id . "_"; $device_unique_name .= $device["name"]; $graph = "\"".$device_unique_name."\"[shape=plaintext, label="; //label $graph .= "<"; //img $graph .= ""; $graph .= ""; } //location if (($PluginArchiresView->fields["display_location"] != 0) && isset($device["locations_id"])) { $graph .= ""; } //state if (($PluginArchiresView->fields["display_state"] !=0 ) && isset($device["states_id"])) { $graph .=""; } $graph .= "
". "
".$device["name"]; //ip / type $graph .= self::displayTypeAndIP($PluginArchiresView, $itemtype, $device, true); //entity if (($PluginArchiresView->fields["display_entity"] != 0) && isset($device["entity"])) { $graph .= "
".$this->CleanField(Dropdown::getDropdownName("glpi_entities", $device["entity"])). "
".$this->CleanField(Dropdown::getDropdownName("glpi_locations", $device["locations_id"])). "
".$PluginArchiresStateColor->displayColorState($device)."
>"; //end label //link - users $graph .=self::displayUsers($url, $device, true); $graph .="];\n"; return $graph; } function graphPorts($devices, $ports, $wire, $format, $PluginArchiresView) { global $DB, $CFG_GLPI; $PluginArchiresNetworkInterfaceColor = new PluginArchiresNetworkInterfaceColor(); $PluginArchiresVlanColor = new PluginArchiresVlanColor(); $items_id1 = $ports[$wire["networkports_id_1"]]["items_id"]; $itemtype1 = $ports[$wire["networkports_id_1"]]["itemtype"]; $logical_number1 = $ports[$wire["networkports_id_1"]]["logical_number"]; $name1 = $ports[$wire["networkports_id_1"]]["namep"]; $ID1 = $ports[$wire["networkports_id_1"]]["idp"]; $ip1 = $ports[$wire["networkports_id_1"]]["ip"]; $netmask1 = $ports[$wire["networkports_id_2"]]["netmask"]; $device_unique_name1 = $itemtype1 . "_" . $items_id1 . "_"; $device_unique_name1 .= $devices[$itemtype1][$items_id1]["name"]; $items_id2 = $ports[$wire["networkports_id_2"]]["items_id"]; $itemtype2 = $ports[$wire["networkports_id_2"]]["itemtype"]; $logical_number2 = $ports[$wire["networkports_id_2"]]["logical_number"]; $name2 = $ports[$wire["networkports_id_2"]]["namep"]; $ID2 = $ports[$wire["networkports_id_2"]]["idp"]; $ip2 = $ports[$wire["networkports_id_2"]]["ip"]; $netmask2 = $ports[$wire["networkports_id_2"]]["netmask"]; $device_unique_name2 = $itemtype2 . "_" . $items_id2 . "_"; $device_unique_name2 .= $devices[$itemtype2][$items_id2]["name"]; $graph = ""; if ($PluginArchiresView->fields["color"] == PluginArchiresView::PLUGIN_ARCHIRES_NETWORK_COLOR ) { if (empty($networkinterfaces_id1) && empty($networkinterfaces_id2)) { $graph .= "edge [color=black,arrowsize=1, fontname=\"Verdana\", fontsize=\"5\"];\n"; } else if (!empty($networkinterfaces_id1)) { if ($PluginArchiresNetworkInterfaceColor->getFromDBbyNetworkInterface($networkinterfaces_id1)) { $graph .= "edge [color=".$PluginArchiresNetworkInterfaceColor->fields["color"].", fontname=\"Verdana\", fontsize=\"5\"];\n"; } else { $graph .= "edge [color=black,arrowsize=1, fontname=\"Verdana\", fontsize=\"5\"];\n"; } } else { if ($PluginArchiresNetworkInterfaceColor->getFromDBbyNetworkInterface($networkinterfaces_id2)) { $graph .= "edge [color=".$PluginArchiresNetworkInterfaceColor->fields["color"].", fontname=\"Verdana\", fontsize=\"5\"];\n"; } else { $graph .= "edge [color=black,arrowsize=1, fontname=\"Verdana\", fontsize=\"5\"];\n"; } } } else if ($PluginArchiresView->fields["color"] == PluginArchiresView::PLUGIN_ARCHIRES_VLAN_COLOR) { $vlan1 = $PluginArchiresVlanColor->getVlanbyNetworkPort($ID1); $vlan2 = $PluginArchiresVlanColor->getVlanbyNetworkPort($ID2); if (empty($vlan1) && empty($vlan2)) { $graph .= "edge [color=black,arrowsize=1, fontname=\"Verdana\", fontsize=\"5\"];\n"; } else if (!empty($vlan1)) { if ($PluginArchiresVlanColor->getFromDBbyVlan($vlan1)) { $graph .= "edge [color=".$PluginArchiresVlanColor->fields["color"].", fontname=\"Verdana\", fontsize=\"5\"];\n"; } else { $graph .= "edge [color=black,arrowsize=1, fontname=\"Verdana\", fontsize=\"5\"];\n"; } } else { if ($PluginArchiresVlanColor->getFromDBbyVlan($vlan2)) { $graph .= "edge [color=".$PluginArchiresVlanColor->fields["color"].", fontname=\"Verdana\", fontsize=\"5\"];\n"; } else { $graph .= "edge [color=black,arrowsize=1, fontname=\"Verdana\", fontsize=\"5\"];\n"; } } } //Display Ports if (($PluginArchiresView->fields["display_ports"] != 0) && ($PluginArchiresView->fields["engine"] != 1)) { $url_ports = $CFG_GLPI["root_doc"] . "/front/networkport.form.php?id="; $graph .= "\"".$device_unique_name1."\""; $graph .= " -- \"".$device_unique_name2."\"[label="; $graph .= "<"; //display ip ports if ($PluginArchiresView->fields["display_ip"] != 0) { if (!empty($ip1)) { $graph .= ""; } } $graph .= ""; if ($format!='svg') { $graph .= ""; } else { $graph .= ""; } $graph .= ""; //display ip ports if ($PluginArchiresView->fields["display_ip"] != 0) { if (!empty($ip2)) { $graph .= ""; } } $graph .= "
".$ip1; if (!empty($netmask1)) { $graph = sprintf(__('%1$s / %2$s'), $graph, $netmask1); } $graph .= "
"; if ($PluginArchiresView->fields["display_ports"]==1) { $graph .= __('Socket', 'archires')." ".$logical_number1; } else if ($PluginArchiresView->fields["display_ports"]==2) { $graph .= $name1; if ($_SESSION["glpiis_ids_visible"] || empty($name1)) { $graph = sprintf(__('%1$s (%2$s)'), $graph, $ID1); } } $graph .= "
". "
"; if ($PluginArchiresView->fields["display_ports"]==1) { $graph .= __('Socket', 'archires')." ".$logical_number2; } else if ($PluginArchiresView->fields["display_ports"]==2) { $graph .= $name2; if ($_SESSION["glpiis_ids_visible"] || empty($name2)) { $graph = sprintf(__('%1$s (%2$s)'), $graph, $ID2); } } $graph .= "
".$ip2; if (!empty($netmask2)) { $graph = sprintf(__('%1$s / %2$s'), $graph, $netmask2); } $graph .= "
>];\n"; } else { $graph .= "\"".$device_unique_name1."\""; $graph .= " -- \"".$device_unique_name2."\";\n"; } return $graph; } static function displayGraph($item, $plugin_archires_views_id, $select=0) { global $DB,$CFG_GLPI; $querytype = $item->getType(); $ID = $item->getID(); $object_view = $item->fields["plugin_archires_views_id"]; $graph = new self(); if (!isset($plugin_archires_views_id)) { $plugin_archires_views_id = $object_view; } if (!$object_view && !$plugin_archires_views_id) { return false; } $PluginArchiresView = new PluginArchiresView(); $PluginArchiresView->getFromDB($plugin_archires_views_id); $PluginArchiresNetworkInterfaceColor = new PluginArchiresNetworkInterfaceColor(); $PluginArchiresVlanColor = new PluginArchiresVlanColor(); $PluginArchiresStateColor = new PluginArchiresStateColor(); echo "
"; $PluginArchiresView->viewSelect($item, $plugin_archires_views_id, $select); echo "
"; if (isset($ID) && !empty($ID)) { echo ""; echo $graph->createGraph("cmapx", $item, $plugin_archires_views_id); } //legend if (isset($ID) && !empty($ID)) { echo "
"; echo ""; echo ""; echo ""; echo "
"; if ( $PluginArchiresView->fields["color"] == 0 ) { $PluginArchiresNetworkInterfaceColor->showConfigForm(); } else if ($PluginArchiresView->fields["color"] == 1 ) { $PluginArchiresVlanColor->showConfigForm(); } echo "".$PluginArchiresStateColor->showConfigForm()."
"; echo "
"; } else { echo "


warning

"; echo "".__('No item found')."
"; } } function createGraph($format,$obj,$plugin_archires_views_id) { global $DB,$CFG_GLPI; $type = get_class($obj); $ID = $obj->fields["id"]; $object_view = $obj->fields["plugin_archires_views_id"]; if (!isset($plugin_archires_views_id)) { $plugin_archires_views_id = $object_view; } $PluginArchiresView = new PluginArchiresView(); $plugin = new Plugin(); if ($plugin->isActivated("appliances")) { $PluginArchiresApplianceQuery = new PluginArchiresApplianceQuery(); } $PluginArchiresLocationQuery = new PluginArchiresLocationQuery(); $PluginArchiresNetworkEquipmentQuery = new PluginArchiresNetworkEquipmentQuery(); $PluginArchiresImageItem = new PluginArchiresImageItem(); $PluginArchiresView->getFromDB($plugin_archires_views_id); $devices = []; $ports = []; if ($type == 'PluginArchiresLocationQuery') { $devices = $PluginArchiresLocationQuery->Query($ID, $PluginArchiresView, true); $ports = $PluginArchiresLocationQuery->Query($ID, $PluginArchiresView, false); } else if ($type == 'PluginArchiresNetworkEquipmentQuery') { $devices = $PluginArchiresNetworkEquipmentQuery->Query($ID, $PluginArchiresView, true); $ports = $PluginArchiresNetworkEquipmentQuery->Query($ID, $PluginArchiresView, false); } else if ($type == 'PluginArchiresApplianceQuery') { $devices = $PluginArchiresApplianceQuery->Query($ID, $PluginArchiresView, true); $ports = $PluginArchiresApplianceQuery->Query($ID, $PluginArchiresView, false); } $wires = []; $query = ['SELECT' => ['id', 'networkports_id_1', 'networkports_id_2'], 'FROM' => 'glpi_networkports_networkports']; if ($result = $DB->request($query)) { while ($data = $result->next()) { $wires[$data["id"]]["networkports_id_1"] = $data["networkports_id_1"]; $wires[$data["id"]]["networkports_id_2"] = $data["networkports_id_2"]; } } $graph = "graph G {\n"; $graph .= "overlap=false;\n"; $graph .= "bgcolor=white;\n"; //items $graph .= "node [shape=polygon, sides=6, fontname=\"Verdana\", fontsize=\"5\"];\n"; foreach ($devices as $itemtype => $typed_devices) { foreach ($typed_devices as $device_id => $device) { $image_name = $PluginArchiresImageItem->displayItemImage($device["type"], $itemtype, false); $link = Toolbox::getItemTypeFormURL($itemtype); $url = $link."?id=".$device_id; $graph .= $this->graphItems($device, $device_id, $itemtype, $format, $image_name, $url, $PluginArchiresView); } } foreach ($wires as $wire) { if (!empty($ports[$wire["networkports_id_1"]]) && !empty($ports[$wire["networkports_id_2"]]) && isset($ports[$wire["networkports_id_1"]]) && isset($ports[$wire["networkports_id_2"]]) ) { $graph .= $this->graphPorts($devices,$ports,$wire,$format,$PluginArchiresView); } } $graph .= "}\n"; return $this->generateGraphviz($graph,$format,$PluginArchiresView); } function generateGraphviz($graph, $format, $PluginArchiresView) { if ($PluginArchiresView->fields["engine"] != 0) { $engine_archires = "neato"; } else { $engine_archires = "dot"; } return self::dotIt($engine_archires, $graph, $format); } static function displayTabContentForItem(CommonGLPI $item, $tabnum=1, $withtemplate=0) { switch ($item->getType()) { case 'PluginArchiresApplianceQuery' : case 'PluginArchiresLocationQuery' : case 'PluginArchiresNetworkEquipmentQuery' : switch ($tabnum) { case 1 : self::test($item); break; case 2 : $plugin_archires_views_id = $item->fields["plugin_archires_views_id"]; self::displayGraph($item, $plugin_archires_views_id); PluginArchiresView::linkToAllViews($item); break; } break; } return true; } function getTabNameForItem(CommonGLPI $item, $withtemplate=0) { if (!$withtemplate && Session::haveRight("plugin_archires", READ)) { switch ($item->getType()) { case 'PluginArchiresApplianceQuery' : case 'PluginArchiresLocationQuery' : case 'PluginArchiresNetworkEquipmentQuery' : return ['1' => __('Test'), '2' => __('Generation', 'archires')]; } } return ''; } }