From 401b1973bed7bde5e06a680d2d1973f1bb4184d4 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Wed, 24 Jan 2024 12:15:16 +0100 Subject: [PATCH] #12687 Added import/export prd 2 --- .../resources/resources_export_import.php | 28 +- .../include/ajax/resources.ajax.php | 94 ++++-- pandora_console/include/class/Prd.class.php | 318 ++++++++++++++++-- pandora_console/include/constants.php | 3 + 4 files changed, 381 insertions(+), 62 deletions(-) diff --git a/pandora_console/godmode/resources/resources_export_import.php b/pandora_console/godmode/resources/resources_export_import.php index 569c854278..146784f2e4 100644 --- a/pandora_console/godmode/resources/resources_export_import.php +++ b/pandora_console/godmode/resources/resources_export_import.php @@ -114,6 +114,7 @@ html_print_table($table); $("#button-export_button").addClass("invisible_important"); $("#export_data_table-1-0").html(''); } else { + $("#export_data_table-1-0").html(''); $.ajax({ type: "GET", url: "ajax.php", @@ -137,10 +138,18 @@ html_print_table($table); $("#button-export_button").click(function(e) { const value = $("#select_value").val(); if (value !== '0') { + //Show dialog. + confirmDialog({ + title: "", + message: "", + hideCancelButton: true + }, + "downloadDialog" + ); + $.ajax({ type: "GET", url: "ajax.php", - dataType: "html", data: { page: 'include/ajax/resources.ajax', exportPrd: 1, @@ -149,7 +158,24 @@ html_print_table($table); name: $("#select_value").text(), }, success: function(data) { + let a = document.createElement('a'); + const url = '' + data; + a.href = url; + a.download = data; + a.click(); + setTimeout(() => { + $.ajax({ + type: "DELETE", + url: "ajax.php", + data: { + page: 'include/ajax/resources.ajax', + deleteFile: 1, + filename: data, + }, + }); + $("#confirm_downloadDialog").dialog("close"); + }, 3000); }, error: function(data) { console.error("Fatal error in AJAX call to interpreter order", data) diff --git a/pandora_console/include/ajax/resources.ajax.php b/pandora_console/include/ajax/resources.ajax.php index 5c6c8ed02d..379a499407 100644 --- a/pandora_console/include/ajax/resources.ajax.php +++ b/pandora_console/include/ajax/resources.ajax.php @@ -20,6 +20,7 @@ if ((bool) is_ajax() === true) { $getResource = (bool) get_parameter('getResource', false); $exportPrd = (bool) get_parameter('exportPrd', false); + $deleteFile = (bool) get_parameter('deleteFile', false); $prd = new Prd(); @@ -27,37 +28,34 @@ if ((bool) is_ajax() === true) { $type = (string) get_parameter('type', ''); $result = false; - $check = $prd->getOnePrdData($type); - if (empty($check) === false) { - switch ($type) { - case 'visual_console': - $result = html_print_label_input_block( - __('Visual console'), - io_safe_output( - html_print_select_from_sql( - 'SELECT id, name FROM tlayout', - 'select_value', - '', - '', - '', - 0, - true, - false, - true, - false, - false, - false, - GENERIC_SIZE_TEXT, - 'w40p', - ), - ) - ); - break; - - default: - // TODO. - break; - } + $data = $prd->getOnePrdData($type); + if (empty($data) === false) { + $sql = sprintf( + 'SELECT %s FROM %s', + reset($data['items']['value']).', '.reset($data['items']['show']), + $data['items']['table'] + ); + $result = html_print_label_input_block( + $data['label'], + io_safe_output( + html_print_select_from_sql( + $sql, + 'select_value', + '', + '', + '', + 0, + true, + false, + true, + false, + false, + false, + GENERIC_SIZE_TEXT, + 'w40p', + ), + ) + ); } echo $result; @@ -69,6 +67,38 @@ if ((bool) is_ajax() === true) { $value = (int) get_parameter('value', 0); $name = (string) get_parameter('name', ''); - $prd->exportPrd($type, $value, $name); + $data = $prd->exportPrd($type, $value, $name); + + $return = ''; + + if (empty($data) === false) { + $filename = $type.'-'.date('Ymd').'-'.date('His').'.prd'; + $file = $config['attachment_store'].'/'.$filename; + + $file_pointer = fopen($file, 'a'); + if ($file_pointer !== false) { + $write = fwrite($file_pointer, $data); + + if ($write === false) { + $return = -2; + } else { + $return = $filename; + } + + fclose($file_pointer); + } else { + $return = -1; + } + } + + echo $return; + + return; + } + + if ($deleteFile === true) { + $filename = (string) get_parameter('filename', ''); + + unlink($config['attachment_store'].'/'.$filename); } } diff --git a/pandora_console/include/class/Prd.class.php b/pandora_console/include/class/Prd.class.php index faf4a13c28..c115b639a2 100644 --- a/pandora_console/include/class/Prd.class.php +++ b/pandora_console/include/class/Prd.class.php @@ -76,17 +76,219 @@ class Prd 'label' => __('Visual console'), 'items' => [ 'table' => 'tlayout', - 'value' => 'id', - 'show' => 'name', - ], - 'data' => [ - [ - 'table' => 'tlayout', - 'ref' => 'id', + 'value' => ['id'], + 'show' => ['name'], + 'data' => [ + [ + 'table' => 'tlayout_data', + 'ref' => ['id_layout'], + 'value' => ['id'], + ], ], - [ - 'table' => 'tlayout_data', - 'ref' => 'id_layout', + ], + ], + 'custom_report' => [ + 'label' => __('Custom report'), + 'items' => [ + 'table' => 'treport', + 'value' => ['id_report'], + 'show' => ['name'], + 'data' => [ + [ + 'table' => 'treport_content', + 'ref' => ['id_report'], + 'value' => ['id_rc'], + 'data' => [ + [ + 'table' => 'treport_content_item', + 'ref' => ['id_report_content'], + 'value' => ['id'], + ], + [ + 'table' => 'treport_content_sla_combined', + 'ref' => ['id_report_content'], + 'value' => ['id'], + ], + ], + ], + ], + ], + ], + 'policy' => [ + 'label' => __('Policy'), + 'items' => [ + 'table' => 'tpolicies', + 'value' => ['id'], + 'show' => ['name'], + 'data' => [ + [ + 'table' => 'tpolicy_agents', + 'ref' => ['id_policy'], + 'value' => ['id'], + ], + [ + 'table' => 'tpolicy_alerts', + 'ref' => ['id_policy'], + 'value' => ['id'], + 'data' => [ + [ + 'table' => 'tpolicy_alerts_actions', + 'ref' => ['id_policy_alert'], + 'value' => ['id'], + ], + ], + ], + [ + 'table' => 'tpolicy_collections', + 'ref' => ['id_policy'], + 'value' => ['id'], + ], + [ + 'table' => 'tpolicy_group_agents', + 'ref' => ['id_policy'], + 'value' => ['id'], + ], + [ + 'table' => 'tpolicy_groups', + 'ref' => ['id_policy'], + 'value' => ['id'], + ], + [ + 'table' => 'tpolicy_modules', + 'ref' => ['id_policy'], + 'value' => ['id'], + 'data' => [ + [ + 'table' => 'ttag_policy_module', + 'ref' => ['id_policy_module'], + 'value' => [ + 'id_tag', + 'id_policy_module', + ], + ], + [ + 'table' => 'tpolicy_modules_synth', + 'ref' => ['id_agent_module_target'], + 'value' => ['id'], + ], + ], + ], + [ + 'table' => 'tpolicy_modules_inventory', + 'ref' => ['id_policy'], + 'value' => ['id'], + ], + [ + 'table' => 'tpolicy_plugins', + 'ref' => ['id_policy'], + 'value' => ['id'], + ], + ], + ], + ], + 'service' => [ + 'label' => __('Service'), + 'items' => [ + 'table' => 'tservice', + 'value' => ['id'], + 'show' => ['name'], + 'data' => [ + [ + 'table' => 'tservice_element', + 'ref' => ['id_service'], + 'value' => ['id'], + ], + ], + ], + ], + 'network_map' => [ + 'label' => __('Network map'), + 'items' => [ + 'table' => 'tmap', + 'value' => ['id'], + 'show' => ['name'], + 'data' => [ + [ + 'table' => 'titem', + 'ref' => ['id_map'], + 'value' => ['id'], + ], + [ + 'table' => 'trel_item', + 'ref' => ['id_map'], + 'value' => ['id'], + ], + ], + ], + ], + 'gis_map' => [ + 'label' => __('GIS map'), + 'items' => [ + 'table' => 'tgis_map', + 'value' => ['id_tgis_map'], + 'show' => ['map_name'], + 'data' => [ + [ + 'table' => 'tgis_map_layer', + 'ref' => ['tgis_map_id_tgis_map'], + 'value' => ['id_tmap_layer'], + 'data' => [ + [ + 'table' => 'tgis_map_layer_groups', + 'ref' => ['layer_id'], + 'value' => [ + 'layer_id', + 'group_id', + ], + ], + [ + 'table' => 'tgis_map_layer_has_tagente', + 'ref' => ['tgis_map_layer_id_tmap_layer'], + 'value' => [ + 'tgis_map_layer_id_tmap_layer', + 'tagente_id_agente', + ], + ], + ], + ], + [ + 'table' => 'tgis_map_has_tgis_map_con', + 'ref' => ['tgis_map_id_tgis_map'], + 'value' => [ + 'tgis_map_id_tgis_map', + 'tgis_map_con_id_tmap_con', + ], + ], + ], + ], + ], + 'custom_graph' => [ + 'label' => __('Custom graph'), + 'items' => [ + 'table' => 'tgraph', + 'value' => ['id_graph'], + 'show' => ['name'], + 'data' => [ + [ + 'table' => 'tgraph_source', + 'ref' => ['id_graph'], + 'value' => ['id_gs'], + ], + ], + ], + ], + 'dashboard' => [ + 'label' => __('Dashboard'), + 'items' => [ + 'table' => 'tdashboard', + 'value' => ['id'], + 'show' => ['name'], + 'data' => [ + [ + 'table' => 'twidget_dashboard', + 'ref' => ['id_dashboard'], + 'value' => ['id'], + ], ], ], ], @@ -243,38 +445,96 @@ class Prd /** - * Export prd. + * Converts a resource into a string. * - * @return array + * @param string $type Item type. + * @param mixed $id Item value. + * @param string $name Item name. + * + * @return string */ - public function exportPrd(string $type, $value, $name) :array + public function exportPrd(string $type, mixed $id, string $name) :string { - $result = []; + $result = ''; $prd_data = $this->getOnePrdData($type); if (empty($prd_data) === false) { - $result['prd_data'] = [ - 'type' => $type, - 'name' => $name, - ]; + $result .= '[prd_data]'.LINE_BREAK.LINE_BREAK; + $result .= 'type="'.$type.'"'.LINE_BREAK; + $result .= 'name="'.$name.'"'.LINE_BREAK.LINE_BREAK; - foreach ($prd_data['data'] as $key => $element) { - $sql = sprintf( - 'SELECT * FROM %s WHERE %s = %s', - $element['table'], - $element['ref'], - $value, - ); + $result .= '['.$prd_data['items']['table'].']'.LINE_BREAK.LINE_BREAK; - $test = db_get_all_rows_sql($sql); + $sql = sprintf( + 'SELECT * FROM %s WHERE %s = %s', + $prd_data['items']['table'], + reset($prd_data['items']['value']), + $id, + ); - // $result[$element['table']] - // hd($test, true); + $row = db_get_row_sql($sql); + $primary_key = $row[reset($prd_data['items']['value'])]; + foreach ($row as $column => $value) { + $result .= $column.'['.$primary_key.']="'.$value.'"'.LINE_BREAK; + } + + $result .= LINE_BREAK; + + $result .= $this->recursiveExport($prd_data['items']['data'], $id); + } + + return $result; + } + + + /** + * Recursive function to traverse all data + * + * @param mixed $data Data. + * @param mixed $id Id value for search. + * + * @return string + */ + private function recursiveExport($data, $id): string + { + $result = ''; + + foreach ($data as $key => $element) { + $result .= '['.$element['table'].']'.LINE_BREAK.LINE_BREAK; + $sql = sprintf( + 'SELECT * FROM %s WHERE %s = %s', + $element['table'], + reset($element['ref']), + $id, + ); + + $rows = db_get_all_rows_sql($sql); + foreach ($rows as $row) { + if (count($element['value']) > 1) { + $primary_key = ''; + foreach ($element['value'] as $value) { + $primary_key .= $row[$value].'-'; + } + + $primary_key = substr($primary_key, 0, -1); + hd($primary_key, true); + } else { + $primary_key = $row[reset($element['value'])]; + } + + foreach ($row as $column => $value) { + $result .= $column.'['.$primary_key.']="'.$value.'"'.LINE_BREAK; + } + + $result .= LINE_BREAK; + } + + if (isset($element['data']) === true) { + $result .= $this->recursiveExport($element['data'], $primary_key); } } return $result; - } diff --git a/pandora_console/include/constants.php b/pandora_console/include/constants.php index b2ce8d88b4..422c2dcc95 100644 --- a/pandora_console/include/constants.php +++ b/pandora_console/include/constants.php @@ -906,3 +906,6 @@ define('DEMO_SERVICE', 6); define('DEMO_DASHBOARD', 7); define('DEMO_VISUAL_CONSOLE', 8); define('DEMO_PLUGIN', 9); + +// Export resources. +define('LINE_BREAK', "\n");