From c29cc92587926d879ffec3bd1701910ed999ad69 Mon Sep 17 00:00:00 2001 From: Arturo Gonzalez Date: Wed, 1 Jun 2016 10:43:22 +0200 Subject: [PATCH 01/44] Rolling release in progress... (Alert when minor release are available) --- pandora_console/general/header.php | 10 ++- pandora_console/include/api.php | 16 ++++- pandora_console/include/functions_db.php | 85 ++++++++++++++++++++++++ pandora_console/pandoradb_data.sql | 3 +- 4 files changed, 111 insertions(+), 3 deletions(-) diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index bd2e0afe7c..f9f5a6da12 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -230,9 +230,17 @@ config_check(); //====================================================== - + $check_minor_release_available = false; $pandora_management = check_acl($config['id_user'], 0, "PM"); + if (is_user_admin($config['id_user'])) { + $check_minor_release_available = db_check_minor_relase_available (); + + if ($check_minor_release_available) { + set_pandora_error_for_header('There are one or more minor releases waiting for update', 'minor release/s available'); + } + } + if ($config["alert_cnt"] > 0) { echo ''; diff --git a/pandora_console/include/api.php b/pandora_console/include/api.php index 1397b70644..457c63f8b3 100644 --- a/pandora_console/include/api.php +++ b/pandora_console/include/api.php @@ -56,7 +56,21 @@ $no_login_msg = ""; // Don't change the format, it is parsed by applications switch($info) { case 'version': - echo 'Pandora FMS ' . $pandora_version . ' - ' . $build_version; + if (!$config["minor_release_open"]) { + $config["minor_release_open"] = 0; + } + if (enterprise_installed()) { + if (!$config["minor_release_enterprise"]) { + $config["minor_release_enterprise"] = 0; + } + } + + if (enterprise_installed()) { + echo 'Pandora FMS ' . $pandora_version . ' - ' . $build_version . " MR" . $config["minor_release_enterprise"]; + } + else { + echo 'Pandora FMS ' . $pandora_version . ' - ' . $build_version . " MR" . $config["minor_release_open"]; + } exit; } diff --git a/pandora_console/include/functions_db.php b/pandora_console/include/functions_db.php index d8b469cdc9..68ff6fa0e6 100644 --- a/pandora_console/include/functions_db.php +++ b/pandora_console/include/functions_db.php @@ -1273,4 +1273,89 @@ function db_process_file ($path, $handle_error = true) { } } +/** + * Search for minor release files. + * + * @return bool Return if minor release is available or not + */ +function db_check_minor_relase_available () { + global $config; + + $dir = $config["homedir"]."/extras/mr"; + + $have_ent_minor = false; + $have_open_minor = false; + + if (file_exists($dir) && is_dir($dir)) { + if (is_readable($dir)) { + $files = scandir($dir); // Get all the files from the directory ordered by asc + if ($files !== false) { + // Enterprise installed + if (enterprise_installed()) { + $pattern = "/^\d+\.open.sql$/"; + $sqlfiles = preg_grep($pattern, $files); // Get the name of the correct files + $pattern = "/\.open.sql$/"; + $replacement = ""; + $sqlfiles_num = preg_replace($pattern, $replacement, $sqlfiles); // Get the number of the file + + $sqlfiles = null; + + if ($sqlfiles_num) { + foreach ($sqlfiles_num as $sqlfile_num) { + $file = "$dir/$sqlfile_num.sql"; + if ($config["minor_release_open"] < $sqlfile_num) { + $have_open_minor = true; + } + } + } + + $pattern2 = "/^\d+\.ent.sql$/"; + $sqlfiles2 = preg_grep($pattern2, $files); // Get the name of the correct files + $files = null; + $pattern2 = "/\.ent.sql$/"; + $replacement2 = ""; + $sqlfiles_num2 = preg_replace($pattern2, $replacement2, $sqlfiles2); // Get the number of the file + + $sqlfiles2 = null; + + if ($sqlfiles_num2) { + foreach ($sqlfiles_num2 as $sqlfile_num2) { + $file = "$dir/$sqlfile_num2.sql"; + if ($config["minor_release_enterprise"] < $sqlfile_num2) { + $have_ent_minor = true; + } + } + } + } + else { + $pattern = "/^\d+\.open.sql$/"; + $sqlfiles = preg_grep($pattern, $files); // Get the name of the correct files + $files = null; + $pattern = "/\.open.sql$/"; + $replacement = ""; + $sqlfiles_num = preg_replace($pattern, $replacement, $sqlfiles); // Get the number of the file + + $sqlfiles = null; + + if ($sqlfiles_num) { + foreach ($sqlfiles_num as $sqlfile_num) { + $file = "$dir/$sqlfile_num.sql"; + if ($config["minor_release"] < $sqlfile_num) { + $have_open_minor = true; + } + } + } + } + } + } + } + + if ($have_open_minor || $have_ent_minor) { + return true; + } + else { + return false; + } +} + ?> \ No newline at end of file diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 39e046f3c2..696148d3dd 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -108,7 +108,8 @@ INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_report_front_logo', 'images/pandora_logo_white.jpg'), ('custom_report_front_header', ''), ('custom_report_front_footer', ''), -('post_process_custom_values', '{"0.00000038580247":"Seconds to months","0.00000165343915":"Seconds to weeks","0.00001157407407":"Seconds to days","0.01666666666667":"Seconds to minutes","0.00000000093132":"Bytes to Gigabytes","0.00000095367432":"Bytes to Megabytes","0.0009765625":"Bytes to Kilobytes","0.00000001653439":"Timeticks to weeks","0.00000011574074":"Timeticks to days"}'); +('post_process_custom_values', '{"0.00000038580247":"Seconds to months","0.00000165343915":"Seconds to weeks","0.00001157407407":"Seconds to days","0.01666666666667":"Seconds to minutes","0.00000000093132":"Bytes to Gigabytes","0.00000095367432":"Bytes to Megabytes","0.0009765625":"Bytes to Kilobytes","0.00000001653439":"Timeticks to weeks","0.00000011574074":"Timeticks to days"}'), +('minor_release_open', 0); UNLOCK TABLES; From 0618dbbab3190c086d549a0d15144ebe350a5b44 Mon Sep 17 00:00:00 2001 From: Arturo Gonzalez Date: Wed, 1 Jun 2016 14:43:31 +0200 Subject: [PATCH 02/44] Rolling release in progress... (Added minor releases) --- pandora_console/general/footer.php | 16 +- pandora_console/include/db/mysql.php | 235 +++++++++++++++++++++++ pandora_console/include/functions.php | 14 ++ pandora_console/include/functions_db.php | 11 +- pandora_console/index.php | 23 +++ 5 files changed, 291 insertions(+), 8 deletions(-) diff --git a/pandora_console/general/footer.php b/pandora_console/general/footer.php index 23022c3d75..d134e8c715 100644 --- a/pandora_console/general/footer.php +++ b/pandora_console/general/footer.php @@ -26,8 +26,22 @@ if (! file_exists ($config["homedir"] . $license_file)) { $license_file = 'general/license/pandora_info_en.html'; } +if (!$config["minor_release_open"]) { + $config["minor_release_open"] = 0; +} +if (enterprise_installed()) { + if (!$config["minor_release_enterprise"]) { + $config["minor_release_enterprise"] = 0; + } +} + echo ''; -echo sprintf(__('Pandora FMS %s - Build %s', $pandora_version, $build_version)); +if (enterprise_installed()) { + echo sprintf(__('Pandora FMS %s - Build %s - MR %s', $pandora_version, $build_version, $config["minor_release_enterprise"])); +} +else { + echo sprintf(__('Pandora FMS %s - Build %s - MR %s', $pandora_version, $build_version, $config["minor_release_open"])); +} echo '
'; echo ''. __('Page generated at') . ' '. ui_print_timestamp ($time, true, array ("prominent" => "timestamp")); //Always use timestamp here echo ''; diff --git a/pandora_console/include/db/mysql.php b/pandora_console/include/db/mysql.php index 3f4a924f67..2419c54bb0 100644 --- a/pandora_console/include/db/mysql.php +++ b/pandora_console/include/db/mysql.php @@ -1175,4 +1175,239 @@ function mysql_db_process_file ($path, $handle_error = true) { return false; } } + +// --------------------------------------------------------------- +// Initiates a transaction and run the queries of an sql file +// --------------------------------------------------------------- + +function db_run_sql_file ($location) { + global $config; + + // Load file + $commands = file_get_contents($location); + + // Delete comments + $lines = explode("\n", $commands); + $commands = ''; + foreach ($lines as $line) { + $line = trim($line); + if ($line && !preg_match('/^--/', $line) && !preg_match('/^\/\*/', $line)) { + $commands .= $line; + } + } + + // Convert to array + $commands = explode(";", $commands); + + // Run commands + mysql_db_process_sql_begin(); // Begin transaction + foreach ($commands as $command) { + if (trim($command)) { + $result = mysql_query($command); + + if (!$result) { + break; // Error + } + } + } + if ($result) { + mysql_db_process_sql_commit(); // Save results + return true; + } + else { + mysql_db_process_sql_rollback(); // Undo results + return false; + } +} + +/** + * Process the file or files in /extras/mr and apply minor releases. + * + * @return string Return error/success message. + */ +function db_update_schema () { + global $config; + + $dir = $config["homedir"]."/extras/mr"; + $message = ''; + + if (file_exists($dir) && is_dir($dir)) { + if (is_readable($dir)) { + if (enterprise_installed()) { + $files = scandir($dir); // Get all the files from the directory ordered by asc + + if ($files !== false) { + $pattern = "/^\d+\.open\.sql$/"; + $sqlfiles = preg_grep($pattern, $files); // Get the name of the correct files + $pattern = "/\.open\.sql$/"; + $replacement = ""; + $sqlfiles_num = preg_replace($pattern, $replacement, $sqlfiles); // Get the number of the file + $sqlfiles = null; + + if ($sqlfiles_num) { + foreach ($sqlfiles_num as $sqlfile_num) { + + $file = "$dir/$sqlfile_num.open.sql"; + + if ($config["minor_release_open"] >= $sqlfile_num) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); + } + $file_dest = "$dir/updated/$sqlfile_num.open.sql"; + if (copy($file, $file_dest)) { + unlink($file); + } + } + else { + $result = db_run_sql_file($file); + + if ($result) { + $update_config = update_config_token("minor_release_open", $sqlfile_num); + if ($update_config) { + $config["minor_release_open"] = $sqlfile_num; + } + + if ($config["minor_release_open"] == $sqlfile_num) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); + } + + $file_dest = "$dir/updated/$sqlfile_num.open.sql"; + + if (copy($file, $file_dest)) { + unlink($file); + } + } + + $message = "

".__('The database schema has been updated to the minor release')." $sqlfile_num

"; + } + else { + $message = "

".__('An error occurred while updating the database schema to the minor release')." $sqlfile_num

"; + break; + } + } + } + } + + $pattern2 = "/^\d+\.ent\.sql$/"; + $sqlfiles2 = preg_grep($pattern2, $files); // Get the name of the correct files + $files = null; + $pattern2 = "/\.ent\.sql$/"; + $replacement2 = ""; + $sqlfiles_num2 = preg_replace($pattern2, $replacement2, $sqlfiles2); // Get the number of the file + $sqlfiles2 = null; + + if ($sqlfiles_num2) { + foreach ($sqlfiles_num2 as $sqlfile_num2) { + + $file = "$dir/$sqlfile_num2.ent.sql"; + + if ($config["minor_release_enterprise"] >= $sqlfile_num2) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); + } + $file_dest = "$dir/updated/$sqlfile_num2.ent.sql"; + if (copy($file, $file_dest)) { + unlink($file); + } + } + else { + $result = db_run_sql_file($file); + + if ($result) { + $update_config2 = update_config_token("minor_release_enterprise", $sqlfile_num2); + if ($update_config2) { + $config["minor_release_enterprise"] = $sqlfile_num2; + } + + if ($config["minor_release_enterprise"] == $sqlfile_num2) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); + } + $file_dest = "$dir/updated/$sqlfile_num2.ent.sql"; + if (copy($file, $file_dest)) { + unlink($file); + } + } + + $message = "

".__('The database schema has been updated to the minor release')." $sqlfile_num2

"; + } + else { + $message = "

".__('An error occurred while updating the database schema to the minor release')." $sqlfile_num2

"; + break; + } + } + } + } + } + } + else { + $files = scandir($dir); // Get all the files from the directory ordered by asc + + if ($files !== false) { + $pattern = "/^\d+\.open\.sql$/"; + $sqlfiles = preg_grep($pattern, $files); // Get the name of the correct files + $files = null; + $pattern = "/\.open\.sql$/"; + $replacement = ""; + $sqlfiles_num = preg_replace($pattern, $replacement, $sqlfiles); // Get the number of the file + $sqlfiles = null; + + if ($sqlfiles_num) { + foreach ($sqlfiles_num as $sqlfile_num) { + + $file = "$dir/$sqlfile_num.open.sql"; + + if ($config["minor_release_open"] >= $sqlfile_num) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); + } + $file_dest = "$dir/updated/$sqlfile_num.open.sql"; + if (copy($file, $file_dest)) { + unlink($file); + } + } + else { + $result = db_run_sql_file($file); + + if ($result) { + $update_config = update_config_token("minor_release_open", $sqlfile_num); + if ($update_config) { + $config["minor_release_open"] = $sqlfile_num; + } + + if ($config["minor_release_open"] == $sqlfile_num) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); + } + + $file_dest = "$dir/updated/$sqlfile_num.open.sql"; + if (copy($file, $file_dest)) { + unlink($file); + } + } + + $message = "

".__('The database schema has been updated to the minor release')." $sqlfile_num

"; + } + else { + $message = "

".__('An error occurred while updating the database schema to the minor release ')." $sqlfile_num

"; + break; + } + } + } + } + } + } + } + else { + $message = "

".__('The directory '.$dir.' should have read permissions in order to update the database schema')."

"; + } + } + else { + $message = "

".__('The directory '.$dir.' does not exist')."

"; + } + + return $message; +} + ?> diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index b632f7004c..7ac39285e7 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -2619,4 +2619,18 @@ function pandora_setlocale() { setlocale(LC_ALL, str_replace(array_keys($replace_locale), $replace_locale, $user_language)); } + +function update_config_token ($cfgtoken, $cfgvalue) { + global $config; + + $delete = db_process_sql ("DELETE FROM tconfig WHERE token = '$cfgtoken'"); + $insert = db_process_sql ("INSERT INTO tconfig (token, value) VALUES ('$cfgtoken', '$cfgvalue')"); + + if ($delete && $insert) { + return true; + } + else { + return false; + } +} ?> diff --git a/pandora_console/include/functions_db.php b/pandora_console/include/functions_db.php index 68ff6fa0e6..4a6c8ff684 100644 --- a/pandora_console/include/functions_db.php +++ b/pandora_console/include/functions_db.php @@ -1292,9 +1292,9 @@ function db_check_minor_relase_available () { if ($files !== false) { // Enterprise installed if (enterprise_installed()) { - $pattern = "/^\d+\.open.sql$/"; + $pattern = "/^\d+\.open\.sql$/"; $sqlfiles = preg_grep($pattern, $files); // Get the name of the correct files - $pattern = "/\.open.sql$/"; + $pattern = "/\.open\.sql$/"; $replacement = ""; $sqlfiles_num = preg_replace($pattern, $replacement, $sqlfiles); // Get the number of the file @@ -1302,17 +1302,16 @@ function db_check_minor_relase_available () { if ($sqlfiles_num) { foreach ($sqlfiles_num as $sqlfile_num) { - $file = "$dir/$sqlfile_num.sql"; if ($config["minor_release_open"] < $sqlfile_num) { $have_open_minor = true; } } } - $pattern2 = "/^\d+\.ent.sql$/"; + $pattern2 = "/^\d+\.ent\.sql$/"; $sqlfiles2 = preg_grep($pattern2, $files); // Get the name of the correct files $files = null; - $pattern2 = "/\.ent.sql$/"; + $pattern2 = "/\.ent\.sql$/"; $replacement2 = ""; $sqlfiles_num2 = preg_replace($pattern2, $replacement2, $sqlfiles2); // Get the number of the file @@ -1320,7 +1319,6 @@ function db_check_minor_relase_available () { if ($sqlfiles_num2) { foreach ($sqlfiles_num2 as $sqlfile_num2) { - $file = "$dir/$sqlfile_num2.sql"; if ($config["minor_release_enterprise"] < $sqlfile_num2) { $have_ent_minor = true; } @@ -1339,7 +1337,6 @@ function db_check_minor_relase_available () { if ($sqlfiles_num) { foreach ($sqlfiles_num as $sqlfile_num) { - $file = "$dir/$sqlfile_num.sql"; if ($config["minor_release"] < $sqlfile_num) { $have_open_minor = true; } diff --git a/pandora_console/index.php b/pandora_console/index.php index 7875442db3..0ab42a79b0 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -174,6 +174,7 @@ if ($change_pass == 1) { $changed_pass = login_update_password_check ($password_old, $password_new, $password_confirm, $id); } +$minor_release_message = false; $searchPage = false; $search = get_parameter_get("head_search_keywords"); if (strlen($search) > 0) { @@ -430,6 +431,8 @@ if (! isset ($config['id_user'])) { db_logon ($nick_in_db, $_SERVER['REMOTE_ADDR']); $_SESSION['id_usuario'] = $nick_in_db; $config['id_user'] = $nick_in_db; + + $minor_release_message = db_update_schema(); //========================================================== //-------- SET THE CUSTOM CONFIGS OF USER ------------------ @@ -596,6 +599,26 @@ if ($old_global_counter_chat != $now_global_counter_chat) { $_SESSION['new_chat'] = true; } +if ($minor_release_message) { + echo "
$minor_release_message
"; + echo ""; +} + if (get_parameter ('login', 0) !== 0) { // Display news dialog include_once("general/news_dialog.php"); From b706e92b3452c83a2200b0e6b1c3f3626c88136f Mon Sep 17 00:00:00 2001 From: Arturo Gonzalez Date: Wed, 1 Jun 2016 15:26:19 +0200 Subject: [PATCH 03/44] Rolling release in progress... (Fixed an important thing) --- pandora_console/index.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandora_console/index.php b/pandora_console/index.php index 0ab42a79b0..f22a42bf34 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -432,7 +432,9 @@ if (! isset ($config['id_user'])) { $_SESSION['id_usuario'] = $nick_in_db; $config['id_user'] = $nick_in_db; - $minor_release_message = db_update_schema(); + if (is_user_admin($config['id_user'])) { + $minor_release_message = db_update_schema(); + } //========================================================== //-------- SET THE CUSTOM CONFIGS OF USER ------------------ From 8c20874a8812a47805ab252b12397f991d719b2c Mon Sep 17 00:00:00 2001 From: Arturo Gonzalez Date: Tue, 19 Jul 2016 12:39:03 +0200 Subject: [PATCH 04/44] Changed rolling release manager system. --- pandora_console/general/header.php | 10 +- .../include/ajax/rolling_release.ajax.php | 104 ++++++++++ pandora_console/include/db/mysql.php | 190 ------------------ pandora_console/include/functions.php | 57 ++++++ pandora_console/index.php | 137 +++++++++++-- 5 files changed, 280 insertions(+), 218 deletions(-) create mode 100644 pandora_console/include/ajax/rolling_release.ajax.php diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index f9f5a6da12..2323d41e45 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -233,12 +233,10 @@ config_check(); $check_minor_release_available = false; $pandora_management = check_acl($config['id_user'], 0, "PM"); - if (is_user_admin($config['id_user'])) { - $check_minor_release_available = db_check_minor_relase_available (); - - if ($check_minor_release_available) { - set_pandora_error_for_header('There are one or more minor releases waiting for update', 'minor release/s available'); - } + $check_minor_release_available = db_check_minor_relase_available (); + + if ($check_minor_release_available) { + set_pandora_error_for_header('There are one or more minor releases waiting for update, there are required administrator permissions', 'minor release/s available'); } if ($config["alert_cnt"] > 0) { diff --git a/pandora_console/include/ajax/rolling_release.ajax.php b/pandora_console/include/ajax/rolling_release.ajax.php new file mode 100644 index 0000000000..274cda1088 --- /dev/null +++ b/pandora_console/include/ajax/rolling_release.ajax.php @@ -0,0 +1,104 @@ += $number) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); + } + $file_dest = "$dir/updated/$number.open.sql"; + if (copy($file, $file_dest)) { + unlink($file); + } + } + else { + $result = db_run_sql_file($file); + + if ($result) { + $update_config = update_config_token("minor_release_open", $number); + if ($update_config) { + $config["minor_release_open"] = $number; + } + + if ($config["minor_release_open"] == $number) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); + } + + $file_dest = "$dir/updated/$number.open.sql"; + + if (copy($file, $file_dest)) { + unlink($file); + } + } + } + else { + $error_file = fopen($config["homedir"] . "/extras/mr/error.txt", "w"); + $message = "An error occurred while updating the database schema to the minor release " . $number; + fwrite($error_file, $message); + fclose($error_file); + } + } + } + else { + $error_file = fopen($config["homedir"] . "/extras/mr/error.txt", "w"); + $message = "The directory ' . $dir . ' should have read permissions in order to update the database schema"; + fwrite($error_file, $message); + fclose($error_file); + } + } + else { + $error_file = fopen($config["homedir"] . "/extras/mr/error.txt", "w"); + $message = "The directory ' . $dir . ' does not exist"; + fwrite($error_file, $message); + fclose($error_file); + } + + echo $message; + return; + } + else if ($check_finish) { + $check = db_check_minor_relase_available(); + + if (file_exists($config["homedir"] . "/extras/mr/error.txt")) { + unlink($config["homedir"] . "/extras/mr/error.txt"); + $check = 2; + } + + echo $check; + return; + } + else if ($check_minor_number) { + echo $config['minor_release_open']; + return; + } +} + +?> diff --git a/pandora_console/include/db/mysql.php b/pandora_console/include/db/mysql.php index 2419c54bb0..d0b372fa00 100644 --- a/pandora_console/include/db/mysql.php +++ b/pandora_console/include/db/mysql.php @@ -1220,194 +1220,4 @@ function db_run_sql_file ($location) { } } -/** - * Process the file or files in /extras/mr and apply minor releases. - * - * @return string Return error/success message. - */ -function db_update_schema () { - global $config; - - $dir = $config["homedir"]."/extras/mr"; - $message = ''; - - if (file_exists($dir) && is_dir($dir)) { - if (is_readable($dir)) { - if (enterprise_installed()) { - $files = scandir($dir); // Get all the files from the directory ordered by asc - - if ($files !== false) { - $pattern = "/^\d+\.open\.sql$/"; - $sqlfiles = preg_grep($pattern, $files); // Get the name of the correct files - $pattern = "/\.open\.sql$/"; - $replacement = ""; - $sqlfiles_num = preg_replace($pattern, $replacement, $sqlfiles); // Get the number of the file - $sqlfiles = null; - - if ($sqlfiles_num) { - foreach ($sqlfiles_num as $sqlfile_num) { - - $file = "$dir/$sqlfile_num.open.sql"; - - if ($config["minor_release_open"] >= $sqlfile_num) { - if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { - mkdir($dir."/updated"); - } - $file_dest = "$dir/updated/$sqlfile_num.open.sql"; - if (copy($file, $file_dest)) { - unlink($file); - } - } - else { - $result = db_run_sql_file($file); - - if ($result) { - $update_config = update_config_token("minor_release_open", $sqlfile_num); - if ($update_config) { - $config["minor_release_open"] = $sqlfile_num; - } - - if ($config["minor_release_open"] == $sqlfile_num) { - if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { - mkdir($dir."/updated"); - } - - $file_dest = "$dir/updated/$sqlfile_num.open.sql"; - - if (copy($file, $file_dest)) { - unlink($file); - } - } - - $message = "

".__('The database schema has been updated to the minor release')." $sqlfile_num

"; - } - else { - $message = "

".__('An error occurred while updating the database schema to the minor release')." $sqlfile_num

"; - break; - } - } - } - } - - $pattern2 = "/^\d+\.ent\.sql$/"; - $sqlfiles2 = preg_grep($pattern2, $files); // Get the name of the correct files - $files = null; - $pattern2 = "/\.ent\.sql$/"; - $replacement2 = ""; - $sqlfiles_num2 = preg_replace($pattern2, $replacement2, $sqlfiles2); // Get the number of the file - $sqlfiles2 = null; - - if ($sqlfiles_num2) { - foreach ($sqlfiles_num2 as $sqlfile_num2) { - - $file = "$dir/$sqlfile_num2.ent.sql"; - - if ($config["minor_release_enterprise"] >= $sqlfile_num2) { - if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { - mkdir($dir."/updated"); - } - $file_dest = "$dir/updated/$sqlfile_num2.ent.sql"; - if (copy($file, $file_dest)) { - unlink($file); - } - } - else { - $result = db_run_sql_file($file); - - if ($result) { - $update_config2 = update_config_token("minor_release_enterprise", $sqlfile_num2); - if ($update_config2) { - $config["minor_release_enterprise"] = $sqlfile_num2; - } - - if ($config["minor_release_enterprise"] == $sqlfile_num2) { - if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { - mkdir($dir."/updated"); - } - $file_dest = "$dir/updated/$sqlfile_num2.ent.sql"; - if (copy($file, $file_dest)) { - unlink($file); - } - } - - $message = "

".__('The database schema has been updated to the minor release')." $sqlfile_num2

"; - } - else { - $message = "

".__('An error occurred while updating the database schema to the minor release')." $sqlfile_num2

"; - break; - } - } - } - } - } - } - else { - $files = scandir($dir); // Get all the files from the directory ordered by asc - - if ($files !== false) { - $pattern = "/^\d+\.open\.sql$/"; - $sqlfiles = preg_grep($pattern, $files); // Get the name of the correct files - $files = null; - $pattern = "/\.open\.sql$/"; - $replacement = ""; - $sqlfiles_num = preg_replace($pattern, $replacement, $sqlfiles); // Get the number of the file - $sqlfiles = null; - - if ($sqlfiles_num) { - foreach ($sqlfiles_num as $sqlfile_num) { - - $file = "$dir/$sqlfile_num.open.sql"; - - if ($config["minor_release_open"] >= $sqlfile_num) { - if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { - mkdir($dir."/updated"); - } - $file_dest = "$dir/updated/$sqlfile_num.open.sql"; - if (copy($file, $file_dest)) { - unlink($file); - } - } - else { - $result = db_run_sql_file($file); - - if ($result) { - $update_config = update_config_token("minor_release_open", $sqlfile_num); - if ($update_config) { - $config["minor_release_open"] = $sqlfile_num; - } - - if ($config["minor_release_open"] == $sqlfile_num) { - if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { - mkdir($dir."/updated"); - } - - $file_dest = "$dir/updated/$sqlfile_num.open.sql"; - if (copy($file, $file_dest)) { - unlink($file); - } - } - - $message = "

".__('The database schema has been updated to the minor release')." $sqlfile_num

"; - } - else { - $message = "

".__('An error occurred while updating the database schema to the minor release ')." $sqlfile_num

"; - break; - } - } - } - } - } - } - } - else { - $message = "

".__('The directory '.$dir.' should have read permissions in order to update the database schema')."

"; - } - } - else { - $message = "

".__('The directory '.$dir.' does not exist')."

"; - } - - return $message; -} - ?> diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index 7ac39285e7..773aa39a14 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -2633,4 +2633,61 @@ function update_config_token ($cfgtoken, $cfgvalue) { return false; } } + +function update_conf_minor_release() { + global $config; + + $config['minor_release_open'] = db_get_value ('value', 'tconfig', 'token', 'minor_release_open'); + + if (enterprise_installed()) { + $config['minor_release_enterprise'] = db_get_value ('value', 'tconfig', 'token', 'minor_release_enterprise'); + } +} + +function get_number_of_mr($mode) { + global $config; + + $dir = $config["homedir"]."/extras/mr"; + $mr_size = array(); + + if (file_exists($dir) && is_dir($dir)) { + if (is_readable($dir)) { + if ($mode == 'open') { + $files = scandir($dir); // Get all the files from the directory ordered by asc + + if ($files !== false) { + $pattern = "/^\d+\.open\.sql$/"; + $sqlfiles = preg_grep($pattern, $files); // Get the name of the correct files + $pattern = "/\.open\.sql$/"; + $replacement = ""; + $sqlfiles_num = preg_replace($pattern, $replacement, $sqlfiles); + + foreach ($sqlfiles_num as $num) { + $mr_size[] = $num; + } + } + } + else { + if (enterprise_installed()) { + $files2 = scandir($dir); // Get all the files from the directory ordered by asc + + if ($files2 !== false) { + $pattern2 = "/^\d+\.ent\.sql$/"; + $sqlfiles2 = preg_grep($pattern2, $files2); // Get the name of the correct files + + $pattern2 = "/\.ent\.sql$/"; + $replacement2 = ""; + $sqlfiles_num2 = preg_replace($pattern2, $replacement2, $sqlfiles2); // Get the number of the file + + foreach ($sqlfiles_num2 as $num2) { + $mr_size[] = $num2; + } + } + } + } + } + } + return $mr_size; +} + ?> diff --git a/pandora_console/index.php b/pandora_console/index.php index f22a42bf34..efa920bb18 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -433,7 +433,43 @@ if (! isset ($config['id_user'])) { $config['id_user'] = $nick_in_db; if (is_user_admin($config['id_user'])) { - $minor_release_message = db_update_schema(); + $have_minor_releases = db_check_minor_relase_available(); + + if ($have_minor_releases) { + $size_mr_o = get_number_of_mr('open'); + $size_mr_e = get_number_of_mr('enterprise'); + echo "
" . __('') . "
"; + ?> + + $minor_release_message"; - echo ""; -} - if (get_parameter ('login', 0) !== 0) { // Display news dialog include_once("general/news_dialog.php"); @@ -848,7 +864,84 @@ require('include/php_to_js_values.php'); return rv; }; })(); - + + function apply_minor_release (n_mr_o, n_mr_e) { + $.each(n_mr_o, function(i, open_mr) { + var params = {}; + var error = false; + params["updare_rr_open"] = 1; + params["number"] = open_mr; + params["page"] = "include/ajax/rolling_release.ajax"; + + jQuery.ajax ({ + data: params, + async: false, + dataType: "html", + type: "POST", + url: "ajax.php", + success: function (data) { + if (data != "") { + alert("Error: " + data); + error = true; + } + } + }); + + if (error == true) { + return false; + } + }); + + $.each(n_mr_e, function(i, e_mr) { + var params = {}; + var error2 = false; + params["updare_rr_enterprise"] = 1; + params["number"] = e_mr; + params["page"] = "enterprise/include/ajax/rolling_release.ajax"; + + jQuery.ajax ({ + data: params, + async: false, + dataType: "html", + type: "POST", + url: "ajax.php", + success: function (data) { + if (data != "") { + alert("Error: " + data); + error2 = true; + } + } + }); + + if (error2 == true) { + return false; + } + }); + + check_is_finished_mr(); + } + + function check_is_finished_mr () { + var params = {}; + params["check_finish"] = 1; + params["page"] = "include/ajax/rolling_release.ajax"; + + jQuery.ajax ({ + data: params, + dataType: "html", + type: "POST", + url: "ajax.php", + success: function (data) { + if (data == 1) { + setInterval(check_is_finished_mr, 2000); + } + else if (data == 0) { + alert("Updated finished successfully"); + } + } + }); + } + //Dynamically assign footer position and width. function adjustFooter() { /* From eefb094df6a87385d7dde1504ebf63099c170a52 Mon Sep 17 00:00:00 2001 From: Arturo Gonzalez Date: Tue, 19 Jul 2016 13:48:56 +0200 Subject: [PATCH 05/44] Added restriction to dangerous querys (drop database). --- .../include/ajax/rolling_release.ajax.php | 99 +++++++++++-------- 1 file changed, 59 insertions(+), 40 deletions(-) diff --git a/pandora_console/include/ajax/rolling_release.ajax.php b/pandora_console/include/ajax/rolling_release.ajax.php index 274cda1088..0c5a121621 100644 --- a/pandora_console/include/ajax/rolling_release.ajax.php +++ b/pandora_console/include/ajax/rolling_release.ajax.php @@ -27,59 +27,78 @@ if (is_ajax ()) { $dir = $config["homedir"]."/extras/mr"; $file = "$dir/$number.open.sql"; - if (file_exists($dir) && is_dir($dir)) { - if (is_readable($dir)) { - if ($config["minor_release_open"] >= $number) { - if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { - mkdir($dir."/updated"); - } - $file_dest = "$dir/updated/$number.open.sql"; - if (copy($file, $file_dest)) { - unlink($file); - } - } - else { - $result = db_run_sql_file($file); - - if ($result) { - $update_config = update_config_token("minor_release_open", $number); - if ($update_config) { - $config["minor_release_open"] = $number; + + $dangerous_query = false; + $mr_file = fopen($file, "r"); + while (!feof($mr_file)) { + $line = fgets($mr_file); + if ((preg_match("/^drop/", $line)) || + (preg_match("/^DROP/", $line))) { + $dangerous_query = true; + } + } + + if ($dangerous_query) { + $error_file = fopen($config["homedir"] . "/extras/mr/error.txt", "w"); + $message = "The sql file contains a dangerous query"; + fwrite($error_file, $message); + fclose($error_file); + } + else { + if (file_exists($dir) && is_dir($dir)) { + if (is_readable($dir)) { + if ($config["minor_release_open"] >= $number) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); } - - if ($config["minor_release_open"] == $number) { - if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { - mkdir($dir."/updated"); - } - - $file_dest = "$dir/updated/$number.open.sql"; - - if (copy($file, $file_dest)) { - unlink($file); - } + $file_dest = "$dir/updated/$number.open.sql"; + if (copy($file, $file_dest)) { + unlink($file); } } else { - $error_file = fopen($config["homedir"] . "/extras/mr/error.txt", "w"); - $message = "An error occurred while updating the database schema to the minor release " . $number; - fwrite($error_file, $message); - fclose($error_file); + $result = db_run_sql_file($file); + + if ($result) { + $update_config = update_config_token("minor_release_open", $number); + if ($update_config) { + $config["minor_release_open"] = $number; + } + + if ($config["minor_release_open"] == $number) { + if (!file_exists($dir."/updated") || !is_dir($dir."/updated")) { + mkdir($dir."/updated"); + } + + $file_dest = "$dir/updated/$number.open.sql"; + + if (copy($file, $file_dest)) { + unlink($file); + } + } + } + else { + $error_file = fopen($config["homedir"] . "/extras/mr/error.txt", "w"); + $message = "An error occurred while updating the database schema to the minor release " . $number; + fwrite($error_file, $message); + fclose($error_file); + } } } + else { + $error_file = fopen($config["homedir"] . "/extras/mr/error.txt", "w"); + $message = "The directory ' . $dir . ' should have read permissions in order to update the database schema"; + fwrite($error_file, $message); + fclose($error_file); + } } else { $error_file = fopen($config["homedir"] . "/extras/mr/error.txt", "w"); - $message = "The directory ' . $dir . ' should have read permissions in order to update the database schema"; + $message = "The directory ' . $dir . ' does not exist"; fwrite($error_file, $message); fclose($error_file); } } - else { - $error_file = fopen($config["homedir"] . "/extras/mr/error.txt", "w"); - $message = "The directory ' . $dir . ' does not exist"; - fwrite($error_file, $message); - fclose($error_file); - } echo $message; return; From 70c771013c87f9b137a51c344cc6e212739513e5 Mon Sep 17 00:00:00 2001 From: Arturo Gonzalez Date: Tue, 19 Jul 2016 15:39:31 +0200 Subject: [PATCH 06/44] Fixed things in rolling release develop --- .../include/ajax/rolling_release.ajax.php | 20 +-------- pandora_console/index.php | 41 ++++++------------- 2 files changed, 14 insertions(+), 47 deletions(-) diff --git a/pandora_console/include/ajax/rolling_release.ajax.php b/pandora_console/include/ajax/rolling_release.ajax.php index 0c5a121621..37da049647 100644 --- a/pandora_console/include/ajax/rolling_release.ajax.php +++ b/pandora_console/include/ajax/rolling_release.ajax.php @@ -15,12 +15,9 @@ // Only accesible by ajax if (is_ajax ()) { global $config; - check_login(); $updare_rr_open = get_parameter('updare_rr_open', 0); - $check_minor_number = get_parameter('check_minor_number', 0); - $check_finish = get_parameter('check_finish', 0); if ($updare_rr_open) { $number = get_parameter('number'); @@ -33,7 +30,7 @@ if (is_ajax ()) { while (!feof($mr_file)) { $line = fgets($mr_file); if ((preg_match("/^drop/", $line)) || - (preg_match("/^DROP/", $line))) { + (preg_match("/^truncate table/", $line))) { $dangerous_query = true; } } @@ -103,21 +100,6 @@ if (is_ajax ()) { echo $message; return; } - else if ($check_finish) { - $check = db_check_minor_relase_available(); - - if (file_exists($config["homedir"] . "/extras/mr/error.txt")) { - unlink($config["homedir"] . "/extras/mr/error.txt"); - $check = 2; - } - - echo $check; - return; - } - else if ($check_minor_number) { - echo $config['minor_release_open']; - return; - } } ?> diff --git a/pandora_console/index.php b/pandora_console/index.php index efa920bb18..364c2d40cf 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -450,8 +450,8 @@ if (! isset ($config['id_user'])) { opacity: 0.5, background: 'black' }, - width: 400, - height: 150, + width: 600, + height: 350, buttons: { "Apply minor releases": function() { var n_mr_o = ''; @@ -464,7 +464,12 @@ if (! isset ($config['id_user'])) { } } }); - $('#mr_dialog2').text('Do you want to apply minor releases?'); + + var dialog_text = "

Do you want to apply minor releases?


"; + dialog_text = dialog_text + "

We recommend launch a planned downtime to this process


"; + dialog_text = dialog_text + "index.php?sec=extensions&sec2=godmode/agentes/planned_downtime.list\">Planned downtimes
" + + $('#mr_dialog2').html(dialog_text); $('#mr_dialog2').dialog('open'); }); @@ -866,9 +871,9 @@ require('include/php_to_js_values.php'); })(); function apply_minor_release (n_mr_o, n_mr_e) { + var error = false; $.each(n_mr_o, function(i, open_mr) { var params = {}; - var error = false; params["updare_rr_open"] = 1; params["number"] = open_mr; params["page"] = "include/ajax/rolling_release.ajax"; @@ -891,10 +896,9 @@ require('include/php_to_js_values.php'); return false; } }); - + var error2 = false; $.each(n_mr_e, function(i, e_mr) { var params = {}; - var error2 = false; params["updare_rr_enterprise"] = 1; params["number"] = e_mr; params["page"] = "enterprise/include/ajax/rolling_release.ajax"; @@ -918,28 +922,9 @@ require('include/php_to_js_values.php'); } }); - check_is_finished_mr(); - } - - function check_is_finished_mr () { - var params = {}; - params["check_finish"] = 1; - params["page"] = "include/ajax/rolling_release.ajax"; - - jQuery.ajax ({ - data: params, - dataType: "html", - type: "POST", - url: "ajax.php", - success: function (data) { - if (data == 1) { - setInterval(check_is_finished_mr, 2000); - } - else if (data == 0) { - alert("Updated finished successfully"); - } - } - }); + if (!error && !error2) { + alert("Updated finished successfully"); + } } //Dynamically assign footer position and width. From 902d0fac9a1daac876593a0de7be28102e6e6540 Mon Sep 17 00:00:00 2001 From: Arturo Gonzalez Date: Wed, 20 Jul 2016 10:08:31 +0200 Subject: [PATCH 07/44] Control PHP restrictions to minor release process. --- pandora_console/index.php | 165 ++++++++++++++++++++++---------------- 1 file changed, 95 insertions(+), 70 deletions(-) diff --git a/pandora_console/index.php b/pandora_console/index.php index 364c2d40cf..e976d43c83 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -36,7 +36,7 @@ if ($develop_bypass != 1) { exit; } } - + if (filesize("include/config.php") == 0) { include ("install.php"); exit; @@ -99,7 +99,7 @@ if (!empty ($config["https"]) && empty ($_SERVER['HTTPS'])) { if (sizeof ($_REQUEST)) //Some (old) browsers don't like the ?&key=var $query .= '?1=1'; - + //We don't clean these variables up as they're only being passed along foreach ($_GET as $key => $value) { if ($key == 1) @@ -110,11 +110,11 @@ if (!empty ($config["https"]) && empty ($_SERVER['HTTPS'])) { $query .= '&'.$key.'='.$value; } $url = ui_get_full_url($query); - + // Prevent HTTP response splitting attacks // http://en.wikipedia.org/wiki/HTTP_response_splitting $url = str_replace ("\n", "", $url); - + header ('Location: '.$url); exit; //Always exit after sending location headers } @@ -140,10 +140,10 @@ echo '' . "\n"; //This starts the page head. In the call back function, things from $page['head'] array will be processed into the head ob_start ('ui_process_page_head'); -// Enterprise main +// Enterprise main enterprise_include ('index.php'); -// This tag is included in the buffer passed to ui_process_page_head so +// This tag is included in the buffer passed to ui_process_page_head so // technically it can be stripped echo '' . "\n"; @@ -165,12 +165,12 @@ $process_login = false; $change_pass = get_parameter_post('renew_password', 0); if ($change_pass == 1) { - + $password_old = (string) get_parameter_post ('old_password', ''); $password_new = (string) get_parameter_post ('new_password', ''); $password_confirm = (string) get_parameter_post ('confirm_new_password', ''); $id = (string) get_parameter_post ('login', ''); - + $changed_pass = login_update_password_check ($password_old, $password_new, $password_confirm, $id); } @@ -189,40 +189,40 @@ if (strlen($search) > 0) { if (! isset ($config['id_user'])) { if (isset ($_GET["login"])) { include_once('include/functions_db.php'); //Include it to use escape_string_sql function - + $config["auth_error"] = ""; //Set this to the error message from the authorization mechanism $nick = get_parameter_post ("nick"); //This is the variable with the login $pass = get_parameter_post ("pass"); //This is the variable with the password $nick = db_escape_string_sql($nick); $pass = db_escape_string_sql($pass); - + //Since now, only the $pass variable are needed unset ($_GET['pass'], $_POST['pass'], $_REQUEST['pass']); - + // If the auth_code exists, we assume the user has come through the double auth page if (isset ($_POST['auth_code'])) { $double_auth_success = false; - + // The double authentication is activated and the user has surpassed the first step (the login). // Now the authentication code provided will be checked. if (isset ($_SESSION['prepared_login_da'])) { if (isset ($_SESSION['prepared_login_da']['id_user']) && isset ($_SESSION['prepared_login_da']['timestamp'])) { - + // The user has a maximum of 5 minutes to introduce the double auth code $dauth_period = SECONDS_2MINUTES; $now = time(); $dauth_time = $_SESSION['prepared_login_da']['timestamp']; - + if ($now - $dauth_period < $dauth_time) { // Nick $nick = $_SESSION["prepared_login_da"]['id_user']; // Code $code = (string) get_parameter_post ("auth_code"); - + if (!empty($code)) { $result = validate_double_auth_code($nick, $code); - + if ($result === true) { // Double auth success $double_auth_success = true; @@ -232,7 +232,7 @@ if (! isset ($config['id_user'])) { $login_screen = 'double_auth'; // Error message $config["auth_error"] = __("Invalid code"); - + if (!isset($_SESSION['prepared_login_da']['attempts'])) $_SESSION['prepared_login_da']['attempts'] = 0; $_SESSION['prepared_login_da']['attempts']++; @@ -243,7 +243,7 @@ if (! isset ($config['id_user'])) { $login_screen = 'double_auth'; // Error message $config["auth_error"] = __("The code shouldn't be empty"); - + if (!isset($_SESSION['prepared_login_da']['attempts'])) $_SESSION['prepared_login_da']['attempts'] = 0; $_SESSION['prepared_login_da']['attempts']++; @@ -252,7 +252,7 @@ if (! isset ($config['id_user'])) { else { // Expired login unset ($_SESSION['prepared_login_da']); - + // Error message $config["auth_error"] = __('Expired login'); } @@ -260,7 +260,7 @@ if (! isset ($config['id_user'])) { else { // If the code doesn't exist, remove the prepared login unset ($_SESSION['prepared_login_da']); - + // Error message $config["auth_error"] = __('Login error'); } @@ -270,10 +270,10 @@ if (! isset ($config['id_user'])) { // Error message $config["auth_error"] = __('Login error'); } - + // Remove the authenticator code unset ($_POST['auth_code'], $code); - + if (!$double_auth_success) { $login_failed = true; require_once ('general/login_page.php'); @@ -305,27 +305,27 @@ if (! isset ($config['id_user'])) { // The auth file can set $config["auth_error"] to an informative error output or reference their internal error messages to it // process_user_login should return false in case of errors or invalid login, the nickname if correct $nick_in_db = process_user_login ($nick, $pass); - + $expired_pass = false; - + if (($nick_in_db != false) && ((!is_user_admin($nick) || $config['enable_pass_policy_admin'])) && (defined('PANDORA_ENTERPRISE')) && ($config['enable_pass_policy'])) { include_once(ENTERPRISE_DIR . "/include/auth/mysql.php"); - + $blocked = login_check_blocked($nick); - + if ($blocked) { require_once ('general/login_page.php'); db_pandora_audit("Password expired", "Password expired: ".$nick, $nick); while (@ob_end_flush ()); exit (""); } - + //Checks if password has expired $check_status = check_pass_status($nick, $pass); - + switch ($check_status) { case PASSSWORD_POLICIES_FIRST_CHANGE: //first change case PASSSWORD_POLICIES_EXPIRED: //pass expired @@ -335,10 +335,10 @@ if (! isset ($config['id_user'])) { } } } - + if (($nick_in_db !== false) && $expired_pass) { //login ok and password has expired - + require_once ('general/login_page.php'); db_pandora_audit("Password expired", "Password expired: " . $nick, $nick); @@ -347,7 +347,7 @@ if (! isset ($config['id_user'])) { } else if (($nick_in_db !== false) && (!$expired_pass)) { //login ok and password has not expired - + // Double auth check if ((!isset ($double_auth_success) || !$double_auth_success) && is_double_auth_enabled($nick_in_db)) { // Store this values in the session to know if the user login was correct @@ -356,24 +356,24 @@ if (! isset ($config['id_user'])) { 'timestamp' => time(), 'attempts' => 0 ); - + // Load the page to introduce the double auth code $login_screen = 'double_auth'; require_once ('general/login_page.php'); while (@ob_end_flush ()); exit (""); } - + //login ok and password has not expired $process_login = true; - + echo ""; - + if (!isset($_GET["sec2"]) && !isset($_GET["sec"])) { // Avoid the show homepage when the user go to // a specific section of pandora // for example when timeout the sesion - + unset ($_GET["sec2"]); $_GET["sec"] = "general/logon_ok"; $home_page =''; @@ -425,9 +425,9 @@ if (! isset ($config['id_user'])) { $_GET["sec"] = "general/logon_ok"; } } - + } - + db_logon ($nick_in_db, $_SERVER['REMOTE_ADDR']); $_SESSION['id_usuario'] = $nick_in_db; $config['id_user'] = $nick_in_db; @@ -435,6 +435,27 @@ if (! isset ($config['id_user'])) { if (is_user_admin($config['id_user'])) { $have_minor_releases = db_check_minor_relase_available(); + // PHP configuration values + $PHPupload_max_filesize = config_return_in_bytes(ini_get('upload_max_filesize')); + $PHPmemory_limit = config_return_in_bytes(ini_get('memory_limit')); + $PHPmax_execution_time = ini_get('max_execution_time'); + + if ($PHPmax_execution_time !== '0') { + set_time_limit(0); + } + + $PHPupload_max_filesize_min = config_return_in_bytes('800M'); + + if ($PHPupload_max_filesize < $PHPupload_max_filesize_min) { + ini_set('upload_max_filesize', config_return_in_bytes('800M')); + } + + $PHPmemory_limit_min = config_return_in_bytes('500M'); + + if ($PHPmemory_limit < $PHPmemory_limit_min && $PHPmemory_limit !== '-1') { + ini_set('memory_limit', config_return_in_bytes('500M')); + } + if ($have_minor_releases) { $size_mr_o = get_number_of_mr('open'); $size_mr_e = get_number_of_mr('enterprise'); @@ -476,18 +497,22 @@ if (! isset ($config['id_user'])) { $param) { @@ -788,7 +813,7 @@ else { } if (isset($_GET['sec2'])) { $file = $_GET['sec2'] . '.php'; - + if (!file_exists ($file)) { unset($_GET['sec2']); require('general/logon_ok.php'); @@ -849,15 +874,15 @@ require('include/php_to_js_values.php'); \ No newline at end of file diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index e75b60f3d1..25a4660e1e 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1919,12 +1919,14 @@ $(document).ready (function () { }, function (data, status) { $("#module").html(''); - jQuery.each (data, function (id, value) { - option = $("") - .attr ("value", value["id_agente_modulo"]) - .html (value["nombre"]); - $("#module").append (option); - }); + if(data){ + jQuery.each (data, function (id, value) { + option = $("") + .attr ("value", value["id_agente_modulo"]) + .html (value["nombre"]); + $("#module").append (option); + }); + } }, "json" ); @@ -1942,12 +1944,14 @@ $(document).ready (function () { }, function (data, status) { $("#module").html(''); - jQuery.each (data, function (id, value) { - option = $("") - .attr ("value", value["id_agente_modulo"]) - .html (value["nombre"]); - $("#module").append (option); - }); + if(data){ + jQuery.each (data, function (id, value) { + option = $("") + .attr ("value", value["id_agente_modulo"]) + .html (value["nombre"]); + $("#module").append (option); + }); + } }, "json" ); @@ -2614,6 +2618,13 @@ function chooseType() { $("#sla_list").show(); $("#row_working_time").show(); break; + + case 'module_histogram_graph': + $("#row_description").show(); + $("#row_period").show(); + $("#row_agent").show(); + $("#row_module").show(); + break; case 'SLA_monthly': case 'SLA_weekly': diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index 595520a269..26b621adab 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -144,12 +144,12 @@ if (is_ajax ()) { if (empty($modules)) $modules = array(); - foreach ($modules as $k => $v) { - for ($j = $k + 1; $j <= sizeof($modules); $j++) { - if ($modules[$j]['nombre'] == $v['nombre']) { - unset($modules[$j]); - } - } + $found = array(); + foreach ($modules as $i=>$row) { + $check = $row['nombre']; + if (@$found[$check]++) { + unset($modules[$i]); + } } } else { @@ -173,13 +173,21 @@ if (is_ajax ()) { } $modules = $modules_to_report; - $modules = array_unique($modules); + $found = array(); + if (is_array($modules) || is_object($modules)){ + foreach ($modules as $i=>$row) { + $check = $row['nombre']; + if (@$found[$check]++) { + unset($modules[$i]); + } + } + } } - - foreach ($modules as $k => $v) { - $modules[$k] = io_safe_output($v); + if (is_array($modules) || is_object($modules)){ + foreach ($modules as $k => $v) { + $modules[$k] = io_safe_output($v); + } } - echo json_encode($modules); return; } From de1291a3786f915e9011a4f6334184b853419828 Mon Sep 17 00:00:00 2001 From: Arturo Gonzalez Date: Mon, 13 Feb 2017 14:59:39 +0100 Subject: [PATCH 32/44] Fixed db --- pandora_console/pandoradb_data.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 0824759041..a473c4d11a 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -109,7 +109,7 @@ INSERT INTO `tconfig` (`token`, `value`) VALUES ('custom_report_front_logo', 'images/pandora_logo_white.jpg'), ('custom_report_front_header', ''), ('custom_report_front_footer', ''), -('minor_release_open', 0); +('minor_release_open', 0), ('identification_reminder', 1), ('identification_reminder_timestamp', 0), ('post_process_custom_values', '{"0.00000038580247":"Seconds to months","0.00000165343915":"Seconds to weeks","0.00001157407407":"Seconds to days","0.01666666666667":"Seconds to minutes","0.00000000093132":"Bytes to Gigabytes","0.00000095367432":"Bytes to Megabytes","0.0009765625":"Bytes to Kilobytes","0.00000001653439":"Timeticks to weeks","0.00000011574074":"Timeticks to days"}'); From b42e4a8277eaac8ddd4b3ad6471dd7a8d135646c Mon Sep 17 00:00:00 2001 From: Arturo Gonzalez Date: Mon, 13 Feb 2017 15:29:45 +0100 Subject: [PATCH 33/44] Rewrite lost code. --- pandora_console/general/header.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index eb48cbfb2e..ace65271c6 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -241,10 +241,7 @@ config_check(); if ($check_minor_release_available) { set_pandora_error_for_header('There are one or more minor releases waiting for update, there are required administrator permissions', 'minor release/s available'); } - - if ($config["alert_cnt"] > 0) { - echo ''; - + echo ''; if ($config["alert_cnt"] > 0) { From 1fe9ded0fc6ed31cf49b7f7e62a30594492bc6de Mon Sep 17 00:00:00 2001 From: m-lopez-f Date: Mon, 13 Feb 2017 16:06:17 +0100 Subject: [PATCH 34/44] Add changes of visual mobile version of pandora. Gitlab: #148 --- .../images/os_icons/so_big_icons/android.png | Bin 0 -> 1602 bytes .../images/os_icons/so_big_icons/embedded.png | Bin 0 -> 1151 bytes .../images/os_icons/so_big_icons/network.png | Bin 0 -> 2605 bytes .../os_icons/so_big_icons/satellite.png | Bin 0 -> 3099 bytes .../images/os_icons/so_big_icons/so_aix.png | Bin 0 -> 3938 bytes .../images/os_icons/so_big_icons/so_bsd.png | Bin 0 -> 2232 bytes .../images/os_icons/so_big_icons/so_cisco.png | Bin 0 -> 2041 bytes .../images/os_icons/so_big_icons/so_hpux.png | Bin 0 -> 2895 bytes .../images/os_icons/so_big_icons/so_linux.png | Bin 0 -> 7214 bytes .../images/os_icons/so_big_icons/so_mac.png | Bin 0 -> 2561 bytes .../os_icons/so_big_icons/so_mainframe.png | Bin 0 -> 900 bytes .../images/os_icons/so_big_icons/so_other.png | Bin 0 -> 3354 bytes .../os_icons/so_big_icons/so_router.png | Bin 0 -> 1642 bytes .../os_icons/so_big_icons/so_solaris.png | Bin 0 -> 2360 bytes .../os_icons/so_big_icons/so_switch.png | Bin 0 -> 2461 bytes .../os_icons/so_big_icons/so_vmware.png | Bin 0 -> 1574 bytes .../images/os_icons/so_big_icons/so_win.png | Bin 0 -> 1014 bytes pandora_console/include/functions_ui.php | 16 +- .../include/style/jquery.mobile-1.3.1.css | 64 +++++-- pandora_console/mobile/include/style/main.css | 156 +++++++++++++--- pandora_console/mobile/include/ui.class.php | 44 ++--- pandora_console/mobile/operation/agent.php | 176 +++++++++++------- pandora_console/mobile/operation/agents.php | 2 +- pandora_console/mobile/operation/events.php | 8 +- .../mobile/operation/module_graph.php | 27 ++- pandora_console/mobile/operation/modules.php | 115 ++++++++---- pandora_console/mobile/operation/tactical.php | 2 +- 27 files changed, 409 insertions(+), 201 deletions(-) create mode 100644 pandora_console/images/os_icons/so_big_icons/android.png create mode 100644 pandora_console/images/os_icons/so_big_icons/embedded.png create mode 100644 pandora_console/images/os_icons/so_big_icons/network.png create mode 100644 pandora_console/images/os_icons/so_big_icons/satellite.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_aix.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_bsd.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_cisco.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_hpux.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_linux.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_mac.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_mainframe.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_other.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_router.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_solaris.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_switch.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_vmware.png create mode 100644 pandora_console/images/os_icons/so_big_icons/so_win.png diff --git a/pandora_console/images/os_icons/so_big_icons/android.png b/pandora_console/images/os_icons/so_big_icons/android.png new file mode 100644 index 0000000000000000000000000000000000000000..73565a78baffa19b8ed8919e4e151660e40cb811 GIT binary patch literal 1602 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 Ra>4)r002ovPDHLkV1mS9{s;g7 literal 0 HcmV?d00001 diff --git a/pandora_console/images/os_icons/so_big_icons/network.png b/pandora_console/images/os_icons/so_big_icons/network.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1aee5f717557282ec6104bbdec53111c3cbf38 GIT binary patch literal 2605 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 P00000NkvXXu0mjfrbo8x literal 0 HcmV?d00001 diff --git a/pandora_console/images/os_icons/so_big_icons/satellite.png b/pandora_console/images/os_icons/so_big_icons/satellite.png new file mode 100644 index 0000000000000000000000000000000000000000..8fba3d7ff0ad9fdba8b1dbc14a2f35f34011b9d3 GIT binary patch literal 3099 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 XUz}%dpng#w00000NkvXXu0mjfQEJG( literal 0 HcmV?d00001 diff --git a/pandora_console/images/os_icons/so_big_icons/so_hpux.png b/pandora_console/images/os_icons/so_big_icons/so_hpux.png new file mode 100644 index 0000000000000000000000000000000000000000..e9bab8b268329c94eeb6ce6416a2c94ad655aba8 GIT binary patch literal 2895 zcmV-V3$XNwP)W0~1wbqS<q8lmW<23dHLeoaqWZBjGDRhyefrG(ZI08Nu4)W85V z3)bTdQeY;>ZwY#8%F>2ra&V=I?0^7xj+}PY0Hcb)lDZOscs_=!F!_pDg46+ANg==o z{P_f5Dk3hW1p?J=z#k`wQWvu=fgCTGpb)GV$pYeYJa(U604Ihl?GJ>M0|d}0qH-xb z?WzK}9f&(sfvV&MTe1QZ&rRmUD>! z2G}gZ=9BYi8B-9c)kd5}crC$SR499KKXQ z^W}cxEkS6S59J%81r5xX=y}Hhza`j{V*(MqRYx3h6Nt?xu*L;u(4e+puyr~LakU@= zaEud>+K_mF+@fK^k)kLA$W11!5s$AMfbhkAQo2@5r1ilF6qY#jF%fW)AmPy!cw>%{ zvYr<9g0B(Q)*Tc8AOL%2c!VGfLt*e705{MLbQ9eGM{ojh0(1i0Ku2%`-9Scg1obLP z(ln$^Jx|Xb|DbogHc7v{{-5vc;x)sZlO6EBVM^X|H( zvzFHF^C+H>JLE$K?-H?lwD;O^d7`))hRn)Vod^hbZ5k>3vj+g@nm#V?5MYR}0kSwD z6|_64QiR;&r|t)glW`Etg@`7y9(`8T&WjuX46Z=a=P0#(2oy<55pK|feTW8S{z zWMBtvkri45E*xv33@=eHxCrTds90TFHiTQ`5cD3l$btiCa$%dx43!X^a3=mak!Pn! zyxLtm>FDG_gp7#1$b=#jOC((F6%nqvf893FiASW5xuT;4f*5+2{=)jG>wJSy@J06BFy&Icm6 z_NtZQHv)t*S-&{yDH!Wmx04m|Xa!8_UJ;kcU_ck*QgY5z zZb<`TA^hH}Cq>I+>zul5G!$hiSbhh#BkkP3XZ4d_H?~F@cWeh}PbbKGu=yy-lzEUl zu-;tktty+6_EByQJGT$DR1ip7Knsuw=?=NaF(RwVh>{FF+lGs+6(o`%Gx|JoBg$4> zs^(9%eBQcd);4pkLa?o9`kN}eReIP%jJJY7&~)z%fTR!l3}VZB%|$EDazl`#K%`cW zxi#1UL#sIR0a>dRUC3K5H!49A*c$3t5XeCh%tvP8Enau~}O+iUkW^dt? zJ&6Mn=1(XP#~>T=bYCaV7BRuj2cr7|(Ec8A4+iW>%C&Y*+Dl1E=!>DlXGom61vdz! zBy@SL^wtP&SAKGi6K7j_9dX}&89_;Omlp91%1}e&f40NC)?c!AIfkAju*qz8&|T!y zs6Rd3Uq!6ew^EdTB#f<5wE3k2(>~1w*&(JK$|nJxXW0&Y%*?Lj$I~>n1>KfhxRB)l zCQXd_?~O;$c;|0F;P=O@E|G#reyniv%-Z;7C+h8_m=LlEt15ue4AleBCA!Bd8YR3Sq<_@Y|49Iy}o!6>wSCOq$H+Px^!h@ugq^e6V$u6R{)>^anB|v-E zd!056#09V4LpOj40uux#NSL5ug5n8iCx8t?Cor7=GC{pTyg|tZeX7jsE7*4@-JNW| z=w3c0#E13M{lAmaPohML5+&-cpQZ1|+3=vLFje&JAh1D47uhbbEy=&5hYesOEX`yc z@1F+AFnv5gT)oT2m(N#!v5PbT7po~Y4X5&Nl;py^^TzkJ`0D>PI9JWW$08%@VOs=P!Axfr%7F{ zR_NIpQX@J7I_MA(#$Y|Sw6UNzNbIa#sl@fDS}2ZAzdesj&c%&I_&cZrBIA1E=Z4bHROM~V42=Ml@Dz6I2MhfNB2*jJRE|}zbpTkHgqjI`N;DQcbi}|eDamXu_%_!X| zA@z`7h%wwF#_$c;-7~`OegbUPK?w+MQEo*Y{|_zU))lF&jlt>=P|RRe%{%bF_W&4s zqF3ch4+2>VuiNQ37bi$n4!P9jjur2#0=bjXMGw^* zE{;9Sb27AKWzPY*_0TLpUlD*}4D(n3eu$lN*h@f~L9zkeW97CU2&oaD%t2{fjpwy% t2SxS&B!_>}F}_NtlqON4M2Qk<(jUa?_g&JBFTDT&002ovPDHLkV1m_XH@5%) literal 0 HcmV?d00001 diff --git a/pandora_console/images/os_icons/so_big_icons/so_linux.png b/pandora_console/images/os_icons/so_big_icons/so_linux.png new file mode 100644 index 0000000000000000000000000000000000000000..2a5f17525351de11468d5e5a1ba0aaf50b8aa5ae GIT binary patch literal 7214 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/os_icons/so_big_icons/so_mac.png b/pandora_console/images/os_icons/so_big_icons/so_mac.png new file mode 100644 index 0000000000000000000000000000000000000000..9dbbf22f6a096e46e3503fbf6762e52e67402b84 GIT binary patch literal 2561 zcmV+c3jXzpP)~#kvOlPs5UCQ=00A`U z6SD!a-eg268nC2YTq!OfD22g4Fd45pP#PyH6(Sd8Fbf)67Qrn571X#AAX!QM?bW>u zA|jFua`LLAXK`YK3tP6QN^nsFkYoucFHgPr8jK0W12SO2C%Ny~WrmNRzG2PMoLEX6 zTtSJ~5+^HN-0^dWf#~=_x1^DT(5t_2{>TCYLz{<#q6z~Dpix9pa4}J6fgmk?a2|-? zlU#NYTg;PEhLK%%fh;Jmno7O03sjdNHzi;|L(_<0V}|UAKR-E=Avvvvwx#gjpIB@fC)*dnZ#C zT+d&<$7s}{#}9gb0r@gJ-IcVm>-V3(3|sb`!P+5}AiEx=c%fSA;^*Z8`$SmVnc?P*^R!LEQdW@+8`jMsD+xD} zXjeTMdT7@iq9n&B4ytw+Kmd&*Dy5wSYMI42Kpxl+q#Qu($B&;<#SKgY;EDfGPZUzi z6F6gplr}N3;Mb>D43}o5kW^(8)5a#N4M8pdjg;KqK9Opk7?7kz4^L3+5m0*xSLX$m zoCtXWHc&>&APwDPgqnF`z%n~*)EzWTN$MyfIhma%F#_sQ!T>EiLARs@OH!cNpckNN zjL<7KXkL%tD~UkkKE(E$2FxSKePdjO05v^9R?>R(^flR*f%@Vg0GiPu1m3)PPP-WS z_WdV#1`#%k2m_Mhf()7}GT`1Yp;{gU)HMtd0rT)S!_mWA8FuYliJ_jDDJ-hhBcOqb zyANJ4+c?_>lYdD%Id%yio>Cw-T>+)f@VT!-e{y#cNbi)0K2;zhGd@|ZNQ

^S(&EP(3-bgJ6b{)KL8=TN0AoXONVc_*^940M zF%U_s07@%T+h9g4ohk<)wV&#lVsa#SbOqE8A$7qC7H|OAv2vt)jDRNRVM9bz@Wj9+ zt(z;Wz%*z+o>qV^(+V(vzNlbGc?34C(A~d|ruLBS5zw3nY<>h6_;BY0oQ-RQ1U5H9 zY4?|=F>+@^8%;Af-7`D2hkoel5m;=HyJl_Bcm$R|$XTaI4j_A^5wzlom}QBC0JY{9 zX%Zuk_s^kgvZ9$sUY>=_k3_~43~i6V02dd}@bCyd0o6SMYUzRiJtsnGq`wrsl89|M}%Y0>tgdW_(kW52d2pW)l9`$W&w4%!$2d4g6kLXt;7 zQ_=JS=v&dLnzWD?{@a>q(qv~ksE~m57C}Wgv8@A=JR&D83SYu;_|$bU&C1FQUiF|X zFF}^W&z(KQuyOqy@Cpb@nl~hQ1hk(Ugzr9l!Eot1WWyt9wF8I^<0AupJ}w4U7K9a? zNd0tN0Mue8rw>C`sRassSPXzRwcL5|0_y@z^o^{t*kT#jlyP+rr?|;aaq%lDCJ4s3 zMp}@;gDbSD3~5r2p!XtCJTlshAN2@r0eVq8W*yAV7O(6WT-&#qlk*784>>;uobcAmT|#(1V~tf?A6x(o+>L^#iYp7Z2jWLr)%z zcoGpm5X6fpiZ`JuLJ!7DJ=EGFG*~qnty&QbJ-Gi(W|`ehb-#CJcK&opXF|)eznz&k zGw;2TKT=XsQtS!=^u%iQ+t~9%Z7~ATr8FEu%_dP%wf%-AkZ@sOi`?uheNP3^FI!0X ztpYBlIn!5p6~-$T@3~E27zM@Z?>nr5D6)Ltwt)0sEO)hd%b3;JKkRuW4( zJ;QM7EP(_c&!0Uq)NS3q$5F}&A%Kiey*JdQm!}*9nYeSt(oH$_T&aEeXvxY656q~5 zaO)uehkN4rNd|Bp#|$BWAaafb4nVM?U`>f2?tmbmltcg$9X)=QE7O*_F{Gnok;MfK zb#`Qi(Yt%VQ+#P6k+OIlqb^oJkUb1e!j9J+rbY~*rDzpiW1Zj$%F@`wRhLEb)e(gm zcqW0gXdU#j2;S^4LmDLzld9zhhB6$^MHCl6kg}PcbC4Oi1QL;ECr1qBAhUKzAT~sT zN{R9U1L0z|xBjzgC{K)!Dqm}#T>USsQ-zWHLueqhbp<(%sHEpDLB!C;4oIqJqf3zQ z3<>vp`wqx1%MWcB7;^P@^ufuzn99Ng=$S?5QiCvV@UQ?GXbTy8Gp!|!$Hvpz?iI?q z>}oCldK8wK*MS^6i}&wd)yJ<^C-E^2hj=e`y&EM$1o?m*po~xs@)JPP>k+j|9lx9h)f_GnPXzP>Q>RHuNrkDu Xz7>_i$tf@F00000NkvXXu0mjfo@$c| literal 0 HcmV?d00001 diff --git a/pandora_console/images/os_icons/so_big_icons/so_mainframe.png b/pandora_console/images/os_icons/so_big_icons/so_mainframe.png new file mode 100644 index 0000000000000000000000000000000000000000..73ce9d6240eb863ec0c1d84b3249c0cb9b42be67 GIT binary patch literal 900 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/os_icons/so_big_icons/so_router.png b/pandora_console/images/os_icons/so_big_icons/so_router.png new file mode 100644 index 0000000000000000000000000000000000000000..441b2416f7ddac706af3138da5dcc74124291e3e GIT binary patch literal 1642 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 e5ClPd8vX%jfSDjvSgwlz0000l literal 0 HcmV?d00001 diff --git a/pandora_console/images/os_icons/so_big_icons/so_switch.png b/pandora_console/images/os_icons/so_big_icons/so_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..73de4894d46c5cdb5933a4221d8def88ad2dab04 GIT binary patch literal 2461 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 Y1%pnS(oXXo%m4rY07*qoM6N<$f;&8_c>n+a literal 0 HcmV?d00001 diff --git a/pandora_console/images/os_icons/so_big_icons/so_win.png b/pandora_console/images/os_icons/so_big_icons/so_win.png new file mode 100644 index 0000000000000000000000000000000000000000..c46d4e8bac5421687037601f4501d377ef8accd5 GIT binary patch literal 1014 zcmV+i@F`YCEul$2i=-wmDV7|-Q6o~d`gI^td^B~9T7oZi zp|>z9t{FgEBMy{ULYGQw6p#b}0%#PCfJe&>1L3IINAt+2 zM@Bs|LOjBPr*t>~F4Yiy1A7Jv$2tbK84vN$0SfHcK_~1v-^Tc?TtmbZ8MGG2K;b?^Qal@6nLeRN3suA znQb6u@c|G(009ILKmf_gYwfFfeT*cn{#~aH?zjKaU*Q6j%_Fu(*Qd1UxA8T#>OgJz z*Z~0q5I_I{1d!u^*sT&*b2sX@y(kIfk*?G(13U$XTq~)nAgf?C?i^}`7M~+sc3H&_ zn-IIQ72f3V1IQa>oTxia*(J!~#D?HCC-G!|lp=(VthWH|+|O;oFcg4s4!$!2?UhSM zAft2>t{sC>7=;lSp|OHn2t>%_FV^o9K7~lp`|KCR&$b@`0Kgd77c!!a{WP2D@hOC5v|0zwD@A%uVsLO=)x6%x .ui-btn-icon-notext, .ui-header-fixed.ui-fixed-hidden > .ui-btn-icon-notext { top: 6px; } .ui-header-fixed > .ui-btn-icon-notext { top: 7px;} -.ui-header .ui-title, .ui-footer .ui-title { min-height: 1.1em; text-align: center; font-size: 16px; display: block; margin: .6em 30% .8em; padding: 0; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; outline: 0 !important; } -.ui-footer .ui-title { margin: .6em 15px .8em; } +.ui-header .ui-title, .ui-footer .ui-title { + min-height: 1.1em; + text-align: center; + font-size: 16px; + display: block; + margin: .6em 30% .8em; + padding: 0; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + outline: 0 !important; +} +.ui-footer .ui-title { + margin: .6em 15px .8em; +} + /* content area*/ -.ui-content { border-width: 0; overflow: visible; overflow-x: hidden; padding: 15px; } +.ui-content { + border-width: 0; + overflow: hidden; + overflow-x: hidden; + padding: 5px 5px 0px 5px; +} /* corner styling for dialogs and popups */ .ui-corner-all > .ui-header:first-child, .ui-corner-all > .ui-content:first-child, @@ -2128,7 +2147,7 @@ label.ui-submit { font-size: 16px; line-height: 1.4; font-weight: normal; margin .ui-field-contain .ui-btn.ui-submit { width: 78%; display: inline-block; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; } .ui-hide-label .ui-btn.ui-submit { width: auto; display: block; } } -.ui-collapsible-inset { margin: .5em 0; } +.ui-collapsible-inset { margin: .5em 2px 1px; width:99%;} .ui-collapsible-heading { font-size: 16px; display: block; margin: 0 -15px; padding: 0; position: relative; } .ui-collapsible-inset .ui-collapsible-heading { margin: 0; } .ui-collapsible-heading .ui-btn { text-align: left; margin: 0; border-left-width: 0; border-right-width: 0; } @@ -2294,7 +2313,7 @@ label.ui-submit { font-size: 16px; line-height: 1.4; font-weight: normal; margin padding: 0; } .ui-dialog-contain > .ui-content { - padding: 15px; + padding: 5px 5px 0px 5px; } .ui-dialog-contain > .ui-footer { z-index: 10; @@ -3120,7 +3139,7 @@ div.ui-slider-switch.ui-mini { } } /* Breakpoint to show as a standard table at 560px (25em x 16px) or wider */ -@media ( min-width: 25em ) { +@media ( min-width: 34.99em ) { /* Fixes table rendering when switching between breakpoints in Safari <= 5. See https://github.com/jquery/jquery-mobile/issues/5380 */ .ui-table-reflow.ui-responsive { display: table-row-group; @@ -3143,7 +3162,7 @@ div.ui-slider-switch.ui-mini { } /* Hack to make IE9 and WP7.5 treat cells like block level elements, scoped to ui-responsive class */ /* Applied in a max-width media query up to the table layout breakpoint so we don't need to negate this*/ -@media ( max-width: 25em ) { +@media ( max-width: 34.98em ) { .ui-table-reflow.ui-responsive td, .ui-table-reflow.ui-responsive th { width: 100%; @@ -3153,6 +3172,15 @@ div.ui-slider-switch.ui-mini { float: left; clear: left; } + #list_agent_Modules.ui-table-reflow.ui-responsive td.cell_0 { + width: 52% !important; + } + #list_agent_Modules.ui-table-reflow.ui-responsive td.cell_1 { + width: 15% !important; + } + #list_agent_Modules.ui-table-reflow.ui-responsive td.cell_4 { + width: 33% !important; + } } /* panel */ .ui-panel { diff --git a/pandora_console/mobile/include/style/main.css b/pandora_console/mobile/include/style/main.css index 0c123564a7..5af548f7d0 100755 --- a/pandora_console/mobile/include/style/main.css +++ b/pandora_console/mobile/include/style/main.css @@ -34,6 +34,10 @@ body { } +.agent_graphs, .events_bar { + padding-top: 10px; +} + #tactical1 *, #tactical2 * { font-weight: bold; } @@ -520,11 +524,32 @@ table.event_details td.cell_event_name { } .agent_details { - line-height: 35px; + padding: 10px 0px 10px 0px; +} +.agent_details > img { + vertical-align: middle; + width: 20px; +} +.agent_os{ + float: right; + position: absolute; + top: 0px; + right: 0px; + padding: 10px; } -.agent_details img { - float: left; +.agent_list_ips { + padding: 10px 0px 10px 0px; +} +.agent_list_ips > img { + vertical-align: middle; + width: 20px; +} +.agent_last_contact { + padding: 10px 0px 10px 0px; +} +.agent_description { + padding: 10px 0px 10px 0px; } .agent_name { @@ -544,8 +569,8 @@ table.event_details td.cell_event_name { } #list_agents td { - height: 35px; - padding-top: 20px; + height: 25px; + padding-top: 10px; } .agents_tiny_stats_tactical { @@ -554,7 +579,33 @@ table.event_details td.cell_event_name { width: 100%; } -@media screen and (max-width: 25em) { +@media screen and (max-width: 34.99em) { + #list_agents td { + height: 35px; + padding-top: 7px; + display: table-cell; + clear: none; + padding-left: 0px !important; + padding-right: 0px !important; + } + + #list_agents td.cell_0 { + width: 45%; + border-top: 0px none; + } + #list_agents td.cell_0>span.tiny>img { + width: 5px; + height: 30px; + margin-top: -6px; + margin-left: 0px; + } + #list_agents td.cell_5 { + width: 30%; + } + #list_agents td.cell_6 { + width: 25%; + } + #list_agents .cell_2 .ui-table-cell-label, #list_agents .cell_3 .ui-table-cell-label, #list_agents .cell_6 .ui-table-cell-label, @@ -572,7 +623,6 @@ table.event_details td.cell_event_name { #list_agents .cell_2, #list_agents .cell_3, - #list_agents .cell_6, #list_agents .cell_7 { display: inline !important; float: none !important; @@ -594,7 +644,7 @@ table.event_details td.cell_event_name { } #list_agents .show_collapside { - display: inline !important; + display: none !important; } #list_agents .cell_1, @@ -605,16 +655,24 @@ table.event_details td.cell_event_name { } #list_agents .cell_0 .ui-link { - font-size: 15px; + font-size: 12px; } #list_agents .cell_6 .show_collapside { - display: inline !important; + display: none !important; } .agents_tiny_stats * { font-size: 12px !important; } + + #list_agent_Modules td { + padding-top: 7px !important; + } + + .agents_tiny_stats { + float: right; + } } /* For mobiles */ @@ -738,7 +796,7 @@ table.event_details td.cell_event_name { /*END-----------Visual maps styles---------------------------------------*/ /*INIT-----------Modules styles---------------------------------------*/ -@media screen and (max-width: 25em) { +@media screen and (max-width: 34.99em) { #list_Modules .cell_1 .ui-table-cell-label, #list_Modules .cell_5 .ui-table-cell-label, #list_Modules .cell_6 .ui-table-cell-label { @@ -755,7 +813,17 @@ table.event_details td.cell_event_name { #list_Modules .cell_3 .ui-table-cell-label, #list_Modules .cell_4 .ui-table-cell-label, #list_Modules .cell_5 .ui-table-cell-label { - display: none; + display: none !important; + } + + #list_Modules td { + height: 35px; + padding-top: 7px; + display: table-cell; + clear: none; + float: none; + padding-left: 0px !important; + padding-right: 0px !important; } #list_Modules .show_collapside { @@ -766,18 +834,43 @@ table.event_details td.cell_event_name { white-space: nowrap; } + #list_Modules .cell_1, #list_Modules .cell_2, #list_Modules .cell_3 { display: none !important; } #list_Modules .cell_0 .show_collapside, - #list_Modules .cell_1 .show_collapside { + #list_Modules .cell_1 .show_collapside, + #list_Modules .cell_4 .show_collapside, + #list_Modules .cell_5 .show_collapside { display: none !important; } #list_Modules .cell_0 .ui-link { - font-size: 15px; + font-size: 12px; + } + + #list_Modules .cell_0{ + width: 50%; + border-top: 0px none; + } + #list_Modules .cell_4{ + width: 25%; + } + #list_Modules .cell_5{ + width: 25%; + } +} + #list_Modules td.cell_0>span.tiny>img { + width: 5px; + height: 30px; + margin-top: -5px; + margin-left: 0px; + float: left; + } + #list_Modules .module_name { + font-size: 12px !important; } } @@ -795,6 +888,10 @@ table.event_details td.cell_event_name { padding-top: 20px; } +#list_agent_Modules td.cell_0 > span.tiny { + display: none; +} + #list_Modules .cell_5 img { float: left; } @@ -809,7 +906,7 @@ table.event_details td.cell_event_name { line-height: 20px; } -@media screen and (max-width: 25em) { +@media screen and (max-width: 34.99em) { #list_agent_Modules .ui-table-cell-label, #list_agent_Modules .cell_2, #list_agent_Modules .cell_3 { @@ -877,7 +974,7 @@ li.ui-btn { float: left; } -@media screen and (max-width: 25em) { +@media screen and (max-width: 34.99em) { .ui-table th, .ui-table td { padding: 8px !important; padding-left: 3px; @@ -924,7 +1021,7 @@ li.ui-btn { height: 28px !important; } -@media screen and (max-width: 25em) +@media screen and (max-width: 35em) { .events .status_row { display: none; @@ -939,12 +1036,12 @@ li.ui-btn { min-width: 50%; } - .agents_tiny_stats, .agents_last_contact { + .agents_last_contact { float: right; } } -@media screen and (min-width: 25em) +@media screen and (min-width: 35em) { .events .cell_0 .event_link{ display: none; @@ -1028,7 +1125,7 @@ li.ui-btn { } .event_name { - font-size: 18px !important; + font-size: 15px !important; } .login_logo img { @@ -1050,7 +1147,7 @@ li.ui-btn { } .event_name { - font-size: 15px; + font-size: 12px; font-weight: bold; } @@ -1199,6 +1296,11 @@ span.nobold * { line-height: 1.1em; } +.events_timestamp > img { + vertical-align: middle; + margin-left: 10px; +} + .events_agent { float: left; } @@ -1258,3 +1360,15 @@ DIV.nodata_container { .ui-table-reflow.ui-responsive { display: table !important; } + +.widget_agent_module > th { + background-color: #373737; +} +#list_agent_Modules >tbody > tr > td { + clear: none; + vertical-align: middle; + padding: 0px; +} +#list_agent_Modules > tbody > tr > td.cell_0 { + border-top: 0px none; +} \ No newline at end of file diff --git a/pandora_console/mobile/include/ui.class.php b/pandora_console/mobile/include/ui.class.php index 23a41b049d..2ef68dc749 100755 --- a/pandora_console/mobile/include/ui.class.php +++ b/pandora_console/mobile/include/ui.class.php @@ -780,6 +780,7 @@ class Table { foreach ($data as $id => $row) { $table_row = array(); foreach ($row as $key => $value) { + if (!in_array($key, $this->head)) { $this->head[] = $key; } @@ -843,45 +844,40 @@ class Table { $html = ''; $html = "\n"; + "data-mode='reflow' class='" . $this->class_table . " ui-responsive table-stroke'>"; - $html .= "\n"; - $html .= "\n"; - //Empty head for white space between rows in the responsive vertical layout - $html .= "\n"; - foreach ($this->head as $head) { - $html .= "\n"; + if ($this->head) { + $html .= ""; + $html .= ""; + //Empty head for white space between rows in the responsive vertical layout + //~ $html .= ""; + foreach ($this->head as $head) { + $html .= ""; + } + $html .= ""; + $html .= ""; } - $html .= "\n"; - $html .= "\n"; - $html .= "\n"; + $html .= ""; foreach ($this->rows as $key => $row) { $class = ''; if (isset($this->rowClass[$key])) { $class = $this->rowClass[$key]; } - $html .= "\n"; + $html .= ""; //Empty head for white space between rows in the responsive vertical layout - if (isset($this->row_heads[$key])) { - $html .= "\n"; - } - elseif ($this->row_keys_as_head_row) { - $html .= "\n"; - } - else { - $html .= "\n"; - } + foreach ($row as $key_cell => $cell) { - $html .= "\n"; + $html .= ""; } - $html .= "\n"; + + $html .= ""; } - $html .= "\n"; - $html .= "
" . $head . "
" . $head . "
" . $this->row_heads[$key] . "" . $key . "" . $cell . "" . $cell . "
\n"; + $html .= ""; + $html .= ""; return $html; } diff --git a/pandora_console/mobile/operation/agent.php b/pandora_console/mobile/operation/agent.php index 2bb7877278..5a765eaedb 100644 --- a/pandora_console/mobile/operation/agent.php +++ b/pandora_console/mobile/operation/agent.php @@ -114,92 +114,123 @@ class Agent { $ui->showFooter(false); $ui->beginContent(); if (empty($this->agent)) { - $ui->contentAddHtml('' . __('No agent found') . ''); + $ui->contentAddHtml('' . + __('No agent found') . ''); } else { $ui->contentBeginGrid(); - if ($this->agent['disabled']) { - $agent_name = "" . $agent_name . "" . ui_print_help_tip(__('Disabled'), true); - } - else if ($this->agent['quiet']) { - $agent_name = "" . $agent_name . " " . html_print_image("images/dot_green.disabled.png", true, array("border" => '0', "title" => __('Quiet'), "alt" => "")) . ""; - } - else { - $agent_name = $agent_name; - } - - - if ($system->getConfig('metaconsole')) { - metaconsole_connect(null, $this->agent['id_tmetaconsole_setup']); - $addresses = agents_get_addresses($this->agent['id_tagente']); - } - else - $addresses = agents_get_addresses($this->id); - - if ($system->getConfig('metaconsole')) - metaconsole_restore_db(); - - $address = $this->agent['direccion']; - foreach ($addresses as $k => $add) { - if ($add == $address) { - unset($addresses[$k]); - } - } - $ip = html_print_image('images/world.png', true, array('title' => __('IP address'))) . '  '; - $ip .= empty($address) ? '' . __('N/A') . '' : $address; - if (!empty($addresses)) { - $ip .= ui_print_help_tip(__('Other IP addresses').':
'.implode('
',$addresses), true); - } - $ip .= '
'; - - $last_contact = '' . __('Last contact') . ': ' - .ui_print_timestamp ($this->agent["ultimo_contacto"], true) . '
'; - - $description = '' . __('Description') . ':
'; - if (empty($agent["comentarios"])) { - $description .= '' . __('N/A') . ''; - } - else { - $description .= $this->agent["comentarios"]; - } - - - $html = '

'; - $html .= ui_print_group_icon ($this->agent["id_grupo"], true, "groups_small", "", false) . '  '; - $html .= '' . $agent_name . '
'; - $html .= $ip; - $html .= $last_contact; - $html .= $description; - $html .= '
'; + if ($this->agent['disabled']) { + $agent_name = "" . $agent_name . "" . + ui_print_help_tip(__('Disabled'), true); + } + else if ($this->agent['quiet']) { + $agent_name = "" . $agent_name . " " . + html_print_image("images/dot_green.disabled.png", + true, array("border" => '0', "title" => __('Quiet'), "alt" => "")) . ""; + } + else { + $agent_name = $agent_name; + } + + if ($system->getConfig('metaconsole')) { metaconsole_connect(null, $this->agent['id_tmetaconsole_setup']); - } + //~ $addresses = agents_get_addresses($this->agent['id_tagente']); + } + else + $addresses = agents_get_addresses($this->id); + + if ($system->getConfig('metaconsole')) + metaconsole_restore_db(); + + $address = $this->agent['direccion']; + //~ foreach ($addresses as $k => $add) { + //~ if ($add == $address) { + //~ unset($addresses[$k]); + //~ } + //~ } + + //~ $ip = html_print_image('images/world.png', + //~ true, array('title' => __('IP address'))) . + //~ '  '; + $ip .= empty($address) ? '' . __('N/A') . + '' : $address; + + //~ if (!empty($addresses)) { + //~ $ip .= ui_print_help_tip(__('Other IP addresses') . + //~ ': ' . implode(', ',$addresses), true); + //~ } + + $last_contact = '' . __('Last contact') . + ': ' . + ui_print_timestamp ($this->agent["ultimo_contacto"], true); + + //~ $description = '' . __('Description') . ': '; + if (empty($agent["comentarios"])) { + $description .= '' . __('N/A') . ''; + } + else { + $description .= $this->agent["comentarios"]; + } + + $html = '
'; + $html .= '' . $agent_name . + ''; + $html .= '
'; + $html .= '
' . ui_print_os_icon ($this->agent["id_os"], false, true, + true, false, false, false, false, true) . '
'; + $html .= '
'; + $html .= $ip . ' - ' . + groups_get_name ($this->agent["id_grupo"], true); + $html .= '
+
'; + $html .= $last_contact; + $html .= '
+
'; + $html .= $description; + $html .= '
'; + + if ($system->getConfig('metaconsole')) { + metaconsole_connect(null, + $this->agent['id_tmetaconsole_setup']); + } + $ui->contentGridAddCell($html, 'agent_details'); - ob_start(); - $html = '
'; - $html .= "" . __('Modules by status') . "
"; - $html .= graph_agent_status ($this->id, 160, 160, true); - $graph_js = ob_get_clean(); - $html = $graph_js . $html; - unset($this->agent['fired_count']); - if ($this->agent['total_count'] > 0) { - $html .= '' . reporting_tiny_stats($this->agent, true) . '
'; - } - $html .= "" . __('Events (24h)') . "

"; - $html .= '
'; - $html .= '
'; - $html .= '
'; + + ob_start(); + + $html = '
'; + $html .= "" . __('Modules by status') . ""; + $html .= graph_agent_status ($this->id, 160, 160, true); + $graph_js = ob_get_clean(); + $html = $graph_js . $html; + + unset($this->agent['fired_count']); + + if ($this->agent['total_count'] > 0) { + $html .= '
' . + reporting_tiny_stats($this->agent, true, 'agent', ' ') . '
'; + } + + $html .= '
'; + $html .= '
'; + $html .= "" . __('Events (24h)') . ""; + $html .= '
'; + $html .= '
'; $ui->contentGridAddCell($html, 'agent_graphs'); $ui->contentEndGrid(); + if ($system->getConfig('metaconsole')) metaconsole_restore_db(); $modules = new Modules(); + if ($system->getConfig('metaconsole')) $filters = array('id_agent' => $this->agent['id_tagente'], 'all_modules' => true, 'status' => -1); else $filters = array('id_agent' => $this->id, 'all_modules' => true, 'status' => -1); + $modules->setFilters($filters); $modules->disabledColumns(array('agent')); $ui->contentBeginCollapsible(__('Modules')); @@ -208,19 +239,24 @@ class Agent { if ($system->getConfig('metaconsole')) { metaconsole_connect(null, $this->agent['id_tmetaconsole_setup']); - } + } + $alerts = new Alerts(); + if ($system->getConfig('metaconsole')) $filters = array('id_agent' => $this->agent['id_tagente'], 'all_alerts' => true); else $filters = array('id_agent' => $this->id, 'all_alerts' => true); + $alerts->setFilters($filters); $alerts->disabledColumns(array('agent')); $ui->contentBeginCollapsible(__('Alerts')); $ui->contentCollapsibleAddItem($alerts->listAlertsHtml(true)); $ui->contentEndCollapsible(); + if ($system->getConfig('metaconsole')) metaconsole_restore_db(); + $events = new Events(); $events->addJavascriptDialog(); diff --git a/pandora_console/mobile/operation/agents.php b/pandora_console/mobile/operation/agents.php index 3430d088b9..1a11e49108 100644 --- a/pandora_console/mobile/operation/agents.php +++ b/pandora_console/mobile/operation/agents.php @@ -325,7 +325,7 @@ class Agents { $row[7] = $row[__('Modules')] = '' . - '' . reporting_tiny_stats($agent, true) . ' '; + '' . reporting_tiny_stats($agent, true, 'agent', ' ') . ' '; $last_time = strtotime ($agent["ultimo_contacto"]); $now = time (); diff --git a/pandora_console/mobile/operation/events.php b/pandora_console/mobile/operation/events.php index 18977219e5..f17a655d2a 100644 --- a/pandora_console/mobile/operation/events.php +++ b/pandora_console/mobile/operation/events.php @@ -105,7 +105,7 @@ class Events { $status_icon = html_print_image($img_st, true, false, false, false, false, true); $row = array(); - $row[] = '' . __('Event Name') . '
' . io_safe_output($event['evento']) . '
'; + $row[] = '' . __('Event Name') . '
' . io_safe_output(str_replace(array(' ',''), ' ', $event['evento'])) . '
'; if ($event["id_agente"] == 0) { $agent_name = __('System'); @@ -115,7 +115,7 @@ class Events { } $row_1 = '' . $agent_name . ''; - $row_1 .= '' . $status_icon . '
' . ui_print_timestamp ($event['timestamp_rep'], true, array('units' => 'tiny')) . '
'; + $row_1 .= '' . ui_print_timestamp ($event['timestamp_rep'], true, array('units' => 'tiny')) . $status_icon . ''; $row[] = $row_1; @@ -966,10 +966,10 @@ class Events { var new_rows = \"\"; $.each(data.events, function(key, event) { new_rows = \"\" + - \"\" + + \"\" + event[0] + \"\" + - \"\" + event[1] + \"\" + + \"\" + event[1] + \"\" + \"\" + new_rows; }); diff --git a/pandora_console/mobile/operation/module_graph.php b/pandora_console/mobile/operation/module_graph.php index c1b18fb427..62da58e81f 100644 --- a/pandora_console/mobile/operation/module_graph.php +++ b/pandora_console/mobile/operation/module_graph.php @@ -84,7 +84,7 @@ class ModuleGraph { $this->height = (int)$system->getRequest('height', 0); //Sancho says "put the height to 1/2 for to make more beautyful" - //$this->height = $this->height / 2; + $this->height = $this->height / 1.5; $this->height -= 80; //Correct the height @@ -279,37 +279,34 @@ class ModuleGraph { ob_start(); ?>