diff options
-rw-r--r-- | etc/inc/pfsense-utils.inc | 85 | ||||
-rwxr-xr-x | usr/local/www/system_firmware_check.php | 41 |
2 files changed, 106 insertions, 20 deletions
diff --git a/etc/inc/pfsense-utils.inc b/etc/inc/pfsense-utils.inc index dd7c4de..007a27e 100644 --- a/etc/inc/pfsense-utils.inc +++ b/etc/inc/pfsense-utils.inc @@ -1793,4 +1793,89 @@ function process_alias_tgz($temp_filename) { fclose($fd); } +function version_compare_dates($a, $b) { + $a_time = strtotime($a); + $b_time = strtotime($b); + + if ((!$a_time) || (!$b_time)) { + return FALSE; + } else { + if ($a < $b) + return -1; + elseif ($a == $b) + return 0; + else + return 1; + } +} +function version_get_string_value($a) { + $strs = array( + 0 => "ALPHA-ALPHA", + 2 => "ALPHA", + 3 => "BETA", + 4 => "B", + 5 => "RC", + 6 => "RELEASE" + ); + $major = 0; + $minor = 0; + foreach ($strs as $num => $str) { + if (substr($a, 0, strlen($str)) == $str) { + $major = $num; + $n = substr($a, strlen($str)); + if (is_numeric($n)) + $minor = $n; + break; + } + } + return "{$major}.{$minor}"; +} +function version_compare_string($a, $b) { + return version_compare_numeric(version_get_string_value($a), version_get_string_value($b)); +} +function version_compare_numeric($a, $b) { + $a_arr = explode('.', rtrim($a, '.0')); + $b_arr = explode('.', rtrim($b, '.0')); + + foreach ($a_arr as $n => $val) { + if (array_key_exists($n, $b_arr)) { + // So far so good, both have values at this minor version level. Compare. + if ($val > $b_arr[$n]) + return 1; + elseif ($val < $b_arr[$n]) + return -1; + } else { + // a is greater, since b doesn't have any minor version here. + return 1; + } + } + if (count($b_arr) > count($a_arr)) { + // b is longer than a, so it must be greater. + return -1; + } else { + // Both a and b are of equal length and value. + return 0; + } +} +function pfs_version_compare($cur_time, $cur_text, $remote) { + // First try date compare + $v = version_compare_dates($cur_time, $b); + if ($v === FALSE) { + // If that fails, try to compare by string + // Before anything else, simply test if the strings are equal + if ($cur_text == $remote) + return 0; + list($cur_num, $cur_str) = explode('-', $cur_text); + list($rem_num, $rem_str) = explode('-', $remote); + + // First try to compare the numeric parts of the version string. + $v = version_compare_numeric($cur_num, $rem_num); + + // If the numeric parts are the same, compare the string parts. + if ($v == 0) + return version_compare_string($cur_str, $rem_str); + } + return $v; +} + ?> diff --git a/usr/local/www/system_firmware_check.php b/usr/local/www/system_firmware_check.php index 77c528c..8d342ae 100755 --- a/usr/local/www/system_firmware_check.php +++ b/usr/local/www/system_firmware_check.php @@ -119,33 +119,33 @@ if(isset($curcfg['alturl']['enable'])) else $updater_url = $g['update_url']; $needs_system_upgrade = false; +$static_text .= "Downloading new version information..."; download_file_with_progress_bar("{$updater_url}/version", "/tmp/{$g['product_name']}_version"); -$latest_version = str_replace("\n", "", @file_get_contents("/tmp/{$g['product_name']}_version")); -$static_text .= "done.\n"; -if(!$latest_version) { - $static_text .= "Unable to check for updates.\n"; +$remote_version = trim(@file_get_contents("/tmp/{$g['product_name']}_version")); +$static_text .= "done.\\n"; +if (!$remote_version) { + $static_text .= "Unable to check for updates.\\n"; if(isset($curcfg['alturl']['enable'])) - $static_text .= "Could not contact custom update server.\n"; + $static_text .= "Could not contact custom update server.\\n"; else - $static_text .= "Could not contact {$g['product_name']} update server {$updater_url}.\n"; + $static_text .= "Could not contact {$g['product_name']} update server {$updater_url}.\\n"; } else { - $static_text .= "Downloading current version information..."; + $static_text .= "Obtaining current version information..."; update_output_window($static_text); - $current_installed_pfsense_version = str_replace("\n", "", file_get_contents("/etc/version.buildtime")); - $current_installed_pfsense = strtotime($current_installed_pfsense_version); - $latest_build_version = strtotime($latest_version); - $static_text .= "done\n"; + + $current_installed_buildtime = trim(file_get_contents("/etc/version.buildtime")); + $current_installed_version = trim(file_get_contents("/etc/version")); + + $static_text .= "done\\n"; update_output_window($static_text); - if(!$latest_build_version) { + + if (pfs_version_compare($current_installed_buildtime, $current_installed_version, $remote_version) == -1) { $needs_system_upgrade = true; } else { - if($current_installed_pfsense < $latest_build_version) { - $needs_system_upgrade = true; - } else { - $static_text .= "You are on the latest version.\n"; - } + $static_text .= "\\nYou are on the latest version.\\n"; } } + update_output_window($static_text); if ($needs_system_upgrade == false) { require("fend.inc"); @@ -154,9 +154,10 @@ if ($needs_system_upgrade == false) { echo "\n<script>$('invokeupgrade').style.visibility = 'visible';</script>"; $txt = "A new version is now available \\n\\n"; -$txt .= "Current version: {$current_installed_pfsense_version}\\n"; -$txt .= "New version: {$latest_version}\\n\\n"; -$txt .= "Update source: {$updater_url}\\n"; +$txt .= "Current version: {$current_installed_version}\\n"; +$txt .= " Built On: {$current_installed_buildtime}\\n"; +$txt .= " New version: {$remote_version}\\n\\n"; +$txt .= " Update source: {$updater_url}\\n"; update_output_window($txt); ?> </form> |