ITSM pandora_enterprise#11471
This commit is contained in:
parent
a7baab0aba
commit
ecfa71b43c
|
@ -26,6 +26,8 @@
|
|||
* ============================================================================
|
||||
*/
|
||||
|
||||
use PandoraFMS\ITSM\ITSM;
|
||||
|
||||
global $config;
|
||||
|
||||
check_login();
|
||||
|
@ -44,59 +46,9 @@ if (! check_acl($config['id_user'], $id_grupo, 'AW', $id_agente)) {
|
|||
return;
|
||||
}
|
||||
|
||||
\ui_require_css_file('pandoraitsm');
|
||||
\ui_require_javascript_file('ITSM');
|
||||
|
||||
$agent = db_get_row('tagente', 'id_agente', $id_agente, false, false);
|
||||
|
||||
try {
|
||||
$columns = [
|
||||
'idIncidence',
|
||||
'title',
|
||||
'groupCompany',
|
||||
'statusResolution',
|
||||
'priority',
|
||||
'updateDate',
|
||||
'startDate',
|
||||
'idCreator',
|
||||
'owner',
|
||||
];
|
||||
|
||||
$column_names = [
|
||||
__('ID'),
|
||||
__('Title'),
|
||||
__('Group').'/'.__('Company'),
|
||||
__('Status').'/'.__('Resolution'),
|
||||
__('Priority'),
|
||||
__('Updated'),
|
||||
__('Started'),
|
||||
__('Creator'),
|
||||
__('Owner'),
|
||||
];
|
||||
|
||||
ui_print_datatable(
|
||||
[
|
||||
'id' => 'itms_list_tickets',
|
||||
'class' => 'info_table',
|
||||
'style' => 'width: 99%',
|
||||
'columns' => $columns,
|
||||
'column_names' => $column_names,
|
||||
'ajax_url' => 'operation/ITSM/itsm',
|
||||
'ajax_data' => [
|
||||
'method' => 'getListTickets',
|
||||
'externalIdLike' => $config['metaconsole_node_id'].'-'.$agent['id_agente'],
|
||||
],
|
||||
'no_sortable_columns' => [
|
||||
2,
|
||||
3,
|
||||
-1,
|
||||
],
|
||||
'order' => [
|
||||
'field' => 'updateDate',
|
||||
'direction' => 'desc',
|
||||
],
|
||||
]
|
||||
);
|
||||
$ITSM = new ITSM();
|
||||
echo $ITSM->getTableIncidencesForAgent($id_agente);
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage();
|
||||
}
|
||||
|
|
|
@ -39,6 +39,7 @@ ui_require_javascript_file('encode_decode_base64');
|
|||
ui_require_css_file('agent_manager');
|
||||
|
||||
use PandoraFMS\Event;
|
||||
use PandoraFMS\ITSM\ITSM;
|
||||
|
||||
check_login();
|
||||
|
||||
|
@ -605,20 +606,6 @@ if ($id_agente) {
|
|||
$agent_wizard['active'] = false;
|
||||
}
|
||||
|
||||
// Incident tab.
|
||||
if ((bool) $config['ITSM_enabled'] === true) {
|
||||
$incidenttab['text'] = html_print_menu_button(
|
||||
[
|
||||
'href' => 'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=incident&id_agente='.$id_agente,
|
||||
'image' => 'images/logs@svg.svg',
|
||||
'title' => __('Incidents'),
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$incidenttab['active'] = ($tab === 'incident');
|
||||
}
|
||||
|
||||
if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === true) {
|
||||
if ($has_remote_conf !== false) {
|
||||
$agent_name = agents_get_name($id_agente);
|
||||
|
|
|
@ -800,12 +800,13 @@ $(document).ready (function () {
|
|||
old_recovery_value = '<?php echo io_safe_output($config['incident_status']); ?>';
|
||||
}
|
||||
} else if (i === 7) {
|
||||
var text = '<?php echo $config['incident_content']; ?>';
|
||||
if(!old_value) {
|
||||
old_value = '<?php echo io_safe_output($config['incident_content']); ?>';
|
||||
old_value = text;
|
||||
}
|
||||
|
||||
if(!old_recovery_value) {
|
||||
old_recovery_value = '<?php echo io_safe_output($config['incident_content']); ?>';
|
||||
old_recovery_value = text;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1979,15 +1979,15 @@ function config_update_config()
|
|||
$text_incident_content = (string) get_parameter('incident_content', $config['incident_content']);
|
||||
if (empty($text_incident_content) === true) {
|
||||
$text_incident_content = sprintf(
|
||||
'Hello,
|
||||
|
||||
A new ticket has been created due a problem in monitoring.
|
||||
|
||||
Agent : _agent_
|
||||
Module: _module_
|
||||
|
||||
Regards,
|
||||
Your %s server.',
|
||||
'Hello, %s %s A new ticket has been created due a problem in monitoring. %s %s Agent : _agent_ %s Module: _module_ %s %s Regards, %s Your %s server.',
|
||||
PHP_EOL,
|
||||
PHP_EOL,
|
||||
PHP_EOL,
|
||||
PHP_EOL,
|
||||
PHP_EOL,
|
||||
PHP_EOL,
|
||||
PHP_EOL,
|
||||
PHP_EOL,
|
||||
get_product_name()
|
||||
);
|
||||
}
|
||||
|
|
|
@ -257,6 +257,10 @@ class ITSM
|
|||
$path = '/customSearch/'.$id;
|
||||
break;
|
||||
|
||||
case 'inventory':
|
||||
$path = '/inventory/'.$id;
|
||||
break;
|
||||
|
||||
default:
|
||||
// Not posible.
|
||||
break;
|
||||
|
@ -436,4 +440,99 @@ class ITSM
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* List incidences.
|
||||
*
|
||||
* @param integer $idAgent Agent id.
|
||||
*
|
||||
* @return array list Incidences.
|
||||
*/
|
||||
public function listIncidenceAgents(int $idAgent): array
|
||||
{
|
||||
global $config;
|
||||
$listIncidences = $this->callApi(
|
||||
'listTickets',
|
||||
[
|
||||
'page' => 0,
|
||||
'sizePage' => 0,
|
||||
],
|
||||
['externalIdLike' => $config['metaconsole_node_id'].'-'.$idAgent]
|
||||
);
|
||||
|
||||
return $listIncidences['data'];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get table incicidences for agent.
|
||||
*
|
||||
* @param integer $idAgent Id agent.
|
||||
* @param boolean|null $mini visual mode mini.
|
||||
* @param integer|null $blocked Blocked.
|
||||
*
|
||||
* @return string Html output.
|
||||
*/
|
||||
public function getTableIncidencesForAgent(int $idAgent, ?bool $mini=false, ?int $blocked=null)
|
||||
{
|
||||
\ui_require_css_file('pandoraitsm');
|
||||
\ui_require_javascript_file('ITSM');
|
||||
|
||||
global $config;
|
||||
$columns = [
|
||||
'idIncidence',
|
||||
'title',
|
||||
'groupCompany',
|
||||
'statusResolution',
|
||||
'priority',
|
||||
'updateDate',
|
||||
'startDate',
|
||||
'idCreator',
|
||||
'owner',
|
||||
];
|
||||
|
||||
$column_names = [
|
||||
__('ID'),
|
||||
__('Title'),
|
||||
__('Group').'/'.__('Company'),
|
||||
__('Status').'/'.__('Resolution'),
|
||||
__('Priority'),
|
||||
__('Updated'),
|
||||
__('Started'),
|
||||
__('Creator'),
|
||||
__('Owner'),
|
||||
];
|
||||
|
||||
$options = [
|
||||
'id' => 'itms_list_tickets',
|
||||
'class' => 'info_table',
|
||||
'style' => 'width: 99%',
|
||||
'columns' => $columns,
|
||||
'column_names' => $column_names,
|
||||
'ajax_url' => 'operation/ITSM/itsm',
|
||||
'ajax_data' => [
|
||||
'method' => 'getListTickets',
|
||||
'externalIdLike' => $config['metaconsole_node_id'].'-'.$idAgent,
|
||||
'blocked' => $blocked,
|
||||
],
|
||||
'no_sortable_columns' => [
|
||||
2,
|
||||
3,
|
||||
-1,
|
||||
],
|
||||
'order' => [
|
||||
'field' => 'updateDate',
|
||||
'direction' => 'desc',
|
||||
],
|
||||
'return' => true,
|
||||
];
|
||||
|
||||
if ($mini === true) {
|
||||
$options['csv'] = 0;
|
||||
$options['dom_elements'] = 'frtip';
|
||||
}
|
||||
|
||||
return ui_print_datatable($options);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -325,6 +325,7 @@ class Manager
|
|||
$users = null;
|
||||
$priorities = null;
|
||||
$priorityDiv = null;
|
||||
$inventories = null;
|
||||
$ITSM = new ITSM();
|
||||
try {
|
||||
if (empty($idIncidence) === false) {
|
||||
|
@ -390,7 +391,16 @@ class Manager
|
|||
|
||||
$users = $this->getUsers($ITSM, $usersInvolved);
|
||||
|
||||
$inventories = [];
|
||||
$priorityDiv = $this->priorityDiv($incidence['priority'], $priorities[$incidence['priority']]);
|
||||
if (empty($incidence) === false
|
||||
&& isset($incidence['inventories']) === true
|
||||
&& empty($incidence['inventories']) === false
|
||||
) {
|
||||
foreach ($incidence['inventories'] as $inventory) {
|
||||
$inventories[] = $this->getInventory($ITSM, $inventory['idInventory']);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (\Throwable $th) {
|
||||
$error = $th->getMessage();
|
||||
|
@ -414,6 +424,7 @@ class Manager
|
|||
'priorities' => $priorities,
|
||||
'priorityDiv' => $priorityDiv,
|
||||
'headerTabs' => $headerTabs,
|
||||
'inventories' => $inventories,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
@ -855,6 +866,28 @@ class Manager
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get Inventory.
|
||||
*
|
||||
* @param ITSM $ITSM Object for callApi.
|
||||
* @param integer $idInventory Inventory ID.
|
||||
*
|
||||
* @return array Data inventory
|
||||
*/
|
||||
private function getInventory(ITSM $ITSM, int $idInventory): array
|
||||
{
|
||||
$result = $ITSM->callApi(
|
||||
'inventory',
|
||||
[],
|
||||
[],
|
||||
$idInventory,
|
||||
'GET'
|
||||
);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get Incidences group by for groups.
|
||||
*
|
||||
|
@ -1113,6 +1146,11 @@ class Manager
|
|||
$filters['externalIdLike'] = $externalIdLike;
|
||||
}
|
||||
|
||||
$blocked = get_parameter('blocked', null);
|
||||
if (isset($blocked) === true) {
|
||||
$filters['blocked'] = $blocked;
|
||||
}
|
||||
|
||||
if (isset($filters['status']) === true && empty($filters['status']) === true) {
|
||||
unset($filters['status']);
|
||||
}
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
* ============================================================================
|
||||
*/
|
||||
|
||||
use PandoraFMS\ITSM\ITSM;
|
||||
|
||||
// Begin.
|
||||
global $config;
|
||||
|
||||
|
@ -944,6 +946,46 @@ if (empty($agentAdditionalInfo) === false) {
|
|||
);
|
||||
}
|
||||
|
||||
if ((bool) $config['ITSM_enabled'] === true) {
|
||||
$show_tab_issue = false;
|
||||
try {
|
||||
$ITSM = new ITSM();
|
||||
$list = $ITSM->listIncidenceAgents($id_agente);
|
||||
if (empty($list) === false) {
|
||||
$show_tab_issue = true;
|
||||
}
|
||||
} catch (\Throwable $th) {
|
||||
$show_tab_issue = false;
|
||||
}
|
||||
|
||||
if ($show_tab_issue === true) {
|
||||
try {
|
||||
$table_itsm = $ITSM->getTableIncidencesForAgent($id_agente, true, 0);
|
||||
} catch (Exception $e) {
|
||||
$table_itsm = $e->getMessage();
|
||||
}
|
||||
|
||||
$itsmInfo = ui_toggle(
|
||||
$table_itsm,
|
||||
'<span class="subsection_header_title">'.__('Incidences').'</span>',
|
||||
'status_monitor_agent',
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
'',
|
||||
'white-box-content',
|
||||
'box-flat white_table_graph w100p'
|
||||
);
|
||||
|
||||
html_print_div(
|
||||
[
|
||||
'class' => 'agent_details_line',
|
||||
'content' => $itsmInfo,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($agentIncidents) === false) {
|
||||
html_print_div(
|
||||
[
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
*/
|
||||
|
||||
use PandoraFMS\Enterprise\Metaconsole\Node;
|
||||
use PandoraFMS\ITSM\ITSM;
|
||||
|
||||
global $config;
|
||||
|
||||
|
@ -1558,16 +1559,29 @@ if ((bool) $config['activate_gis'] === true) {
|
|||
|
||||
// Incident tab.
|
||||
if ((bool) $config['ITSM_enabled'] === true) {
|
||||
$incidenttab['text'] = html_print_menu_button(
|
||||
[
|
||||
'href' => 'index.php?sec=gagente&sec2=operation/agentes/ver_agente&tab=incident&id_agente='.$id_agente,
|
||||
'image' => 'images/logs@svg.svg',
|
||||
'title' => __('Incidents'),
|
||||
],
|
||||
true
|
||||
);
|
||||
$show_tab_issue = false;
|
||||
try {
|
||||
$ITSM = new ITSM();
|
||||
$list = $ITSM->listIncidenceAgents($id_agente);
|
||||
if (empty($list) === false) {
|
||||
$show_tab_issue = true;
|
||||
}
|
||||
} catch (\Throwable $th) {
|
||||
$show_tab_issue = false;
|
||||
}
|
||||
|
||||
$incidenttab['active'] = ($tab === 'incident');
|
||||
if ($show_tab_issue === true) {
|
||||
$incidenttab['text'] = html_print_menu_button(
|
||||
[
|
||||
'href' => 'index.php?sec=gagente&sec2=operation/agentes/ver_agente&tab=incident&id_agente='.$id_agente,
|
||||
'image' => 'images/logs@svg.svg',
|
||||
'title' => __('Incidents'),
|
||||
],
|
||||
true
|
||||
);
|
||||
|
||||
$incidenttab['active'] = ($tab === 'incident');
|
||||
}
|
||||
}
|
||||
|
||||
// Url address tab.
|
||||
|
|
|
@ -52,6 +52,8 @@ ui_print_standard_header(
|
|||
]
|
||||
);
|
||||
|
||||
hd($inventories);
|
||||
|
||||
if (empty($error) === false) {
|
||||
ui_print_error_message($error);
|
||||
}
|
||||
|
@ -190,7 +192,7 @@ if (empty($incidence) === true) {
|
|||
|
||||
// Show description.
|
||||
$description_box = '<div class="ITSM_details_description">';
|
||||
$description_box .= $incidence['description'];
|
||||
$description_box .= str_replace("\r\n", '</br>', $incidence['description']);
|
||||
$description_box .= '</div>';
|
||||
ui_toggle($description_box, __('Description'), '', '', false);
|
||||
|
||||
|
|
|
@ -1932,7 +1932,8 @@ sub pandora_execute_action ($$$$$$$$$;$$) {
|
|||
'IP Address' => safe_output($agent->{'direccion'}),
|
||||
'URL Address' => safe_output($agent->{'url_address'}),
|
||||
'ID Agent' => $agent->{'id_agente'},
|
||||
'Group' => safe_output(get_db_value($dbh, 'select nombre from tgrupo where id_grupo = ?', $agent->{'id_grupo'}))
|
||||
'Group' => safe_output(get_db_value($dbh, 'select nombre from tgrupo where id_grupo = ?', $agent->{'id_grupo'})),
|
||||
'OS Version' => $agent->{'os_version'}
|
||||
);
|
||||
|
||||
my %dataSend = (
|
||||
|
@ -1948,11 +1949,6 @@ sub pandora_execute_action ($$$$$$$$$;$$) {
|
|||
'createWu' => $action->{'create_wu_integria'}
|
||||
);
|
||||
|
||||
# TODO: change to logger.
|
||||
use Data::Dumper;
|
||||
$Data::Dumper::SortKeys = 1;
|
||||
print Dumper(\%dataSend);
|
||||
|
||||
my $response = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/pandorafms/alert', $ITSM_token, \%dataSend);
|
||||
if (!defined($response)){
|
||||
return;
|
||||
|
@ -3878,6 +3874,32 @@ sub pandora_get_custom_field_for_itsm ($$) {
|
|||
return \%result;
|
||||
}
|
||||
|
||||
sub pandora_prepare_info_object_inventory_itsm ($) {
|
||||
my ($dbh) = @_;
|
||||
my $custom_fields = pandora_get_custom_fields($dbh);
|
||||
|
||||
my $sql = 'SELECT tagente.alias, tagente.id_agente AS "ID Agent", tagente.os_version AS "OS Version", tagente.direccion AS "IP Address",';
|
||||
$sql .= ' tagente.url_address AS "URL Address", tgrupo.nombre AS "Group", tconfig_os.name AS "OS",';
|
||||
|
||||
foreach my $field (@{$custom_fields}) {
|
||||
$sql .= ' case when tagent_custom_fields.name = "'. $field->{'name'} . '" then tagent_custom_data.description end AS "'. $field->{'name'} . '",';
|
||||
}
|
||||
|
||||
$sql = substr($sql, 0, -1);
|
||||
|
||||
$sql .= ' FROM tagent_custom_fields';
|
||||
$sql .= ' INNER JOIN tagent_custom_data ON tagent_custom_data.id_field = tagent_custom_fields.id_field';
|
||||
$sql .= ' RIGHT JOIN tagente ON tagent_custom_data.id_agent = tagente.id_agente';
|
||||
$sql .= ' INNER JOIN tgrupo ON tgrupo.id_grupo = tagente.id_grupo';
|
||||
$sql .= ' INNER JOIN tconfig_os ON tconfig_os.id_os = tagente.id_os';
|
||||
$sql .= ' GROUP BY tagente.id_agente';
|
||||
$sql .= ' ORDER BY tagente.id_agente';
|
||||
|
||||
my @result = get_db_rows($dbh, $sql);
|
||||
|
||||
return \@result;
|
||||
}
|
||||
|
||||
##########################################################################
|
||||
## Update a custom field from agent of tagent_custom_data
|
||||
##########################################################################
|
||||
|
@ -7019,8 +7041,8 @@ sub pandora_API_ITSM_call ($$$$$) {
|
|||
}
|
||||
}
|
||||
|
||||
sub pandora_sync_agents_integria ($) {
|
||||
my ($dbh) = @_;
|
||||
sub pandora_sync_agents_integria ($$) {
|
||||
my ($pa_config, $dbh) = @_;
|
||||
|
||||
my $config_ITSM_enabled = pandora_get_tconfig_token ($dbh, 'ITSM_enabled', '');
|
||||
|
||||
|
@ -7028,44 +7050,23 @@ sub pandora_sync_agents_integria ($) {
|
|||
return;
|
||||
}
|
||||
|
||||
my $config_api_path = pandora_get_tconfig_token ($dbh, 'ITSM_hostname', '');
|
||||
my $config_integria_user_pass = pandora_get_tconfig_token ($dbh, 'ITSM_token', '');
|
||||
my $ITSM_path = pandora_get_tconfig_token ($dbh, 'ITSM_hostname', '');
|
||||
my $ITSM_token = pandora_get_tconfig_token ($dbh, 'ITSM_token', '');
|
||||
|
||||
my $api_path = $config_api_path;
|
||||
|
||||
my @agents_string = '';
|
||||
my @agents = get_db_rows ($dbh, 'SELECT * FROM tagente');
|
||||
|
||||
my @agents_array = ();
|
||||
my $agents_string = '';
|
||||
my %dataAgents = (
|
||||
'agents' => pandora_prepare_info_object_inventory_itsm($dbh),
|
||||
'idNode' => pandora_get_tconfig_token($dbh, 'metaconsole_node_id', 0)
|
||||
);
|
||||
|
||||
foreach my $agent (@agents) {
|
||||
push @agents_array, $agent->{'nombre'} .
|
||||
"|;|" .
|
||||
$agent->{'alias'} .
|
||||
"|;|" .
|
||||
$agent->{'id_os'} .
|
||||
"|;|" .
|
||||
$agent->{'direccion'} .
|
||||
"|;|" .
|
||||
$agent->{'id_grupo'};
|
||||
}
|
||||
# TODO: change to logger.
|
||||
#use Data::Dumper;
|
||||
#$Data::Dumper::SortKeys = 1;
|
||||
#print Dumper(\%dataAgents);
|
||||
|
||||
my $ua = LWP::UserAgent->new();
|
||||
my $response = $ua->post( $api_path, {
|
||||
'user_pass' => $config_integria_user_pass,
|
||||
'op' => 'sync_pandora_agents_inventory',
|
||||
'params[]' => [@agents_array],
|
||||
'token' => '|;|'
|
||||
});
|
||||
|
||||
my $content = $response->decoded_content();
|
||||
|
||||
if (defined $content && is_numeric($content) && $content ne "-1") {
|
||||
return $content;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
my $response = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/pandorafms/agents', $ITSM_token, \%dataAgents);
|
||||
if (!defined($response)){
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1397,7 +1397,7 @@ if (defined($history_dbh)) {
|
|||
}
|
||||
|
||||
# Keep integrity between PandoraFMS agents and Pandora ITSM inventory objects.
|
||||
pandora_sync_agents_integria($dbh);
|
||||
#pandora_sync_agents_integria($dbh);
|
||||
|
||||
# Cleanup and exit
|
||||
db_disconnect ($history_dbh) if defined ($history_dbh);
|
||||
|
|
Loading…
Reference in New Issue