From 9e264c156c03cbb69e6621ac097963baa92cdba3 Mon Sep 17 00:00:00 2001 From: fbsanchez Date: Wed, 26 Oct 2016 16:34:51 +0200 Subject: [PATCH] Update manager. Issues fixed Open: TGZ files extraction failed with PHP <5.5.0, added a switch to use system call to extract the file if PHP <5.5.0 (Linux) If in a Windows Server with PHP <5.5.0, the installation will fail. Removed double call to update_manager_starting_update --- .../include/ajax/update_manager.ajax.php | 1006 ++++++++--------- .../include/functions_update_manager.php | 34 +- 2 files changed, 531 insertions(+), 509 deletions(-) diff --git a/pandora_console/include/ajax/update_manager.ajax.php b/pandora_console/include/ajax/update_manager.ajax.php index dcf0ebf7e1..d947bbb78a 100644 --- a/pandora_console/include/ajax/update_manager.ajax.php +++ b/pandora_console/include/ajax/update_manager.ajax.php @@ -1,504 +1,502 @@ -open($path) === true) { - // The files will be extracted one by one - for($i = 0; $i < $zip->numFiles; $i++) { - $filename = $zip->getNameIndex($i); - - if ($zip->extractTo($destination, array($filename))) { - // Creates a file with the name of the files extracted - file_put_contents ($destination."/files.txt", $filename."\n", FILE_APPEND | LOCK_EX); - } else { - // Deletes the entire extraction directory if a file can not be extracted - delete_directory($destination); - $return["status"] = "error"; - $return["message"] = __("There was an error extracting the file '".$filename."' from the package."); - echo json_encode($return); - return; - } - } - // Creates a file with the number of files extracted - file_put_contents ($destination."/files.info.txt", $zip->numFiles); - // Zip close - $zip->close(); - - $return["status"] = "success"; - $return["package"] = $destination; - echo json_encode($return); - return; - } else { - $return["status"] = "error"; - $return["message"] = __("The package was not extracted."); - echo json_encode($return); - return; - } - } else { - $return["status"] = "error"; - $return["message"] = __("Invalid extension. The package must have the extension .oum."); - echo json_encode($return); - return; - } - } - - $return["status"] = "error"; - $return["message"] = __("The file was not uploaded succesfully."); - echo json_encode($return); - return; -} - -if ($install_package) { - global $config; - ob_clean(); - - $package = (string) get_parameter("package"); - $package = trim($package); - - $chunks = explode("_", basename($package)); - $chunks = explode(".", $chunks[1]); - $version = $chunks[0]; - - // All files extracted - $files_total = $package . "/files.txt"; - // Files copied - $files_copied = $package . "/files.copied.txt"; - $return = array(); - - if (file_exists($files_copied)) { - unlink($files_copied); - } - - if (file_exists($package)) { - - if ($files_h = fopen($files_total, "r")) { - - while ($line = stream_get_line($files_h, 65535, "\n")) { - $line = trim($line); - - // Tries to move the old file to the directory backup inside the extracted package - if (file_exists($config["homedir"] . "/" . $line)) { - rename($config["homedir"] . "/" . $line, - $package . "/backup/" . $line); - } - // Tries to move the new file to the Pandora directory - $dirname = dirname($line); - if (!file_exists($config["homedir"] . "/" . $dirname)) { - $dir_array = explode("/", $dirname); - $temp_dir = ""; - foreach ($dir_array as $dir) { - $temp_dir .= "/" . $dir; - if (!file_exists($config["homedir"] . $temp_dir)) { - mkdir($config["homedir"] . $temp_dir); - } - } - } - if (is_dir($package . "/" . $line)) { - if (!file_exists($config["homedir"] . "/" . $line)) { - mkdir($config["homedir"] . "/" . $line); - file_put_contents($files_copied, $line."\n", FILE_APPEND | LOCK_EX); - } - } - else { - if (rename($package."/".$line, $config["homedir"]."/".$line)) { - - // Append the moved file to the copied files txt - if (!file_put_contents($files_copied, $line."\n", FILE_APPEND | LOCK_EX)) { - - // If the copy process fail, this code tries to restore the files backed up before - if ($files_copied_h = fopen($files_copied, "r")) { - while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { - $line_c = trim($line_c); - if (!rename($package."/backup/".$line, $config["homedir"]."/".$line_c)) { - $backup_status = __("Some of your files might not be recovered."); - } - } - if (!rename($package."/backup/".$line, $config["homedir"]."/".$line)) { - $backup_status = __("Some of your files might not be recovered."); - } - fclose($files_copied_h); - } else { - $backup_status = __("Some of your old files might not be recovered."); - } - - fclose($files_h); - $return["status"] = "error"; - $return["message"]= __("Line '$line' not copied to the progress file.")." ".$backup_status; - echo json_encode($return); - return; - } - } - else { - - // If the copy process fail, this code tries to restore the files backed up before - if ($files_copied_h = fopen($files_copied, "r")) { - while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { - $line_c = trim($line_c); - if (!rename($package."/backup/".$line, $config["homedir"]."/".$line)) { - $backup_status = __("Some of your old files might not be recovered."); - } - } - fclose($files_copied_h); - } - else { - $backup_status = __("Some of your files might not be recovered."); - } - - fclose($files_h); - $return["status"] = "error"; - $return["message"]= __("File '$line' not copied.")." ".$backup_status; - echo json_encode($return); - return; - } - } - } - fclose($files_h); - } - else { - $return["status"] = "error"; - $return["message"]= __("An error ocurred while reading a file."); - echo json_encode($return); - return; - } - } - else { - $return["status"] = "error"; - $return["message"]= __("The package does not exist"); - echo json_encode($return); - return; - } - - update_manager_enterprise_set_version($version); - db_pandora_audit("Update Pandora", "Update version: $version of Pandora FMS by ".$config['id_user']); - - $return["status"] = "success"; - echo json_encode($return); - return; -} - -if ($check_install_package) { - // 1 second - //sleep(1); - // Half second - usleep(500000); - - ob_clean(); - - $package = (string) get_parameter("package"); - // All files extracted - $files_total = $package."/files.txt"; - // Number of files extracted - $files_num = $package."/files.info.txt"; - // Files copied - $files_copied = $package."/files.copied.txt"; - - $files = @file($files_copied); - if (empty($files)) - $files = array(); - $total = (int)@file_get_contents($files_num); - - $progress = 0; - if ((count($files) > 0) && ($total > 0)) { - $progress = format_numeric((count($files) / $total) * 100, 2); - if ($progress > 100) - $progress = 100; - } - - $return = array(); - $return['info'] = (string) implode("
", $files); - $return['progress'] = $progress; - - if ($progress >= 100) { - unlink($files_total); - unlink($files_num); - unlink($files_copied); - } - - echo json_encode($return); - return; -} - -if ($check_online_enterprise_packages) { - - update_manager_check_online_enterprise_packages(); - - return; - -} - -if ($check_online_packages) { - - return; -} - -if ($update_last_enterprise_package) { - - update_manager_update_last_enterprise_package(); - - return; - -} - -if ($update_last_package) { - - return; -} - -if ($install_package_online) { - - return; -} - -if ($install_package_step2) { - update_manager_install_package_step2(); - - return; -} - -if ($check_progress_enterprise_update) { - update_manager_check_progress_enterprise(); - - return; -} - -if ($check_progress_update) { - - return; -} - -if ($enterprise_install_package) { - $package = get_parameter('package', ''); - - - update_manager_enterprise_starting_update($package, - $config['attachment_store'] . "/downloads/" . $package); - - return; -} - -if ($enterprise_install_package_step2) { - update_manager_install_enterprise_package_step2(); - - return; -} - -if ($check_online_free_packages) { - - update_manager_check_online_free_packages(); - - return; -} - -if ($update_last_free_package) { - - $package = get_parameter('package', ''); - $version = get_parameter('version', ''); - $package_url = base64_decode($package); - - $params = array('action' => 'get_package', - 'license' => $license, - 'limit_count' => $users, - 'current_package' => $current_package, - 'package' => $package, - 'version' => $config['version'], - 'build' => $config['build']); - - $curlObj = curl_init(); - //curl_setopt($curlObj, CURLOPT_URL, $config['url_updatemanager']); - curl_setopt($curlObj, CURLOPT_URL, $package_url); - curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($curlObj, CURLOPT_FOLLOWLOCATION, true); - //curl_setopt($curlObj, CURLOPT_POST, true); - //curl_setopt($curlObj, CURLOPT_POSTFIELDS, $params); - curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false); - if (isset($config['update_manager_proxy_server'])) { - curl_setopt($curlObj, CURLOPT_PROXY, $config['update_manager_proxy_server']); - } - if (isset($config['update_manager_proxy_port'])) { - curl_setopt($curlObj, CURLOPT_PROXYPORT, $config['update_manager_proxy_port']); - } - if (isset($config['update_manager_proxy_user'])) { - curl_setopt($curlObj, CURLOPT_PROXYUSERPWD, $config['update_manager_proxy_user'] . ':' . $config['update_manager_proxy_password']); - } - - $result = curl_exec($curlObj); - $http_status = curl_getinfo($curlObj, CURLINFO_HTTP_CODE); - - curl_close($curlObj); - - - - - - if (empty($result)) { - echo json_encode(array( - 'in_progress' => false, - 'message' => __('Fail to update to the last package.'))); - } - else { - file_put_contents( - $config['attachment_store'] . "/downloads/last_package.tgz" , $result); - - echo json_encode(array( - 'in_progress' => true, - 'message' => __('Starting to update to the last package.'))); - - - $progress_update_status = db_get_value( - 'value', 'tconfig', 'token', 'progress_update_status'); - - - - if (empty($progress_update_status)) { - db_process_sql_insert('tconfig', - array( - 'value' => 0, - 'token' => 'progress_update') - ); - - db_process_sql_insert('tconfig', - array( - 'value' => json_encode( - array( - 'status' => 'in_progress', - 'message' => '' - )), - 'token' => 'progress_update_status') - ); - } - else { - db_process_sql_update('tconfig', - array('value' => 0), - array('token' => 'progress_update')); - - db_process_sql_update('tconfig', - array('value' => json_encode( - array( - 'status' => 'in_progress', - 'message' => '' - ) - ) - ), - array('token' => 'progress_update_status')); - } - } - - return; -} - -if ($check_update_free_package) { - - - $progress_update = db_get_value('value', 'tconfig', - 'token', 'progress_update'); - - $progress_update_status = db_get_value('value', 'tconfig', - 'token', 'progress_update_status'); - $progress_update_status = json_decode($progress_update_status, true); - - switch ($progress_update_status['status']) { - case 'in_progress': - $correct = true; - $end = false; - break; - case 'fail': - $correct = false; - $end = false; - break; - case 'end': - $correct = true; - $end = true; - break; - } - - $progressbar_tag = progressbar($progress_update, 400, 20, - __("progress"), $config['fontpath']); - preg_match("/src='(.*)'/", $progressbar_tag, $matches); - $progressbar = $matches[1]; - - echo json_encode(array( - 'correct' => $correct, - 'end' => $end, - 'message' => $progress_update_status['message'], - 'progressbar' => $progressbar - )); - - return; -} - -if ($install_free_package) { - $version = get_parameter('version', ''); - - update_manager_starting_update(); - - $result = update_manager_starting_update(); - - if ($result) - update_manager_set_current_package($version); - - - sleep(3); - - - - $return["status"] = "success"; - $return["message"]= __("The package is installed."); - echo json_encode($return); -} -?> +open($path) === true) { + // The files will be extracted one by one + for($i = 0; $i < $zip->numFiles; $i++) { + $filename = $zip->getNameIndex($i); + + if ($zip->extractTo($destination, array($filename))) { + // Creates a file with the name of the files extracted + file_put_contents ($destination."/files.txt", $filename."\n", FILE_APPEND | LOCK_EX); + } else { + // Deletes the entire extraction directory if a file can not be extracted + delete_directory($destination); + $return["status"] = "error"; + $return["message"] = __("There was an error extracting the file '".$filename."' from the package."); + echo json_encode($return); + return; + } + } + // Creates a file with the number of files extracted + file_put_contents ($destination."/files.info.txt", $zip->numFiles); + // Zip close + $zip->close(); + + $return["status"] = "success"; + $return["package"] = $destination; + echo json_encode($return); + return; + } else { + $return["status"] = "error"; + $return["message"] = __("The package was not extracted."); + echo json_encode($return); + return; + } + } else { + $return["status"] = "error"; + $return["message"] = __("Invalid extension. The package must have the extension .oum."); + echo json_encode($return); + return; + } + } + + $return["status"] = "error"; + $return["message"] = __("The file was not uploaded succesfully."); + echo json_encode($return); + return; +} + +if ($install_package) { + global $config; + ob_clean(); + + $package = (string) get_parameter("package"); + $package = trim($package); + + $chunks = explode("_", basename($package)); + $chunks = explode(".", $chunks[1]); + $version = $chunks[0]; + + // All files extracted + $files_total = $package . "/files.txt"; + // Files copied + $files_copied = $package . "/files.copied.txt"; + $return = array(); + + if (file_exists($files_copied)) { + unlink($files_copied); + } + + if (file_exists($package)) { + + if ($files_h = fopen($files_total, "r")) { + + while ($line = stream_get_line($files_h, 65535, "\n")) { + $line = trim($line); + + // Tries to move the old file to the directory backup inside the extracted package + if (file_exists($config["homedir"] . "/" . $line)) { + rename($config["homedir"] . "/" . $line, + $package . "/backup/" . $line); + } + // Tries to move the new file to the Pandora directory + $dirname = dirname($line); + if (!file_exists($config["homedir"] . "/" . $dirname)) { + $dir_array = explode("/", $dirname); + $temp_dir = ""; + foreach ($dir_array as $dir) { + $temp_dir .= "/" . $dir; + if (!file_exists($config["homedir"] . $temp_dir)) { + mkdir($config["homedir"] . $temp_dir); + } + } + } + if (is_dir($package . "/" . $line)) { + if (!file_exists($config["homedir"] . "/" . $line)) { + mkdir($config["homedir"] . "/" . $line); + file_put_contents($files_copied, $line."\n", FILE_APPEND | LOCK_EX); + } + } + else { + if (rename($package."/".$line, $config["homedir"]."/".$line)) { + + // Append the moved file to the copied files txt + if (!file_put_contents($files_copied, $line."\n", FILE_APPEND | LOCK_EX)) { + + // If the copy process fail, this code tries to restore the files backed up before + if ($files_copied_h = fopen($files_copied, "r")) { + while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { + $line_c = trim($line_c); + if (!rename($package."/backup/".$line, $config["homedir"]."/".$line_c)) { + $backup_status = __("Some of your files might not be recovered."); + } + } + if (!rename($package."/backup/".$line, $config["homedir"]."/".$line)) { + $backup_status = __("Some of your files might not be recovered."); + } + fclose($files_copied_h); + } else { + $backup_status = __("Some of your old files might not be recovered."); + } + + fclose($files_h); + $return["status"] = "error"; + $return["message"]= __("Line '$line' not copied to the progress file.")." ".$backup_status; + echo json_encode($return); + return; + } + } + else { + + // If the copy process fail, this code tries to restore the files backed up before + if ($files_copied_h = fopen($files_copied, "r")) { + while ($line_c = stream_get_line($files_copied_h, 65535, "\n")) { + $line_c = trim($line_c); + if (!rename($package."/backup/".$line, $config["homedir"]."/".$line)) { + $backup_status = __("Some of your old files might not be recovered."); + } + } + fclose($files_copied_h); + } + else { + $backup_status = __("Some of your files might not be recovered."); + } + + fclose($files_h); + $return["status"] = "error"; + $return["message"]= __("File '$line' not copied.")." ".$backup_status; + echo json_encode($return); + return; + } + } + } + fclose($files_h); + } + else { + $return["status"] = "error"; + $return["message"]= __("An error ocurred while reading a file."); + echo json_encode($return); + return; + } + } + else { + $return["status"] = "error"; + $return["message"]= __("The package does not exist"); + echo json_encode($return); + return; + } + + update_manager_enterprise_set_version($version); + db_pandora_audit("Update Pandora", "Update version: $version of Pandora FMS by ".$config['id_user']); + + $return["status"] = "success"; + echo json_encode($return); + return; +} + +if ($check_install_package) { + // 1 second + //sleep(1); + // Half second + usleep(500000); + + ob_clean(); + + $package = (string) get_parameter("package"); + // All files extracted + $files_total = $package."/files.txt"; + // Number of files extracted + $files_num = $package."/files.info.txt"; + // Files copied + $files_copied = $package."/files.copied.txt"; + + $files = @file($files_copied); + if (empty($files)) + $files = array(); + $total = (int)@file_get_contents($files_num); + + $progress = 0; + if ((count($files) > 0) && ($total > 0)) { + $progress = format_numeric((count($files) / $total) * 100, 2); + if ($progress > 100) + $progress = 100; + } + + $return = array(); + $return['info'] = (string) implode("
", $files); + $return['progress'] = $progress; + + if ($progress >= 100) { + unlink($files_total); + unlink($files_num); + unlink($files_copied); + } + + echo json_encode($return); + return; +} + +if ($check_online_enterprise_packages) { + + update_manager_check_online_enterprise_packages(); + + return; + +} + +if ($check_online_packages) { + + return; +} + +if ($update_last_enterprise_package) { + + update_manager_update_last_enterprise_package(); + + return; + +} + +if ($update_last_package) { + + return; +} + +if ($install_package_online) { + + return; +} + +if ($install_package_step2) { + update_manager_install_package_step2(); + + return; +} + +if ($check_progress_enterprise_update) { + update_manager_check_progress_enterprise(); + + return; +} + +if ($check_progress_update) { + + return; +} + +if ($enterprise_install_package) { + $package = get_parameter('package', ''); + + + update_manager_enterprise_starting_update($package, + $config['attachment_store'] . "/downloads/" . $package); + + return; +} + +if ($enterprise_install_package_step2) { + update_manager_install_enterprise_package_step2(); + + return; +} + +if ($check_online_free_packages) { + + update_manager_check_online_free_packages(); + + return; +} + +if ($update_last_free_package) { + + $package = get_parameter('package', ''); + $version = get_parameter('version', ''); + $package_url = base64_decode($package); + + $params = array('action' => 'get_package', + 'license' => $license, + 'limit_count' => $users, + 'current_package' => $current_package, + 'package' => $package, + 'version' => $config['version'], + 'build' => $config['build']); + + $curlObj = curl_init(); + //curl_setopt($curlObj, CURLOPT_URL, $config['url_updatemanager']); + curl_setopt($curlObj, CURLOPT_URL, $package_url); + curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($curlObj, CURLOPT_FOLLOWLOCATION, true); + //curl_setopt($curlObj, CURLOPT_POST, true); + //curl_setopt($curlObj, CURLOPT_POSTFIELDS, $params); + curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false); + if (isset($config['update_manager_proxy_server'])) { + curl_setopt($curlObj, CURLOPT_PROXY, $config['update_manager_proxy_server']); + } + if (isset($config['update_manager_proxy_port'])) { + curl_setopt($curlObj, CURLOPT_PROXYPORT, $config['update_manager_proxy_port']); + } + if (isset($config['update_manager_proxy_user'])) { + curl_setopt($curlObj, CURLOPT_PROXYUSERPWD, $config['update_manager_proxy_user'] . ':' . $config['update_manager_proxy_password']); + } + + $result = curl_exec($curlObj); + $http_status = curl_getinfo($curlObj, CURLINFO_HTTP_CODE); + + curl_close($curlObj); + + + + + + if (empty($result)) { + echo json_encode(array( + 'in_progress' => false, + 'message' => __('Fail to update to the last package.'))); + } + else { + file_put_contents( + $config['attachment_store'] . "/downloads/last_package.tgz" , $result); + + echo json_encode(array( + 'in_progress' => true, + 'message' => __('Starting to update to the last package.'))); + + + $progress_update_status = db_get_value( + 'value', 'tconfig', 'token', 'progress_update_status'); + + + + if (empty($progress_update_status)) { + db_process_sql_insert('tconfig', + array( + 'value' => 0, + 'token' => 'progress_update') + ); + + db_process_sql_insert('tconfig', + array( + 'value' => json_encode( + array( + 'status' => 'in_progress', + 'message' => '' + )), + 'token' => 'progress_update_status') + ); + } + else { + db_process_sql_update('tconfig', + array('value' => 0), + array('token' => 'progress_update')); + + db_process_sql_update('tconfig', + array('value' => json_encode( + array( + 'status' => 'in_progress', + 'message' => '' + ) + ) + ), + array('token' => 'progress_update_status')); + } + } + + return; +} + +if ($check_update_free_package) { + + + $progress_update = db_get_value('value', 'tconfig', + 'token', 'progress_update'); + + $progress_update_status = db_get_value('value', 'tconfig', + 'token', 'progress_update_status'); + $progress_update_status = json_decode($progress_update_status, true); + + switch ($progress_update_status['status']) { + case 'in_progress': + $correct = true; + $end = false; + break; + case 'fail': + $correct = false; + $end = false; + break; + case 'end': + $correct = true; + $end = true; + break; + } + + $progressbar_tag = progressbar($progress_update, 400, 20, + __("progress"), $config['fontpath']); + preg_match("/src='(.*)'/", $progressbar_tag, $matches); + $progressbar = $matches[1]; + + echo json_encode(array( + 'correct' => $correct, + 'end' => $end, + 'message' => $progress_update_status['message'], + 'progressbar' => $progressbar + )); + + return; +} + +if ($install_free_package) { + $version = get_parameter('version', ''); + + $result = update_manager_starting_update(); + + if ($result) + update_manager_set_current_package($version); + + + sleep(3); + + + + $return["status"] = "success"; + $return["message"]= __("The package is installed."); + echo json_encode($return); +} +?> diff --git a/pandora_console/include/functions_update_manager.php b/pandora_console/include/functions_update_manager.php index b51db5aadf..b0e3486007 100755 --- a/pandora_console/include/functions_update_manager.php +++ b/pandora_console/include/functions_update_manager.php @@ -610,14 +610,38 @@ function update_manager_starting_update() { $full_path = $config['attachment_store'] . "/downloads/pandora_console"; - $phar = new PharData($path_package); ob_start(); - try { - $result = $phar->extractTo($config['attachment_store'] . "/downloads/"); + + + if (!defined('PHP_VERSION_ID')) { + $version = explode('.', PHP_VERSION); + define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); } - catch (Exception $e) { - echo ' There\'s a problem ... -> ' . $e->getMessage(); + + $extracted = false; + // Phar and exception working fine in 5.5.0 or higher + if (PHP_VERSION_ID >= 50505) { + $phar = new PharData($path_package); + try { + $result = $phar->extractTo($config['attachment_store'] . "/downloads/",null, true); + $extracted = true; + } + catch (Exception $e) { + echo ' There\'s a problem ... -> ' . $e->getMessage(); + $extracted = false; + } } + + if($extracted === false) { + if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { + // unsupported OS + echo "This OS [" . PHP_OS . "] does not support direct extraction of tgz files. Upgrade PHP version to be > 5.5.0"; + } + else { + system('tar xzf "' . $path_package . '" -C ' . $config['attachment_store'] . "/downloads/"); + } + } + ob_end_clean(); rrmdir($path_package);