WIP netclass editor
Former-commit-id: 2c7dffb63e4f9c587c3cdcbf8f87f134a82c1299
This commit is contained in:
parent
97b53db82b
commit
1b99c5db49
|
@ -233,7 +233,7 @@ class NetworkMap
|
|||
$this->mapOptions['text_filter'] = '';
|
||||
$this->mapOptions['dont_show_subgroups'] = false;
|
||||
$this->mapOptions['strict_user'] = false;
|
||||
$this->mapOptions['size_canvas'] = null;
|
||||
$this->mapOptions['size_canvas'] = 0;
|
||||
$this->mapOptions['old_mode'] = false;
|
||||
$this->mapOptions['map_filter'] = [
|
||||
'dont_show_subgroups' => 0,
|
||||
|
@ -281,7 +281,9 @@ class NetworkMap
|
|||
// Map options, check default values above.
|
||||
// This is only used while generating new maps using
|
||||
// (generateDotGraph).
|
||||
if (is_array($options['map_options'])) {
|
||||
if (isset($options['map_options'])
|
||||
&& is_array($options['map_options'])
|
||||
) {
|
||||
foreach ($options['map_options'] as $k => $v) {
|
||||
$this->mapOptions[$k] = $v;
|
||||
}
|
||||
|
@ -807,8 +809,34 @@ class NetworkMap
|
|||
|
||||
|
||||
/**
|
||||
* Generates or loads nodes&relations array from data load
|
||||
* and stores it in $this->graph.
|
||||
* Generates or loads nodes&relations array from DB.
|
||||
* Load, calculates statuses and leave the structure in $this->graph.
|
||||
*
|
||||
* * Structure generated:
|
||||
* Nodes:
|
||||
* id_map.
|
||||
* id.
|
||||
* id_agent.
|
||||
* id_module.
|
||||
* type.
|
||||
* x.
|
||||
* y.
|
||||
* width.
|
||||
* height.
|
||||
* text.
|
||||
* source_data.
|
||||
* style (json).
|
||||
*
|
||||
* Relations:
|
||||
* id_map.
|
||||
* id_parent.
|
||||
* parent_type.
|
||||
* id_parent_source_data.
|
||||
* id_child.
|
||||
* child_type.
|
||||
* id_child_source_data.
|
||||
* id_parent_agent.
|
||||
* id_child_agent.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
@ -823,16 +851,30 @@ class NetworkMap
|
|||
return;
|
||||
}
|
||||
|
||||
$nodes_and_relations = [];
|
||||
$nodes_and_relations['nodes'] = [];
|
||||
$index_nodes = 0;
|
||||
foreach ($nodes as $node) {
|
||||
$graph = [];
|
||||
$graph['nodes'] = [];
|
||||
$node_mapping = [];
|
||||
$i = 0;
|
||||
foreach ($nodes as $k => $node) {
|
||||
if (!$node['deleted']) {
|
||||
$nodes_and_relations['nodes'][$index_nodes]['id_map'] = $node['id_map'];
|
||||
$nodes_and_relations['nodes'][$index_nodes]['x'] = $node['x'];
|
||||
$nodes_and_relations['nodes'][$index_nodes]['y'] = $node['y'];
|
||||
$nodes_and_relations['nodes'][$index_nodes]['source_data'] = $node['source_data'];
|
||||
$nodes_and_relations['nodes'][$index_nodes]['type'] = $node['type'];
|
||||
$tmp_node = [];
|
||||
$tmp_node['id_map'] = $node['id_map'];
|
||||
$tmp_node['id'] = $i;
|
||||
$tmp_node['id_db'] = $node['id'];
|
||||
$tmp_node['source_data'] = $node['source_data'];
|
||||
$tmp_node['type'] = $node['type'];
|
||||
|
||||
if ($tmp_node['type'] == NODE_AGENT) {
|
||||
$tmp_node['id_agent'] = $tmp_node['source_data'];
|
||||
} else if ($tmp_node['type'] == NODE_MODULE) {
|
||||
$tmp_node['id_module'] = $tmp_node['source_data'];
|
||||
$tmp_node['id_agent'] = modules_get_agentmodule_agent(
|
||||
$tmp_node['id_module']
|
||||
);
|
||||
} else {
|
||||
$tmp_node['id_agent'] = 0;
|
||||
$tmp_node['id_module'] = 0;
|
||||
}
|
||||
|
||||
$style_node = json_decode($node['style'], true);
|
||||
$style = [];
|
||||
|
@ -842,35 +884,67 @@ class NetworkMap
|
|||
$style['height'] = $style_node['height'];
|
||||
$style['label'] = $style_node['label'];
|
||||
$style['id_networkmap'] = $style_node['networkmap'];
|
||||
$nodes_and_relations['nodes'][$index_nodes]['style'] = json_encode($style);
|
||||
$tmp_node['style'] = json_encode($style);
|
||||
|
||||
if ($node['type'] == 1) {
|
||||
$nodes_and_relations['nodes'][$index_nodes]['id_agent'] = $style_node['id_agent'];
|
||||
$tmp_node['x'] = $node['x'];
|
||||
$tmp_node['y'] = $node['y'];
|
||||
$tmp_node['z'] = $node['z'];
|
||||
$tmp_node['width'] = $style['width'];
|
||||
$tmp_node['height'] = $style['height'];
|
||||
$tmp_node['text'] = $style['label'];
|
||||
|
||||
if ($tmp_node['type'] == 1) {
|
||||
$tmp_node['id_agent'] = $style_node['id_agent'];
|
||||
}
|
||||
|
||||
$nodes_and_relations['nodes'][$index_nodes]['id_in_db'] = $node['id'];
|
||||
|
||||
$index_nodes++;
|
||||
$node_mapping[$node['source_data'].'_'.$tmp_node['type']] = $i;
|
||||
$this->nodeMapping[$i] = $i;
|
||||
$graph['nodes'][$i++] = $tmp_node;
|
||||
}
|
||||
}
|
||||
|
||||
$nodes_and_relations['relations'] = [];
|
||||
$index_relations = 0;
|
||||
$graph['relations'] = [];
|
||||
$i = 0;
|
||||
if (is_array($relations)) {
|
||||
foreach ($relations as $relation) {
|
||||
$nodes_and_relations['relations'][$index_relations]['id_map'] = $relation['id_map'];
|
||||
$nodes_and_relations['relations'][$index_relations]['id_parent'] = $relation['id_parent'];
|
||||
$nodes_and_relations['relations'][$index_relations]['id_child'] = $relation['id_child'];
|
||||
$nodes_and_relations['relations'][$index_relations]['parent_type'] = $relation['parent_type'];
|
||||
$nodes_and_relations['relations'][$index_relations]['child_type'] = $relation['child_type'];
|
||||
$nodes_and_relations['relations'][$index_relations]['id_parent_source_data'] = $relation['id_parent_source_data'];
|
||||
$nodes_and_relations['relations'][$index_relations]['id_child_source_data'] = $relation['id_child_source_data'];
|
||||
foreach ($relations as $rel) {
|
||||
$edge = [];
|
||||
$edge['id_map'] = $rel['id_map'];
|
||||
$edge['id_db'] = $rel['id'];
|
||||
$edge['id'] = $rel[$i];
|
||||
|
||||
$index_relations++;
|
||||
if ($rel['parent_type'] == NODE_AGENT) {
|
||||
$edge['id_parent_agent'] = $rel['id_parent_source_data'];
|
||||
} else if ($rel['parent_type'] == NODE_MODULE) {
|
||||
$edge['id_parent_agent'] = modules_get_agentmodule_agent(
|
||||
$rel['id_parent_source_data']
|
||||
);
|
||||
}
|
||||
|
||||
if ($rel['child_type'] == NODE_AGENT) {
|
||||
$edge['id_child_agent'] = $rel['id_child_source_data'];
|
||||
} else if ($rel['child_type'] == NODE_MODULE) {
|
||||
$edge['id_child_agent'] = modules_get_agentmodule_agent(
|
||||
$rel['id_child_source_data']
|
||||
);
|
||||
}
|
||||
|
||||
// Search parent.
|
||||
$kp = $edge['id_parent_agent'].'_'.NODE_AGENT;
|
||||
$edge['id_parent'] = $node_mapping[$kp];
|
||||
$edge['parent_type'] = $rel['parent_type'];
|
||||
$edge['id_parent_source_data'] = $rel['id_parent_source_data'];
|
||||
|
||||
// Search child.
|
||||
$kc = $edge['id_child_agent'].'_'.NODE_AGENT;
|
||||
$edge['id_child'] = $node_mapping[$kc];
|
||||
$edge['child_type'] = $rel['child_type'];
|
||||
$edge['id_child_source_data'] = $rel['id_child_source_data'];
|
||||
|
||||
$graph['relations'][$i++] = $edge;
|
||||
}
|
||||
}
|
||||
|
||||
$this->graph = $nodes_and_relations;
|
||||
$this->graph = $graph;
|
||||
|
||||
}
|
||||
|
||||
|
@ -888,6 +962,7 @@ class NetworkMap
|
|||
|
||||
$map_filter = $this->mapOptions['map_filter'];
|
||||
$nooverlap = $this->mapOptions['nooverlap'];
|
||||
$zoom = $this->mapOptions['zoom'];
|
||||
|
||||
if (isset($config['networkmap_max_width'])) {
|
||||
$size_x = ($config['networkmap_max_width'] / 100);
|
||||
|
@ -1037,6 +1112,357 @@ class NetworkMap
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Avoid multiple connections between two nodes if any of them does not
|
||||
* add more information. Prioritize.
|
||||
*
|
||||
* For instance, if we have module - module relationship and agent - agent
|
||||
* discard agent - agent relationship (module - module apports more
|
||||
* information).
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function cleanGraphRelations()
|
||||
{
|
||||
global $config;
|
||||
|
||||
$relations = $this->graph['relations'];
|
||||
|
||||
$segregation_links = [];
|
||||
$index = 0;
|
||||
$index2 = 0;
|
||||
$index3 = 0;
|
||||
$index4 = 0;
|
||||
foreach ($relations as $rel) {
|
||||
if (($rel['parent_type'] == NODE_AGENT) && ($rel['child_type'] == NODE_AGENT)) {
|
||||
$segregation_links['aa'][$index] = $rel;
|
||||
$index++;
|
||||
} else if (($rel['parent_type'] == NODE_MODULE) && ($rel['child_type'] == NODE_MODULE)) {
|
||||
$segregation_links['mm'][$index2] = $rel;
|
||||
$index2++;
|
||||
} else if (($rel['parent_type'] == NODE_GENERIC) && ($rel['child_type'] == NODE_GENERIC)) {
|
||||
$segregation_links['ff'][$index4] = $rel;
|
||||
$index4++;
|
||||
} else {
|
||||
$segregation_links['am'][$index3] = $rel;
|
||||
$index3++;
|
||||
}
|
||||
}
|
||||
|
||||
$final_links = [];
|
||||
|
||||
// ----------------------------------------------------------------
|
||||
// --------------------- Clean duplicate links --------------------
|
||||
// ----------------------------------------------------------------
|
||||
$duplicated = false;
|
||||
$index_to_del = 0;
|
||||
$index = 0;
|
||||
if (isset($segregation_links['aa']) === true
|
||||
&& is_array($segregation_links['aa']) === true
|
||||
) {
|
||||
foreach ($segregation_links['aa'] as $link) {
|
||||
foreach ($segregation_links['aa'] as $link2) {
|
||||
if ($link['id_parent'] == $link2['id_child']
|
||||
&& $link['id_child'] == $link2['id_parent']
|
||||
) {
|
||||
/*
|
||||
XXX: Verify
|
||||
* enterprise_hook(
|
||||
* 'delete_link',
|
||||
* [$segregation_links['aa'][$index_to_del]]
|
||||
* );
|
||||
*/
|
||||
unset($segregation_links['aa'][$index_to_del]);
|
||||
}
|
||||
|
||||
$index_to_del++;
|
||||
}
|
||||
|
||||
$final_links['aa'][$index] = $link;
|
||||
$index++;
|
||||
|
||||
$duplicated = false;
|
||||
$index_to_del = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$duplicated = false;
|
||||
$index_to_del = 0;
|
||||
$index2 = 0;
|
||||
if (isset($segregation_links['mm']) === true
|
||||
&& is_array($segregation_links['mm']) === true
|
||||
) {
|
||||
foreach ($segregation_links['mm'] as $link) {
|
||||
foreach ($segregation_links['mm'] as $link2) {
|
||||
if ($link['id_parent'] == $link2['id_child']
|
||||
&& $link['id_child'] == $link2['id_parent']
|
||||
) {
|
||||
/*
|
||||
XXX: Verify
|
||||
* enterprise_hook(
|
||||
* 'delete_link',
|
||||
* [$segregation_links['mm'][$index_to_del]]
|
||||
* );
|
||||
*/
|
||||
|
||||
unset($segregation_links['mm'][$index_to_del]);
|
||||
}
|
||||
|
||||
$index_to_del++;
|
||||
}
|
||||
|
||||
$final_links['mm'][$index2] = $link;
|
||||
$index2++;
|
||||
|
||||
$duplicated = false;
|
||||
$index_to_del = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$duplicated = false;
|
||||
$index_to_del = 0;
|
||||
$index3 = 0;
|
||||
|
||||
if (isset($segregation_links['ff']) === true
|
||||
&& is_array($segregation_links['ff']) === true
|
||||
) {
|
||||
foreach ($segregation_links['ff'] as $link) {
|
||||
foreach ($segregation_links['ff'] as $link2) {
|
||||
if ($link['id_parent'] == $link2['id_child']
|
||||
&& $link['id_child'] == $link2['id_parent']
|
||||
) {
|
||||
/*
|
||||
XXX: Verify
|
||||
* enterprise_hook(
|
||||
* 'delete_link',
|
||||
* [$segregation_links['ff'][$index_to_del]]
|
||||
* );
|
||||
*/
|
||||
unset($segregation_links['ff'][$index_to_del]);
|
||||
}
|
||||
|
||||
$index_to_del++;
|
||||
}
|
||||
|
||||
$final_links['ff'][$index3] = $link;
|
||||
$index3++;
|
||||
|
||||
$duplicated = false;
|
||||
$index_to_del = 0;
|
||||
}
|
||||
}
|
||||
|
||||
$final_links['am'] = $segregation_links['am'];
|
||||
|
||||
/*
|
||||
----------------------------------------------------------------
|
||||
----------------- AA, AM and MM links management ---------------
|
||||
------------------ Priority: -----------------------------------
|
||||
-------------------- 1 -> MM (module - module) -----------------
|
||||
-------------------- 2 -> AM (agent - module) ------------------
|
||||
-------------------- 3 -> AA (agent - agent) -------------------
|
||||
----------------------------------------------------------------
|
||||
*/
|
||||
|
||||
$final_links2 = [];
|
||||
$index = 0;
|
||||
$l3_link = [];
|
||||
$agent1 = 0;
|
||||
$agent2 = 0;
|
||||
|
||||
if (isset($final_links['mm']) === true
|
||||
&& is_array($final_links['mm']) === true
|
||||
) {
|
||||
foreach ($final_links['mm'] as $rel_mm) {
|
||||
$module_parent = $rel_mm['id_parent_source_data'];
|
||||
$module_children = $rel_mm['id_child_source_data'];
|
||||
$agent1 = (int) agents_get_agent_id_by_module_id(
|
||||
$module_parent
|
||||
);
|
||||
$agent2 = (int) agents_get_agent_id_by_module_id(
|
||||
$module_children
|
||||
);
|
||||
foreach ($final_links['aa'] as $key => $rel_aa) {
|
||||
$l3_link = $rel_aa;
|
||||
$id_p_source_data = (int) $rel_aa['id_parent_source_data'];
|
||||
$id_c_source_data = (int) $rel_aa['id_child_source_data'];
|
||||
if ((($id_p_source_data == $agent1)
|
||||
&& ($id_c_source_data == $agent2))
|
||||
|| (($id_p_source_data == $agent2)
|
||||
&& ($id_c_source_data == $agent1))
|
||||
) {
|
||||
enterprise_hook(
|
||||
'delete_link',
|
||||
[$final_links['aa'][$key]]
|
||||
);
|
||||
|
||||
unset($final_links['aa'][$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$final_links2['aa'] = $final_links['aa'];
|
||||
$final_links2['mm'] = $final_links['mm'];
|
||||
$final_links2['am'] = $final_links['am'];
|
||||
$final_links2['ff'] = $final_links['ff'];
|
||||
|
||||
$same_m = [];
|
||||
$index = 0;
|
||||
if (isset($final_links2['am']) === true
|
||||
&& is_array($final_links2['am']) === true
|
||||
) {
|
||||
foreach ($final_links2['am'] as $rel_am) {
|
||||
foreach ($final_links2['am'] as $rel_am2) {
|
||||
if (($rel_am['id_child_source_data'] == $rel_am2['id_child_source_data'])
|
||||
&& ($rel_am['id_parent_source_data'] != $rel_am2['id_parent_source_data'])
|
||||
) {
|
||||
$same_m[$index]['rel'] = $rel_am2;
|
||||
$same_m[$index]['agent_parent'] = $rel_am['id_parent_source_data'];
|
||||
$index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$final_links3 = [];
|
||||
$index = 0;
|
||||
$l3_link = [];
|
||||
$have_l3 = false;
|
||||
if (isset($final_links2['aa']) === true
|
||||
&& is_array($final_links2['aa']) === true
|
||||
) {
|
||||
foreach ($final_links2['aa'] as $key => $rel_aa) {
|
||||
$l3_link = $rel_aa;
|
||||
foreach ($same_m as $rel_am) {
|
||||
if ((($rel_aa['id_parent_source_data'] == $rel_am['parent']['id_parent_source_data'])
|
||||
&& ($rel_aa['id_child_source_data'] == $rel_am['rel']['id_parent_source_data']))
|
||||
|| (($rel_aa['id_child_source_data'] == $rel_am['parent']['id_parent_source_data'])
|
||||
&& ($rel_aa['id_parent_source_data'] == $rel_am['rel']['id_parent_source_data']))
|
||||
) {
|
||||
enterprise_hook(
|
||||
'delete_link',
|
||||
[$final_links2['aa'][$key]]
|
||||
);
|
||||
|
||||
unset($final_links2['aa'][$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$final_links3['aa'] = $final_links2['aa'];
|
||||
$final_links3['mm'] = $segregation_links['mm'];
|
||||
$final_links3['am'] = $segregation_links['am'];
|
||||
$final_links3['ff'] = $final_links2['ff'];
|
||||
|
||||
$cleaned_links = [];
|
||||
if (isset($final_links3['aa']) === true
|
||||
&& is_array($final_links3['aa']) === true
|
||||
) {
|
||||
foreach ($final_links3['aa'] as $link) {
|
||||
$cleaned_links[] = $link;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($final_links3['am']) === true
|
||||
&& is_array($final_links3['am']) === true
|
||||
) {
|
||||
foreach ($final_links3['am'] as $link) {
|
||||
$cleaned_links[] = $link;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($final_links3['mm']) === true
|
||||
&& is_array($final_links3['mm']) === true
|
||||
) {
|
||||
foreach ($final_links3['mm'] as $link) {
|
||||
$cleaned_links[] = $link;
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($final_links3['ff']) === true
|
||||
&& is_array($final_links3['ff']) === true
|
||||
) {
|
||||
foreach ($final_links3['ff'] as $link) {
|
||||
$cleaned_links[] = $link;
|
||||
}
|
||||
}
|
||||
|
||||
$this->graph['relations'] = $cleaned_links;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Internal method to allow developer to compare status from
|
||||
* different origins by checking a value.
|
||||
*
|
||||
* Greater value implies more critical.
|
||||
*
|
||||
* @param integer $status Status.
|
||||
*
|
||||
* @return integer Criticity value.
|
||||
*/
|
||||
private static function getStatusNumeric($status)
|
||||
{
|
||||
if (isset($status) === false) {
|
||||
return NO_CRIT;
|
||||
}
|
||||
|
||||
switch ($status) {
|
||||
case AGENT_MODULE_STATUS_NORMAL:
|
||||
case AGENT_STATUS_NORMAL:
|
||||
return CRIT_1;
|
||||
|
||||
case AGENT_MODULE_STATUS_NOT_INIT:
|
||||
case AGENT_STATUS_NOT_INIT:
|
||||
return CRIT_0;
|
||||
|
||||
case AGENT_MODULE_STATUS_CRITICAL_BAD:
|
||||
case AGENT_STATUS_CRITICAL:
|
||||
return CRIT_4;
|
||||
|
||||
case AGENT_MODULE_STATUS_WARNING:
|
||||
case AGENT_STATUS_WARNING:
|
||||
return CRIT_3;
|
||||
|
||||
case AGENT_MODULE_STATUS_CRITICAL_ALERT:
|
||||
case AGENT_MODULE_STATUS_WARNING_ALERT:
|
||||
case AGENT_STATUS_ALERT_FIRED:
|
||||
return CRIT_5;
|
||||
|
||||
case AGENT_MODULE_STATUS_UNKNOWN:
|
||||
case AGENT_STATUS_UNKNOWN:
|
||||
return CRIT_2;
|
||||
|
||||
default:
|
||||
// Ignored.
|
||||
break;
|
||||
}
|
||||
|
||||
return NO_CRIT;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns worst status from two received.
|
||||
* Agent and module statuses should be identical, unless little differences.
|
||||
*
|
||||
* @param integer $status_a Status A.
|
||||
* @param integer $status_b Status B.
|
||||
*
|
||||
* @return integer Status A or status B, the worstest one.
|
||||
*/
|
||||
public static function getWorstStatus($status_a, $status_b)
|
||||
{
|
||||
// Case agent statuses.
|
||||
$a = self::getStatusNumeric($status_a);
|
||||
$b = self::getStatusNumeric($status_b);
|
||||
|
||||
return ($a > $b) ? $status_a : $status_b;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns target color to be used based on the status received.
|
||||
*
|
||||
|
@ -1047,7 +1473,7 @@ class NetworkMap
|
|||
public static function getColorByStatus($status)
|
||||
{
|
||||
if (isset($status) === false) {
|
||||
return COL_IGNORED;
|
||||
return COL_UNKNOWN;
|
||||
}
|
||||
|
||||
switch ($status) {
|
||||
|
@ -1089,9 +1515,9 @@ class NetworkMap
|
|||
/**
|
||||
* Translates a standard node into a JS node with following attributes:
|
||||
*
|
||||
* @param array $node Input array (standard node structure).
|
||||
* @param array $nodes Input array (standard nodes structure).
|
||||
* id_map.
|
||||
* id_in_db.
|
||||
* id_db.
|
||||
* type.
|
||||
* source_data.
|
||||
* x.
|
||||
|
@ -1131,29 +1557,34 @@ class NetworkMap
|
|||
* map_id.
|
||||
* networkmap_id.
|
||||
*/
|
||||
public function nodeToJS($node)
|
||||
public function nodesToJS($nodes)
|
||||
{
|
||||
global $config;
|
||||
|
||||
$return = [];
|
||||
foreach ($nodes as $node) {
|
||||
$item = [];
|
||||
$item['id'] = $node['id'];
|
||||
|
||||
// Id titem.
|
||||
if (enterprise_installed()
|
||||
&& $this->map['__simulated'] === false
|
||||
) {
|
||||
$item['id_db'] = $node['id_db'];
|
||||
if ($node['deleted']) {
|
||||
// Skip deleted nodes.
|
||||
continue;
|
||||
}
|
||||
|
||||
$source_data = $this->getNodeData($node['id']);
|
||||
|
||||
if (enterprise_installed() && $simulated === false) {
|
||||
enterprise_include_once('include/functions_networkmap.php');
|
||||
$item['id_db'] = $node['id_in_db'];
|
||||
// Id titem.
|
||||
if ($this->map['__simulated'] === false) {
|
||||
$item['id_db'] = $node['id_db'];
|
||||
} else {
|
||||
$item['id_db'] = (int) $node['id'];
|
||||
}
|
||||
|
||||
// Get source data.
|
||||
$source_data = $this->getNodeData($node['id']);
|
||||
|
||||
if (is_array($node['style']) === false) {
|
||||
$node['style'] = json_decode($node['style'], true);
|
||||
}
|
||||
|
||||
$item['type'] = $node['type'];
|
||||
$item['fixed'] = true;
|
||||
$item['x'] = (int) $node['x'];
|
||||
|
@ -1170,7 +1601,7 @@ class NetworkMap
|
|||
$item['deleted'] = $node['deleted'];
|
||||
|
||||
// Node color.
|
||||
$item['color'] = $this->getColorByStatus($source_data['status']);
|
||||
$item['color'] = self::getColorByStatus($source_data['status']);
|
||||
switch ($node['type']) {
|
||||
case NODE_AGENT:
|
||||
$item['id_agent'] = $node['source_data'];
|
||||
|
@ -1241,20 +1672,30 @@ class NetworkMap
|
|||
$item['networkmap_id'] = $node['style']['id_networkmap'];
|
||||
}
|
||||
|
||||
return $item;
|
||||
$return[] = $item;
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Transforms an edge relationship into a JS array to be dumped.
|
||||
* Sets fields like status, link color and updates some internal identifiers
|
||||
* used by JS frontend.
|
||||
*
|
||||
* @param array $edge Edge information.
|
||||
* @param array $edges Edges information in array of following items.
|
||||
*
|
||||
* * Input structure:
|
||||
* id_map.
|
||||
* id_parent.
|
||||
* parent_type.
|
||||
* child_type.
|
||||
* id_parent_source_data.
|
||||
* id_child.
|
||||
* child_type.
|
||||
* id_child_source_data.
|
||||
* id_parent_agent.
|
||||
* id_child_agent.
|
||||
*
|
||||
* @return array Edge translated to JS object.
|
||||
*
|
||||
|
@ -1276,11 +1717,96 @@ class NetworkMap
|
|||
* text_start.
|
||||
* text_end.
|
||||
*/
|
||||
public function edgeToJS($edge)
|
||||
public function edgeToJS($edges)
|
||||
{
|
||||
// TODO: migrate networkmap_links_to_js_links here.
|
||||
hd($edge);
|
||||
return [];
|
||||
$return = [];
|
||||
// JS edge pseudo identificator.
|
||||
$i = 0;
|
||||
foreach ($edges as $rel) {
|
||||
$item = [];
|
||||
|
||||
// Simulated index.
|
||||
$item['id_db'] = $i;
|
||||
$item['deleted'] = 0;
|
||||
|
||||
// Else load.
|
||||
if (isset($this->map['__simulated']) === false) {
|
||||
$item['id_db'] = $rel['id_db'];
|
||||
$item['deleted'] = $rel['deleted'];
|
||||
$item['target_id_db'] = $this->nodes[$rel['id_parent']]['id'];
|
||||
$item['source_id_db'] = $this->nodes[$rel['id_child']]['id'];
|
||||
}
|
||||
|
||||
// Set relationship as 'agent' by default.
|
||||
// Generic and Pandora nodes simulates agent relationships.
|
||||
$item['arrow_start'] = 'agent';
|
||||
$item['arrow_end'] = 'agent';
|
||||
$item['source'] = $rel['id_parent'];
|
||||
$item['target'] = $rel['id_child'];
|
||||
$item['id_agent_start'] = $rel['id_child_agent'];
|
||||
$item['id_agent_end'] = $rel['id_parent_agent'];
|
||||
|
||||
if ($rel['parent_type'] === NODE_MODULE) {
|
||||
$item['arrow_start'] = 'module';
|
||||
$item['id_module_start'] = $rel['id_parent_source_data'];
|
||||
$item['status_start'] = modules_get_agentmodule_status(
|
||||
$item['id_module_start']
|
||||
);
|
||||
|
||||
// Extract interface name to be placed on edge.
|
||||
$text = modules_get_agentmodule_name(
|
||||
(int) $item['id_module_start']
|
||||
);
|
||||
if (preg_match(
|
||||
'/(.+)_ifOperStatus$/',
|
||||
(string) $text,
|
||||
$matches
|
||||
)
|
||||
) {
|
||||
if ($matches[1]) {
|
||||
$item['text_start'] = io_safe_output($matches[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($rel['child_type'] === NODE_MODULE) {
|
||||
$item['arrow_end'] = 'module';
|
||||
$item['id_module_end'] = $rel['id_child_source_data'];
|
||||
$item['status_end'] = modules_get_agentmodule_status(
|
||||
$item['id_module_end']
|
||||
);
|
||||
|
||||
// Extract interface name to be placed on edge.
|
||||
$text = modules_get_agentmodule_name(
|
||||
(int) $item['id_module_end']
|
||||
);
|
||||
if (preg_match(
|
||||
'/(.+)_ifOperStatus$/',
|
||||
(string) $text,
|
||||
$matches
|
||||
)
|
||||
) {
|
||||
if ($matches[1]) {
|
||||
$item['text_end'] = io_safe_output($matches[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Use worst case to set link color.
|
||||
$item['link_color'] = self::getColorByStatus(
|
||||
self::getWorstStatus(
|
||||
$item['status_start'],
|
||||
$item['status_end']
|
||||
)
|
||||
);
|
||||
|
||||
// Set direct values.
|
||||
$item['id'] = $i++;
|
||||
|
||||
$return[] = $item;
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1343,7 +1869,6 @@ class NetworkMap
|
|||
*/
|
||||
public function generateDotGraph($nodes=false)
|
||||
{
|
||||
echo 'regenerar la net es: '.$this->network.'<br />';
|
||||
if (!isset($this->dotGraph)) {
|
||||
// Generate dot file.
|
||||
$this->nodes = [];
|
||||
|
@ -1457,8 +1982,8 @@ class NetworkMap
|
|||
foreach ($this->nodes as $k => $item) {
|
||||
$target = $this->calculateRelations($k);
|
||||
|
||||
// Adopt orphans.
|
||||
if (empty($target)) {
|
||||
// Adopt all orphan nodes but pandora one.
|
||||
if (empty($target) && $item['id_node'] != 0) {
|
||||
$rel = [];
|
||||
$rel['id_parent'] = 0;
|
||||
$rel['id_child'] = $item['id_node'];
|
||||
|
@ -1530,8 +2055,8 @@ class NetworkMap
|
|||
// Graph definition.
|
||||
$fields = explode(' ', $line);
|
||||
|
||||
$this->map['width'] = ($fields[2] * 100);
|
||||
$this->map['height'] = ($fields[3] * 100);
|
||||
$this->map['width'] = 0;
|
||||
$this->map['height'] = 0;
|
||||
} else if (preg_match('/^node.*$/', $line) != 0) {
|
||||
// Node.
|
||||
$fields = explode(' ', $line);
|
||||
|
@ -1866,17 +2391,19 @@ class NetworkMap
|
|||
'id_parent_agent' => $rel['id_parent_agent'],
|
||||
'id_child_agent' => $rel['id_child_agent'],
|
||||
];
|
||||
if ($rel['id_child_agent'] == 103 || $rel['id_parent_agent'] == 103) {
|
||||
hd($tmp);
|
||||
}
|
||||
|
||||
// Avoid child - parent - parent -child relation duplicated.
|
||||
// Avoid [child - parent] : [parent - child] relation duplicates.
|
||||
$found = 0;
|
||||
if (is_array($parents[$tmp['id_parent_source_data']])) {
|
||||
foreach ($parents[$tmp['id_parent_source_data']] as $k) {
|
||||
if ($k == $tmp['id_child_source_data']) {
|
||||
$found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$parents[$tmp['id_parent_source_data']] = [];
|
||||
}
|
||||
|
||||
if ($found == 0) {
|
||||
$parents[$tmp['id_child_source_data']][] = $tmp['id_parent_source_data'];
|
||||
|
@ -1884,16 +2411,14 @@ class NetworkMap
|
|||
}
|
||||
}
|
||||
|
||||
hd($parents);
|
||||
|
||||
// Save data.
|
||||
if ($this->idMap > 0 && (!isset($this->map['__simulated']))) {
|
||||
// TODO: REMOVE '!'.
|
||||
if (!enterprise_installed()) {
|
||||
$nodes_and_relations = enterprise_hook(
|
||||
if (enterprise_installed()) {
|
||||
$graph = enterprise_hook(
|
||||
'save_generate_nodes',
|
||||
[
|
||||
$this->idMap,
|
||||
$nodes_and_relations,
|
||||
$graph,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
@ -1919,7 +2444,6 @@ class NetworkMap
|
|||
}
|
||||
|
||||
$this->graph = $graph;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -1952,9 +2476,8 @@ class NetworkMap
|
|||
];
|
||||
}
|
||||
|
||||
$this->graph['relations'] = clean_duplicate_links(
|
||||
$this->graph['relations']
|
||||
);
|
||||
// Prioritize relations between same nodes.
|
||||
$this->cleanGraphRelations();
|
||||
|
||||
// Print some params to handle it in js.
|
||||
html_print_input_hidden('product_name', get_product_name());
|
||||
|
@ -1999,95 +2522,28 @@ class NetworkMap
|
|||
$output .= 'var node_radius = '.$networkmap['filter']['node_radius'].";\n";
|
||||
$output .= 'var networkmap_holding_area_dimensions = '.json_encode($networkmap['filter']['holding_area']).";\n";
|
||||
$output .= "var networkmap = {'nodes': [], 'links': []};\n";
|
||||
$nodes = $this->graph['nodes'];
|
||||
|
||||
if (empty($nodes)) {
|
||||
// Init.
|
||||
$count_item_holding_area = 0;
|
||||
$count = 0;
|
||||
|
||||
// Translate nodes to JS Nodes.
|
||||
$nodes = $this->graph['nodes'];
|
||||
if (is_array($nodes) === false) {
|
||||
$nodes = [];
|
||||
}
|
||||
|
||||
$count_item_holding_area = 0;
|
||||
$count = 0;
|
||||
$nodes_graph = [];
|
||||
|
||||
foreach ($nodes as $key => $node) {
|
||||
$style = json_decode($node['style'], true);
|
||||
$node['style'] = json_decode($node['style'], true);
|
||||
|
||||
// Only agents can be show.
|
||||
if (isset($node['type'])) {
|
||||
if ($node['type'] == 1) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
$node['type'] = '';
|
||||
}
|
||||
|
||||
$item = $this->nodeToJS(
|
||||
$node
|
||||
);
|
||||
|
||||
/*
|
||||
* $count,
|
||||
* $count_item_holding_area,
|
||||
* $simulate
|
||||
*/
|
||||
|
||||
if ($item['deleted']) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$output .= 'networkmap.nodes.push('.json_encode($item).");\n";
|
||||
$nodes_graph[$item['id']] = $item;
|
||||
}
|
||||
$nodes_js = $this->nodesToJS($nodes);
|
||||
$output .= 'networkmap.nodes = ('.json_encode($nodes_js).");\n";
|
||||
|
||||
// Translate edges to js links.
|
||||
$relations = $this->graph['relations'];
|
||||
|
||||
if ($relations === false) {
|
||||
if (is_array($relations) === false) {
|
||||
$relations = [];
|
||||
}
|
||||
|
||||
// Clean the relations and transform the module relations into
|
||||
// interfaces.
|
||||
networkmap_clean_relations_for_js($relations);
|
||||
|
||||
$links_js = networkmap_links_to_js_links(
|
||||
$relations,
|
||||
$nodes_graph,
|
||||
$simulate
|
||||
);
|
||||
|
||||
$array_aux = [];
|
||||
foreach ($links_js as $link_js) {
|
||||
if ($link_js['deleted']) {
|
||||
unset($links_js[$link_js['id']]);
|
||||
}
|
||||
|
||||
if ($link_js['target'] == -1) {
|
||||
unset($links_js[$link_js['id']]);
|
||||
}
|
||||
|
||||
if ($link_js['source'] == -1) {
|
||||
unset($links_js[$link_js['id']]);
|
||||
}
|
||||
|
||||
if ($link_js['target'] == $link_js['source']) {
|
||||
unset($links_js[$link_js['id']]);
|
||||
}
|
||||
|
||||
if ($link_js['arrow_start'] == 'module' && $link_js['arrow_end'] == 'module') {
|
||||
$output .= 'networkmap.links.push('.json_encode($link_js).");\n";
|
||||
$array_aux[$link_js['id_agent_start']] = 1;
|
||||
unset($links_js[$link_js['id']]);
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($links_js as $link_js) {
|
||||
if (($link_js['id_agent_end'] === 0) && $array_aux[$link_js['id_agent_start']] === 1) {
|
||||
continue;
|
||||
} else {
|
||||
$output .= 'networkmap.links.push('.json_encode($link_js).");\n";
|
||||
}
|
||||
}
|
||||
$links_js = $this->edgeToJS($relations);
|
||||
$output .= 'networkmap.links = ('.json_encode($links_js).");\n";
|
||||
|
||||
$output .= '
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -195,6 +195,14 @@ define('AGENT_STATUS_UNKNOWN', 3);
|
|||
define('AGENT_STATUS_ALERT_FIRED', 4);
|
||||
define('AGENT_STATUS_WARNING', 2);
|
||||
|
||||
// Pseudo criticity analysis.
|
||||
define('NO_CRIT', -1);
|
||||
define('CRIT_0', 0);
|
||||
define('CRIT_1', 1);
|
||||
define('CRIT_2', 2);
|
||||
define('CRIT_3', 3);
|
||||
define('CRIT_4', 4);
|
||||
define('CRIT_5', 5);
|
||||
|
||||
// Visual maps contants.
|
||||
// The items kind.
|
||||
|
|
|
@ -1889,8 +1889,8 @@ function networkmap_links_to_js_links(
|
|||
}
|
||||
}
|
||||
}
|
||||
} else if (($relation['parent_type'] == NODE_GENERIC)
|
||||
&& ($relation['child_type'] == NODE_GENERIC)
|
||||
} else if (($relation['parent_type'] == NODE_PANDORA)
|
||||
&& ($relation['child_type'] == NODE_PANDORA)
|
||||
) {
|
||||
foreach ($nodes_graph as $key2 => $node) {
|
||||
if ($relation['id_parent'] == $node['id_db']) {
|
||||
|
@ -1903,10 +1903,10 @@ function networkmap_links_to_js_links(
|
|||
$agent2 = $node['id_db'];
|
||||
}
|
||||
}
|
||||
} else if (($relation['parent_type'] == NODE_GENERIC)
|
||||
|| ($relation['child_type'] == NODE_GENERIC)
|
||||
} else if (($relation['parent_type'] == NODE_PANDORA)
|
||||
|| ($relation['child_type'] == NODE_PANDORA)
|
||||
) {
|
||||
if ($relation['parent_type'] == NODE_GENERIC) {
|
||||
if ($relation['parent_type'] == NODE_PANDORA) {
|
||||
foreach ($nodes_graph as $key2 => $node) {
|
||||
if ($relation['id_parent'] == $node['id_db']) {
|
||||
$agent = $node['id_db'];
|
||||
|
@ -1914,7 +1914,7 @@ function networkmap_links_to_js_links(
|
|||
$agent2 = $node['id_db'];
|
||||
}
|
||||
}
|
||||
} else if ($relation['child_type'] == NODE_GENERIC) {
|
||||
} else if ($relation['child_type'] == NODE_PANDORA) {
|
||||
foreach ($nodes_graph as $key2 => $node) {
|
||||
if ($relation['id_child'] == $node['id_db']) {
|
||||
$agent2 = $node['id_db'];
|
||||
|
|
Loading…
Reference in New Issue