.
@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 "| ".__('Item')." |
";
echo "| ".__('Graphviz name', 'archires')." | ";
echo "".__('Associated picture', 'archires')." | ";
echo "".__('Name of item', 'archires')." | ";
echo "".sprintf(__('%1$s / %2$s'), __('Type'), __('IP'))." | ";
echo "".__('Status')." | ";
echo "".sprintf(__('%1$s / %2$s'), __('User'),
sprintf(__('%1$s / %2$s'), __('Group'), __('Contact')))." |
";
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 "| $device_unique_name | ";
echo " | ";
echo "" . $device["name"]." | ";
echo "";
echo self::displayTypeAndIP($PluginArchiresView, $itemtype, $device, false);
echo " | ";
echo "";
if ($PluginArchiresView->fields["display_state"]!=0 && isset($device["states_id"])) {
echo $PluginArchiresStateColor->displayColorState($device);
}
echo " | ";
echo "";
echo self::displayUsers($url, $device, false);
echo " | ";
echo "
";
}
}
echo "
";
echo "
";
echo "| "._n('Link', 'Links', 2, 'archires')." |
";
echo "| ".__('Graphviz links', 'archires')." | ";
echo "".__('IP item 1', 'archires')." | ";
echo "".__('Socket item 1', 'archires')." | ";
echo "".__('Associated picture', 'archires')." | ";
echo "".__('Socket item 2', 'archires')." | ";
echo "".__('IP item 2', 'archires')." |
";
$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 "| ".printf(__('%1$s - %2$s'), $device_unique_name1, $device_unique_name2).
" | ";
if ($PluginArchiresView->fields["display_ip"]!=0) {
echo "".$ip1." | ";
} else {
echo " | ";
}
echo "".$name1." - ".
__('Socket', 'archires')." ".$logical_number1." | ";
echo " ";
echo " | ".$name2." - ".
__('Socket', 'archires')." ".$logical_number2." | ";
if ($PluginArchiresView->fields["display_ip"]!=0) {
echo "".$ip2." | ";
} else {
echo " | ";
}
} else {
echo "".$device_unique_name1." -- ".$device_unique_name2 ." | ";
echo " | | | | | ";
}
}
}
echo "
";
echo "
";
echo "| ".__('Test Graphviz', 'archires')." |
";
echo "";
echo " ";
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 .= "| |
| ".$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"])).
" |
";
}
//location
if (($PluginArchiresView->fields["display_location"] != 0) && isset($device["locations_id"])) {
$graph .= "| ".$this->CleanField(Dropdown::getDropdownName("glpi_locations",
$device["locations_id"])).
" |
";
}
//state
if (($PluginArchiresView->fields["display_state"] !=0 ) && isset($device["states_id"])) {
$graph .="| ".$PluginArchiresStateColor->displayColorState($device)." |
";
}
$graph .= "
>";
//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 .= "| ".$ip1;
if (!empty($netmask1)) {
$graph = sprintf(__('%1$s / %2$s'), $graph, $netmask1);
}
$graph .= " |
";
}
}
$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 ($format!='svg') {
$graph .= " |
";
} else {
$graph .= " ".
" |
";
}
$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 .= " |
";
//display ip ports
if ($PluginArchiresView->fields["display_ip"] != 0) {
if (!empty($ip2)) {
$graph .= "| ".$ip2;
if (!empty($netmask2)) {
$graph = sprintf(__('%1$s / %2$s'), $graph, $netmask2);
}
$graph .= " |
";
}
}
$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 "| ";
if ( $PluginArchiresView->fields["color"] == 0 ) {
$PluginArchiresNetworkInterfaceColor->showConfigForm();
} else if ($PluginArchiresView->fields["color"] == 1 ) {
$PluginArchiresVlanColor->showConfigForm();
}
echo " | ".$PluginArchiresStateColor->showConfigForm()." | ";
echo "
";
echo "
";
echo "
";
} else {
echo "
";
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 '';
}
}