From e163c27b43e36ac6ba44ba5f4b3386009e1048a5 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Mon, 25 Mar 2019 17:59:12 +0100 Subject: [PATCH 001/112] Commit para revisar progreso Former-commit-id: 498b7c6a44a18c075c431853d8bf6875e92945f9 --- pandora_console/include/api.php | 53 ++++++++- pandora_console/include/functions_api.php | 136 +++++++++++++++++++++- 2 files changed, 182 insertions(+), 7 deletions(-) diff --git a/pandora_console/include/api.php b/pandora_console/include/api.php index 3b04cedd24..8fbeccafe7 100644 --- a/pandora_console/include/api.php +++ b/pandora_console/include/api.php @@ -107,14 +107,13 @@ if ($correctLogin) { if ($op == 'set' && $id) { switch ($op2) { case 'update_agent': - case 'add_module_in_conf': case 'update_module_in_conf': case 'delete_module_in_conf': $id_os = db_get_value_sql('select id_os from tagente where id_agente = '.$id); - if ($id_os == 100) { + if ($id_os === 100) { returnError('not_allowed_operation_cluster', $returnType); return false; } @@ -130,7 +129,7 @@ if ($correctLogin) { $id_os = db_get_value_sql('select id_os from tagente where nombre = "'.$id.'"'); - if ($id_os == 100) { + if ($id_os === 100) { returnError('not_allowed_operation_cluster', $returnType); return false; } @@ -143,14 +142,58 @@ if ($correctLogin) { $id_os = db_get_value_sql('select id_os from tagente where id_agente = (select id_agente from tagente_modulo where id_agente_modulo ='.$id.')'); - if ($id_os == 100) { + if ($id_os === 100) { returnError('not_allowed_operation_cluster', $returnType); return false; } break; - default: + case 'get_info_user_name': + $id_os = get_info_user_name($user); + + if ($id_os === 100) { + returnError('not_allowed_operation_cluster', $returnType); + return false; + } + break; + + case 'get_filter_user_group': + + $id_os = get_filter_user_group($user, $group, $disable); + + if ($id_os === false) { + returnError('not_allowed_operation_cluster', $returnType); + return false; + } + break; + + case 'delete_user_profile': + $id_os = delete_user_profile($user); + + if ($id_os === false) { + returnError('not_allowed_operation_cluster', $returnType); + return false; + } + break; + + case 'get_list_all_user': + $id_os = get_list_all_user(); + + if ($id_os === false) { + returnError('not_allowed_operation_cluster', $returnType); + return false; + } + + case 'add_permission_user_to_group': + $id_os = add_permisson_user_to_group(); + + if ($id_os === false) { + returnError('not_allowed_operation_cluster', $returnType); + return false; + } + + default: // break; } } diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index e57dd31013..a792da92c5 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -542,7 +542,6 @@ $module_field_column_mampping = [ 'module_critical_inverse' => 'critical_inverse as module_critical_inverse', 'module_warning_inverse' => 'warning_inverse as module_warning_inverse', ]; - // module related field mappings 2/2 (output field => column for 'tagente_estado') // module_id_agent_modulo is not in this list $estado_fields_to_columns_mapping = [ @@ -13952,7 +13951,7 @@ function api_set_update_event_filter($id_event_filter, $thrash1, $other, $thrash break; case 5: - $values['status'] = (array_key_exists($other['data'][5], events_get_all_status()) || $other['data'][5] == -1) ? $other['data'][5] : -1; + $values['status'] = (array_key_exists($other['data'][5], events_get_all_status()) || $db_process_sql_insertother['data'][5] == -1) ? $other['data'][5] : -1; break; case 6: @@ -14684,3 +14683,136 @@ function api_set_reset_agent_counts($id, $thrash1, $thrash2, $thrash3) } } + + +function api_get_list_all_user() +{ + $sql = sprintf('SELECT * FROM tusuario ORDER BY fullname'); + $users = db_get_all_rows_sql($sql); + + if ($users === false) { + returnError('Error_user', ' Users could not be found.'); + } else { + $data = [ + 'type' => 'string', + 'data' => $users, + ]; + + returnData('string', ['type' => 'string', 'data' => $data]); + } + +} + + +function api_get_info_user_name($user) +{ + if ($user === null) { + return false; + } + + $sql = sprintf("select * from tperfil,tusuario_perfil where tperfil.id_perfil in (select tusuario_perfil.id_perfil from tusuario_perfil where id_usuario = '$user')"); + $user_profile = db_get_all_rows_sql($sql); + if ($user_profile === false) { + returnError('Error_user', ' User could not be found.'); + } else { + $data = [ + 'type' => 'string', + 'data' => $user_profile, + ]; + + returnData('string', ['type' => 'string', 'data' => $data]); + } +} + + +function api_get_filter_user_group($user, $group, $disable) +{ + if ($user === null && ($group === null || $disable === null)) { + return false; + } + + if ($group !== null) { + $sql = "select * from tperfil,tusuario_perfil where tperfil.id_perfil in (select tusuario_perfil.id_perfil from tusuario_perfil where id_usuario = '$user' and id_grupo = $group) LIMIT 1"; + $filter_user = db_get_all_rows_sql($sql); + } + + if ($disable !== null) { + $sql = "select * from tperfil,tusuario_perfil where tperfil.id_perfil in (select tusuario_perfil.id_perfil from tusuario_perfil where id_usuario = '$user' and disable = $disable) LIMIT 1"; + $filter_user = db_get_all_rows_sql($sql); + } + + if ($filter_user === false) { + returnError('Error_user', ' User profile could not be found.'); + } else { + $data = [ + 'type' => 'string', + 'data' => $filter_user, + ]; + + returnData('string', ['type' => 'string', 'data' => $data]); + } +} + + +function api_get_delete_user_profile($id_user) +{ + if ($id_user === null) { + return false; + } + + $sql = "delete from tusuario_perfil where id_usuario = '$id_user'"; + $deleted_permission = db_process_sql_delete($sql); + + if ($deleted_permission === false) { + returnError('Error_delete', ' User profile could not be deleted.'); + } else { + $data = [ + 'type' => 'string', + 'data' => $deleted_permission, + ]; + + returnData('string', ['type' => 'string', 'data' => $data]); + } +} + + +function api_add_permisson_user_to_group($id_user, $group, $profile, $other=';') +{ + if ($user === null || $group === null || $profile === null) { + return false; + } + + $other[0] = $id_user; + $other[1] = $group; + $other[2] = $profile; + if ($id_user === null || $group === null || $profile === null) { + return false; + } + + // take it up last value(id_up) for tusuario_peril and increase 1 value + $sql = 'select MAX(id_up) from tusuario_perfil'; + + $last_id_up = db_get_value_sql($sql); + + $last_id_up ++; + + $values = [ + 'id_up' => $last_id_up, + 'id_usuario' => $other[0], + 'id_perfil' => $other[2], + 'id_grupo' => $other[1], + 'no_hierarchy' => 0, + 'assigned_by' => 0, + 'id_policy' => 0, + 'tags' => '', + + ]; + + $sucessfull_insert = db_process_sql_insert('tusuario_perfil', $values); + + if ($sucessfull_insert === false) { + returnError('Error_insert', ' User profile could not be aviable.'); + } else { + returnData('string', ['type' => 'string', 'data' => $data]); + } +} From ce49a45d2a3fe8f9337f375ab0507f7041045b94 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Tue, 26 Mar 2019 11:03:36 +0100 Subject: [PATCH 002/112] Commit para revisar progreso Former-commit-id: e1e07ad590624f958e0e8cc31b18d6f936df485e --- pandora_console/include/functions_api.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index a792da92c5..9d9216e0b3 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -14732,15 +14732,26 @@ function api_get_filter_user_group($user, $group, $disable) } if ($group !== null) { - $sql = "select * from tperfil,tusuario_perfil where tperfil.id_perfil in (select tusuario_perfil.id_perfil from tusuario_perfil where id_usuario = '$user' and id_grupo = $group) LIMIT 1"; - $filter_user = db_get_all_rows_sql($sql); + $condition = $grupo; + $campo = 'group'; } if ($disable !== null) { - $sql = "select * from tperfil,tusuario_perfil where tperfil.id_perfil in (select tusuario_perfil.id_perfil from tusuario_perfil where id_usuario = '$user' and disable = $disable) LIMIT 1"; - $filter_user = db_get_all_rows_sql($sql); + $condition = $disable; + $campo = 'disable'; } + // CASO CON USUARIO DE META CONSOLE + /* + if ($user_meta !== null) { + $campo = 'metaconsole_assigned_server'; + $condition = 1; + } + */ + + $sql = sprintf(('select * from tperfil,tusuario_perfil where tperfil.id_perfil in (select tusuario_perfil.id_perfil from tusuario_perfil where id_usuario = '$user' and %s = % d)'), $campo, $condition); + $filter_user = db_get_all_rows_sql($sql); + if ($filter_user === false) { returnError('Error_user', ' User profile could not be found.'); } else { From 1f02159a43888f3080a4950f4d52de7fb7480486 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Tue, 26 Mar 2019 12:06:54 +0100 Subject: [PATCH 003/112] Commit para revisar progreso Former-commit-id: f51d1e10ad320772c77d41aa2da3a1e4eded146a --- pandora_console/include/functions_api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 9d9216e0b3..1df222957f 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -14749,7 +14749,7 @@ function api_get_filter_user_group($user, $group, $disable) } */ - $sql = sprintf(('select * from tperfil,tusuario_perfil where tperfil.id_perfil in (select tusuario_perfil.id_perfil from tusuario_perfil where id_usuario = '$user' and %s = % d)'), $campo, $condition); + $sql = sprintf(('select * from tperfil,tusuario_perfil where tperfil.id_perfil in (select tusuario_perfil.id_perfil from tusuario_perfil where id_usuario = '$user' and %s = %d)'), $campo, $condition); $filter_user = db_get_all_rows_sql($sql); if ($filter_user === false) { From 845cb85c557c1ac05cfa032af7bc216c3b4337b0 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Wed, 27 Mar 2019 17:03:55 +0100 Subject: [PATCH 004/112] New design for tables - #3707 Former-commit-id: 923414d8bf98d6264e6cebc27706118e16710b70 --- pandora_console/extensions/agents_alerts.php | 19 +- .../extensions/users_connected.php | 6 +- pandora_console/general/logon_ok.php | 4 +- .../godmode/agentes/fields_manager.php | 17 +- .../godmode/agentes/modificar_agente.php | 4 +- .../godmode/agentes/planned_downtime.list.php | 4 +- .../godmode/events/event_responses.list.php | 4 +- .../godmode/groups/modu_group_list.php | 9 +- pandora_console/godmode/reporting/graphs.php | 6 +- .../godmode/reporting/map_builder.php | 5 +- .../godmode/reporting/reporting_builder.php | 3 +- .../godmode/servers/servers.build_table.php | 4 +- pandora_console/include/ajax/module.php | 8 +- pandora_console/include/functions_ui.php | 39 ++-- pandora_console/include/styles/pandora.css | 167 ++++++++++++++++++ .../operation/agentes/alerts_status.php | 12 +- .../operation/agentes/estado_agente.php | 23 +-- .../operation/agentes/pandora_networkmap.php | 22 ++- .../operation/agentes/status_monitor.php | 6 +- .../operation/events/events.build_table.php | 7 + .../operation/servers/recon_view.php | 6 +- 21 files changed, 312 insertions(+), 63 deletions(-) diff --git a/pandora_console/extensions/agents_alerts.php b/pandora_console/extensions/agents_alerts.php index 46272504f6..5b0cc4a72d 100755 --- a/pandora_console/extensions/agents_alerts.php +++ b/pandora_console/extensions/agents_alerts.php @@ -378,7 +378,7 @@ function mainAgentsAlerts() 'alerts_agents' ); - echo ''; + echo '
'; echo "'; if ($hor_offset > 0) { @@ -478,6 +478,23 @@ function mainAgentsAlerts() } echo '
".__('Agents').' / '.__('Alert templates').'
'; + + ui_pagination( + $nagents, + false, + 0, + 0, + false, + 'offset', + true, + 'pagination-bottom', + '', + [ + 'count' => '', + 'offset' => 'offset_param', + ], + 'alerts_agents' + ); } } diff --git a/pandora_console/extensions/users_connected.php b/pandora_console/extensions/users_connected.php index 562d757a20..e26b0dab1e 100644 --- a/pandora_console/extensions/users_connected.php +++ b/pandora_console/extensions/users_connected.php @@ -66,10 +66,10 @@ function users_extension_main_god($god=true) $rows = []; echo "
".__('No other users connected').'
'; } else { - $table->cellpadding = 4; - $table->cellspacing = 4; + $table->cellpadding = 0; + $table->cellspacing = 0; $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; $table->size = []; $table->data = []; $table->head = []; diff --git a/pandora_console/general/logon_ok.php b/pandora_console/general/logon_ok.php index 21c9713a48..9e83e0b793 100644 --- a/pandora_console/general/logon_ok.php +++ b/pandora_console/general/logon_ok.php @@ -195,7 +195,9 @@ if (!empty($all_data)) { echo '
'; $table = new stdClass(); - $table->class = 'databox data'; + $table->class = 'info_table'; + $table->cellpadding = 0; + $table->cellspacing = 0; $table->width = '100%'; // Don't specify px $table->data = []; diff --git a/pandora_console/godmode/agentes/fields_manager.php b/pandora_console/godmode/agentes/fields_manager.php index 0be7166062..ee94813a59 100644 --- a/pandora_console/godmode/agentes/fields_manager.php +++ b/pandora_console/godmode/agentes/fields_manager.php @@ -97,11 +97,22 @@ if ($delete_field) { } } -$fields = db_get_all_fields_in_table('tagent_custom_fields'); +// Prepare pagination. +$offset = (int) get_parameter('offset'); +$limit = $config['block_size']; +$count_fields = db_get_value('count(*)', 'tagent_custom_fields'); + +$fields = db_get_all_rows_filter( + 'tagent_custom_fields', + [ + 'limit' => $limit, + 'offset' => $offset, + ] +); $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; if ($fields) { $table->head = []; $table->head[0] = __('ID'); @@ -142,7 +153,9 @@ foreach ($fields as $field) { } if ($fields) { + ui_pagination($count_fields, false, $offset); html_print_table($table); + ui_pagination($count_fields, false, $offset, 0, false, 'offset', true, 'pagination-bottom'); } echo '
'; diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index 4673bf2f46..cee4f06f8e 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -441,7 +441,7 @@ if (($config['dbtype'] == 'oracle') && ($agents !== false)) { ui_pagination($total_agents, "index.php?sec=gagente&sec2=godmode/agentes/modificar_agente&group_id=$ag_group&recursion=$recursion&search=$search&sort_field=$sortField&sort=$sort&disabled=$disabled&os=$os", $offset); if ($agents !== false) { - echo ""; + echo "
"; echo ''; echo "
'.__('Agent name').' '.''.html_print_image('images/sort_up.png', true, ['style' => $selectNameUp]).''.''.html_print_image('images/sort_down.png', true, ['style' => $selectNameDown]).''; echo '".__('R').' '.''.html_print_image('images/sort_up.png', true, ['style' => $selectRemoteUp]).''.''.html_print_image('images/sort_down.png', true, ['style' => $selectRemoteDown]).''; @@ -670,7 +670,7 @@ if ($agents !== false) { } echo '
'; - ui_pagination($total_agents, "index.php?sec=gagente&sec2=godmode/agentes/modificar_agente&group_id=$ag_group&search=$search&sort_field=$sortField&sort=$sort&disabled=$disabled&os=$os", $offset); + ui_pagination($total_agents, "index.php?sec=gagente&sec2=godmode/agentes/modificar_agente&group_id=$ag_group&search=$search&sort_field=$sortField&sort=$sort&disabled=$disabled&os=$os", $offset, 0, false, 'offset', true, 'pagination-bottom'); echo "
"; } else { ui_print_info_message(['no_close' => true, 'message' => __('There are no defined agents') ]); diff --git a/pandora_console/godmode/agentes/planned_downtime.list.php b/pandora_console/godmode/agentes/planned_downtime.list.php index 790944b472..a9529248b0 100755 --- a/pandora_console/godmode/agentes/planned_downtime.list.php +++ b/pandora_console/godmode/agentes/planned_downtime.list.php @@ -393,7 +393,7 @@ else { // View available downtimes present in database (if any of them) $table = new StdClass(); - $table->class = 'databox data'; + $table->class = 'info_table'; $table->width = '100%'; $table->cellstyle = []; @@ -518,9 +518,9 @@ else { } html_print_table($table); + ui_pagination($downtimes_number, "index.php?sec=estado&sec2=godmode/agentes/planned_downtime.list&$filter_params_str", $offset, 0, false, 'offset', true, 'pagination-bottom'); echo '
'; - echo '
'; // CSV export button echo '
'; html_print_button( diff --git a/pandora_console/godmode/events/event_responses.list.php b/pandora_console/godmode/events/event_responses.list.php index e3b27a32d4..10f9b4c47b 100644 --- a/pandora_console/godmode/events/event_responses.list.php +++ b/pandora_console/godmode/events/event_responses.list.php @@ -36,7 +36,9 @@ if (empty($event_responses)) { $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; +$table->cellpadding = 0; +$table->cellspacing = 0; $table->size = []; $table->size[0] = '200px'; diff --git a/pandora_console/godmode/groups/modu_group_list.php b/pandora_console/godmode/groups/modu_group_list.php index 9dbc9311a6..6af3f98197 100644 --- a/pandora_console/godmode/groups/modu_group_list.php +++ b/pandora_console/godmode/groups/modu_group_list.php @@ -212,14 +212,11 @@ if ($delete_group) { } } +// Prepare pagination. $total_groups = db_get_num_rows('SELECT * FROM tmodule_group'); - $url = ui_get_url_refresh(['offset' => false]); - $offset = (int) get_parameter('offset', 0); -ui_pagination($total_groups, $url, $offset); - $sql = 'SELECT * FROM tmodule_group @@ -230,7 +227,7 @@ $groups = db_get_all_rows_sql($sql); $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; if (!empty($groups)) { $table->head = []; @@ -257,7 +254,9 @@ if (!empty($groups)) { array_push($table->data, $data); } + ui_pagination($total_groups, $url, $offset); html_print_table($table); + ui_pagination($total_groups, $url, $offset, 0, false, 'offset', true, 'pagination-bottom'); } else { ui_print_info_message( [ diff --git a/pandora_console/godmode/reporting/graphs.php b/pandora_console/godmode/reporting/graphs.php index 633ed82f4d..0e1a0c3afc 100644 --- a/pandora_console/godmode/reporting/graphs.php +++ b/pandora_console/godmode/reporting/graphs.php @@ -159,7 +159,9 @@ ui_pagination(count($graphs)); if (!empty($graphs)) { $table = new stdClass(); $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; + $table->cellpadding = 0; + $table->cellspacing = 0; $table->align = []; $table->head = []; $table->head[0] = __('Graph name'); @@ -213,6 +215,7 @@ if (!empty($graphs)) { echo ""; html_print_input_hidden('multiple_delete', 1); html_print_table($table); + ui_pagination(count($graphs), false, 0, 0, false, 'offset', true, 'pagination-bottom'); echo "
"; html_print_submit_button(__('Delete'), 'delete_btn', false, 'class="sub delete"'); echo '
'; @@ -228,7 +231,6 @@ if (!empty($graphs)) { } echo '
'; - ui_pagination(count($graphs)); } else { include_once $config['homedir'].'/general/firts_task/custom_graphs.php'; } diff --git a/pandora_console/godmode/reporting/map_builder.php b/pandora_console/godmode/reporting/map_builder.php index 6a20eeb30d..79130eda11 100644 --- a/pandora_console/godmode/reporting/map_builder.php +++ b/pandora_console/godmode/reporting/map_builder.php @@ -327,7 +327,9 @@ echo '
'; $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; +$table->cellpadding = 0; +$table->cellspacing = 0; $table->data = []; $table->head = []; $table->head[0] = __('Map name'); @@ -462,6 +464,7 @@ if (!$maps && !is_metaconsole()) { } html_print_table($table); + ui_pagination($total_maps, $url, $offset, $pagination, false, 'offset', true, 'pagination-bottom'); } if ($maps) { diff --git a/pandora_console/godmode/reporting/reporting_builder.php b/pandora_console/godmode/reporting/reporting_builder.php index 7253b931d4..84a9eb0267 100755 --- a/pandora_console/godmode/reporting/reporting_builder.php +++ b/pandora_console/godmode/reporting/reporting_builder.php @@ -646,7 +646,7 @@ switch ($action) { $table = new stdClass(); $table->id = 'report_list'; $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; $table->cellpadding = 0; $table->cellspacing = 0; @@ -887,6 +887,7 @@ switch ($action) { } html_print_table($table); + ui_pagination($total_reports, $url, $offset, $pagination, false, 'offset', true, 'pagination-bottom'); } else { ui_print_info_message([ 'no_close' => true, 'message' => __('No data found.') ]); } diff --git a/pandora_console/godmode/servers/servers.build_table.php b/pandora_console/godmode/servers/servers.build_table.php index 2bb4f6ab00..65a76690e0 100644 --- a/pandora_console/godmode/servers/servers.build_table.php +++ b/pandora_console/godmode/servers/servers.build_table.php @@ -40,7 +40,9 @@ if ($servers === false) { $table = new StdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; +$table->cellpadding = 0; +$table->cellspacing = 0; $table->size = []; $table->style = []; diff --git a/pandora_console/include/ajax/module.php b/pandora_console/include/ajax/module.php index 6e93f12165..fb62ff8339 100755 --- a/pandora_console/include/ajax/module.php +++ b/pandora_console/include/ajax/module.php @@ -758,9 +758,9 @@ if (check_login()) { $table = new stdClass(); $table->width = '100%'; - $table->cellpadding = 4; - $table->cellspacing = 4; - $table->class = 'databox data'; + $table->cellpadding = 0; + $table->cellspacing = 0; + $table->class = 'info_table'; $table->head = []; $table->data = []; @@ -1199,7 +1199,7 @@ if (check_login()) { false, 'offset', true, - '', + 'pagination-bottom', 'pagination_list_modules(offset_param)', [ 'count' => '', diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index eee8138e1e..71227e27ca 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -1884,7 +1884,7 @@ function ui_pagination( if ($print_total_items) { $output = "'; @@ -1910,10 +1910,11 @@ function ui_pagination( // Show the count of items if ($print_total_items) { - $output .= sprintf(__('Total items: %s'), $count); - $output .= '
'; + $output .= '
'.sprintf(__('Total items: %s'), $count).'
'; } + $output .= "
"; + // Show GOTO FIRST PAGE button if ($number_of_pages > $block_limit) { if (!empty($script)) { @@ -1929,10 +1930,10 @@ function ui_pagination( $script_modified ); - $output .= " '; + $output .= "".html_print_image('images/go_first.png', true, ['class' => 'bot']).''; } else { - $output .= " '; + $output .= "".html_print_image('images/go_first.png', true, ['class' => 'bot']).''; } } @@ -1958,10 +1959,10 @@ function ui_pagination( $script_modified ); - $output .= "'; } else { - $output .= "'; + $output .= "".html_print_image('images/go_previous.png', true, ['class' => 'bot']).''; } } @@ -1970,9 +1971,9 @@ function ui_pagination( $actual_page = (int) ($offset / $pagination); if ($iterator == $actual_page) { - $output .= ""; + $output .= "
"; } else { - $output .= ''; + $output .= "
"; } $offset_page = ($iterator * $pagination); @@ -1990,15 +1991,15 @@ function ui_pagination( $script_modified ); - $output .= "'; } else { - $output .= "'; + $output .= "".html_print_image('images/go_next.png', true, ['class' => 'bot']).''; } } @@ -2047,13 +2048,15 @@ function ui_pagination( $script_modified ); - $output .= "'; } else { - $output .= "'; + $output .= "".html_print_image('images/go_last.png', true, ['class' => 'bot']).''; } } + $output .= '
'; + // total_number // End div and layout $output .= '
'; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 6631a5dc48..af40f50077 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -5006,3 +5006,170 @@ select#autorefresh_list:-internal-list-box { .table_three_columns .table_td { width: 33%; } + +/* + * --------------------------------------------------------------------- + * - TABLES TO SHOW INFORMATION + * --------------------------------------------------------------------- + */ + +table.info_table { + background-color: #fff; + /* margin-bottom: 20px;*/ + border-spacing: 0; +} + +table.info_table tr:nth-child(even) { + background-color: #f5f5f5; +} + +table.info_table tr:first-child > th { + background-color: #373737; + color: #fff; + /*font-size: 9pt;*/ +} + +table.info_table tr:first-child > th span { + /*font-size: 9pt;*/ +} + +table.info_table th { + color: #fff; + background-color: #666; + font-size: 7.5pt; + letter-spacing: 0.3pt; +} + +table.info_table > thead > tr:first-child > th:last-child { + border-right: 1px solid #373737; + border-top-right-radius: 4px; +} + +table.info_table > thead > tr:first-child > th:first-child { + border-left: 1px solid #373737; + border-top-left-radius: 4px; +} + +table.info_table > thead > tr > th, +table.info_table > tbody > tr > th, +table.info_table > thead > tr > th a { + padding: 9px 7px; + font-weight: normal; + color: #fff; +} + +table.info_table > tbody > tr > td { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; + border: none; + /*padding: 9px 7px;*/ + padding-left: 9px; + padding-right: 9px; + padding-top: 7px; + padding-bottom: 7px; + border-bottom: 1px solid #e2e2e2; +} + +table.info_table > tbody > tr:last-child > td:first-child { + border-bottom-left-radius: 4px; +} + +table.info_table > tbody > tr > td:first-child { + border-left: 1px solid #e2e2e2; +} + +table.info_table > tbody > tr:last-child > td:last-child { + border-bottom-right-radius: 4px; +} + +table.info_table > tbody > tr > td:last-child { + border-right: 1px solid #e2e2e2; +} + +table.info_table > tbody > tr > td > img, +table.info_table > thead > tr > th > img, +table.info_table > tbody > tr > td > div > a > img, +table.info_table > tbody > tr > td > span > img, +table.info_table > tbody > tr > td > span > a > img, +table.info_table > tbody > tr > td > a > img, +table.info_table > tbody > tr > td > form > a > img { + vertical-align: middle; +} + +table.info_table > tbody > tr:hover { + background-color: #eee; +} + +table.info_table td:last-child img { + border-radius: 4px; + /* border: 2px solid #dcdcdc !important;*/ + /* padding: 2px;*/ + border: 1px solid #dcdcdc !important; + padding: 1px; + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); +} + +.pagination { + display: flex; + justify-content: space-between; + align-items: flex-end; + margin-bottom: 10px; +} + +.pagination .page_number { + border: 1px solid #cacaca; + border-right: 0px; + text-align: center; +} + +.pagination .page_number a { + padding: 5px; + width: 12px; + display: block; +} + +.pagination .total_number > *:first-child { + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +.pagination .total_number > *:last-child { + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + border-right: 1px solid #cacaca !important; +} + +.pagination .page_number_active { + font-weight: bold; + background-color: #82b92e; + color: #fff; + border-color: #82b92e; +} + +.pagination .page_number_active a { + color: #fff; +} + +.pagination .total_pages { +} + +.pagination .total_number { + display: flex; + justify-content: flex-end; +} + +.pagination a { + margin: 0 !important; +} + +.pagination .pagination-arrows { + border: 1px solid #cacaca; + border-right: 0px; +} + +.pagination-bottom { + margin-bottom: 15px; + margin-top: 10px; + align-items: flex-start; +} diff --git a/pandora_console/operation/agentes/alerts_status.php b/pandora_console/operation/agentes/alerts_status.php index f0d7565c70..706a1a8552 100755 --- a/pandora_console/operation/agentes/alerts_status.php +++ b/pandora_console/operation/agentes/alerts_status.php @@ -442,7 +442,7 @@ if ($print_agent) { $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->cellpadding = '0'; $table->cellspacing = '0'; $table->size = []; @@ -608,6 +608,16 @@ if (!empty($table->data)) { 'offset_simple' ); html_print_table($table); + ui_pagination( + $countAlertsSimple, + $url, + $offset_simple, + 0, + false, + 'offset_simple', + true, + 'pagination-bottom' + ); if (!is_metaconsole()) { if (check_acl($config['id_user'], $id_group, 'AW') || check_acl($config['id_user'], $id_group, 'LM')) { diff --git a/pandora_console/operation/agentes/estado_agente.php b/pandora_console/operation/agentes/estado_agente.php index b823ad02d9..16c080edd3 100644 --- a/pandora_console/operation/agentes/estado_agente.php +++ b/pandora_console/operation/agentes/estado_agente.php @@ -631,7 +631,7 @@ $table = new stdClass(); $table->cellpadding = 0; $table->cellspacing = 0; $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->head = []; $table->head[0] = __('Agent').' '.''.html_print_image('images/sort_up.png', true, ['style' => $selectNameUp, 'alt' => 'up']).''.''.html_print_image('images/sort_down.png', true, ['style' => $selectNameDown, 'alt' => 'down']).''; @@ -795,14 +795,6 @@ foreach ($agents as $agent) { if (!empty($table->data)) { html_print_table($table); - if (check_acl($config['id_user'], 0, 'AW') || check_acl($config['id_user'], 0, 'AM')) { - echo '
'; - echo ''; - html_print_input_hidden('new_agent', 1); - html_print_submit_button(__('Create agent'), 'crt', false, 'class="sub next"'); - echo ''; - echo '
'; - } ui_pagination( $total_agents, @@ -819,8 +811,19 @@ if (!empty($table->data)) { 0, false, 'offset', - false + true, + 'pagination-bottom' ); + + if (check_acl($config['id_user'], 0, 'AW') || check_acl($config['id_user'], 0, 'AM')) { + echo '
'; + echo '
'; + html_print_input_hidden('new_agent', 1); + html_print_submit_button(__('Create agent'), 'crt', false, 'class="sub next"'); + echo '
'; + echo '
'; + } + unset($table); } else { ui_print_info_message([ 'no_close' => true, 'message' => __('There are no defined agents') ]); diff --git a/pandora_console/operation/agentes/pandora_networkmap.php b/pandora_console/operation/agentes/pandora_networkmap.php index 604d800307..67407eb319 100644 --- a/pandora_console/operation/agentes/pandora_networkmap.php +++ b/pandora_console/operation/agentes/pandora_networkmap.php @@ -612,7 +612,9 @@ switch ($tab) { $table = new stdClass(); $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; + $table->cellpadding = 0; + $table->cellspacing = 0; $table->headstyle['copy'] = 'text-align: center;'; $table->headstyle['edit'] = 'text-align: center;'; @@ -657,11 +659,24 @@ switch ($tab) { $id_groups = array_keys(users_get_groups()); - $network_maps = db_get_all_rows_filter( + // Prepare pagination. + $offset = (int) get_parameter('offset'); + $limit = $config['block_size']; + $count_maps = db_get_value_filter( + 'count(*)', 'tmap', ['id_group' => $id_groups] ); + $network_maps = db_get_all_rows_filter( + 'tmap', + [ + 'id_group' => $id_groups, + 'limit' => $limit, + 'offset' => $offset, + ] + ); + if ($network_maps !== false) { $table->data = []; @@ -732,7 +747,9 @@ switch ($tab) { $table->data[] = $data; } + ui_pagination($count_maps, false, $offset); html_print_table($table); + ui_pagination($count_maps, false, 0, 0, false, 'offset', true, 'pagination-bottom'); } else { ui_print_info_message(['no_close' => true, 'message' => __('There are no maps defined.') ]); } @@ -756,4 +773,3 @@ switch ($tab) { } break; } - diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index fa0473c771..9a51210216 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -987,7 +987,7 @@ if ($autosearch) { if ($result === false) { $result = []; } else { - ui_pagination($count, false, $offset); + ui_pagination($count, false, $offset, 0, false, 'offset', true); } } else { // For each server defined and not disabled: @@ -1073,7 +1073,7 @@ if (!empty($result)) { $table->cellpadding = 0; $table->cellspacing = 0; $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; $table->head = []; $table->data = []; $table->size = []; @@ -1659,6 +1659,8 @@ if (!empty($result)) { } html_print_table($table); + + ui_pagination($count, false, $offset, 0, false, 'offset', true, 'pagination-bottom'); } else { if ($first_interaction) { ui_print_info_message(['no_close' => true, 'message' => __('This group doesn\'t have any monitor')]); diff --git a/pandora_console/operation/events/events.build_table.php b/pandora_console/operation/events/events.build_table.php index d38bd1918e..d4b3ed3a30 100644 --- a/pandora_console/operation/events/events.build_table.php +++ b/pandora_console/operation/events/events.build_table.php @@ -929,6 +929,13 @@ if ($group_rep == 2) { } html_print_table($table); + if ($allow_pagination) { + $params_to_paginate = $params; + unset($params_to_paginate['offset']); + $url_paginate = 'index.php?'.http_build_query($params_to_paginate, '', '&'); + ui_pagination($total_events, $url_paginate, $offset, $pagination, false, 'offset', true, 'pagination-bottom'); + } + echo '
'; if ($allow_action) { diff --git a/pandora_console/operation/servers/recon_view.php b/pandora_console/operation/servers/recon_view.php index 84a057d69c..b647d0ef20 100644 --- a/pandora_console/operation/servers/recon_view.php +++ b/pandora_console/operation/servers/recon_view.php @@ -76,10 +76,10 @@ if ($servers === false) { } $table = new StdClass(); - $table->cellpadding = 4; - $table->cellspacing = 4; + $table->cellpadding = 0; + $table->cellspacing = 0; $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; $table->head = []; $table->data = []; $table->align = []; From 3f4156162870a00669c0b56eeb15254396169e77 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Fri, 29 Mar 2019 09:23:38 +0100 Subject: [PATCH 005/112] Added pandoradb.sql without output column in tnetflow_filter Former-commit-id: 7bb1ce608678dbbc192bf734515ce96caba25c66 --- pandora_console/pandoradb.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 0ecc9b8f5d..4aa8c0122c 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1963,7 +1963,6 @@ CREATE TABLE IF NOT EXISTS `tnetflow_filter` ( `advanced_filter` TEXT NOT NULL, `filter_args` TEXT NOT NULL, `aggregate` varchar(60), - `output` varchar(60), PRIMARY KEY (`id_sg`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; From 26451c41a1d685bfe43a6a8dbf867a173fce5229 Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Fri, 29 Mar 2019 11:05:52 +0100 Subject: [PATCH 006/112] New design for the tables - #3707 Former-commit-id: 17d66da1d4d0365db38923e15e9c261c12d23544 --- pandora_console/godmode/admin_access_logs.php | 7 +-- .../godmode/alerts/alert_actions.php | 2 +- .../godmode/alerts/alert_commands.php | 2 +- .../godmode/alerts/alert_list.list.php | 7 ++- .../godmode/alerts/alert_templates.php | 3 +- pandora_console/godmode/category/category.php | 11 ++++- .../godmode/events/event_filter.php | 2 +- pandora_console/godmode/groups/group_list.php | 7 +-- .../modules/manage_network_components.php | 3 +- .../modules/manage_network_templates.php | 19 +++++++- pandora_console/godmode/servers/plugin.php | 2 +- pandora_console/godmode/setup/gis.php | 1 + pandora_console/godmode/setup/links.php | 2 +- pandora_console/godmode/setup/news.php | 2 +- pandora_console/godmode/setup/os.list.php | 18 +++++++- pandora_console/godmode/tag/tag.php | 3 +- pandora_console/godmode/users/user_list.php | 3 +- pandora_console/include/styles/pandora.css | 46 +++++++++++++------ .../operation/gis_maps/gis_map.php | 2 +- .../operation/messages/message_list.php | 6 +-- pandora_console/operation/users/user_edit.php | 2 +- 21 files changed, 109 insertions(+), 41 deletions(-) diff --git a/pandora_console/godmode/admin_access_logs.php b/pandora_console/godmode/admin_access_logs.php index 93c668f00c..0a2c545eb1 100644 --- a/pandora_console/godmode/admin_access_logs.php +++ b/pandora_console/godmode/admin_access_logs.php @@ -183,10 +183,10 @@ if (empty($result)) { } $table = new stdClass(); -$table->cellpadding = 4; -$table->cellspacing = 4; +$table->cellpadding = 0; +$table->cellspacing = 0; $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->size = []; $table->data = []; $table->head = []; @@ -247,6 +247,7 @@ foreach ($result as $row) { } html_print_table($table); +ui_pagination($count, $url, 0, 0, false, 'offset', true, 'pagination-bottom'); if ($enterprise_include !== ENTERPRISE_NOT_HOOK) { enterprise_hook('enterpriseAuditFooter'); diff --git a/pandora_console/godmode/alerts/alert_actions.php b/pandora_console/godmode/alerts/alert_actions.php index 6140d5407a..1530c6207f 100644 --- a/pandora_console/godmode/alerts/alert_actions.php +++ b/pandora_console/godmode/alerts/alert_actions.php @@ -221,7 +221,7 @@ if ($delete_action) { $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->data = []; $table->head = []; $table->head[0] = __('Name'); diff --git a/pandora_console/godmode/alerts/alert_commands.php b/pandora_console/godmode/alerts/alert_commands.php index 455ae72d73..8bbfa01dee 100644 --- a/pandora_console/godmode/alerts/alert_commands.php +++ b/pandora_console/godmode/alerts/alert_commands.php @@ -388,7 +388,7 @@ if ($copy_command) { } $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->data = []; $table->head = []; diff --git a/pandora_console/godmode/alerts/alert_list.list.php b/pandora_console/godmode/alerts/alert_list.list.php index 77bb7067bb..ee6411fe96 100644 --- a/pandora_console/godmode/alerts/alert_list.list.php +++ b/pandora_console/godmode/alerts/alert_list.list.php @@ -407,7 +407,7 @@ $table = new stdClass(); if (is_metaconsole()) { $table->class = 'alert_list databox'; } else { - $table->class = 'databox data'; + $table->class = 'info_table'; } $table->width = '100%'; @@ -815,6 +815,11 @@ foreach ($simple_alerts as $alert) { if (isset($data)) { html_print_table($table); + if ($id_agente) { + ui_pagination($total, 'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&tab=alert&id_agente='.$id_agente.$form_params.$sort_params, 0, 0, false, 'offset', true, 'pagination-bottom'); + } else { + ui_pagination($total, 'index.php?sec='.$sec.'&sec2=godmode/alerts/alert_list'.$form_params.$sort_params, 0, 0, false, 'offset', true, 'pagination-bottom'); + } } else { ui_print_info_message(['no_close' => true, 'message' => __('No alerts defined') ]); } diff --git a/pandora_console/godmode/alerts/alert_templates.php b/pandora_console/godmode/alerts/alert_templates.php index f00dbe5827..90e01b712d 100644 --- a/pandora_console/godmode/alerts/alert_templates.php +++ b/pandora_console/godmode/alerts/alert_templates.php @@ -339,7 +339,7 @@ if ($templates === false) { $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->data = []; $table->head = []; $table->head[0] = __('Name'); @@ -396,6 +396,7 @@ foreach ($templates as $template) { ui_pagination($total_templates, $url); if (isset($data)) { html_print_table($table); + ui_pagination($total_templates, $url, 0, 0, false, 'offset', true, 'pagination-bottom'); } else { ui_print_info_message(['no_close' => true, 'message' => __('No alert templates defined') ]); } diff --git a/pandora_console/godmode/category/category.php b/pandora_console/godmode/category/category.php index 727be02057..ba7155cc6b 100755 --- a/pandora_console/godmode/category/category.php +++ b/pandora_console/godmode/category/category.php @@ -82,7 +82,13 @@ $filter['limit'] = (int) $config['block_size']; // Search action: This will filter the display category view $result = false; -$result = categories_get_all_categories(); +$result = db_get_all_rows_filter( + 'tcategory', + [ + 'limit' => $filter['limit'], + 'offset' => $filter['offset'], + ] +); // Display categories previously filtered or not $rowPair = true; @@ -94,7 +100,7 @@ if (!empty($result)) { $table = new stdClass(); $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; $table->data = []; $table->head = []; @@ -131,6 +137,7 @@ if (!empty($result)) { } html_print_table($table); + ui_pagination($total_categories, $url, $offset, 0, false, 'offset', true, 'pagination-bottom'); } else { // No categories available or selected ui_print_info_message(['no_close' => true, 'message' => __('No categories found') ]); diff --git a/pandora_console/godmode/events/event_filter.php b/pandora_console/godmode/events/event_filter.php index 40d60650f6..59bd219ee6 100644 --- a/pandora_console/godmode/events/event_filter.php +++ b/pandora_console/godmode/events/event_filter.php @@ -113,7 +113,7 @@ if ($filters === false) { $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->head = []; $table->head[0] = __('Name'); diff --git a/pandora_console/godmode/groups/group_list.php b/pandora_console/godmode/groups/group_list.php index 6fc899a5d8..e24342ff6d 100644 --- a/pandora_console/godmode/groups/group_list.php +++ b/pandora_console/godmode/groups/group_list.php @@ -515,7 +515,7 @@ if ($tab == 'tree') { $table = new StdClass(); $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; $table->head = []; $table->head[0] = __('ID'); $table->head[1] = __('Name'); @@ -592,7 +592,7 @@ if ($tab == 'tree') { $block_size, true, 'offset', - false + true ); html_print_table($table); echo ui_pagination( @@ -602,7 +602,8 @@ if ($tab == 'tree') { $block_size, true, 'offset', - true + true, + 'pagination-bottom' ); } else { ui_print_info_message(['no_close' => true, 'message' => __('There are no defined groups') ]); diff --git a/pandora_console/godmode/modules/manage_network_components.php b/pandora_console/godmode/modules/manage_network_components.php index f1fae1785d..6014ef08c5 100644 --- a/pandora_console/godmode/modules/manage_network_components.php +++ b/pandora_console/godmode/modules/manage_network_components.php @@ -634,7 +634,7 @@ unset($table); $table->width = '100%'; $table->head = []; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->head[0] = __('Module name'); $table->head[1] = __('Type'); $table->head[3] = __('Description'); @@ -698,6 +698,7 @@ if (isset($data)) { echo "
"; html_print_input_hidden('multiple_delete', 1); html_print_table($table); + ui_pagination($total_components, $url, 0, 0, false, 'offset', true, 'pagination-bottom'); echo "
"; html_print_submit_button(__('Delete'), 'delete_btn', false, 'class="sub delete"'); echo '
'; diff --git a/pandora_console/godmode/modules/manage_network_templates.php b/pandora_console/godmode/modules/manage_network_templates.php index b179bdfd91..10468e75bf 100644 --- a/pandora_console/godmode/modules/manage_network_templates.php +++ b/pandora_console/godmode/modules/manage_network_templates.php @@ -189,7 +189,20 @@ if ($export_profile) { exit; } -$result = db_get_all_rows_in_table('tnetwork_profile', 'name'); +// Prepare pagination. +$offset = (int) get_parameter('offset'); +$limit = $config['block_size']; +$count_network_templates = db_get_value('count(*)', 'tnetwork_profile'); + +$result = db_get_all_rows_filter( + 'tnetwork_profile', + [ + 'order' => 'name', + 'limit' => $limit, + 'offset' => $offset, + ] +); + if ($result === false) { $result = []; } @@ -197,7 +210,7 @@ if ($result === false) { $table->cellpadding = 0; $table->cellspacing = 0; $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->head = []; $table->head[0] = __('Name'); @@ -241,7 +254,9 @@ foreach ($result as $row) { if (!empty($table->data)) { echo ''; html_print_input_hidden('multiple_delete', 1); + ui_pagination($count_network_templates, false, $offset); html_print_table($table); + ui_pagination($count_network_templates, false, $offset, 0, false, 'offset', true, 'pagination-bottom'); echo "
"; html_print_submit_button(__('Delete'), 'delete_btn', false, 'class="sub delete"'); echo '
'; diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php index b04643e1c3..9520bb6625 100644 --- a/pandora_console/godmode/servers/plugin.php +++ b/pandora_console/godmode/servers/plugin.php @@ -954,7 +954,7 @@ if (($create != '') || ($view != '')) { if (defined('METACONSOLE')) { echo ''; } else { - echo '
'; + echo '
'; } echo ''; diff --git a/pandora_console/godmode/setup/gis.php b/pandora_console/godmode/setup/gis.php index 946d0526ea..3acd113014 100755 --- a/pandora_console/godmode/setup/gis.php +++ b/pandora_console/godmode/setup/gis.php @@ -63,6 +63,7 @@ switch ($action) { break; } +$table->class = 'info_table'; $table->width = '98%'; $table->head[0] = __('Map connection name'); $table->head[1] = __('Group'); diff --git a/pandora_console/godmode/setup/links.php b/pandora_console/godmode/setup/links.php index f5016e666e..450115590a 100644 --- a/pandora_console/godmode/setup/links.php +++ b/pandora_console/godmode/setup/links.php @@ -137,7 +137,7 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { if (empty($rows)) { ui_print_info_message(['no_close' => true, 'message' => __("There isn't links") ]); } else { - echo "
'.__('Name').'
"; + echo "
"; echo "'; echo "'; diff --git a/pandora_console/godmode/setup/news.php b/pandora_console/godmode/setup/news.php index 7b663bad53..3339b8cd88 100644 --- a/pandora_console/godmode/setup/news.php +++ b/pandora_console/godmode/setup/news.php @@ -231,7 +231,7 @@ if ((isset($_GET['form_add'])) || (isset($_GET['form_edit']))) { ui_print_info_message(['no_close' => true, 'message' => __('There are no defined news') ]); } else { // Main list view for Links editor - echo "
".__('Link name').'".__('Delete').'
"; + echo "
"; echo ''; echo ''; echo ''; diff --git a/pandora_console/godmode/setup/os.list.php b/pandora_console/godmode/setup/os.list.php index f00b8cb00d..5673dd476a 100644 --- a/pandora_console/godmode/setup/os.list.php +++ b/pandora_console/godmode/setup/os.list.php @@ -25,7 +25,7 @@ if (! check_acl($config['id_user'], 0, 'PM') && ! is_user_admin($config['id_user $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->head[0] = ''; $table->head[1] = __('ID'); @@ -37,7 +37,19 @@ $table->align[4] = 'center'; $table->size[0] = '20px'; $table->size[4] = '20px'; -$osList = db_get_all_rows_in_table('tconfig_os'); +// Prepare pagination. +$offset = (int) get_parameter('offset'); +$limit = $config['block_size']; +$count_osList = db_get_value('count(*)', 'tconfig_os'); + +$osList = db_get_all_rows_filter( + 'tconfig_os', + [ + 'offset' => $offset, + 'limit' => $limit, + ] +); + if ($osList === false) { $osList = []; } @@ -69,7 +81,9 @@ foreach ($osList as $os) { } if (isset($data)) { + ui_pagination($count_osList, false, $offset); html_print_table($table); + ui_pagination($count_osList, false, $offset, 0, false, 'offset', true, 'pagination-bottom'); } else { ui_print_info_message(['no_close' => true, 'message' => __('There are no defined operating systems') ]); } diff --git a/pandora_console/godmode/tag/tag.php b/pandora_console/godmode/tag/tag.php index d717a9095e..e8678bb1ad 100644 --- a/pandora_console/godmode/tag/tag.php +++ b/pandora_console/godmode/tag/tag.php @@ -191,7 +191,7 @@ if (!empty($result)) { $table = new stdClass(); $table->width = '100%'; - $table->class = 'databox data'; + $table->class = 'info_table'; $table->data = []; $table->head = []; @@ -284,6 +284,7 @@ if (!empty($result)) { } html_print_table($table); + ui_pagination($total_tags, $url, 0, 0, false, 'offset', true, 'pagination-bottom'); } else { if (is_metaconsole()) { ui_toggle($filter_form, __('Show Options')); diff --git a/pandora_console/godmode/users/user_list.php b/pandora_console/godmode/users/user_list.php index 6b4d19ad28..b5904225a2 100644 --- a/pandora_console/godmode/users/user_list.php +++ b/pandora_console/godmode/users/user_list.php @@ -304,7 +304,7 @@ $table = new stdClass(); $table->cellpadding = 0; $table->cellspacing = 0; $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->head = []; $table->data = []; @@ -535,6 +535,7 @@ foreach ($info as $user_id => $user_info) { } html_print_table($table); +ui_pagination(count($info), false, 0, 0, false, 'offset', true, 'pagination-bottom'); echo '
'; unset($table); diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index b81387a4e5..e4b3e86cd2 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -3958,7 +3958,7 @@ span.log_zone_line_error { background-color: #eee; } .checkselected { - background-color: #eee; + background-color: #eee !important; } .tag-wrapper { padding: 0 10px 0 0; @@ -5040,18 +5040,22 @@ select#autorefresh_list:-internal-list-box { table.info_table { background-color: #fff; - /* margin-bottom: 20px;*/ + margin-bottom: 10px; border-spacing: 0; } -table.info_table tr:nth-child(even) { +table.info_table tbody tr:nth-child(even) { background-color: #f5f5f5; } table.info_table tr:first-child > th { - background-color: #373737; - color: #fff; + /*background-color: #373737;*/ + /*color: #fff;*/ /*font-size: 9pt;*/ + background-color: #fff; + border-top: 1px solid #e2e2e2; + color: #000; + text-align: left !important; } table.info_table tr:first-child > th span { @@ -5059,19 +5063,35 @@ table.info_table tr:first-child > th span { } table.info_table th { - color: #fff; - background-color: #666; + /*color: #fff;*/ + /*background-color: #666;*/ font-size: 7.5pt; letter-spacing: 0.3pt; + color: #000; + background-color: #fff; +} + +table.info_table > thead > tr > th:first-child { + border-left: 1px solid #e2e2e2; +} + +table.info_table > thead > tr > th:last-child { + border-right: 1px solid #e2e2e2; +} + +table.info_table tr th { + border-bottom: 1px solid #e2e2e2; } table.info_table > thead > tr:first-child > th:last-child { - border-right: 1px solid #373737; + /*border-right: 1px solid #373737;*/ + /*border-right: 1px solid #e2e2e2;*/ border-top-right-radius: 4px; } table.info_table > thead > tr:first-child > th:first-child { - border-left: 1px solid #373737; + /*border-left: 1px solid #373737;*/ + /* border-left: 1px solid #e2e2e2;*/ border-top-left-radius: 4px; } @@ -5079,8 +5099,8 @@ table.info_table > thead > tr > th, table.info_table > tbody > tr > th, table.info_table > thead > tr > th a { padding: 9px 7px; - font-weight: normal; - color: #fff; + font-weight: bold; + color: #000; } table.info_table > tbody > tr > td { @@ -5150,7 +5170,7 @@ table.info_table td:last-child img { .pagination .page_number a { padding: 5px; - width: 12px; + min-width: 12px; display: block; } @@ -5195,6 +5215,6 @@ table.info_table td:last-child img { .pagination-bottom { margin-bottom: 15px; - margin-top: 10px; + margin-top: 0px; align-items: flex-start; } diff --git a/pandora_console/operation/gis_maps/gis_map.php b/pandora_console/operation/gis_maps/gis_map.php index 9e6ea1a50a..6b6f5fad25 100644 --- a/pandora_console/operation/gis_maps/gis_map.php +++ b/pandora_console/operation/gis_maps/gis_map.php @@ -96,7 +96,7 @@ $maps = gis_get_maps(); $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; $table->head = []; $table->head['name'] = __('Name'); diff --git a/pandora_console/operation/messages/message_list.php b/pandora_console/operation/messages/message_list.php index 9427159432..88153b8fc9 100644 --- a/pandora_console/operation/messages/message_list.php +++ b/pandora_console/operation/messages/message_list.php @@ -135,9 +135,9 @@ if (empty($messages)) { } else { $table = new stdClass(); $table->width = '100%'; - $table->class = 'databox data'; - $table->cellpadding = 4; - $table->cellspacing = 4; + $table->class = 'info_table'; + $table->cellpadding = 0; + $table->cellspacing = 0; $table->head = []; $table->data = []; $table->align = []; diff --git a/pandora_console/operation/users/user_edit.php b/pandora_console/operation/users/user_edit.php index a5e3390c69..47e0f9f687 100644 --- a/pandora_console/operation/users/user_edit.php +++ b/pandora_console/operation/users/user_edit.php @@ -575,7 +575,7 @@ if (!defined('METACONSOLE')) { $table = new stdClass(); $table->width = '100%'; -$table->class = 'databox data'; +$table->class = 'info_table'; if (defined('METACONSOLE')) { $table->width = '100%'; $table->class = 'databox data'; From 7412a7cef0a07017bd3a623758d9e3d5bbeb77a0 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Fri, 29 Mar 2019 13:37:12 +0100 Subject: [PATCH 007/112] change Former-commit-id: 47ccc5dce928453e1fac9c1036094e6a03c6cde7 --- pandora_console/pandoradb.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 4aa8c0122c..77c5ab9324 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1989,7 +1989,7 @@ CREATE TABLE IF NOT EXISTS `tnetflow_report_content` ( `date` bigint(20) NOT NULL default '0', `period` int(11) NOT NULL default 0, `max` int (11) NOT NULL default 0, - `show_graph` varchar(60), + `show_graph` varchar(60) `order` int (11) NOT NULL default 0, PRIMARY KEY(`id_rc`), FOREIGN KEY (`id_report`) REFERENCES tnetflow_report(`id_report`) From b3c7a9fb4d28a73f89aecffec2845738b04e9a62 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Fri, 29 Mar 2019 13:38:36 +0100 Subject: [PATCH 008/112] change Former-commit-id: 3fe44307ee0118db78b80a21d0aa209e709e0d7d --- pandora_console/pandoradb.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql index 77c5ab9324..4aa8c0122c 100644 --- a/pandora_console/pandoradb.sql +++ b/pandora_console/pandoradb.sql @@ -1989,7 +1989,7 @@ CREATE TABLE IF NOT EXISTS `tnetflow_report_content` ( `date` bigint(20) NOT NULL default '0', `period` int(11) NOT NULL default 0, `max` int (11) NOT NULL default 0, - `show_graph` varchar(60) + `show_graph` varchar(60), `order` int (11) NOT NULL default 0, PRIMARY KEY(`id_rc`), FOREIGN KEY (`id_report`) REFERENCES tnetflow_report(`id_report`) From 48c4eb9c01d4d518d9a06b82ac71d053e6b0b87b Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Fri, 29 Mar 2019 13:58:53 +0100 Subject: [PATCH 009/112] Add changes in migrate and 27.sql file Former-commit-id: 60c2e2f2dc9a78ff9fb236efe7ac57a288d3717a --- pandora_console/extras/mr/27.sql | 5 +++++ .../extras/pandoradb_migrate_6.0_to_7.0.mysql.sql | 2 ++ 2 files changed, 7 insertions(+) create mode 100644 pandora_console/extras/mr/27.sql diff --git a/pandora_console/extras/mr/27.sql b/pandora_console/extras/mr/27.sql new file mode 100644 index 0000000000..2ed92ecbaf --- /dev/null +++ b/pandora_console/extras/mr/27.sql @@ -0,0 +1,5 @@ +START TRANSACTION; + +ALTER TABLE tnetflow_filter DROP COLUMN output; + +COMMIT; diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql index 6e5e2ebcc9..276a984831 100644 --- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql +++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql @@ -2058,3 +2058,5 @@ INSERT INTO `trecon_script` (`name`,`description`,`script`,`macros`) VALUES ('Di -- Add column in table `tagent_custom_fields` -- ---------------------------------------------------------------------- ALTER TABLE tagent_custom_fields ADD COLUMN `combo_values` VARCHAR(255) DEFAULT ''; +ALTER TABLE tnetflow_filter DROP COLUMN output; + From 4854d4b2df9d4a131a888b2f1d51bccf3c9e6075 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 29 Mar 2019 20:31:55 +0100 Subject: [PATCH 010/112] WIP atomic JS map Former-commit-id: 95736d11295948e5dc20aefcf1293b7882729588 --- .../include/class/NetworkMap.class.php | 122 ++++++++++++------ 1 file changed, 82 insertions(+), 40 deletions(-) diff --git a/pandora_console/include/class/NetworkMap.class.php b/pandora_console/include/class/NetworkMap.class.php index 17133d4d65..ecb92a59a7 100644 --- a/pandora_console/include/class/NetworkMap.class.php +++ b/pandora_console/include/class/NetworkMap.class.php @@ -34,9 +34,9 @@ enterprise_include_once('include/functions_networkmap.php'); enterprise_include_once('include/functions_discovery.php'); // Avoid node overlapping. -define('GRAPHVIZ_RADIUS_CONVERSION_FACTOR', 20); -define('MAP_X_CORRECTION', 600); -define('MAP_Y_CORRECTION', 150); +define('GRAPHVIZ_CONVERSION_FACTOR', 30); +define('MAP_X_CORRECTION', 0); +define('MAP_Y_CORRECTION', 0); /** @@ -319,6 +319,8 @@ class NetworkMap // Default mapOptions values. // Defines the command to generate positions. $this->mapOptions['generation_method'] = LAYOUT_SPRING1; + // Use fixed positions defined (X,Y) per node. + $this->mapOptions['fixed_positions'] = 0; $this->mapOptions['width'] = $config['networkmap_max_width']; $this->mapOptions['height'] = $config['networkmap_max_width']; $this->mapOptions['simple'] = 0; @@ -999,23 +1001,25 @@ class NetworkMap case NODE_GENERIC: // Handmade ones. // Add also parent relationship. - $parent_id = $node['id_parent']; + if (isset($node['id_parent'])) { + $parent_id = $node['id_parent']; - if ((int) $parent_id > 0) { - $parent_node = $this->getNodeData( - (int) $parent_id, - 'id_node' - ); - } + if ((int) $parent_id >= 0) { + $parent_node = $this->getNodeData( + (int) $parent_id, + 'id_node' + ); + } - // Store relationship. - if ($parent_node) { - $relations[] = [ - 'id_parent' => $parent_node, - 'parent_type' => NODE_GENERIC, - 'id_child' => $node['id_node'], - 'child_type' => NODE_GENERIC, - ]; + // Store relationship. + if ($parent_node !== null) { + $relations[] = [ + 'id_parent' => $parent_node, + 'parent_type' => NODE_GENERIC, + 'id_child' => $node['id_node'], + 'child_type' => NODE_GENERIC, + ]; + } } break; @@ -1233,8 +1237,13 @@ class NetworkMap $url = 'none'; $parent = $data['parent']; $font_size = $this->mapOptions['font_size']; - $radius = $this->mapOptions['map_filter']['node_radius']; - $radius /= GRAPHVIZ_RADIUS_CONVERSION_FACTOR; + if (isset($data['radius'])) { + $radius = $data['radius']; + } else { + $radius = $this->mapOptions['map_filter']['node_radius']; + } + + $radius /= GRAPHVIZ_CONVERSION_FACTOR; if (strlen($label) > 16) { $label = ui_print_truncate_text($label, 16, false, true, false); @@ -1632,7 +1641,7 @@ class NetworkMap $node[$k] = $v; } - $node['style']['label'] = $node['name']; + $node['style']['label'] = $node['label']; $node['style']['shape'] = 'circle'; $item['color'] = self::getColorByStatus($node['status']); break; @@ -1660,6 +1669,11 @@ class NetworkMap $count_item_holding_area++; } + // Propagate styles. + foreach ($node['style'] as $k => $v) { + $item[$k] = $v; + } + // Node image. $item['image_url'] = ''; $item['image_width'] = 0; @@ -1679,6 +1693,7 @@ class NetworkMap $item['text'] = io_safe_output($node['style']['label']); $item['shape'] = $node['style']['shape']; $item['map_id'] = $node['id_map']; + if (!isset($node['style']['id_networkmap']) || $node['style']['id_networkmap'] == '' || $node['style']['id_networkmap'] == 0 @@ -1694,8 +1709,6 @@ class NetworkMap $item['image'] = $item['image_url']; $item['image_height'] = 52; $item['image_width'] = 52; - $item['width'] = $this->mapOptions['map_filter']['node_radius']; - $item['height'] = $this->mapOptions['map_filter']['node_radius']; } $return[] = $item; @@ -2148,8 +2161,8 @@ class NetworkMap if (preg_match('/^graph.*$/', $line) != 0) { // Graph definition. $fields = explode(' ', $line); - $this->map['width'] = ($fields[2] * 10 * GRAPHVIZ_RADIUS_CONVERSION_FACTOR); - $this->map['height'] = ($fields[3] * 10 * GRAPHVIZ_RADIUS_CONVERSION_FACTOR); + $this->map['width'] = ($fields[2] * GRAPHVIZ_CONVERSION_FACTOR); + $this->map['height'] = ($fields[3] * GRAPHVIZ_CONVERSION_FACTOR); if ($this->map['width'] > $config['networkmap_max_width']) { $this->map['width'] = $config['networkmap_max_width']; @@ -2162,8 +2175,8 @@ class NetworkMap // Node. $fields = explode(' ', $line); $id = $fields[1]; - $nodes[$id]['x'] = (($fields[2] * $this->mapOptions['map_filter']['node_radius']) - $this->mapOptions['map_filter']['rank_sep'] * GRAPHVIZ_RADIUS_CONVERSION_FACTOR); - $nodes[$id]['y'] = (($fields[3] * $this->mapOptions['map_filter']['node_radius']) - $this->mapOptions['map_filter']['rank_sep'] * GRAPHVIZ_RADIUS_CONVERSION_FACTOR); + $nodes[$id]['x'] = ($fields[2] * GRAPHVIZ_CONVERSION_FACTOR); + $nodes[$id]['y'] = ($fields[3] * GRAPHVIZ_CONVERSION_FACTOR); } else if (preg_match('/^edge.*$/', $line) != 0 && empty($this->relations) === true ) { @@ -2401,7 +2414,14 @@ class NetworkMap * Calculate X,Y positions. */ - $graph = $this->calculateCoords(); + if (!$this->mapOptions['fixed_positions']) { + $graph = $this->calculateCoords(); + } else { + // Set by user. + $graph['nodes'] = $this->rawNodes; + $this->map['width'] = $this->mapOptions['width']; + $this->map['height'] = $this->mapOptions['height']; + } if (is_array($graph) === true) { $nodes = $graph['nodes']; @@ -2501,6 +2521,10 @@ class NetworkMap $style['image'] = $node_tmp['image']; $style['width'] = $node_tmp['width']; $style['height'] = $node_tmp['height']; + $style['radius'] = max( + $style['width'], + $style['height'] + ); $style['label'] = $node_tmp['text']; $node_tmp['style'] = json_encode($style); @@ -2676,6 +2700,7 @@ class NetworkMap $nodes = []; } + $this->nodes = $nodes; $nodes_js = $this->nodesToJS($nodes); $output .= 'networkmap.nodes = ('.json_encode($nodes_js).");\n"; @@ -2685,6 +2710,7 @@ class NetworkMap $relations = []; } + $this->relations = $relations; $links_js = $this->edgeToJS($relations); $output .= 'networkmap.links = ('.json_encode($links_js).");\n"; @@ -3220,17 +3246,25 @@ class NetworkMap if (enterprise_installed() && $this->useTooltipster ) { + $nodes_js = $this->nodesToJS($this->nodes); + $links_js = $this->edgeToJS($this->relations); + $output .= ''; @@ -3315,9 +3349,17 @@ class NetworkMap $output .= '
mapOptions['width']; - $output .= ' ;height:'.$this->mapOptions['height'].'">'; - $output .= ''; + + if ($this->fullSize) { + $output .= ' width:100%'; + $output .= ' ;height: 100%">'; + $output .= ''; + } else { + $output .= ' width:'.$this->mapOptions['width'].'px'; + $output .= ' ;height:'.$this->mapOptions['height'].'px">'; + $output .= ''; + } + $output .= ''; $output .= '
'; } else { From b0a6ea74151aa2901a3ff690f2b7db3c1f638b8c Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 29 Mar 2019 20:52:51 +0100 Subject: [PATCH 011/112] WIP atomic JS map. Minor fix to keep working Former-commit-id: fee809008311942f1d9ad14aea70ba78e3d6eb3a --- .../include/class/NetworkMap.class.php | 57 +++++++++++++------ 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/pandora_console/include/class/NetworkMap.class.php b/pandora_console/include/class/NetworkMap.class.php index ecb92a59a7..825ace8ae6 100644 --- a/pandora_console/include/class/NetworkMap.class.php +++ b/pandora_console/include/class/NetworkMap.class.php @@ -191,6 +191,20 @@ class NetworkMap */ public $relations; + /** + * Private nodes converted to JS. + * + * @var array + */ + private $nodesJS; + + /** + * Private relations converted to JS. + * + * @var array + */ + private $relationsJS; + /** * Include a Pandora (or vendor) node or not. * @@ -1604,6 +1618,11 @@ class NetworkMap $node['style'] = json_decode($node['style'], true); } + // Propagate styles. + foreach ($node['style'] as $k => $v) { + $item[$k] = $v; + } + $item['type'] = $node['type']; $item['fixed'] = true; $item['x'] = (int) $node['x']; @@ -1643,7 +1662,13 @@ class NetworkMap $node['style']['label'] = $node['label']; $node['style']['shape'] = 'circle'; - $item['color'] = self::getColorByStatus($node['status']); + if (isset($source_data['color'])) { + $item['color'] = $source_data['color']; + } else { + $item['color'] = self::getColorByStatus( + $node['status'] + ); + } break; } @@ -1669,11 +1694,6 @@ class NetworkMap $count_item_holding_area++; } - // Propagate styles. - foreach ($node['style'] as $k => $v) { - $item[$k] = $v; - } - // Node image. $item['image_url'] = ''; $item['image_width'] = 0; @@ -2700,9 +2720,13 @@ class NetworkMap $nodes = []; } - $this->nodes = $nodes; - $nodes_js = $this->nodesToJS($nodes); - $output .= 'networkmap.nodes = ('.json_encode($nodes_js).");\n"; + $this->nodesJS = $this->nodesToJS($nodes); + $output .= 'networkmap.nodes = ('.json_encode($this->nodesJS).");\n"; + + // Clean. + unset($this->nodes); + unset($this->rawNodes); + unset($this->nodeMapping); // Translate edges to js links. $relations = $this->graph['relations']; @@ -2710,9 +2734,11 @@ class NetworkMap $relations = []; } - $this->relations = $relations; - $links_js = $this->edgeToJS($relations); - $output .= 'networkmap.links = ('.json_encode($links_js).");\n"; + $this->relationsJS = $this->edgeToJS($relations); + $output .= 'networkmap.links = ('.json_encode($this->relationsJS).");\n"; + + // Clean. + unset($this->relations); $output .= ' //////////////////////////////////////////////////////////////////// @@ -3246,9 +3272,6 @@ class NetworkMap if (enterprise_installed() && $this->useTooltipster ) { - $nodes_js = $this->nodesToJS($this->nodes); - $links_js = $this->edgeToJS($this->relations); - $output .= ' width = '100%'; $table->id = 'table_filemanager'; if (!defined('METACONSOLE')) { - $table->class = 'databox data'; + $table->class = 'info_table'; $table->title = ''.__('Index of %s', $relative_directory).''; } @@ -582,13 +629,6 @@ function filemanager_file_explorer( $table->head[2] = __('Last modification'); $table->head[3] = __('Size'); $table->head[4] = __('Actions'); - if (!defined('METACONSOLE')) { - $table->headstyle[0] = 'background-color:#82B92E'; - $table->headstyle[1] = 'background-color:#82B92E'; - $table->headstyle[2] = 'background-color:#82B92E'; - $table->headstyle[3] = 'background-color:#82B92E'; - $table->headstyle[4] = 'background-color:#82B92E'; - } $prev_dir = explode('/', $relative_directory); $prev_dir_str = ''; @@ -608,85 +648,6 @@ function filemanager_file_explorer( $table->colspan[0][1] = 5; } - if (is_writable($real_directory)) { - $table->rowstyle[1] = 'display: none;'; - $table->data[1][0] = ''; - $table->data[1][1] = ''; - - $table->data[1][1] .= ''; - - $table->data[1][1] .= ''; - - $table->data[1][1] .= ''; - - $table->colspan[1][1] = 5; - } - foreach ($files as $fileinfo) { $fileinfo['realpath'] = str_replace('\\', '/', $fileinfo['realpath']); $relative_path = str_replace($_SERVER['DOCUMENT_ROOT'], '', $fileinfo['realpath']); @@ -815,10 +776,45 @@ function filemanager_file_explorer( if (defined('METACONSOLE')) { echo "
"; } else { - echo "
"; + $tabs_dialog = ''; + + echo ''; + + echo ''; + + echo ' '; + + echo "'; } else { - echo "
"; + echo "
"; echo "".__('The directory is read-only'); echo '
'; } diff --git a/pandora_console/include/styles/menu.css b/pandora_console/include/styles/menu.css index dcb9db06cb..7846a3f9a6 100644 --- a/pandora_console/include/styles/menu.css +++ b/pandora_console/include/styles/menu.css @@ -260,11 +260,6 @@ ul li { } /* End */ -ul li a:hover { - color: #e2144a; -} /* Hover Styles */ -/*li ul li a { padding: 2px 5px; } Sub Menu Styles */ - /* * --------------------------------------------------------------------- * - MAIN LEFT MENU and SUBMENU - diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e64e94329c..48a66017ed 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1014,7 +1014,6 @@ div#cont { } td.datos3, -/*td.datos3 **/ td.datos4 { background-color: #fff; color: #000 !important; @@ -1026,12 +1025,9 @@ td.datos4 { font-weight: normal; } -td.datos4 /*, -td.datos4 */ { +td.datos4 { /*Add !important because in php the function html_print_table write style in cell and this is style head.*/ text-align: center !important; - /* background-color: #666; - color: white !important;*/ } td.datos3 *, @@ -5162,6 +5158,186 @@ table.info_table > tbody > tr:hover { background-color: #fff !important; } +/* Tables to upload files */ +#table_filemanager tr:first-child th span { + font-weight: bold; +} + +.file_table_buttons { + text-align: right; + margin-bottom: 10px; +} + +.file_table_buttons a img { + border: 1px solid #e2e2e2; + padding: 5px; + border-radius: 4px; + margin-right: 10px; + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); +} + +#file_table_modal { + display: flex; + justify-content: space-between; + margin-bottom: 40px; +} + +#file_table_modal .create_folder, +#file_table_modal .create_text_file, +#file_table_modal .upload_file { + width: 33%; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + margin-right: 2px; + background-color: #e6e6e6; +} + +.file_table_buttons a:last-child img, +#file_table_modal .upload_file { + margin-right: 0px !important; +} + +#file_table_modal li a { + display: block; + padding: 5px; +} + +#file_table_modal li img, +#file_table_modal li span { + vertical-align: middle; +} + +#file_table_modal li img { + margin-right: 10px; +} + +#create_folder, +#create_text_file, +#upload_file { + margin-bottom: 30px; +} + +#create_folder input#text-dirname, +#create_text_file input#text-name_file { + width: 100%; + margin-right: 5px; + box-sizing: border-box; + margin-bottom: 10px; +} + +#upload_file input#file-file { + width: 70%; +} + +#create_folder input#submit-crt, +#create_text_file input#submit-create, +#upload_file input#submit-go { + float: right; +} + +#upload_file input#submit-go { + margin-top: 10px; +} + +.file_table_modal_active { + background-color: #fff !important; + border: 1px solid #e6e6e6; + border-bottom: none; +} + +/* Inventory table */ +.inventory_table_buttons { + text-align: right; + margin-bottom: 10px; +} + +.inventory_table_buttons a { + font-weight: bolder; + display: inline-block; + border: 1px solid #e2e2e2; + padding: 8px; + border-radius: 4px; + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.1); +} + +.inventory_table_buttons a img, +.inventory_table_buttons a span { + vertical-align: middle; +} + +.inventory_table_buttons a img { + padding-left: 10px; +} + +.inventory_tables thead th span:first-child { + float: left; + font-weight: bold; +} + +.inventory_tables thead th span { + font-size: 8.6pt; +} + +.inventory_tables tbody > tr:first-child { + font-weight: bold; +} + +/* Tag view */ +table.info_table.agent_info_table { + margin-bottom: 20px; +} +table.agent_info_table tr { + background-color: #fff !important; +} + +table.agent_info_table > tbody > tr > td { + border-bottom: none; +} + +table.agent_info_table > tbody > tr:last-child > td { + border-bottom: 1px solid #e2e2e2; +} + +table.agent_info_table thead > tr:first-child th { + background-color: #f5f5f5; +} + +table.agent_info_table thead > tr:first-child th span, +table.agent_info_table thead > tr:first-child th { + font-weight: bold; + font-size: 8.6pt; +} + +table.info_table.agent_info_table td { + padding-left: 20px; + padding-right: 20px; +} + +table.info_table.agent_info_table table#agent_table { + padding-top: 15px; +} + +table.info_table.agent_info_table table#module_table { + padding-top: 10px; + padding-bottom: 15px; +} + +table.info_table.agent_info_table table.info_table { + margin-bottom: 0; +} + +.agent_info_table_opened { + background-color: #82b92e !important; + color: #fff !important; + border-color: #82b92e !important; +} + +.agent_info_table_closed { + background-color: #fff !important; + color: #000 !important; + border-radius: 4px; +} + /* Arrows to sort the tables. */ .sort_arrow { display: inline-grid; diff --git a/pandora_console/index.php b/pandora_console/index.php index 78f4c76571..7fb469f2da 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1254,6 +1254,11 @@ require 'include/php_to_js_values.php'; \ No newline at end of file From 8bdc980ab0ebf96f4c18ebd4306c75a2b65cb188 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Fri, 12 Apr 2019 23:47:21 +0200 Subject: [PATCH 051/112] minor fix Former-commit-id: 4222b217953e88da43d0f50d3217a065dbb13332 --- pandora_server/lib/PandoraFMS/DiscoveryServer.pm | 12 ++++++------ pandora_server/lib/PandoraFMS/Recon/Base.pm | 1 + 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm index 76a8ac766c..c8b40d1848 100644 --- a/pandora_server/lib/PandoraFMS/DiscoveryServer.pm +++ b/pandora_server/lib/PandoraFMS/DiscoveryServer.pm @@ -202,15 +202,15 @@ sub data_consumer ($$) { || $cnf_extra{'cloud_util_path'} ne $ENV{'AWS_SECRET_ACCESS_KEY'}) { # Environmental data is out of date. Create a tmp file to manage # credentials. Perl limitation. We cannot update ENV here. - $cnf_extra{'cred_file'} = $pa_config->{'temporal'} . '/tmp_discovery.' . md5($task->{'id_rt'} . $task->{'name'} . time()); + $cnf_extra{'creds_file'} = $pa_config->{'temporal'} . '/tmp_discovery.' . md5($task->{'id_rt'} . $task->{'name'} . time()); eval { - open(my $__file_cfg, '> '. $cnf_extra{'cred_file'}) or die($!); + open(my $__file_cfg, '> '. $cnf_extra{'creds_file'}) or die($!); print $__file_cfg $cnf_extra{'aws_access_key_id'} . "\n"; print $__file_cfg $cnf_extra{'aws_secret_access_key'} . "\n"; close($__file_cfg); set_file_permissions( $pa_config, - $cnf_extra{'cred_file'}, + $cnf_extra{'creds_file'}, "0600" ); }; @@ -270,9 +270,9 @@ sub data_consumer ($$) { $recon->scan(); # Clean tmp file. - if (defined($cnf_extra{'cred_file'}) - && -f $cnf_extra{'cred_file'}) { - unlink($cnf_extra{'cred_file'}); + if (defined($cnf_extra{'creds_file'}) + && -f $cnf_extra{'creds_file'}) { + unlink($cnf_extra{'creds_file'}); } }; if ($@) { diff --git a/pandora_server/lib/PandoraFMS/Recon/Base.pm b/pandora_server/lib/PandoraFMS/Recon/Base.pm index 58e0eb8543..23532d843b 100644 --- a/pandora_server/lib/PandoraFMS/Recon/Base.pm +++ b/pandora_server/lib/PandoraFMS/Recon/Base.pm @@ -1456,6 +1456,7 @@ sub cloud_scan($) { aws_access_key_id => $self->{'aws_access_key_id'}, aws_secret_access_key => $self->{'aws_secret_access_key'}, cloud_util_path => $self->{'cloud_util_path'}, + creds_file => $self->{'creds_file'}, parent => $self ] From ef0f7cded872a7e9f578bc1f83e70451463e21a0 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 13 Apr 2019 00:01:31 +0200 Subject: [PATCH 052/112] Auto-updated build strings. Former-commit-id: c9f4339d4c39a14d446e1a3ea42c28d68398670d --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index ae32bb637c..bf32135d47 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.733-190412 +Version: 7.0NG.733-190413 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index dfaee640cd..32a2345ad2 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.733-190412" +pandora_version="7.0NG.733-190413" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 8574e5992c..ab473b2156 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.733'; -use constant AGENT_BUILD => '190412'; +use constant AGENT_BUILD => '190413'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index f422cf9440..dc4f5ee3ec 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.733 -%define release 190412 +%define release 190413 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index aa20c8959d..af67411052 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.733 -%define release 190412 +%define release 190413 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 5a37ec8afb..c18ecc854f 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.733" -PI_BUILD="190412" +PI_BUILD="190413" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index ab6dbf55cf..6e4c3c5490 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190412} +{190413} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 29e3fa7c6c..2487b74435 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.733(Build 190412)") +#define PANDORA_VERSION ("7.0NG.733(Build 190413)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index f100c45e66..031a3c1826 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.733(Build 190412))" + VALUE "ProductVersion", "(7.0NG.733(Build 190413))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 9a2377396a..1ca1ddd698 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.733-190412 +Version: 7.0NG.733-190413 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 8ede0c1194..7634224065 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.733-190412" +pandora_version="7.0NG.733-190413" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 8c2bb2d844..b39c440545 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190412'; +$build_version = 'PC190413'; $pandora_version = 'v7.0NG.733'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 3d0b96a7fc..d0f65b0098 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 567f5b5c31..e5802dfeb3 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.733 -%define release 190412 +%define release 190413 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 21ccfc3b6a..2713196643 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.733 -%define release 190412 +%define release 190413 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 229d90d637..1332c441cb 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.733" -PI_BUILD="190412" +PI_BUILD="190413" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 7ecf3e1d85..ff87840e15 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.733 PS190412"; +my $version = "7.0NG.733 PS190413"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 05c7a879ac..1210f6b1af 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.733 PS190412"; +my $version = "7.0NG.733 PS190413"; # save program name for logging my $progname = basename($0); From d0f6726d00c6fdcd368467d1b93a80d996a6ea0a Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 14 Apr 2019 00:01:23 +0200 Subject: [PATCH 053/112] Auto-updated build strings. Former-commit-id: b06d9487fb226c80a72020082f0b33ee2af854f7 --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index bf32135d47..b1e64770e3 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.733-190413 +Version: 7.0NG.733-190414 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 32a2345ad2..e6b95a24ce 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.733-190413" +pandora_version="7.0NG.733-190414" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index ab473b2156..9e9a74a6aa 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.733'; -use constant AGENT_BUILD => '190413'; +use constant AGENT_BUILD => '190414'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index dc4f5ee3ec..b38004128e 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.733 -%define release 190413 +%define release 190414 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index af67411052..f8d2d8fe6f 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.733 -%define release 190413 +%define release 190414 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index c18ecc854f..628a953fdb 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.733" -PI_BUILD="190413" +PI_BUILD="190414" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 6e4c3c5490..1c7aaee0b8 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190413} +{190414} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 2487b74435..21ce524282 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.733(Build 190413)") +#define PANDORA_VERSION ("7.0NG.733(Build 190414)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 031a3c1826..e6a8afbae9 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.733(Build 190413))" + VALUE "ProductVersion", "(7.0NG.733(Build 190414))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 1ca1ddd698..c37bb4627b 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.733-190413 +Version: 7.0NG.733-190414 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 7634224065..a942aca6bc 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.733-190413" +pandora_version="7.0NG.733-190414" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index b39c440545..71dd735d54 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190413'; +$build_version = 'PC190414'; $pandora_version = 'v7.0NG.733'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index d0f65b0098..74b1fb2c50 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index e5802dfeb3..f0ea59d3c2 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.733 -%define release 190413 +%define release 190414 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 2713196643..9fef53ea0f 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.733 -%define release 190413 +%define release 190414 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 1332c441cb..3057a5417c 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.733" -PI_BUILD="190413" +PI_BUILD="190414" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index ff87840e15..123dc3f1a0 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.733 PS190413"; +my $version = "7.0NG.733 PS190414"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 1210f6b1af..166b4f1b7b 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.733 PS190413"; +my $version = "7.0NG.733 PS190414"; # save program name for logging my $progname = basename($0); From 68258661b1369af36f9cc503ee5d9544c7ed431d Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 15 Apr 2019 00:01:24 +0200 Subject: [PATCH 054/112] Auto-updated build strings. Former-commit-id: a45bf5f65399be38165be423f0b40a40e4468522 --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index b1e64770e3..d4ecfdb23a 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.733-190414 +Version: 7.0NG.733-190415 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index e6b95a24ce..68e93c1a9d 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.733-190414" +pandora_version="7.0NG.733-190415" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 9e9a74a6aa..e85d782d8a 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -42,7 +42,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.733'; -use constant AGENT_BUILD => '190414'; +use constant AGENT_BUILD => '190415'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index b38004128e..eae61811b0 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.733 -%define release 190414 +%define release 190415 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index f8d2d8fe6f..35cbf6d9a6 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -3,7 +3,7 @@ # %define name pandorafms_agent_unix %define version 7.0NG.733 -%define release 190414 +%define release 190415 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 628a953fdb..edb50b3948 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.733" -PI_BUILD="190414" +PI_BUILD="190415" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 1c7aaee0b8..0d82aece5e 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{190414} +{190415} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 21ce524282..fa52a8997a 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.733(Build 190414)") +#define PANDORA_VERSION ("7.0NG.733(Build 190415)") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index e6a8afbae9..69aa821e1b 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.733(Build 190414))" + VALUE "ProductVersion", "(7.0NG.733(Build 190415))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index c37bb4627b..811275c5c7 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.733-190414 +Version: 7.0NG.733-190415 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index a942aca6bc..de9a50678b 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.733-190414" +pandora_version="7.0NG.733-190415" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 71dd735d54..3178d5cce4 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC190414'; +$build_version = 'PC190415'; $pandora_version = 'v7.0NG.733'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 74b1fb2c50..7549110130 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -129,7 +129,7 @@
[ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index f0ea59d3c2..c00fdccebd 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.733 -%define release 190414 +%define release 190415 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 9fef53ea0f..cd780204c1 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -3,7 +3,7 @@ # %define name pandorafms_server %define version 7.0NG.733 -%define release 190414 +%define release 190415 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 3057a5417c..5df5a40fe0 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.733" -PI_BUILD="190414" +PI_BUILD="190415" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 123dc3f1a0..7338eb3c28 100644 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -34,7 +34,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.733 PS190414"; +my $version = "7.0NG.733 PS190415"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 166b4f1b7b..a1b8bc4b38 100644 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.733 PS190414"; +my $version = "7.0NG.733 PS190415"; # save program name for logging my $progname = basename($0); From d3d5312f40202d582a865b099d815274cdbb7e40 Mon Sep 17 00:00:00 2001 From: Marcos Alconada Date: Mon, 15 Apr 2019 11:14:41 +0200 Subject: [PATCH 055/112] Update 27.sql Former-commit-id: 4e027274bb9edeb51dc64f935ddd3ee2bfd62d0d --- pandora_console/extras/mr/27.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/pandora_console/extras/mr/27.sql b/pandora_console/extras/mr/27.sql index aff9a5eeb9..d04e8da857 100644 --- a/pandora_console/extras/mr/27.sql +++ b/pandora_console/extras/mr/27.sql @@ -2,7 +2,6 @@ START TRANSACTION; ALTER TABLE `tnetflow_filter` DROP COLUMN `output`; -COMMIT; ALTER TABLE `tagente_modulo` ADD COLUMN `ff_type` tinyint(1) unsigned default '0'; ALTER TABLE `tnetwork_component` ADD COLUMN `ff_type` tinyint(1) unsigned default '0'; ALTER TABLE `tlocal_component` ADD COLUMN `ff_type` tinyint(1) unsigned default '0'; From eca7f6e53afebdc6e79796d892b52a4707aae4d1 Mon Sep 17 00:00:00 2001 From: Rafael Ameijeiras Date: Mon, 15 Apr 2019 11:20:57 +0200 Subject: [PATCH 056/112] fixed minor bug in the open spec Former-commit-id: 0d8aacf0d4e7ae6199d103e62b6a6a8891c3a0f2 --- pandora_console/pandora_console.rhel7.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/pandora_console.rhel7.spec b/pandora_console/pandora_console.rhel7.spec index 29b446ae07..b128c4153a 100644 --- a/pandora_console/pandora_console.rhel7.spec +++ b/pandora_console/pandora_console.rhel7.spec @@ -21,7 +21,7 @@ Source0: %{name}-%{version}.tar.gz URL: http://www.pandorafms.com Group: Productivity/Networking/Web/Utilities Packager: Sancho Lerena -Prefix: /opt/rh/httpd24/root/var/www/html/ +Prefix: /opt/rh/httpd24/root/var/www/html BuildRoot: %{_tmppath}/%{name} BuildArch: noarch AutoReq: 0 From 994424fe52c69f6f3c5a82ccf11ed1bd83018645 Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Mon, 15 Apr 2019 12:19:35 +0200 Subject: [PATCH 057/112] Functions changed Former-commit-id: 7eb0fb25ec863df6c60ed88bf84a6f5db5c90979 --- pandora_console/include/api.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/api.php b/pandora_console/include/api.php index 7adfdbe2fe..589ce3a046 100644 --- a/pandora_console/include/api.php +++ b/pandora_console/include/api.php @@ -149,7 +149,7 @@ if ($correctLogin) { break; case 'get_info_user_name': - $id_os = get_info_user_name($user); + $id_os = get_info_user_name($type, $user); if ($id_os === 100) { returnError('not_allowed_operation_cluster', $returnType); @@ -158,7 +158,7 @@ if ($correctLogin) { break; case 'get_filter_user_group': - $id_os = get_filter_user_group($user, $group, $disable); + $id_os = get_filter_user_group($type, $user, $group, $disable); if ($id_os === false) { returnError('not_allowed_operation_cluster', $returnType); @@ -176,7 +176,7 @@ if ($correctLogin) { break; case 'get_list_all_user': - $id_os = get_list_all_user(); + $id_os = get_list_all_user($type); if ($id_os === false) { returnError('not_allowed_operation_cluster', $returnType); @@ -184,7 +184,7 @@ if ($correctLogin) { } case 'add_permission_user_to_group': - $id_os = add_permisson_user_to_group(); + $id_os = add_permisson_user_to_group($type, $id_user, $group, $profile, $other = ';'); if ($id_os === false) { returnError('not_allowed_operation_cluster', $returnType); From c8af83b1128c89e90125acdeef8503f4a4a89c1d Mon Sep 17 00:00:00 2001 From: Marcos Alconada Date: Mon, 15 Apr 2019 12:30:42 +0200 Subject: [PATCH 058/112] Update with validations and type return data functions_api.php Former-commit-id: 0757de69c24df3e547924d8dacd32ba9dd88524c --- pandora_console/include/functions_api.php | 133 ++++++++++++++++------ 1 file changed, 96 insertions(+), 37 deletions(-) diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 820791f999..24e03f0e8e 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -14730,9 +14730,15 @@ function api_set_reset_agent_counts($id, $thrash1, $thrash2, $thrash3) } -// Functions por get all user to Carrefour new feature -function api_get_list_all_user() +// Functions por get all user to new feature for Carrefour +// It depends of type the method will return csv or json data +function api_get_list_all_user($type) { +//validate return type data +//if return type data is not specifiqued you will return message error + if($type === null){ + returnError('no_data_to_show', 'type data return not specifiqued.'); + } $sql = sprintf('select u.id_usuario, p.id_perfil, p.name, u.id_grupo from tperfil p, tusuario_perfil u where p.id_perfil in (select u.id_perfil from tusuario_perfil)'); $users = db_get_all_rows_sql($sql); @@ -14749,29 +14755,40 @@ function api_get_list_all_user() 'id_perfil' => $users['id_perfil'], 'perfil_name' => $users['name'], 'id_grupo' => $users['id_grupo'], - 'group_name' => $users, + 'group_name' => $group_name, ]; } if ($values === false) { returnError('Error_user', ' Users could not be found.'); - } else { - $data = [ - 'type' => 'string', - 'data' => $values, - ]; - - returnData('string', ['type' => 'string', 'data' => $data]); } + $data = [ + 'type' => 'array', + 'data' => $values, + ]; + switch ($type) { + case 'csv': + returnData('csv', $data, ';'); + + case 'json': + returnData('json', $data, ';'); + } } -// Funtion for get all info user for Carrefour new feature -function api_get_info_user_name($user) +// Funtion for get all info user to new feature for Carrefour +// It depends of type the method will return csv or json data +function api_get_info_user_name($type,$user) { if ($user === null) { - return false; + returnError('no_data_to_show', 'User not specifiqued.'); + } +//validate return type data +//if return type data is not specifiqued you will return message error + if($type === null){ + returnError('no_data_to_show', 'type data return not specifiqued.'); + } $sql = sprintf("select u.id_usuario, p.id_perfil, p.name, u.id_grupo from tperfil p, tusuario_perfil u where p.id_perfil in (select u.id_perfil from tusuario_perfil where u.id_usuario = '.$user.')"); @@ -14796,24 +14813,36 @@ function api_get_info_user_name($user) if ($values === false) { returnError('Error_user', ' User could not be found.'); - } else { + } $data = [ - 'type' => 'string', + 'type' => 'array', 'data' => $values, ]; - - returnData('string', ['type' => 'string', 'data' => $data]); - } + switch ($type) { + case 'csv': + returnData('csv', $data, ';'); + + case 'json': + returnData('json', $data, ';'); + } } -// Function for get group user to Carrefour new feature -function api_get_filter_user_group($user, $group, $disable) +// Function for get user from a group to new feature for Carrefour. +// It depends of type the method will return csv or json data. + +function api_get_filter_user_group($type,$user, $group, $disable) { if ($user === null && ($group === null || $disable === null)) { - return false; + returnError('no_data_to_show', 'User, group or is disable not specifiqued.'); } +//validate return type data +//if return type data is not specifiqued you will return message error + if($type === null){ + returnError('no_data_to_show', 'type data return not specifiqued.'); + + } if ($group !== null) { $condition = $grupo; $campo = 'group'; @@ -14853,48 +14882,66 @@ function api_get_filter_user_group($user, $group, $disable) } if ($values === false) { - returnError('Error_user', ' User profile could not be found.'); - } else { + returnError('Error_user', ' User could not be found.'); + } $data = [ - 'type' => 'string', + 'type' => 'array', 'data' => $values, ]; - - returnData('string', ['type' => 'string', 'data' => $data]); - } + switch ($type) { + case 'csv': + returnData('csv', $data, ';'); + + case 'json': + returnData('json', $data, ';'); + } } // Function for delete an user profile for Carrefour new feature +// The return of this function its only a message function api_get_delete_user_profile($id_user) { if ($id_user === null) { return false; } +//validate return type data +//if return type data is not specifiqued you will return message error + if($type === null){ + returnError('no_data_to_show', 'type data return not specifiqued.'); + + } $sql = "delete from tusuario_perfil where id_usuario = '$id_user'"; $deleted_permission = db_process_sql_delete($sql); if ($deleted_permission === false) { returnError('Error_delete', ' User profile could not be deleted.'); - } else { - $data = [ + } + + $data = [ 'type' => 'string', 'data' => $deleted_permission, - ]; + ]; returnData('string', ['type' => 'string', 'data' => $data]); - } } - - -// Function for add permission an user to a group for Carrefour new feature -function api_add_permisson_user_to_group($id_user, $group, $profile, $other=';') + +// Function for add permission a user to a group for Carrefour new feature +//it depends of type the method will return csv or json data +function api_add_permisson_user_to_group($type, $id_user, $group, $profile, $other=';') { if ($user === null || $group === null || $profile === null) { return false; } +//validate return type data +//if return type data is not specifiqued you will return message error + if($type === null){ + returnError('no_data_to_show', 'type data return not specifiqued.'); + + } + $other[0] = $id_user; $other[1] = $group; $other[2] = $profile; @@ -14925,7 +14972,19 @@ function api_add_permisson_user_to_group($id_user, $group, $profile, $other=';') if ($sucessfull_insert === false) { returnError('Error_insert', ' User profile could not be aviable.'); - } else { - returnData('string', ['type' => 'string', 'data' => $data]); } + + $data = [ + 'type' => 'array', + 'data' => $values, + ]; + switch ($type) { + + case 'csv': + returnData('csv', $data, ';'); + + case 'json': + returnData('json', $data, ';'); + } + } From 6648e0268a3633496f4aa83e2129f7ec1981e2b2 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 15 Apr 2019 12:54:22 +0200 Subject: [PATCH 059/112] removed reconview link from menu Former-commit-id: 41b80e4eaa41617982c91a218aee3902b76e4fde --- pandora_console/operation/menu.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index e22769cd8a..f52d830d14 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -492,12 +492,6 @@ if (is_array($config['extensions'])) { $sub['godmode/agentes/planned_downtime.list']['id'] = 'Scheduled downtime'; } - if (check_acl($config['id_user'], 0, 'AW')) { - $sub['operation/servers/recon_view']['text'] = __('Recon view'); - $sub['operation/servers/recon_view']['id'] = 'Recon view'; - $sub['operation/servers/recon_view']['refr'] = 0; - } - foreach ($config['extensions'] as $extension) { // If no operation_menu is a godmode extension. if ($extension['operation_menu'] == '') { From 072fec3dd1bb133b59a3fb2136abfe51d4aafb5e Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Mon, 15 Apr 2019 13:03:11 +0200 Subject: [PATCH 060/112] removed map link from mysql/oracle/RDS discovery tasks Former-commit-id: c01ca25dbe4ca16265a6377d80f60f6d603b7664 --- pandora_console/godmode/wizards/DiscoveryTaskList.class.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php index 20b52c7e36..fbd8bc4fb6 100644 --- a/pandora_console/godmode/wizards/DiscoveryTaskList.class.php +++ b/pandora_console/godmode/wizards/DiscoveryTaskList.class.php @@ -549,7 +549,11 @@ class DiscoveryTaskList extends Wizard $data[9] .= ''; } - if ($task['disabled'] != 2 && $task['utimestamp'] > 0) { + if ($task['disabled'] != 2 && $task['utimestamp'] > 0 + && $task['type'] != DISCOVERY_APP_MYSQL + && $task['type'] != DISCOVERY_APP_ORACLE + && $task['type'] != DISCOVERY_CLOUD_AWS_RDS + ) { $data[9] .= ''; $data[9] .= html_print_image( 'images/dynamic_network_icon.png', From 29c282dc798bae6baf2d783650df5d10ab36357b Mon Sep 17 00:00:00 2001 From: Tatiana Llorente Date: Mon, 15 Apr 2019 14:42:58 +0200 Subject: [PATCH 061/112] Changed popup no access - #3625 Former-commit-id: 0798f53d9074a580309aeb9f9577ec518efd9264 --- pandora_console/general/noaccess.php | 14 +++++++------- pandora_console/images/imagen-no-acceso.jpg | Bin 0 -> 61471 bytes 2 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 pandora_console/images/imagen-no-acceso.jpg diff --git a/pandora_console/general/noaccess.php b/pandora_console/general/noaccess.php index 27fc4fec72..8f70661296 100644 --- a/pandora_console/general/noaccess.php +++ b/pandora_console/general/noaccess.php @@ -11,9 +11,10 @@ transform: translate(-50%, -50%); -webkit-transform: translate(-50%, -50%); width:650px; - height: 350px; + height: 400px; background:white; - background-image:url('images/image_problem_area.png'); + background-image:url('images/imagen-no-acceso.jpg'); + background-repeat:no-repeat; justify-content: center; display: flex; flex-direction: column; @@ -30,7 +31,7 @@ color:#000; font-family:Nunito; line-height: 40px; - font-size: 25pt; + font-size: 23pt; margin-bottom:30px; } .modalclose{ @@ -42,12 +43,11 @@ } .modalconten{ color:black; - background:white; - width:350px; + width:300px; margin-left: 30px; } .modalcontenttex{ - text-align:justify; + text-align:left; color:black; font-size: 11pt; line-height:13pt; @@ -159,6 +159,6 @@ font-size:10pt; window.location="."; }); - $('div#page').css('background-color','#a5a5a5'); + $('div#page').css('background-color','#d3d3d3'); \ No newline at end of file diff --git a/pandora_console/images/imagen-no-acceso.jpg b/pandora_console/images/imagen-no-acceso.jpg new file mode 100644 index 0000000000000000000000000000000000000000..93b9256edb59b290aa3f53a0abd70f7577b63cb0 GIT binary patch literal 61471 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 literal 0 HcmV?d00001 From a3787c687c8ba8a7623747c8786ffe24d873353a Mon Sep 17 00:00:00 2001 From: "marcos.alconada" Date: Mon, 15 Apr 2019 15:10:43 +0200 Subject: [PATCH 062/112] prueba Former-commit-id: 61d4bc20b7811c44125b806f960561eb40412818 --- pandora_console/godmode/servers/plugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php index b04643e1c3..5ff8022afa 100644 --- a/pandora_console/godmode/servers/plugin.php +++ b/pandora_console/godmode/servers/plugin.php @@ -281,7 +281,7 @@ if (($create != '') || ($view != '')) { } else { if ($create != '') { ui_print_page_header( - __('Plugin creation'), + __('Plugin registration'), 'images/gm_servers.png', false, 'plugin_definition', From 8c27411be633878cd5654a24e2dcc91664e585e5 Mon Sep 17 00:00:00 2001 From: Marcos Alconada Date: Mon, 15 Apr 2019 15:18:22 +0200 Subject: [PATCH 063/112] Delete plugin.php Former-commit-id: c37a85bcf4082a148e72cdc9b1a166a70ec94537 --- pandora_console/godmode/servers/plugin.php | 1205 -------------------- 1 file changed, 1205 deletions(-) delete mode 100644 pandora_console/godmode/servers/plugin.php diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php deleted file mode 100644 index 5ff8022afa..0000000000 --- a/pandora_console/godmode/servers/plugin.php +++ /dev/null @@ -1,1205 +0,0 @@ - $id_plugin]); - $preload = io_safe_output($description); - $preload = str_replace("\n", '
', $preload); - - echo $preload; - return; - } - - if ($get_list_modules_and_component_locked_plugin) { - $id_plugin = (int) get_parameter('id_plugin', 0); - - $network_components = db_get_all_rows_filter( - 'tnetwork_component', - ['id_plugin' => $id_plugin] - ); - if (empty($network_components)) { - $network_components = []; - } - - $modules = db_get_all_rows_filter( - 'tagente_modulo', - [ - 'delete_pending' => 0, - 'id_plugin' => $id_plugin, - ] - ); - if (empty($modules)) { - $modules = []; - } - - $table = null; - $table->width = '100%'; - $table->head[0] = __('Network Components'); - $table->data = []; - foreach ($network_components as $net_comp) { - $table->data[] = [$net_comp['name']]; - } - - if (!empty($table->data)) { - html_print_table($table); - - echo '
'; - } - - $table = null; - $table->width = '100%'; - $table->head[0] = __('Agent'); - $table->head[1] = __('Module'); - foreach ($modules as $mod) { - $agent_name = '
'.modules_get_agentmodule_agent_name( - $mod['id_agente_modulo'] - ).''; - - - $table->data[] = [ - $agent_name, - $mod['nombre'], - ]; - } - - if (!empty($table->data)) { - html_print_table($table); - } - - return; - } -} - - -require_once $config['homedir'].'/include/functions_filemanager.php'; - -check_login(); - -if (! check_acl($config['id_user'], 0, 'PM')) { - db_pandora_audit( - 'ACL Violation', - 'Trying to access Plugin Management' - ); - include 'general/noaccess.php'; - return; -} - -enterprise_include_once('meta/include/functions_components_meta.php'); - -$view = get_parameter('view', ''); -$create = get_parameter('create', ''); -$filemanager = (bool) get_parameter('filemanager', false); -$edit_file = get_parameter('edit_file', false); -$update_file = get_parameter('update_file', false); -$plugin_command = get_parameter('plugin_command', ''); -$tab = get_parameter('tab', ''); -$deploy_plugin = get_parameter('deploy_plugin', 0); - -if ($view != '') { - $form_id = $view; - $plugin = db_get_row('tplugin', 'id', $form_id); - $form_name = $plugin['name']; - $form_description = $plugin['description']; - $form_max_timeout = $plugin['max_timeout']; - $form_max_retries = $plugin['max_retries']; - if (empty($plugin_command)) { - $form_execute = $plugin['execute']; - } else { - $form_execute = $plugin_command; - } - - $form_plugin_type = $plugin['plugin_type']; - $macros = $plugin['macros']; - $parameters = $plugin['parameters']; -} - -if ($create != '') { - $form_id = 0; - $form_name = ''; - $form_description = ''; - $form_max_timeout = 15; - $form_max_retries = 1; - $form_execute = $plugin_command; - $form_plugin_type = 0; - $form_parameters = ''; - $macros = ''; - $parameters = ''; -} - -// END LOAD VALUES -// ===================================================================== -// INIT FILEMANAGER -// ===================================================================== -if ($filemanager) { - if ($edit_file) { - $location_file = get_parameter('location_file', ''); - $filename = array_pop(explode('/', $location_file)); - $file = file_get_contents($location_file); - echo '

'.__('Edit file').' '.$filename.'

'; - // echo "" . __('Back to file explorer') . ""; - echo "
"; - // html_print_input_hidden('location_file', $locationFile); - echo "
'.__('Subject').''.__('Type').''.__('Author').'
"; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ""; - echo ''; - echo ''; - echo '
'.__('Edit').'
'; - echo "'; - echo '
'; - html_print_input_hidden('location_file', $location_file); - - echo __('Compatibility mode').':'; - $options = [ - 'unix' => 'Unix', - 'windows' => 'Windows', - ]; - html_print_select($options, 'compatibility', $compatibility); - echo " "; - echo '
'; - echo ''; - } else { - if ($update_file) { - $location_file = get_parameter('location_file', ''); - $contentFile = io_safe_output(get_parameter('content_file', '')); - $compatibility = get_parameter('compatibility', 'unix'); - $is_win_compatible = strpos($contentFile, "\r\n"); - // If is win compatible and the compatibility must be unix - if ($is_win_compatible !== false && $compatibility == 'unix') { - $contentFile = str_replace("\r\n", "\n", $contentFile); - } else if ($is_win_compatible === false && $compatibility == 'windows') { - // If is unix compatible and the compatibility must be win - $contentFile = str_replace("\n", "\r\n", $contentFile); - } - - $result = file_put_contents($location_file, $contentFile); - } - - $id_plugin = (int) get_parameter('id_plugin', 0); - - // Add custom directories here - $fallback_directory = 'attachment/plugin'; - - $directory = (string) get_parameter('directory', $fallback_directory); - $directory = str_replace('\\', '/', $directory); - - // A miminal security check to avoid directory traversal - if (preg_match('/\.\./', $directory)) { - $directory = $fallback_directory; - } - - if (preg_match('/^\//', $directory)) { - $directory = $fallback_directory; - } - - if (preg_match('/^manager/', $directory)) { - $directory = $fallback_directory; - } - - $banned_directories['include'] = true; - $banned_directories['godmode'] = true; - $banned_directories['operation'] = true; - $banned_directories['reporting'] = true; - $banned_directories['general'] = true; - $banned_directories[ENTERPRISE_DIR] = true; - - if (isset($banned_directories[$directory])) { - $directory = $fallback_directory; - } - - $real_directory = realpath($config['homedir'].'/'.$directory); - - echo '

'.__('Index of %s', $directory).'

'; - - $chunck_url = '&view='.$id_plugin; - if ($id_plugin == 0) { - $chunck_url = '&create=1'; - } - - $homedir_filemanager = isset($config['homedir_filemanager']) ? $config['homedir_filemanager'] : false; - filemanager_file_explorer( - $real_directory, - $directory, - 'index.php?sec=gservers&sec2=godmode/servers/plugin&filemanager=1&id_plugin='.$id_plugin, - $fallback_directory, - true, - false, - 'index.php?sec=gservers&sec2=godmode/servers/plugin'.$chunck_url.'&plugin_command=[FILE_FULLPATH]&id_plugin='.$id_plugin, - true, - 0775, - $homedir_filemanager - ); - } - - return; -} - -// ===================================================================== -// END FILEMANAGER -// ===================================================================== -// ===================================================================== -// SHOW THE FORM -// ===================================================================== -$sec = 'gservers'; - -if (($create != '') || ($view != '')) { - enterprise_hook('open_meta_frame'); - - if (defined('METACONSOLE')) { - components_meta_print_header(); - $sec = 'advanced'; - $management_allowed = is_management_allowed(); - if (!$management_allowed) { - ui_print_warning_message(__('To manage plugin you must activate centralized management')); - } - } else { - if ($create != '') { - ui_print_page_header( - __('Plugin registration'), - 'images/gm_servers.png', - false, - 'plugin_definition', - true - ); - } else { - ui_print_page_header( - __('Plugin update'), - 'images/gm_servers.png', - false, - 'plugin_definition', - true - ); - } - - $management_allowed = !is_central_policies_on_node(); - if (!$management_allowed) { - ui_print_warning_message( - __( - 'This console is not manager of this environment, - please manage this feature from centralized manager console (Metaconsole).' - ) - ); - } - } - - - if ($create == '') { - $plugin_id = get_parameter('view', ''); - echo "
"; - } else { - echo ""; - } - - $table = new stdClass(); - $table->width = '100%'; - $table->id = 'table-form'; - $table->class = 'databox filters'; - $table->style = []; - $table->style[0] = 'font-weight: bold'; - $table->style[2] = 'font-weight: bold'; - $table->data = []; - - $data = []; - $data[0] = __('Name'); - $data[1] = ''; - $table->colspan['plugin_name'][1] = 3; - $table->data['plugin_name'] = $data; - - $data = []; - $data[0] = __('Plugin type'); - $fields[0] = __('Standard'); - $fields[1] = __('Nagios'); - $data[1] = html_print_select($fields, 'form_plugin_type', $form_plugin_type, '', '', 0, true); - $table->data['plugin_type'] = $data; - $table->colspan['plugin_type'][1] = 3; - - $data[0] = __('Max. timeout').ui_print_help_tip(__('This value only will be applied if is minor than the server general configuration plugin timeout').'.

'.__('If you set a 0 seconds timeout, the server plugin timeout will be used'), true); - $data[1] = html_print_extended_select_for_time('form_max_timeout', $form_max_timeout, '', '', '0', false, true); - - $table->data['plugin_timeout'] = $data; - - $data = []; - $data[0] = __('Description'); - $data[1] = ''; - $table->colspan['plugin_desc'][1] = 3; - $table->data['plugin_desc'] = $data; - - // if (!defined("METACONSOLE")) { - // echo '
'; - // echo ''; - } - - enterprise_hook('close_meta_frame'); -} else { - enterprise_hook('open_meta_frame'); - - if (defined('METACONSOLE')) { - components_meta_print_header(); - $sec = 'advanced'; - $management_allowed = is_management_allowed(); - if (!$management_allowed) { - ui_print_warning_message(__('To manage plugin you must activate centralized management')); - } - - if (!$config['metaconsole_deploy_plugin_server'] && $management_allowed) { - $deploy_plugin_server = true; - - echo ''; - ?> - - '; - echo __('You need to create your own plugins with Windows compatibility'); - echo ''; - } - } - - - // Update plugin. - if (isset($_GET['update_plugin'])) { - $plugin_id = get_parameter('update_plugin', 0); - $plugin_name = get_parameter('form_name', ''); - $plugin_description = get_parameter('form_description', ''); - $plugin_max_timeout = get_parameter('form_max_timeout', ''); - $plugin_execute = get_parameter('form_execute', ''); - $plugin_plugin_type = get_parameter('form_plugin_type', '0'); - $parameters = get_parameter('form_parameters', ''); - - // Get macros - $i = 1; - $macros = []; - while (1) { - $macro = (string) get_parameter('field'.$i.'_macro'); - if ($macro == '') { - break; - } - - $desc = (string) get_parameter('field'.$i.'_desc'); - $help = (string) get_parameter('field'.$i.'_help'); - $value = (string) get_parameter('field'.$i.'_value'); - $hide = get_parameter('field'.$i.'_hide'); - - $macros[$i]['macro'] = $macro; - $macros[$i]['desc'] = $desc; - $macros[$i]['help'] = $help; - if ($hide == 1) { - $macros[$i]['value'] = io_input_password($value); - } else { - $macros[$i]['value'] = $value; - } - - $macros[$i]['hide'] = $hide; - - $i++; - } - - $macros = io_json_mb_encode($macros); - - $values = [ - 'name' => $plugin_name, - 'description' => $plugin_description, - 'max_timeout' => $plugin_max_timeout, - 'execute' => $plugin_execute, - 'plugin_type' => $plugin_plugin_type, - 'parameters' => $parameters, - 'macros' => $macros, - ]; - - $result = false; - if ($values['name'] != '' && $values['execute'] != '') { - $result = db_process_sql_update( - 'tplugin', - $values, - ['id' => $plugin_id] - ); - } - - if (! $result) { - ui_print_error_message(__('Problem updating plugin')); - } else { - ui_print_success_message(__('Plugin updated successfully')); - } - } - - // Create plugin - if (isset($_GET['create_plugin'])) { - $plugin_name = get_parameter('form_name', ''); - $plugin_description = get_parameter('form_description', ''); - $plugin_max_timeout = get_parameter('form_max_timeout', ''); - $plugin_execute = get_parameter('form_execute', ''); - $plugin_plugin_type = get_parameter('form_plugin_type', '0'); - $plugin_parameters = get_parameter('form_parameters', ''); - - // Get macros - $i = 1; - $macros = []; - while (1) { - $macro = (string) get_parameter('field'.$i.'_macro'); - if ($macro == '') { - break; - } - - $desc = (string) get_parameter('field'.$i.'_desc'); - $help = (string) get_parameter('field'.$i.'_help'); - $value = (string) get_parameter('field'.$i.'_value'); - $hide = get_parameter('field'.$i.'_hide'); - - $macros[$i]['macro'] = $macro; - $macros[$i]['desc'] = $desc; - $macros[$i]['help'] = $help; - if ($hide == 1) { - $macros[$i]['value'] = io_input_password($value); - } else { - $macros[$i]['value'] = $value; - } - - $macros[$i]['hide'] = $hide; - $i++; - } - - $macros = io_json_mb_encode($macros); - - $values = [ - 'name' => $plugin_name, - 'description' => $plugin_description, - 'max_timeout' => $plugin_max_timeout, - 'execute' => $plugin_execute, - 'plugin_type' => $plugin_plugin_type, - 'parameters' => $plugin_parameters, - 'macros' => $macros, - ]; - - $result = false; - if ($values['name'] != '' && $values['execute'] != '') { - $result = db_process_sql_insert('tplugin', $values); - } - - if (! $result) { - ui_print_error_message(__('Problem creating plugin')); - } else { - ui_print_success_message(__('Plugin created successfully')); - } - } - - if (isset($_GET['kill_plugin'])) { - // if delete alert - $plugin_id = get_parameter('kill_plugin', 0); - - $result = db_process_sql_delete('tplugin', ['id' => $plugin_id]); - - if (!is_metaconsole()) { - if (!$result) { - ui_print_error_message(__('Problem deleting plugin')); - } else { - ui_print_success_message(__('Plugin deleted successfully')); - } - } - - - if ($plugin_id != 0) { - // Delete all the modules with this plugin - $plugin_modules = db_get_all_rows_filter( - 'tagente_modulo', - ['id_plugin' => $plugin_id] - ); - - if (empty($plugin_modules)) { - $plugin_modules = []; - } - - foreach ($plugin_modules as $pm) { - modules_delete_agent_module($pm['id_agente_modulo']); - } - - if (enterprise_installed()) { - enterprise_include_once('include/functions_policies.php'); - $policies_ids = db_get_all_rows_filter('tpolicy_modules', ['id_plugin' => $plugin_id]); - foreach ($policies_ids as $policies_id) { - policies_change_delete_pending_module($policies_id['id']); - } - } - - if (is_metaconsole()) { - enterprise_include_once('include/functions_plugins.php'); - $result = plugins_delete_plugin($plugin_id); - if (!$result) { - ui_print_error_message(__('Problem deleting plugin')); - } else { - ui_print_success_message(__('Plugin deleted successfully')); - } - } - } - } - - if ($deploy_plugin) { - if (is_metaconsole()) { - enterprise_include_once('include/functions_plugins.php'); - $result = plugins_deploy_plugin($deploy_plugin); - if (!$result) { - ui_print_error_message(__('Problem deploying plugin')); - } else { - ui_print_success_message(__('Plugin deployed successfully')); - } - } - } - - if ($deploy_plugin_server) { - $setup = db_get_all_rows_in_table('tmetaconsole_setup'); - // recorremos todos los nodos. - foreach ($setup as $key => $value) { - // Obtenemos los plugins de la meta. - $all_plugin_meta = db_get_all_rows_sql('SELECT SQL_NO_CACHE * FROM tplugin', false, false); - // Conectamos con el nodo. - if (metaconsole_connect($value) == NOERR) { - $values = []; - // Obtenemos los plugin del nodo. - $node_plugin_server = db_get_all_rows_sql('SELECT SQL_NO_CACHE * FROM tplugin', false, false); - foreach ($node_plugin_server as $key2 => $plugin) { - // Comprobamos si el id esta meta y nodo al mismo tiempo. - $key_exists = array_search($plugin['id'], array_column($all_plugin_meta, 'id')); - if ($key_exists !== false) { - // Si el plugin tiene el mismo id pero diferentes datos. - if ($all_plugin_meta[$key_exists] != $plugin) { - $old_id = $plugin['id']; - $new_id = ($plugin['id'] + (1000 * $value['id'])); - - // El plugin del nodo pasa a tener otro id y otro nombre. - $plugin['id'] = $new_id; - $plugin['name'] = $plugin['name'].'_'.$value['server_name']; - $result_update = db_process_sql_update( - 'tplugin', - [ - 'id' => $new_id, - 'name' => $plugin['name'], - ], - ['id' => $old_id] - ); - - if ($result_update) { - db_process_sql_update( - 'tagente_modulo', - ['id_plugin' => $new_id], - ['id_plugin' => $old_id] - ); - - db_process_sql_update( - 'tnetwork_component', - ['id_plugin' => $new_id], - ['id_plugin' => $old_id] - ); - - db_process_sql_update( - 'tpolicy_modules', - ['id_plugin' => $new_id], - ['id_plugin' => $old_id] - ); - } - - // New plugins to insert in the metaconsole. - $values[$plugin['id']] = $plugin; - } - } else { - // Exists in the node, but does not exist in the metaconsole. - $values[$plugin['id']] = $plugin; - } - } - - // Restore to metaconsole. - metaconsole_restore_db(); - - // Insert in metaconsole. - if (!empty($values)) { - foreach ($values as $key2 => $val) { - // Insert into metaconsole. - $result_insert = db_process_sql_insert('tplugin', $val); - } - } - } - } - - $all_plugin_meta = db_get_all_rows_sql('SELECT SQL_NO_CACHE * FROM tplugin', false, false); - - foreach ($setup as $key => $value) { - if (metaconsole_connect($value) == NOERR) { - $all_plugin_node = db_get_all_rows_sql('SELECT SQL_NO_CACHE * FROM tplugin', false, false); - - $array_diff = array_diff(array_column($all_plugin_meta, 'id'), array_column($all_plugin_node, 'id')); - foreach ($array_diff as $key2 => $pluginid) { - $other = []; - $plugin_meta = $all_plugin_meta[$key2]; - - unset($plugin_meta['id']); - $other['name'] = urlencode($plugin_meta['name']); - $other['description'] = urlencode($plugin_meta['description']); - $other['max_timeout'] = $plugin_meta['max_timeout']; - $other['max_retries'] = $plugin_meta['max_retries']; - $other['execute'] = urlencode($plugin_meta['execute']); - $other['net_dst_opt'] = $plugin_meta['net_dst_opt']; - $other['net_port_opt'] = $plugin_meta['net_port_opt']; - $other['user_opt'] = $plugin_meta['user_opt']; - $other['pass_opt'] = $plugin_meta['pass_opt']; - $other['plugin_type'] = $plugin_meta['plugin_type']; - $other['macros'] = urlencode($plugin_meta['macros']); - $other['parameters'] = urlencode($plugin_meta['parameters']); - $other = implode('%7C', $other); - - $auth_token = json_decode($value['auth_token']); - $url = $value['server_url'].'include/api.php?op=set&op2=push_plugin'.'&id='.$pluginid.'&other_mode=url_encode_separator_%7C&other='.$other."&apipass=$auth_token->api_password"."&user=$auth_token->console_user&pass=$auth_token->console_password"; - $file_path = realpath($plugin_meta['execute']); - $post = ''; - if (file_exists($file_path)) { - $post = ['file' => curl_file_create($file_path)]; - } - - $curlObj = curl_init(); - curl_setopt($curlObj, CURLOPT_URL, $url); - curl_setopt($curlObj, CURLOPT_POST, 1); - curl_setopt($curlObj, CURLOPT_POSTFIELDS, $post); - curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false); - - $api_result = curl_exec($curlObj); - curl_close($curlObj); - } - } - - // restore to metaconsole - metaconsole_restore_db(); - } - } - - // If not edition or insert, then list available plugins - $rows = db_get_all_rows_sql('SELECT * FROM tplugin ORDER BY name'); - - if ($rows !== false) { - if (defined('METACONSOLE')) { - echo '
'; - // } - $table->width = '100%'; - $table->class = 'databox filters'; - - if (defined('METACONSOLE')) { - $table->head[0] = __('General'); - $table->head_colspan[0] = 4; - $table->headstyle[0] = 'text-align: center'; - html_print_table($table); - } else { - echo '
'.__('General').''; - html_print_table($table); - echo '
'; - } - - $table->data = []; - - $plugin_id = get_parameter('view', 0); - - $locked = true; - - // If we have plugin id (update mode) and this plugin used by any module or component - // The command configuration will be locked - if ($plugin_id > 0) { - $modules_using_plugin = db_get_value_filter('count(*)', 'tagente_modulo', ['delete_pending' => 0, 'id_plugin' => $plugin_id]); - $components_using_plugin = db_get_value_filter('count(*)', 'tnetwork_component', ['id_plugin' => $plugin_id]); - if (($components_using_plugin + $modules_using_plugin) == 0) { - $locked = false; - } - } else { - $locked = false; - } - - $disabled = ''; - if ($locked) { - $disabled = 'readonly="readonly"'; - } - - $data = []; - $data[0] = __('Plugin command'); - $data[1] = ''; - if ($locked) { - $data[1] .= html_print_image('images/lock.png', true, ['class' => 'command_advanced_conf lock']); - } - - $data[1] .= ' '; - $data[1] .= html_print_image('images/file.png', true); - $data[1] .= ''; - $table->data['plugin_command'] = $data; - - $data = []; - $data[0] = __('Plug-in parameters').ui_print_help_icon('plugin_parameters', true); - $data[1] = ''; - if ($locked) { - $data[1] .= html_print_image('images/lock.png', true, ['class' => 'command_advanced_conf lock']); - } - - $table->data['plugin_parameters'] = $data; - - $data = []; - $data[0] = __('Command preview'); - $data[1] = '
'; - $table->data['plugin_preview'] = $data; - - $table->width = '100%'; - $table->class = 'databox filters'; - if (defined('METACONSOLE')) { - $table->head[0] = __('Command'); - $table->head_colspan[0] = 4; - $table->headstyle[0] = 'text-align: center'; - html_print_table($table); - } else { - echo '
'.__('Command').''; - html_print_table($table); - echo '
'; - } - - $data = []; - - $table->data = []; - - $macros = json_decode($macros, true); - - // The next row number is plugin_9 - $next_name_number = 9; - $i = 1; - while (1) { - // Always print at least one macro - if ((!isset($macros[$i]) || $macros[$i]['desc'] == '') && $i > 1) { - break; - } - - $macro_desc_name = 'field'.$i.'_desc'; - $macro_desc_value = ''; - $macro_help_name = 'field'.$i.'_help'; - $macro_help_value = ''; - $macro_value_name = 'field'.$i.'_value'; - $macro_value_value = ''; - $macro_name_name = 'field'.$i.'_macro'; - $macro_name = '_field'.$i.'_'; - $macro_hide_value_name = 'field'.$i.'_hide'; - $macro_hide_value_value = 0; - - if (isset($macros[$i]['desc'])) { - $macro_desc_value = $macros[$i]['desc']; - } - - if (isset($macros[$i]['help'])) { - $macro_help_value = $macros[$i]['help']; - } - - if (isset($macros[$i]['value'])) { - $macro_value_value = $macros[$i]['value']; - } - - if (isset($macros[$i]['hide'])) { - $macro_hide_value_value = $macros[$i]['hide']; - - // Decrypt hidden macros. - $macro_value_value = io_output_password($macro_value_value); - } - - $datam = []; - $datam[0] = __('Description')." ($macro_name)"; - $datam[0] .= html_print_input_hidden($macro_name_name, $macro_name, true); - $datam[1] = html_print_input_text_extended($macro_desc_name, $macro_desc_value, 'text-'.$macro_desc_name, '', 30, 255, $locked, '', "class='command_macro'", true); - if ($locked) { - $datam[1] .= html_print_image('images/lock.png', true, ['class' => 'command_macro lock']); - } - - $datam[2] = __('Default value')." ($macro_name)"; - $datam[3] = html_print_input_text_extended($macro_value_name, $macro_value_value, 'text-'.$macro_value_name, '', 30, 255, $locked, '', "class='command_component command_macro'", true); - if ($locked) { - $datam[3] .= html_print_image('images/lock.png', true, ['class' => 'command_macro lock']); - } - - $table->data['plugin_'.$next_name_number] = $datam; - - $next_name_number++; - - $table->colspan['plugin_'.$next_name_number][1] = 3; - - $datam = []; - $datam[0] = __('Hide value').ui_print_help_tip(__('This field will show up as dots like a password'), true); - $datam[1] = html_print_checkbox_extended($macro_hide_value_name, 1, $macro_hide_value_value, 0, '', ['class' => 'command_macro'], true, 'checkbox-'.$macro_hide_value_name); - - $table->data['plugin_'.$next_name_number] = $datam; - $next_name_number++; - - $table->colspan['plugin_'.$next_name_number][1] = 3; - - $datam = []; - $datam[0] = __('Help')." ($macro_name)


"; - $tadisabled = $locked === true ? ' disabled' : ''; - $datam[1] = html_print_textarea($macro_help_name, 6, 100, $macro_help_value, 'class="command_macro" style="width: 97%;"'.$tadisabled, true); - - if ($locked) { - $datam[1] .= html_print_image('images/lock.png', true, ['class' => 'command_macro lock']); - } - - $datam[1] .= '


'; - - $table->data['plugin_'.$next_name_number] = $datam; - $next_name_number++; - $i++; - } - - // Add/Delete buttons - $datam = []; - $datam[0] = ''.''.__('Add macro').''.' '.html_print_image('images/add.png', true).''; - $datam[0] .= ''; - $datam[0] .= ''; - - if (!$locked) { - $delete_macro_style = ''; - if ($i <= 2) { - $delete_macro_style = 'display:none;'; - } - - $datam[2] = ''; - - $table->colspan['plugin_action'][0] = 2; - $table->colspan['plugin_action'][2] = 2; - } else { - $table->colspan['plugin_action'][0] = 4; - } - - $table->rowstyle['plugin_action'] = 'text-align:center'; - $table->data['plugin_action'] = $datam; - - - if (defined('METACONSOLE')) { - $table->head[0] = __('Parameters macros'); - $table->head_colspan[0] = 4; - $table->headstyle[0] = 'text-align: center'; - html_print_table($table); - } else { - echo '
'.''.__('Parameters macros').ui_print_help_icon('macros', true).''; - html_print_table($table); - echo '
'; - } - - echo ''; - - echo '
'; - - if ($create != '') { - echo ""; - } else { - echo ""; - } - - echo '
'; - - if (defined('METACONSOLE')) { - echo '
'; - } else { - echo '
'; - } - - echo ''; - echo ''; - echo ''; - if ($management_allowed) { - echo "'; - } - - $color = 0; - - foreach ($rows as $row) { - if ($color == 1) { - $tdcolor = 'datos'; - $color = 0; - } else { - $tdcolor = 'datos2'; - $color = 1; - } - - echo ''; - echo "'; - echo "'; - if ($management_allowed) { - echo "'; - } - - echo ''; - } - - echo '
'.__('Name').''.__('Type').''.__('Command').'".''.__('Op.').''.'
"; - if ($management_allowed) { - echo ""; - } - - echo $row['name']; - echo '"; - if ($row['plugin_type'] == 0) { - echo __('Standard'); - } else { - echo __('Nagios'); - } - - echo ""; - echo $row['execute']; - echo '"; - - // Show it is locket - $modules_using_plugin = db_get_value_filter( - 'count(*)', - 'tagente_modulo', - [ - 'delete_pending' => 0, - 'id_plugin' => $row['id'], - ] - ); - $components_using_plugin = db_get_value_filter( - 'count(*)', - 'tnetwork_component', - ['id_plugin' => $row['id']] - ); - if (($components_using_plugin + $modules_using_plugin) > 0) { - echo ''; - html_print_image('images/lock.png'); - echo ''; - } - - echo "".html_print_image('images/config.png', true, ['title' => __('Edit')]).'  '; - echo "".html_print_image('images/cross.png', true, ['border' => '0']).''; - if (is_metaconsole()) { - echo "   ".html_print_image('images/deploy.png', true, ['title' => __('Deploy'), 'width' => '21 px']).'  '; - } - - echo '
'; - } else { - ui_print_info_message(['no_close' => true, 'message' => __('There are no plugins in the system') ]); - } - - if ($management_allowed) { - echo ""; - - echo '
'; - echo "
"; - echo ""; - echo '
'; - echo '