ITSM pandora_enterprise#11471

This commit is contained in:
daniel 2023-08-11 14:30:18 +02:00
parent 7f82273dc4
commit dbf98689c2
13 changed files with 588 additions and 326 deletions

View File

@ -87,8 +87,6 @@ INSERT INTO `tmodule_inventory` (`id_module_inventory`, `id_os`, `name`, `descri
ALTER TABLE `treport_content` ADD COLUMN `period_range` INT NULL DEFAULT 0 AFTER `period`;
ALTER TABLE `tusuario` MODIFY COLUMN `integria_user_level_pass` TEXT;
CREATE TABLE IF NOT EXISTS `tevent_comment` (
`id` serial PRIMARY KEY,
`id_event` BIGINT UNSIGNED NOT NULL,

View File

@ -1,19 +1,34 @@
<?php
/**
* Alerts commands.
*
* @category Alerts
* @package Pandora FMS
* @subpackage Opensource
* @version 1.0.0
* @license See below
*
* ______ ___ _______ _______ ________
* | __ \.-----.--.--.--| |.-----.----.-----. | ___| | | __|
* | __/| _ | | _ || _ | _| _ | | ___| |__ |
* |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______|
*
* ============================================================================
* Copyright (c) 2005-2023 Pandora FMS
* Please see https://pandorafms.com/community/ for full contribution list
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation for version 2.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* ============================================================================
*/
// Pandora FMS - https://pandorafms.com
// ==================================================
// Copyright (c) 2005-2023 Pandora FMS
// Please see https://pandorafms.com/community/ for full contribution list
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation for version 2.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// Load global vars.
use PandoraFMS\ITSM\ITSM;
// Load global vars.
global $config;
require_once $config['homedir'].'/include/functions_alerts.php';
@ -53,9 +68,9 @@ if (is_ajax()) {
$get_recovery_fields = (int) get_parameter('get_recovery_fields', 1);
// Snmp alerts are not in the metaconsole so they cannot be centralized.
$is_management_allowed = false;
$management_is_not_allowed = false;
if ($get_recovery_fields !== 0) {
$is_management_allowed = !is_management_allowed();
$management_is_not_allowed = !is_management_allowed();
}
// If command ID is not provided, check for action id.
@ -137,6 +152,17 @@ if (is_ajax()) {
$style = ((int) $field_hidden === 1) ? '-webkit-text-security: disc; font-family: text-security-disc;' : '';
$recovery_disabled = 0;
if (empty($command) === false && $command['name'] === io_safe_input('Integria IMS Ticket')) {
if ($management_is_not_allowed == 0) {
if (preg_match('/^_html_editor_$/i', $field_value) || $field_description === 'Ticket status') {
$recovery_disabled = 0;
} else {
$recovery_disabled = 1;
}
}
}
if (!empty($field_value)) {
$field_value = io_safe_output($field_value);
// HTML type.
@ -152,7 +178,7 @@ if (is_ajax()) {
0,
'',
false,
$is_management_allowed,
$management_is_not_allowed,
"UndefineTinyMCE('#textarea_field".$i."_value')",
'',
true
@ -164,7 +190,7 @@ if (is_ajax()) {
0,
'',
true,
$is_management_allowed,
$management_is_not_allowed,
"defineTinyMCE('#textarea_field".$i."_value')",
'',
true
@ -179,7 +205,7 @@ if (is_ajax()) {
'class="fields w100p"',
true,
'',
$is_management_allowed
$management_is_not_allowed
);
$editor_type_chkbx = '<div id="command_div"><b><small>';
@ -189,7 +215,7 @@ if (is_ajax()) {
0,
'',
false,
$is_management_allowed,
$management_is_not_allowed,
"UndefineTinyMCE('#textarea_field".$i."_recovery_value')",
'',
true
@ -201,7 +227,7 @@ if (is_ajax()) {
0,
'',
true,
$is_management_allowed,
$management_is_not_allowed,
"defineTinyMCE('#textarea_field".$i."_recovery_value')",
'',
true
@ -216,7 +242,7 @@ if (is_ajax()) {
'class="fields_recovery"',
true,
'',
$is_management_allowed
$management_is_not_allowed || $recovery_disabled
);
} else if (preg_match('/^_content_type_$/i', $field_value)) {
$editor_type_chkbx = '<div id="command_div"><b><small>';
@ -230,7 +256,7 @@ if (is_ajax()) {
'text/plain',
'',
'',
$is_management_allowed,
$management_is_not_allowed,
'',
'',
true
@ -242,7 +268,7 @@ if (is_ajax()) {
'text/html',
'',
'text/html',
$is_management_allowed,
$management_is_not_allowed,
'',
'',
true
@ -261,7 +287,7 @@ if (is_ajax()) {
'text/plain',
'',
'',
$is_management_allowed,
$management_is_not_allowed,
'',
'',
true
@ -273,7 +299,7 @@ if (is_ajax()) {
'text/html',
'',
'text/html',
$is_management_allowed,
$management_is_not_allowed,
'',
'',
true
@ -282,95 +308,196 @@ if (is_ajax()) {
$rfield = $editor_type_chkbx;
// Select type.
} else if (preg_match('/^_custom_field_ITSM_$/i', $field_value)) {
$ffield = '';
$rfield = '';
$ffield = '';
$rfield = '';
$ffield .= '<div name="field'.$i.'_value_container">'.html_print_switch(
[
'name' => 'field'.$i.'_value[]',
'value' => '',
]
).'</div>';
$rfield .= '<div name="field'.$i.'_recovery_value_container">'.html_print_switch(
[
'name' => 'field'.$i.'_recovery_value[]',
'value' => '',
]
).'</div>';
$ffield .= '<div name="field'.$i.'_value_container">'.html_print_switch(
[
'name' => 'field'.$i.'_value[]',
'value' => '',
]
).'</div>';
$rfield .= '<div name="field'.$i.'_recovery_value_container">'.html_print_switch(
[
'name' => 'field'.$i.'_recovery_value[]',
'value' => '',
'disabled' => $management_is_not_allowed || $recovery_disabled,
]
).'</div>';
$ffield .= html_print_select(
'',
'field'.$i.'_value[]',
'',
'',
__('None'),
'',
true,
false,
false,
'fields',
$is_management_allowed,
'width: 100%;',
false,
false,
false,
'',
false,
false,
false,
false,
false
);
$ffield .= html_print_select(
'',
'field'.$i.'_value[]',
'',
'',
__('None'),
'',
true,
false,
false,
'fields',
$management_is_not_allowed,
'width: 100%;',
false,
false,
false,
'',
false,
false,
false,
false,
false
);
$rfield .= html_print_select(
'',
'field'.$i.'_recovery_value[]',
'',
'',
__('None'),
'',
true,
false,
false,
'fields',
$is_management_allowed,
'width: 100%;',
false,
false,
false,
'',
false,
false,
false,
false,
false
);
$rfield .= html_print_select(
'',
'field'.$i.'_recovery_value[]',
'',
'',
__('None'),
'',
true,
false,
false,
'fields',
$management_is_not_allowed || $recovery_disabled,
'width: 100%;',
false,
false,
false,
'',
false,
false,
false,
false,
false
);
$ffield .= html_print_input_text('field'.$i.'_value[]', '', '', 10, 10, true, false, false, '', 'datepicker');
$rfield .= html_print_input_text('field'.$i.'_recovery_value[]', '', '', 10, 10, true, false, false, '', 'datepicker');
$ffield .= html_print_input_text(
'field'.$i.'_value[]',
'',
'',
10,
10,
true,
false,
false,
'',
'datepicker',
'',
'off',
false,
false,
'',
'',
$management_is_not_allowed
);
$rfield .= html_print_input_text(
'field'.$i.'_recovery_value[]',
'',
'',
10,
10,
true,
false,
false,
'',
'datepicker',
'',
'off',
false,
false,
'',
'',
$management_is_not_allowed || $recovery_disabled
);
$ffield .= html_print_textarea(
'field'.$i.'_value[]',
5,
1,
'',
'style="min-height:40px; '.$style.'" class="fields"',
true,
'',
$is_management_allowed
);
$ffield .= html_print_textarea(
'field'.$i.'_value[]',
5,
1,
'',
'style="min-height:40px; '.$style.'" class="fields"',
true,
'',
$management_is_not_allowed
);
$rfield .= html_print_textarea(
'field'.$i.'_recovery_value[]',
5,
1,
'',
'style="min-height:40px; '.$style.'" class="fields_recovery',
true,
'',
$management_is_not_allowed || $recovery_disabled
);
$rfield .= html_print_textarea(
'field'.$i.'_recovery_value[]',
5,
1,
'',
'style="min-height:40px; '.$style.'" class="fields_recovery',
true,
'',
$is_management_allowed
);
$values_input_number = [
'name' => 'field'.$i.'_value[]',
'value' => 0,
'id' => 'field'.$i.'_value',
'return' => true,
];
if ($management_is_not_allowed === true) {
$values_input_number['disabled'] = true;
}
$ffield .= html_print_input_number($values_input_number);
$values_input_number_recovery = [
'name' => 'field'.$i.'_recovery_value[]',
'value' => 0,
'id' => 'field'.$i.'_recovery_value',
'return' => true,
];
if ($management_is_not_allowed || $recovery_disabled) {
$values_input_number_recovery['disabled'] = true;
}
$rfield .= html_print_input_number($values_input_number_recovery);
$ffield .= html_print_input_text(
'field'.$i.'_value[]',
'',
'',
50,
255,
true,
false,
false,
'',
'normal w98p',
'',
'off',
false,
false,
'',
'',
$management_is_not_allowed
);
$rfield .= html_print_input_text(
'field'.$i.'_recovery_value[]',
'',
'',
50,
255,
true,
false,
false,
'',
'normal w98p',
'',
'off',
false,
false,
'',
'',
$management_is_not_allowed || $recovery_disabled
);
} else if (str_starts_with($field_value, '_ITSM_')) {
$nothing = '';
$nothing_value = 0;
@ -441,7 +568,7 @@ if (is_ajax()) {
false,
false,
'fields',
$is_management_allowed
$management_is_not_allowed
);
$rfield = html_print_select(
@ -455,11 +582,28 @@ if (is_ajax()) {
false,
false,
'fields_recovery',
$is_management_allowed
$management_is_not_allowed || $recovery_disabled
);
} else {
$ffield = 'TODO';
$rfield = 'TODO';
$ffield = html_print_autocomplete_users_from_pandora_itsm(
'field'.$i.'_value',
'',
true,
0,
$management_is_not_allowed,
false,
''
);
$rfield = html_print_autocomplete_users_from_pandora_itsm(
'field'.$i.'_recovery_value',
'',
true,
0,
$management_is_not_allowed || $recovery_disabled,
false,
''
);
}
} else {
$fields_value_select = [];
@ -578,7 +722,7 @@ if (is_ajax()) {
false,
false,
'fields',
$is_management_allowed
$management_is_not_allowed
);
$rfield = html_print_select(
$fields_value_select,
@ -591,7 +735,7 @@ if (is_ajax()) {
false,
false,
'fields_recovery',
$is_management_allowed
$management_is_not_allowed || $recovery_disabled
);
} else {
$ffield = html_print_textarea(
@ -602,7 +746,7 @@ if (is_ajax()) {
'style="'.$style.'" class="fields min-height-40px w100p"',
true,
'',
$is_management_allowed
$management_is_not_allowed
);
$rfield = html_print_textarea(
'field'.$i.'_recovery_value',
@ -612,7 +756,7 @@ if (is_ajax()) {
'style="'.$style.'" class="fields_recovery min-height-40px w100p',
true,
'',
$is_management_allowed
$management_is_not_allowed || $recovery_disabled
);
}
}
@ -625,7 +769,7 @@ if (is_ajax()) {
'style="'.$style.'" class="fields min-height-40px w100p"',
true,
'',
$is_management_allowed
$management_is_not_allowed
);
$rfield = html_print_textarea(
'field'.$i.'_recovery_value',
@ -635,7 +779,7 @@ if (is_ajax()) {
'style="'.$style.'" class="fields_recovery min-height-40px w100p"',
true,
'',
$is_management_allowed
$management_is_not_allowed || $recovery_disabled
);
}

View File

@ -170,8 +170,8 @@ if ($id) {
$action['field3_recovery'] = ($action['field3'] ?? $config['default_criticity']);
$action['field4_recovery'] = ($action['field4'] ?? $config['default_owner']);
$action['field5_recovery'] = ($action['field5'] ?? $config['incident_type']);
$action['field6_recovery'] = ($action['field6'] ?? $config['incident_status']);
$action['field7_recovery'] = ($action['field7'] ?? $config['incident_content']);
$action['field6_recovery'] = ($action['field6_recovery'] ?? $config['incident_status']);
$action['field7_recovery'] = ($action['field7_recovery'] ?? $config['incident_content']);
}
$group = $action['id_group'];
@ -378,24 +378,26 @@ $table_macros->data[1][2] = html_print_label_input_block(
)
);
// Selector will work only with Integria activated.
$integriaIdName = 'integria_wu';
$table_macros->colspan[$integriaIdName][0] = 3;
$table_macros->data[$integriaIdName][0] = html_print_label_input_block(
__('Create workunit on recovery').ui_print_help_tip(
__('If closed status is set on recovery, a workunit will be added to the ticket in Integria IMS rather that closing the ticket.'),
true
),
html_print_checkbox_switch_extended(
'create_wu_integria',
1,
$create_wu_integria,
false,
'',
$disabled_attr,
true
)
);
if (empty($command) === false && $command['name'] === io_safe_input('Integria IMS Ticket')) {
// Selector will work only with Integria activated.
$integriaIdName = 'integria_wu';
$table_macros->colspan[$integriaIdName][0] = 3;
$table_macros->data[$integriaIdName][0] = html_print_label_input_block(
__('Create workunit on recovery').ui_print_help_tip(
__('If closed status is set on recovery, a workunit will be added to the ticket in Integria IMS rather that closing the ticket.'),
true
),
html_print_checkbox_switch_extended(
'create_wu_integria',
1,
$create_wu_integria,
false,
'',
$disabled_attr,
true
)
);
}
for ($i = 1; $i <= $config['max_macro_fields']; $i++) {
$table_macros->data['field'.$i][0] = html_print_image(
@ -546,8 +548,8 @@ $(document).ready (function () {
switch (custom_field.type) {
case 'CHECKBOX':
var checkbox_selector = $('input:not(.datepicker)[name=field'+custom_field_key+'_value\\[\\]]');
var checkbox_recovery_selector = $('input:not(.datepicker)[name=field'+custom_field_key+'_recovery_value\\[\\]]');
var checkbox_selector = $('input[type="checkbox"][name=field'+custom_field_key+'_value\\[\\]]');
var checkbox_recovery_selector = $('input[type="checkbox"][name=field'+custom_field_key+'_recovery_value\\[\\]]');
checkbox_selector.on('change', function() {
if (checkbox_selector.prop('checked')) {
@ -587,8 +589,8 @@ $(document).ready (function () {
$('[name=field'+custom_field_key+'_value_container]').show();
$('[name=field'+custom_field_key+'_recovery_value_container]').show();
$('input:not(.datepicker)[name=field'+custom_field_key+'_value\\[\\]]').show();
$('input:not(.datepicker)[name=field'+custom_field_key+'_recovery_value\\[\\]]').show();
$('input[type="checkbox"][name=field'+custom_field_key+'_value\\[\\]]').show();
$('input[type="checkbox"][name=field'+custom_field_key+'_recovery_value\\[\\]]').show();
break;
case 'COMBO':
var combo_input = $('select[name=field'+custom_field_key+'_value\\[\\]]');
@ -627,11 +629,10 @@ $(document).ready (function () {
$('input.datepicker[type="text"][name=field'+custom_field_key+'_recovery_value\\[\\]]').removeClass("hasDatepicker");
$('input.datepicker[type="text"][name=field'+custom_field_key+'_value\\[\\]]').datepicker("destroy");
$('input.datepicker[type="text"][name=field'+custom_field_key+'_recovery_value\\[\\]]').datepicker("destroy");
$('input.datepicker[type="text"][name=field'+custom_field_key+'_value\\[\\]]').show();
$('input.datepicker[type="text"][name=field'+custom_field_key+'_recovery_value\\[\\]]').show();
$('input.datepicker[type="text"][name=field'+custom_field_key+'_value\\[\\]]').datepicker({dateFormat: "<?php echo DATE_FORMAT_JS; ?>"});
$('input.datepicker[type="text"][name=field'+custom_field_key+'_recovery_value\\[\\]]').datepicker({dateFormat: "<?php echo DATE_FORMAT_JS; ?>"});
$('input.datepicker[type="text"][name=field'+custom_field_key+'_value\\[\\]]').datepicker({dateFormat: "<?php echo 'yy-mm-dd 00:00:00'; ?>"});
$('input.datepicker[type="text"][name=field'+custom_field_key+'_recovery_value\\[\\]]').datepicker({dateFormat: "<?php echo 'yy-mm-dd 00:00:00'; ?>"});
$.datepicker.setDefaults($.datepicker.regional[ "<?php echo get_user_language(); ?>"]);
if (typeof values[key] !== "undefined") {
@ -642,9 +643,31 @@ $(document).ready (function () {
$('input.datepicker[type="text"][name=field'+custom_field_key+'_recovery_value\\[\\]]').val(recovery_values[key]);
}
break;
case 'TEXT':
case 'TEXTAREA':
case 'NUMERIC':
if (typeof values[key] !== "undefined") {
$('input[type="number"][name=field'+custom_field_key+'_value\\[\\]]').val(values[key]);
}
if (typeof recovery_values[key] !== "undefined") {
$('input[type="number"][name=field'+custom_field_key+'_recovery_value\\[\\]]').val(recovery_values[key]);
}
$('input[type="number"][name=field'+custom_field_key+'_value\\[\\]]').show();
$('input[type="number"][name=field'+custom_field_key+'_recovery_value\\[\\]]').show();
break;
case 'TEXT':
if (typeof values[key] !== "undefined") {
$('input.normal[type="text"][name=field'+custom_field_key+'_value\\[\\]]').val(values[key]);
}
if (typeof recovery_values[key] !== "undefined") {
$('input.normal[type="text"][name=field'+custom_field_key+'_recovery_value\\[\\]]').val(recovery_values[key]);
}
$('input.normal[type="text"][name=field'+custom_field_key+'_value\\[\\]]').show();
$('input.normal[type="text"][name=field'+custom_field_key+'_recovery_value\\[\\]]').show();
break;
case 'TEXTAREA':
default:
if (typeof values[key] !== "undefined") {
$('textarea[name=field'+custom_field_key+'_value\\[\\]]').val(values[key]);
@ -695,13 +718,6 @@ $(document).ready (function () {
} else {
render_command_description('');
}
// Allow create workunit if Integria IMS Ticket is selected.
if (data['id'] == '14') {
$("#table_macros-"+integriaWorkUnitName).css('display', 'table-row');
} else {
$("#table_macros-"+integriaWorkUnitName).css('display', 'none');
}
var max_fields = parseInt('<?php echo $config['max_macro_fields']; ?>');
@ -831,7 +847,6 @@ $(document).ready (function () {
$("[name=field" + i + "_recovery_value]").val(old_recovery_value);
if (is_element_select === true) {
$("[name=field" + i + "_recovery_value]").trigger('change');
}

View File

@ -2683,6 +2683,11 @@ function alerts_ui_update_or_create_actions($update=true)
$values = [];
for ($i = 1; $i <= $config['max_macro_fields']; $i++) {
$field_value = get_parameter('field'.$i.'_value');
if (empty(get_parameter('field'.$i.'_value_hidden')) === false) {
$field_value = get_parameter('field'.$i.'_value_hidden');
} else {
$field_value = get_parameter('field'.$i.'_value');
}
if (is_array($field_value)) {
$field_value = reset(array_filter($field_value));
@ -2695,7 +2700,11 @@ function alerts_ui_update_or_create_actions($update=true)
$values['field'.$i] = (string) $field_value;
$info_fields .= ' Field'.$i.': '.$values['field'.$i];
$field_recovery_value = get_parameter('field'.$i.'_recovery_value');
if (empty(get_parameter('field'.$i.'_recovery_value_hidden')) === false) {
$field_recovery_value = get_parameter('field'.$i.'_recovery_value_hidden');
} else {
$field_recovery_value = get_parameter('field'.$i.'_recovery_value');
}
if (is_array($field_recovery_value)) {
$field_recovery_value = reset(array_filter($field_recovery_value));

View File

@ -4988,9 +4988,6 @@ function events_page_general($event)
}
$data[1] = $user_ack.'&nbsp;(&nbsp;';
// hd($config['date_format'], true);
// hd($event['ack_utimestamp_raw'], true);
// TODO: mirar en el manage y en la api que este ack de venir vacio lo herede del anterior que hubiera.
if ($event['ack_utimestamp_raw'] !== false
&& $event['ack_utimestamp_raw'] !== 'false'
&& empty($event['ack_utimestamp_raw']) === false

View File

@ -16,7 +16,7 @@ function getInputFieldsIncidenceType(idIncidenceType, fieldsData, ajaxUrl) {
// Visual Console container request.
jQuery
.get(
.post(
ajaxUrl,
{
page: "operation/ITSM/itsm",

View File

@ -255,16 +255,16 @@ class ITSM
}
if (empty($queryParams) === false) {
if (isset($queryParams['direction']) === true) {
$queryParams['sortDirection'] = $queryParams['direction'];
unset($queryParams['direction']);
}
if (isset($queryParams['field']) === true) {
$queryParams['sortField'] = $queryParams['field'];
unset($queryParams['field']);
}
if (isset($queryParams['direction']) === true) {
$queryParams['sortDirection'] = $queryParams['direction'];
unset($queryParams['direction']);
}
$path .= '?';
$path .= http_build_query($queryParams);
}
@ -369,8 +369,10 @@ class ITSM
$result = $this->callApi(
'incidenceTypeFields',
[
'page' => 0,
'sizePage' => 0,
'page' => 0,
'sizePage' => 0,
'field' => 'idIncidenceTypeField',
'direction' => 'ascending',
],
[],
$idIncidenceType

View File

@ -527,8 +527,10 @@ class Manager
$result = $ITSM->callApi(
'incidenceTypeFields',
[
'page' => 0,
'sizePage' => 0,
'page' => 0,
'sizePage' => 0,
'field' => 'idIncidenceTypeField',
'direction' => 'ascending',
],
[],
$idIncidenceType
@ -1125,7 +1127,7 @@ class Manager
public function getInputFieldsIncidenceType()
{
$idIncidenceType = (int) get_parameter('idIncidenceType', true);
$fieldsData = json_decode(io_safe_output(get_parameter('fieldsData', [])), true);
$fieldsData = json_decode(base64_decode(get_parameter('fieldsData')), true);
if (empty($fieldsData) === false) {
$fieldsData = array_reduce(
$fieldsData,

View File

@ -67,10 +67,12 @@ if (empty($customFields) === true) {
break;
case 'CHECKBOX':
$options['checked'] = ($fieldsData[$field['idIncidenceTypeField']] ?? null);
$options['type'] = 'checkbox';
break;
case 'DATE':
$options['value'] = ($fieldsData[$field['idIncidenceTypeField']] ?? null);
$options['type'] = 'text';
break;

View File

@ -274,7 +274,7 @@ ui_require_javascript_file('tinymce', 'vendor/tinymce/tinymce/');
<script type="text/javascript">
$(document).ready(function () {
var ajax_url = '<?php echo ui_get_full_url('ajax.php'); ?>';
var fieldsData = '<?php echo json_encode($incidence['typeFieldData']); ?>';
var fieldsData = '<?php echo base64_encode(json_encode($incidence['typeFieldData'])); ?>';
defineTinyMCE('#textarea_description');

View File

@ -263,7 +263,6 @@ our @EXPORT = qw(
pandora_thread_monitoring
pandora_process_policy_queue
pandora_sync_agents_integria
pandora_get_integria_ticket_types
subst_alert_macros
subst_column_macros
locate_agent
@ -1841,16 +1840,14 @@ sub pandora_execute_action ($$$$$$$$$;$$) {
# Integria IMS Ticket
} elsif ($clean_name eq "Integria IMS Ticket") {
my $config_integria_enabled = pandora_get_tconfig_token ($dbh, 'integria_enabled', '');
if (!$config_integria_enabled) {
my $config_ITSM_enabled = pandora_get_tconfig_token ($dbh, 'ITSM_enabled', '');
if (!$config_ITSM_enabled) {
return;
}
my $config_api_path = pandora_get_tconfig_token ($dbh, 'integria_hostname', '');
my $config_api_pass = pandora_get_tconfig_token ($dbh, 'integria_api_pass', '');
my $config_integria_user = pandora_get_tconfig_token ($dbh, 'integria_user', '');
my $config_integria_user_pass = pandora_get_tconfig_token ($dbh, 'integria_pass', '');
my $ITSM_path = pandora_get_tconfig_token ($dbh, 'ITSM_hostname', '');
my $ITSM_token = pandora_get_tconfig_token ($dbh, 'ITSM_token', '');
$field1 = subst_alert_macros ($field1, \%macros, $pa_config, $dbh, $agent, $module, $alert);
$field2 = subst_alert_macros ($field2, \%macros, $pa_config, $dbh, $agent, $module, $alert);
$field3 = subst_alert_macros ($field3, \%macros, $pa_config, $dbh, $agent, $module, $alert);
@ -1871,18 +1868,6 @@ sub pandora_execute_action ($$$$$$$$$;$$) {
$field18 = subst_alert_macros ($field18, \%macros, $pa_config, $dbh, $agent, $module, $alert);
$field19 = subst_alert_macros ($field19, \%macros, $pa_config, $dbh, $agent, $module, $alert);
$field20 = subst_alert_macros ($field20, \%macros, $pa_config, $dbh, $agent, $module, $alert);
# Field 1 (Integria IMS API path)
my $api_path = $config_api_path . "/include/api.php";
# Field 2 (Integria IMS API pass)
my $api_pass = $config_api_pass;
# Field 3 (Integria IMS user)
my $integria_user = $config_integria_user;
# Field 4 (Integria IMS user password)
my $integria_user_pass = $config_integria_user_pass;
# Field 1 (Ticket name)
my $ticket_name = safe_output($field1);
@ -1893,7 +1878,7 @@ sub pandora_execute_action ($$$$$$$$$;$$) {
# Field 2 (Ticket group ID)
my $ticket_group_id = $field2;
if ($ticket_group_id eq '') {
$ticket_group_id = 0;
$ticket_group_id = 1;
}
# Field 3 (Ticket priority);
@ -1921,31 +1906,192 @@ sub pandora_execute_action ($$$$$$$$$;$$) {
}
# Field 7 (Ticket description);
my $ticket_description = safe_output($field7);
my $ticket_description = subst_alert_macros(safe_output($field7), \%macros, $pa_config, $dbh, $agent, $module, $alert);
my $create_wu_on_close_recovery = 0;
my $external_id = $agent->{'nombre'} . '-' . $module->{'id_agente'} . '-' . $module->{'id_agente_modulo'};
if ($alert_mode == RECOVERED_ALERT && $action->{'create_wu_integria'} == '1') {
$create_wu_on_close_recovery = 1;
# if recovered
if ($alert_mode == RECOVERED_ALERT) {
# Check exit incidence.
my %filter_incidence = ('externalId' => $external_id, 'blocked' => '0');
my $existIncidence = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/incidence/list', $ITSM_token, \%filter_incidence);
if (!defined($existIncidence)){
return;
}
my $id_incidence = 0;
my $incidence_data = p_decode_json($pa_config, $existIncidence);
# If exist update state and add new workunit if necessary.
if(!is_empty($incidence_data->{'data'})) {
my %data_incidence = (
'status' => $ticket_status
);
$id_incidence = $incidence_data->{'data'}[0]->{'idIncidence'};
my $updateIncidence = pandora_API_ITSM_call($pa_config, 'put', $ITSM_path . '/incidence/' . $id_incidence, $ITSM_token, \%data_incidence);
if (!defined($updateIncidence)){
return;
}
if ($action->{'create_wu_integria'} == '1') {
my %data_workunit = (
'description' => $ticket_description
);
my $createWorkunit = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/incidence/' . $id_incidence . '/workunit', $ITSM_token, \%data_workunit);
if (!defined($createWorkunit)){
return;
}
}
}
return;
}
# Ticket type custom fields
my $ticket_custom_field1 = $field8;
my $ticket_custom_field2 = $field9;
my $ticket_custom_field3 = $field10;
my $ticket_custom_field4 = $field11;
my $ticket_custom_field5 = $field12;
my $ticket_custom_field6 = $field13;
my $ticket_custom_field7 = $field14;
my $ticket_custom_field8 = $field15;
my $ticket_custom_field9 = $field16;
my $ticket_custom_field10 = $field17;
my $ticket_custom_field11 = $field18;
my $ticket_custom_field12 = $field19;
my $ticket_custom_field13 = $field20;
my %custom_fields = (
'field0' => subst_alert_macros(safe_output($field8), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field1' => subst_alert_macros(safe_output($field9), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field2' => subst_alert_macros(safe_output($field10), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field3' => subst_alert_macros(safe_output($field11), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field4' => subst_alert_macros(safe_output($field12), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field5' => subst_alert_macros(safe_output($field13), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field6' => subst_alert_macros(safe_output($field14), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field7' => subst_alert_macros(safe_output($field15), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field8' => subst_alert_macros(safe_output($field16), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field9' => subst_alert_macros(safe_output($field17), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field10' => subst_alert_macros(safe_output($field18), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field11' => subst_alert_macros(safe_output($field19), \%macros, $pa_config, $dbh, $agent, $module, $alert),
'field12' => subst_alert_macros(safe_output($field20), \%macros, $pa_config, $dbh, $agent, $module, $alert)
);
pandora_create_integria_ticket($pa_config, $api_path, $api_pass, $integria_user, $integria_user_pass, $agent->{'nombre'}, $agent->{'alias'}, $agent->{'id_os'}, $agent->{'direccion'}, $agent->{'id_agente'}, $agent->{'id_grupo'}, $ticket_name, $ticket_group_id, $ticket_priority, $ticket_owner, $ticket_type, $ticket_status, $ticket_description, $create_wu_on_close_recovery, $ticket_custom_field1, $ticket_custom_field2, $ticket_custom_field3, $ticket_custom_field4, $ticket_custom_field5, $ticket_custom_field6, $ticket_custom_field7, $ticket_custom_field8, $ticket_custom_field9, $ticket_custom_field10, $ticket_custom_field11, $ticket_custom_field12, $ticket_custom_field13);
# Check exit inventory object.
my %filter_inventory = ('idPandora' => $agent->{'nombre'});
my $existInventory = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/inventory/list', $ITSM_token, \%filter_inventory);
if (!defined($existInventory)){
return;
}
my $id_inventory = 0;
my $inventory_data = p_decode_json($pa_config, $existInventory);
my %data_inventory = (
"name" => $agent->{'alias'},
"isPublic" => \0,
"idObjectType" => 2,
"isShowInList" => \0,
"status" => "new",
"idPandora" => $agent->{'nombre'},
"typeFieldData" => [
{
"idInventoryField" => 12,
"data" => $agent->{'id_os'}
},
{
"idInventoryField" => 13,
"data" => $agent->{'direccion'}
},
{
"idInventoryField" => 15,
"data" => $agent->{'id_agente'}
},
{
"idInventoryField" => 46,
"data" => $agent->{'id_grupo'}
},
]
);
# If not exit inventory object create, if exist update.
if(is_empty($inventory_data->{'data'})) {
my $insertInventory = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/inventory', $ITSM_token, \%data_inventory);
if (!defined($insertInventory)){
return;
}
my $inventory = p_decode_json($pa_config, $insertInventory);
$id_inventory = $inventory->{'idInventory'};
} else {
$id_inventory = $inventory_data->{'data'}[0]->{'idInventory'};
my $updateInventory = pandora_API_ITSM_call($pa_config, 'put', $ITSM_path . '/inventory/' . $id_inventory, $ITSM_token, \%data_inventory);
if (!defined($updateInventory)){
return;
}
}
# List field incidence type.
my @fields = ();
if($ticket_type ne '' && $ticket_type ne '0') {
my %filter_incidence_type = ();
my $path_list_fields = $ITSM_path . '/incidencetype/' . $ticket_type . '/field/list?sortField=idIncidenceTypeField&sortDirection=ascending';
my $listFields = pandora_API_ITSM_call($pa_config, 'post', $path_list_fields, $ITSM_token, \%filter_incidence_type);
if (!defined($listFields)){
return;
}
my $listFields_data = p_decode_json($pa_config, $listFields);
if(!is_empty($listFields_data->{'data'})) {
my $i = 0;
foreach my $field (@{$listFields_data->{'data'}}) {
$fields[$i] = {"idIncidenceTypeField" => $field->{'idIncidenceTypeField'}, "data" => $custom_fields{'field' . $i}};
$i++;
}
}
}
# Check exit incidence.
my %filter_incidence = ('externalId' => $external_id, 'blocked' => '0');
my $existIncidence = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/incidence/list', $ITSM_token, \%filter_incidence);
if (!defined($existIncidence)){
return;
}
my $id_incidence = 0;
my $incidence_data = p_decode_json($pa_config, $existIncidence);
my %data_incidence = (
'title' => $ticket_name,
'idGroup' => $ticket_group_id,
'priority' => $ticket_priority,
'owner' => $ticket_owner,
'idIncidenceType' => $ticket_type,
'status' => $ticket_status,
'description' => $ticket_description,
'externalId' => $external_id,
'typeFieldData' => \@fields
);
# If not exit incidence create, if exist update and add new workunit.
if(is_empty($incidence_data->{'data'})) {
my $insertIncidence = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/incidence', $ITSM_token, \%data_incidence);
if (!defined($insertIncidence)){
return;
}
my $incidence = p_decode_json($pa_config, $insertIncidence);
$id_incidence = $incidence->{'idIncidence'};
} else {
$id_incidence = $incidence_data->{'data'}[0]->{'idIncidence'};
my $updateIncidence = pandora_API_ITSM_call($pa_config, 'put', $ITSM_path . '/incidence/' . $id_incidence, $ITSM_token, \%data_incidence);
if (!defined($updateIncidence)){
return;
}
my %data_workunit = (
'description' => 'Incidence updated by ' . $pa_config->{'rb_product_name'}
);
my $createWorkunit = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/incidence/' . $id_incidence . '/workunit', $ITSM_token, \%data_workunit);
if (!defined($createWorkunit)){
return;
}
}
# Check exit relation incidence whit inventory, if not exist create.
my %filter_incidence_inventory = ('idInventory' => $id_inventory);
my $existIncidenceInventory = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/incidence/' . $id_incidence . '/inventory/list', $ITSM_token, \%filter_incidence_inventory);
if (!defined($existIncidenceInventory)){
return;
}
my $incidence_inventory_data = p_decode_json($pa_config, $existIncidenceInventory);
if(is_empty($incidence_inventory_data->{'data'})) {
my %data_incidence_inventory = ();
my $result_incidence_inventory = pandora_API_ITSM_call($pa_config, 'post', $ITSM_path . '/incidence/' . $id_incidence . '/inventory/' . $id_inventory, $ITSM_token, \%data_incidence_inventory);
if (!defined($result_incidence_inventory)){
return;
}
}
# Generate notification
} elsif ($clean_name eq "Generate Notification") {
@ -6955,89 +7101,33 @@ sub pandora_edit_custom_graph ($$$$$$$$$$$) {
return $res;
}
sub pandora_create_integria_ticket ($$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$) {
my ($pa_config,$api_path,$api_pass,$integria_user,$user_pass,$agent_name,$agent_alias,$agent_os,$agent_addr,$agent_id,$agent_group,$ticket_name,$ticket_group_id,$ticket_priority,$ticket_owner,$ticket_type,$ticket_status,$ticket_description, $create_wu_on_close_recovery, $ticket_custom_field1, $ticket_custom_field2, $ticket_custom_field3, $ticket_custom_field4, $ticket_custom_field5, $ticket_custom_field6, $ticket_custom_field7, $ticket_custom_field8, $ticket_custom_field9, $ticket_custom_field10, $ticket_custom_field11, $ticket_custom_field12, $ticket_custom_field13) = @_;
use URI::URL;
use URI::Escape;
use HTML::Entities;
my $data_ticket;
my $call_api;
my $uri = URI->new($api_path);
if ($uri->scheme eq "") {
$api_path = "http://" . $api_path;
}
my $ticket_create_wu = 0;
if ($create_wu_on_close_recovery == 1 && $ticket_status eq '7') {
$ticket_create_wu = 1;
}
$data_ticket = $agent_name .
"|;|" . uri_escape(decode_entities($agent_alias)) .
"|;|" . $agent_os .
"|;|" . $agent_addr .
"|;|" . $agent_id .
"|;|" . $agent_group .
"|;|" . $ticket_name .
"|;|" . $ticket_group_id .
"|;|" . $ticket_priority .
"|;|" . $ticket_description .
"|;|" . $ticket_type .
"|;|" . $ticket_owner .
"|;|" . $ticket_status .
"|;|" . $ticket_create_wu .
"|;|" . $ticket_custom_field1 .
"|;|" . $ticket_custom_field2 .
"|;|" . $ticket_custom_field3 .
"|;|" . $ticket_custom_field4 .
"|;|" . $ticket_custom_field5 .
"|;|" . $ticket_custom_field6 .
"|;|" . $ticket_custom_field7 .
"|;|" . $ticket_custom_field8 .
"|;|" . $ticket_custom_field9 .
"|;|" . $ticket_custom_field10 .
"|;|" . $ticket_custom_field11 .
"|;|" . $ticket_custom_field12 .
"|;|" . $ticket_custom_field13;
$call_api = $api_path . '?' .
'user=' . $integria_user . '&' .
'user_pass=' . $user_pass . '&' .
'pass=' . $api_pass . '&' .
'op=create_pandora_ticket&' .
'params=' . $data_ticket .'&' .
'token=|;|';
my $content = get($call_api);
if (is_numeric($content) && $content ne "-1") {
return $content;
}
else {
return 0;
sub pandora_API_ITSM_call ($$$$$) {
my ($pa_config, $method, $ITSM_path, $ITSM_token, $data) = @_;
my @headers = (
'accept' => 'application/json',
'Content-Type' => 'application/json; charset=utf-8',
'Authorization' => 'Bearer ' . $ITSM_token,
);
if($method =~/put/i) {
return api_call($pa_config, $method, $ITSM_path, encode_utf8(p_encode_json($pa_config, $data)), @headers);
} else {
return api_call($pa_config, $method, $ITSM_path, Content => encode_utf8(p_encode_json($pa_config, $data)), @headers);
}
}
sub pandora_sync_agents_integria ($) {
my ($dbh) = @_;
my $config_integria_enabled = pandora_get_tconfig_token ($dbh, 'integria_enabled', '');
my $config_ITSM_enabled = pandora_get_tconfig_token ($dbh, 'ITSM_enabled', '');
if (!$config_integria_enabled) {
if (!$config_ITSM_enabled) {
return;
}
my $config_api_path = pandora_get_tconfig_token ($dbh, 'integria_hostname', '');
my $config_api_pass = pandora_get_tconfig_token ($dbh, 'integria_api_pass', '');
my $config_integria_user = pandora_get_tconfig_token ($dbh, 'integria_user', '');
my $config_integria_user_pass = pandora_get_tconfig_token ($dbh, 'integria_pass', '');
my $config_api_path = pandora_get_tconfig_token ($dbh, 'ITSM_hostname', '');
my $config_integria_user_pass = pandora_get_tconfig_token ($dbh, 'ITSM_token', '');
my $api_path = $config_api_path . "/include/api.php";
my $api_path = $config_api_path;
my @agents_string = '';
my @agents = get_db_rows ($dbh, 'SELECT * FROM tagente');
@ -7059,9 +7149,7 @@ sub pandora_sync_agents_integria ($) {
my $ua = LWP::UserAgent->new();
my $response = $ua->post( $api_path, {
'user' => $config_integria_user,
'user_pass' => $config_integria_user_pass,
'pass' => $config_api_pass,
'op' => 'sync_pandora_agents_inventory',
'params[]' => [@agents_array],
'token' => '|;|'
@ -7077,32 +7165,6 @@ sub pandora_sync_agents_integria ($) {
}
}
sub pandora_get_integria_ticket_types($) {
my ($dbh) = @_;
my $config_api_path = pandora_get_tconfig_token ($dbh, 'integria_hostname', '');
my $config_api_pass = pandora_get_tconfig_token ($dbh, 'integria_api_pass', '');
my $config_integria_user = pandora_get_tconfig_token ($dbh, 'integria_user', '');
my $config_integria_user_pass = pandora_get_tconfig_token ($dbh, 'integria_pass', '');
my $api_path = $config_api_path . "/include/api.php";
my $call_api = $api_path . '?' .
'user=' . $config_integria_user . '&' .
'user_pass=' . $config_integria_user_pass . '&' .
'pass=' . $config_api_pass . '&' .
'op=get_types&' .
'return_type=json';
my $content = get($call_api);
my @decoded_json;
@decoded_json = @{decode_json($content)} if (defined $content && $content ne "");
return @decoded_json;
}
##########################################################################
=head2 C<< pandora_input_password (I<$pa_config>, I<$password>) >>

View File

@ -108,6 +108,7 @@ our @EXPORT = qw(
MODULE_UNKNOWN
MODULE_NOTINIT
$THRRUN
api_call
api_call_url
cron_get_closest_in_range
cron_next_execution
@ -2323,6 +2324,51 @@ sub uri_encode_literal_percent {
return $return_char;
} ## end sub uri_encode_literal_percent
sub api_call {
my ($pa_config, $method, $server_url, $api_params, @options) = @_;
my $ua = LWP::UserAgent->new();
$ua->timeout($pa_config->{'tcp_timeout'});
# Enable environmental proxy settings
$ua->env_proxy;
# Enable in-memory cookie management
$ua->cookie_jar( {} );
# Disable verify host certificate (only needed for self-signed cert)
$ua->ssl_opts( 'verify_hostname' => 0 );
$ua->ssl_opts( 'SSL_verify_mode' => 0x00 );
my $response;
eval {
if ($method =~/get/i) {
$response = $ua->get($server_url, $api_params, @options);
} elsif ($method =~/put/i) {
my $req = HTTP::Request->new('PUT' => $server_url);
$req->header(@options);
$req->content($api_params);
$response = $ua->request($req);
} else {
$response = $ua->post($server_url, $api_params, @options);
}
};
if ((!$@) && $response->is_success) {
return $response->decoded_content;
}
# TODO: change to logger.
use Data::Dumper;
$Data::Dumper::SortKeys = 1;
print Dumper("------------------");
if ($@) { print Dumper($@); }
#print Dumper($response);
print Dumper($response->{'_rc'});
print Dumper($response->{'_content'});
print Dumper($response->{'_request'});
return undef;
}
################################################################################
# Launch API call

View File

@ -1436,24 +1436,9 @@ if (defined($history_dbh)) {
}
# Keep integrity between PandoraFMS agents and IntegriaIMS inventory objects.
# Keep integrity between PandoraFMS agents and Pandora ITSM inventory objects.
pandora_sync_agents_integria($dbh);
# Get Integria IMS ticket types for alert commands.
my @types = pandora_get_integria_ticket_types($dbh);
if (scalar(@types) != 0) {
my $query_string = '';
foreach my $type (@types) {
$query_string .= $type->{'id'} . ',' . $type->{'name'} . ';';
}
$query_string = substr $query_string, 0, -1;
db_do($dbh, "UPDATE talert_commands SET fields_descriptions='[\"Ticket&#x20;title\",\"Ticket&#x20;group&#x20;ID\",\"Ticket&#x20;priority\",\"Ticket&#x20;owner\",\"Ticket&#x20;type\",\"Ticket&#x20;status\",\"Ticket&#x20;description\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\"]' WHERE name=\"Integria&#x20;IMS&#x20;Ticket\"");
db_do($dbh, "UPDATE talert_commands SET fields_values='[\"\", \"\", \"\",\"\",\"" . $query_string . "\",\"\",\"\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\",\"_integria_type_custom_field_\"]' WHERE name=\"Integria&#x20;IMS&#x20;Ticket\"");
}
# Cleanup and exit
db_disconnect ($history_dbh) if defined ($history_dbh);
db_disconnect ($dbh);