]> git.wh0rd.org - tt-rss.git/blobdiff - plugins/updater/init.php
Updater: check whether system() is useable.
[tt-rss.git] / plugins / updater / init.php
index 8a7c8a9ca8d31a240da2178c1e814383dbd48eb9..6ee018f74d766ec87285a36b69ee76ed8d9aa029 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 class Updater extends Plugin {
 
-       private $link;
        private $host;
 
        function about() {
@@ -12,7 +11,6 @@ class Updater extends Plugin {
        }
 
        function init($host) {
-               $this->link = $host->get_link();
                $this->host = $host;
 
                $host->add_hook($host::HOOK_PREFS_TAB, $this);
@@ -22,10 +20,12 @@ class Updater extends Plugin {
                        $this);
        }
 
-       function update_self_step($link, $step, $params, $force = false) {
+       function update_self_step($step, $params, $force = false) {
                // __FILE__ is in plugins/updater so we need to go one level up
                $work_dir = dirname(dirname(dirname(__FILE__)));
                $parent_dir = dirname($work_dir);
+               // Set PATH to run "which"
+               putenv('PATH="$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"');
 
                $log = array();
                if (!is_array($params)) $params = array();
@@ -42,7 +42,7 @@ class Updater extends Plugin {
                        case 0:
                                array_push($log, "Work directory: $work_dir");
 
-                               if (!is_writable($work_dir) && !is_writable("$parent_dir")) {
+                               if (!is_writable($work_dir) || !is_writable("$parent_dir")) {
                                        $user = posix_getpwuid(posix_geteuid());
                                        $user = $user["name"];
                                        array_push($log, "Both tt-rss and parent directories should be writable as current user ($user).");
@@ -59,6 +59,24 @@ class Updater extends Plugin {
                                        $stop = true; break;
                                }
 
+                               // bah, also humbug
+                               putenv("PATH=" . getenv("PATH") . PATH_SEPARATOR . "/bin" .
+                                       PATH_SEPARATOR . "/usr/bin");
+
+                                array_push($log, "Checking for system() call...");
+
+                                $disabled = explode(',', ini_get('disable_functions'));
+                                foreach ($disabled as $function) {
+                                        if ( trim($function) == 'system' ) {
+                                                array_push($log, "Can not execute commands with PHP's system() function.");
+                                                $stop = true;
+                                        }
+                                }
+
+                                if ( $stop == true ) {
+                                        break;
+                                }
+
                                array_push($log, "Checking for tar...");
 
                                $system_rc = 0;
@@ -232,6 +250,7 @@ class Updater extends Plugin {
                                        CACHE_DIR . "/images",
                                        CACHE_DIR . "/js",
                                        CACHE_DIR . "/simplepie",
+                                       CACHE_DIR . "/upload",
                                        ICONS_DIR,
                                        LOCK_DIRECTORY);
 
@@ -275,13 +294,13 @@ class Updater extends Plugin {
                return array("step" => $step, "stop" => $stop, "params" => $params, "log" => $log);
        }
 
-       function update_self_cli($link, $force = false) {
+       function update_self_cli($force = false) {
                $step = 0;
                $stop = false;
                $params = array();
 
                while (!$stop) {
-                       $rc = $this->update_self_step($link, $step, $params, $force);
+                       $rc = $this->update_self_step($step, $params, $force);
 
                        $params = $rc['params'];
                        $stop = $rc['stop'];
@@ -294,8 +313,10 @@ class Updater extends Plugin {
        }
 
        function update_self($args) {
-               _debug("Warning: self-updating is experimental. Use at your own risk.");
-               _debug("Please backup your tt-rss directory before continuing. Your database will not be modified.");
+               _debug("READ THE FOLLOWING BEFORE CONTINUING!");
+               _debug("* It is suggested to backup your tt-rss directory first.");
+               _debug("* Your database will not be modified.");
+               _debug("* Your current tt-rss installation directory will not be modified. It will be renamed and left in the parent directory. You will be able to migrate all your customized files after update finishes.");
                _debug("Type 'yes' to continue.");
 
                $input = read_stdin();
@@ -303,7 +324,7 @@ class Updater extends Plugin {
                if ($input != 'yes' && $input != 'force')
                        exit;
 
-               $this->update_self_cli($link, $input == 'force');
+               $this->update_self_cli($input == 'force');
        }
 
        function get_prefs_js() {
@@ -317,7 +338,7 @@ class Updater extends Plugin {
                        print "<div dojoType=\"dijit.layout.AccordionPane\" title=\"".__('Update Tiny Tiny RSS')."\">";
 
                        if ($_SESSION["pref_last_version_check"] + 86400 + rand(-1000, 1000) < time()) {
-                               $_SESSION["version_data"] = @check_for_update($this->link);
+                               $_SESSION["version_data"] = @check_for_update();
                                $_SESSION["pref_last_version_check"] = time();
                        }
 
@@ -335,6 +356,10 @@ class Updater extends Plugin {
 
                        } else {
                                print_notice(__("Your Tiny Tiny RSS installation is up to date."));
+
+                               print "<br/> <button dojoType=\"dijit.form.Button\" onclick=\"return updateSelf()\">".
+                                       __('Force update')."</button></p>";
+
                        }
 
                        print "</div>"; #pane
@@ -342,11 +367,18 @@ class Updater extends Plugin {
        }
 
        function updateSelf() {
+               print_warning(__("Do not close this dialog until updating is finished."));
+
                print "<form style='display : block' name='self_update_form' id='self_update_form'>";
 
-               print "<div class='error'>".__("Do not close this dialog until updating is finished. Backup your tt-rss directory before continuing.")."</div>";
+               print "<style type='text/css'>
+                       li.notice { font-style : italic; color : red; }
+               </style>";
 
                print "<ul class='selfUpdateList' id='self_update_log'>";
+               print "<li class='notice'>" .__("It is suggested to backup your tt-rss directory first.") . "</li>";
+               print "<li class='notice'>" . __("Your database will not be modified.") . "</li>";
+               print "<li class='notice'>" . __("Your current tt-rss installation directory will not be modified. It will be renamed and left in the parent directory. You will be able to migrate all your customized files after update finishes.") . "</li>";
                print "<li>" . __("Ready to update.") . "</li>";
                print "</ul>";
 
@@ -365,9 +397,13 @@ class Updater extends Plugin {
                $force = (bool) $_REQUEST["force"];
 
                if (($_SESSION["access_level"] >= 10 || SINGLE_USER_MODE) && CHECK_FOR_NEW_VERSION) {
-                       print   json_encode($this->update_self_step($this->link, $step, $params, $force));
+                       print   json_encode($this->update_self_step($step, $params, $force));
                }
        }
 
+       function api_version() {
+               return 2;
+       }
+
 }
 ?>