]> git.wh0rd.org Git - tt-rss.git/commitdiff
implement web-based self updater (closes #395)
authorAndrew Dolgov <fox@fakecake.org>
Thu, 23 Aug 2012 18:53:32 +0000 (22:53 +0400)
committerAndrew Dolgov <fox@fakecake.org>
Thu, 23 Aug 2012 18:56:04 +0000 (22:56 +0400)
classes/pref/prefs.php
include/update_self.php
js/prefs.js
tt-rss.css

index 5b472d5a9c2dea420f0173fd7138a588221571a8..576dd2f030940b17493dd3511a6ece6dca0fa615 100644 (file)
@@ -524,23 +524,28 @@ class Pref_Prefs extends Handler_Protected {
 
                print "<div class='error'>".__("Do not close this dialog until updating is finished. Backup your tt-rss directory before continuing.")."</div>";
 
-               print "<pre class='selfUpdateList' id='self_update_log'>";
-               print __("Ready to update.")."\n";
-               print "</pre>";
+               print "<ul class='selfUpdateList' id='self_update_log'>";
+               print "<li>" . __("Ready to update.") . "</li>";
+               print "</ul>";
 
                print "<div class='dlgButtons'>";
                print "<button id=\"self_update_start_btn\" dojoType=\"dijit.form.Button\" onclick=\"return dijit.byId('updateSelfDlg').start()\" >".
                        __("Start update")."</button>";
-               print "<button onclick=\"return dijit.byId('updateSelfDlg').close()\" dojoType=\"dijit.form.Button\">".
+               print "<button id=\"self_update_stop_btn\" onclick=\"return dijit.byId('updateSelfDlg').close()\" dojoType=\"dijit.form.Button\">".
                        __("Close this window")."</button>";
                print "</div>";
                print "</form>";
        }
 
        function performUpdate() {
+               $step = (int) $_REQUEST["step"];
+               $params = json_decode($_REQUEST["params"], true);
+               $force = (bool) $_REQUEST["force"];
+
                if (($_SESSION["access_level"] >= 10 || SINGLE_USER_MODE) && CHECK_FOR_NEW_VERSION) {
                        include "update_self.php";
-                       update_self($this->link, true);
+
+                       print   json_encode(update_self_step($this->link, $step, $params, $force));
                }
        }
 
index c71081115589e6b7d077e9072286d9af0087993e..1a4b0a34409938f23bb3b0247adfe3571c8feefd 100644 (file)
 <?php
-       function update_self($link, $force = false) {
+       function update_self_step($link, $step, $params, $force = false) {
                // __FILE__ is in include/ so we need to go one level up
                $work_dir = dirname(dirname(__FILE__));
                $parent_dir = dirname($work_dir);
 
-               if (!is_writable($work_dir) && !is_writable("$parent_dir")) {
-                       _debug("Both current and parent directories should be writable as current user.");
-                       exit;
+               if (!chdir($work_dir)) {
+                       array_push($log, "Unable to change to work directory: $work_dir");
+                       $stop = true; break;
                }
 
-               if (!file_exists("$work_dir/config.php") || !file_exists("$work_dir/include/sanity_check.php")) {
-                       _debug("Work directory $work_dir doesn't look like tt-rss installation.");
-                       exit;
-               }
+               $stop = false;
+               $log = array();
+               if (!is_array($params)) $params = array();
 
-               if (!is_writable(sys_get_temp_dir())) {
-                       _debug("System temporary directory should be writable as current user.");
-                       exit;
-               }
+               switch ($step) {
+               case 0:
 
-               _debug("Checking for tar...");
+                       if (!is_writable($work_dir) && !is_writable("$parent_dir")) {
+                               array_push($log, "Both current and parent directories should be writable as current user.");
+                               $stop = true; break;
+                       }
 
-               $system_rc = 0;
-               system("tar --version >/dev/null", $system_rc);
+                       if (!file_exists("$work_dir/config.php") || !file_exists("$work_dir/include/sanity_check.php")) {
+                               array_push($log, "Work directory $work_dir doesn't look like tt-rss installation.");
+                               $stop = true; break;
+                       }
 
-               if ($system_rc != 0) {
-                       _debug("Could not run tar executable (RC=$system_rc).");
-                       exit;
-               }
+                       if (!is_writable(sys_get_temp_dir())) {
+                               array_push($log, "System temporary directory should be writable as current user.");
+                               $stop = true; break;
+                       }
 
-               _debug("Checking for latest version...");
+                       array_push($log, "Checking for tar...");
 
-               $version_info = json_decode(fetch_file_contents("http://tt-rss.org/version.php"),
-                       true);
+                       $system_rc = 0;
+                       system("tar --version >/dev/null", $system_rc);
 
-               if (!is_array($version_info)) {
-                       _debug("Unable to fetch version information.");
-                       exit;
-               }
+                       if ($system_rc != 0) {
+                               array_push($log, "Could not run tar executable (RC=$system_rc).");
+                               $stop = true; break;
+                       }
 
-               $target_version = $version_info["version"];
-               $target_dir = "$parent_dir/tt-rss-$target_version";
+                       array_push($log, "Checking for latest version...");
 
-               _debug("Target version: $target_version");
+                       $version_info = json_decode(fetch_file_contents("http://tt-rss.org/version.php"),
+                               true);
 
-               if (version_compare(VERSION, $target_version) != -1 && !$force) {
-                       _debug("Your Tiny Tiny RSS installation is up to date.");
-                       exit;
-               }
-               if (file_exists($target_dir)) {
-                       _debug("Target directory $target_dir already exists.");
-                       exit;
-               }
+                       if (!is_array($version_info)) {
+                               array_push($log, "Unable to fetch version information.");
+                               $stop = true; break;
+                       }
 
-               _debug("Downloading checksums...");
-               $md5sum_data = fetch_file_contents("http://tt-rss.org/download/md5sum.txt");
+                       $target_version = $version_info["version"];
+                       $target_dir = "$parent_dir/tt-rss-$target_version";
 
-               if (!$md5sum_data) {
-                       _debug("Could not download checksums.");
-                       exit;
-               }
+                       array_push($log, "Target version: $target_version");
+                       $params["target_version"] = $target_version;
 
-               $md5sum_data = explode("\n", $md5sum_data);
+                       if (version_compare(VERSION, $target_version) != -1 && !$force) {
+                               array_push($log, "Your Tiny Tiny RSS installation is up to date.");
+                               $stop = true; break;
+                       }
 
-               $tarball_url = "http://tt-rss.org/download/tt-rss-$target_version.tar.gz";
-               $data = fetch_file_contents($tarball_url);
+                       if (file_exists($target_dir)) {
+                               array_push($log, "Target directory $target_dir already exists.");
+                               $stop = true; break;
+                       }
 
-               if (!$data) {
-                       _debug("Could not download distribution tarball ($tarball_url).");
-                       exit;
-               }
+                       break;
+               case 1:
+                       $target_version = $params["target_version"];
+
+                       array_push($log, "Downloading checksums...");
+                       $md5sum_data = fetch_file_contents("http://tt-rss.org/download/md5sum.txt");
 
-               _debug("Verifying tarball checksum...");
+                       if (!$md5sum_data) {
+                               array_push($log, "Could not download checksums.");
+                               $stop = true; break;
+                       }
 
-               $target_md5sum = false;
+                       $md5sum_data = explode("\n", $md5sum_data);
 
-               foreach ($md5sum_data as $line) {
-                       $pair = explode("  ", $line);
+                       foreach ($md5sum_data as $line) {
+                               $pair = explode("  ", $line);
 
-                       if ($pair[1] == "tt-rss-$target_version.tar.gz") {
-                               $target_md5sum = $pair[0];
-                               break;
+                               if ($pair[1] == "tt-rss-$target_version.tar.gz") {
+                                       $target_md5sum = $pair[0];
+                                       break;
+                               }
                        }
-               }
 
-               if (!$target_md5sum) {
-                       _debug("Unable to locate checksum for target version.");
-                       exit;
-               }
+                       if (!$target_md5sum) {
+                               array_push($log, "Unable to locate checksum for target version.");
+                               $stop = true; break;
+                       }
 
-               $test_md5sum = md5($data);
+                       $params["target_md5sum"] = $target_md5sum;
 
-               if ($test_md5sum != $target_md5sum) {
-                       _debug("Downloaded checksum doesn't match (got $test_md5sum, expected $target_md5sum).");
-                       exit;
-               }
+                       break;
+               case 2:
+                       $target_version = $params["target_version"];
+                       $target_md5sum = $params["target_md5sum"];
 
-               $tmp_file = tempnam(sys_get_temp_dir(), 'tt-rss');
-               _debug("Saving download to $tmp_file");
+                       array_push($log, "Downloading distribution tarball...");
 
-               if (!file_put_contents($tmp_file, $data)) {
-                       _debug("Unable to save download.");
-                       exit;
-               }
+                       $tarball_url = "http://tt-rss.org/download/tt-rss-$target_version.tar.gz";
+                       $data = fetch_file_contents($tarball_url);
 
-               if (!chdir($parent_dir)) {
-                       _debug("Unable to change into parent directory.");
-                       exit;
-               }
+                       if (!$data) {
+                               array_push($log, "Could not download distribution tarball ($tarball_url).");
+                               $stop = true; break;
+                       }
 
-               $old_dir = tmpdirname($parent_dir, "tt-rss-old");
+                       array_push($log, "Verifying tarball checksum...");
 
-               _debug("Renaming tt-rss directory to ".basename($old_dir));
-               if (!rename($work_dir, $old_dir)) {
-                       _debug("Unable to rename tt-rss directory.");
-                       exit;
-               }
+                       $test_md5sum = md5($data);
 
-               _debug("Extracting tarball...");
-               system("tar zxf $tmp_file", $system_rc);
+                       if ($test_md5sum != $target_md5sum) {
+                               array_push($log, "Downloaded checksum doesn't match (got $test_md5sum, expected $target_md5sum).");
+                               $stop = true; break;
+                       }
 
-               if ($system_rc != 0) {
-                       _debug("Error while extracting tarball (RC=$system_rc).");
-                       exit;
-               }
+                       $tmp_file = tempnam(sys_get_temp_dir(), 'tt-rss');
+                       array_push($log, "Saving download to $tmp_file");
 
-               _debug("Renaming target directory...");
-               if (!rename($target_dir, $work_dir)) {
-                       _debug("Unable to rename target directory.");
-                       exit;
-               }
+                       if (!file_put_contents($tmp_file, $data)) {
+                               array_push($log, "Unable to save download.");
+                               $stop = true; break;
+                       }
 
-               chdir($work_dir);
+                       $params["tmp_file"] = $tmp_file;
 
-               _debug("Copying config.php...");
-               if (!copy("$old_dir/config.php", "$work_dir/config.php")) {
-                       _debug("Unable to copy config.php to $work_dir.");
-                       exit;
-               }
+                       break;
+               case 3:
+                       $tmp_file = $params["tmp_file"];
+                       $target_version = $params["target_version"];
+
+                       if (!chdir($parent_dir)) {
+                               array_push($log, "Unable to change into parent directory.");
+                               $stop = true; break;
+                       }
 
-               _debug("Cleaning up...");
-               unlink($tmp_file);
+                       $old_dir = tmpdirname($parent_dir, "tt-rss-old");
 
-               _debug("Fixing permissions...");
+                       array_push($log, "Renaming tt-rss directory to ".basename($old_dir));
+                       if (!rename($work_dir, $old_dir)) {
+                               array_push($log, "Unable to rename tt-rss directory.");
+                               $stop = true; break;
+                       }
+
+                       array_push($log, "Extracting tarball...");
+                       system("tar zxf $tmp_file", $system_rc);
+
+                       if ($system_rc != 0) {
+                               array_push($log, "Error while extracting tarball (RC=$system_rc).");
+                               $stop = true; break;
+                       }
+
+                       $target_dir = "$parent_dir/tt-rss-$target_version";
+
+                       array_push($log, "Renaming target directory...");
+                       if (!rename($target_dir, $work_dir)) {
+                               array_push($log, "Unable to rename target directory.");
+                               $stop = true; break;
+                       }
+
+                       if (!chdir($work_dir)) {
+                               array_push($log, "Unable to change to work directory: $work_dir");
+                               $stop = true; break;
+                       }
+
+                       array_push($log, "Copying config.php...");
+                       if (!copy("$old_dir/config.php", "$work_dir/config.php")) {
+                               array_push($log, "Unable to copy config.php to $work_dir.");
+                               $stop = true; break;
+                       }
 
-               $directories = array(
-                       CACHE_DIR,
-                       CACHE_DIR . "/htmlpurifier",
-                       CACHE_DIR . "/export",
-                       CACHE_DIR . "/images",
-                       CACHE_DIR . "/magpie",
-                       CACHE_DIR . "/simplepie",
-                       ICONS_DIR,
-                       LOCK_DIRECTORY);
+                       array_push($log, "Cleaning up...");
+                       unlink($tmp_file);
 
-               foreach ($directories as $dir) {
-                       _debug("-> $dir");
-                       chmod($dir, 0777);
+                       array_push($log, "Fixing permissions...");
+
+                       $directories = array(
+                               CACHE_DIR,
+                               CACHE_DIR . "/htmlpurifier",
+                               CACHE_DIR . "/export",
+                               CACHE_DIR . "/images",
+                               CACHE_DIR . "/magpie",
+                               CACHE_DIR . "/simplepie",
+                               ICONS_DIR,
+                               LOCK_DIRECTORY);
+
+                       foreach ($directories as $dir) {
+                               array_push($log, "-> $dir");
+                               chmod($dir, 0777);
+                       }
+
+                       array_push($log, "Upgrade completed.");
+                       array_push($log, "Your old tt-rss directory is saved at $old_dir. ".
+                               "Please migrate locally modified files (if any) and remove it.");
+                       array_push($log, "You might need to re-enter current directory in shell to see new files.");
+
+                       $stop = true;
+                       break;
+               default:
+                       $stop = true;
                }
 
-               _debug("Upgrade completed.");
-               _debug("Your old tt-rss directory is saved at $old_dir. ".
-                       "Please migrate locally modified files (if any) and remove it.");
-               _debug("You might need to re-enter current directory in shell to see new files.");
+               return array("step" => $step, "stop" => $stop, "params" => $params, "log" => $log);
+       }
+
+
+       function update_self($link, $force = false) {
+               $step = 0;
+               $stop = false;
+               $params = array();
+
+               while (!$stop) {
+                       $rc = update_self_step($link, $step, $params, $force);
+
+                       $params = $rc['params'];
+                       $stop = $rc['stop'];
+
+                       foreach ($rc['log'] as $line) {
+                               _debug($line);
+                       }
+                       ++$step;
+               }
        }
 ?>
index 10e33f701b2a1fe6a9c5c306bcd85c7aae3cde49..f0ed5ac030b5a9b42331309d5c367459bb1a6492 100644 (file)
@@ -2142,15 +2142,37 @@ function updateSelf() {
                        title: __("Update Tiny Tiny RSS"),
                        style: "width: 600px",
                        closable: false,
-                       performUpdate: function() {
+                       performUpdate: function(step) {
                                dijit.byId("self_update_start_btn").attr("disabled", true);
+                               dijit.byId("self_update_stop_btn").attr("disabled", true);
+
                                notify_progress("Loading, please wait...", true);
                                new Ajax.Request("backend.php", {
-                               parameters: "?op=pref-prefs&method=performUpdate",
+                               parameters: "?op=pref-prefs&method=performUpdate&step=" + step +
+                                       "&params=" + param_escape(JSON.stringify(dialog.attr("update-params"))),
                                onComplete: function(transport) {
                                        try {
-                                               notify('');
-                                               $("self_update_log").innerHTML = transport.responseText;
+                                               rv = JSON.parse(transport.responseText);
+                                               if (rv) {
+                                                       notify('');
+
+                                                       rv['log'].each(function(line) {
+                                                               $("self_update_log").innerHTML += "<li>" + line + "</li>";
+                                                       });
+
+                                                       dialog.attr("update-params", rv['params']);
+
+                                                       if (!rv['stop']) {
+                                                               window.setTimeout("dijit.byId('updateSelfDlg').performUpdate("+(step+1)+")", 500);
+                                                       } else {
+                                                               dijit.byId("self_update_stop_btn").attr("disabled", false);
+                                                       }
+
+                                               } else {
+                                                       console.log(transport.responseText);
+                                                       notify_error("Received invalid data from server.");
+                                               }
+
                                                dialog.attr("updated", true);
                                        } catch (e) {
                                                exception_error("updateSelf/inner", e);
@@ -2166,7 +2188,7 @@ function updateSelf() {
                        },
                        start: function() {
                                if (prompt(__("Live updating is considered experimental. Backup your tt-rss directory before continuing. Please type 'yes' to continue.")) == 'yes') {
-                                       dialog.performUpdate();
+                                       dialog.performUpdate(0);
                                }
                        },
                        href: query});
index abc6050bf329d9eda174965f0c3723b759ef623b..421e6f153a2fde033f0e97acdf77ad65fd81398b 100644 (file)
@@ -678,9 +678,8 @@ ul.feedErrorsList {
        padding : 5px;
 }
 
-pre.selfUpdateList {
+ul.selfUpdateList {
        height : 200px;
-       font-size : 10px;
        overflow : auto;
        list-style-type : none;
        border : 1px solid #c0c0c0;