]>
git.wh0rd.org - tt-rss.git/blob - plugins/updater/init.php
2 class Updater
extends Plugin
{
8 "Updates tt-rss installation to latest version." ,
13 function init ( $host ) {
16 $host -> add_hook ( $host :: HOOK_PREFS_TAB
, $this );
18 $host -> add_command ( "update-self" ,
19 "update tt-rss installation to latest version" ,
23 function update_self_step ( $step , $params , $force = false ) {
24 // __FILE__ is in plugins/updater so we need to go one level up
25 $work_dir = dirname ( dirname ( dirname ( __FILE__
)));
26 $parent_dir = dirname ( $work_dir );
27 // Set PATH to run "which"
28 putenv ( 'PATH=" $PATH :/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"' );
31 if (! is_array ( $params )) $params = array ();
35 if (! chdir ( $work_dir )) {
36 array_push ( $log , "Unable to change to work directory: $work_dir " );
43 array_push ( $log , "Work directory: $work_dir " );
45 if (! is_writable ( $work_dir ) ||
! is_writable ( " $parent_dir " )) {
46 $user = posix_getpwuid ( posix_geteuid ());
47 $user = $user [ "name" ];
48 array_push ( $log , "Both tt-rss and parent directories should be writable as current user ( $user )." );
52 if (! file_exists ( " $work_dir /config.php" ) ||
! file_exists ( " $work_dir /include/sanity_check.php" )) {
53 array_push ( $log , "Work directory $work_dir doesn't look like tt-rss installation." );
57 if (! is_writable ( sys_get_temp_dir ())) {
58 array_push ( $log , "System temporary directory should be writable as current user." );
63 putenv ( "PATH=" . getenv ( "PATH" ) . PATH_SEPARATOR
. "/bin" .
64 PATH_SEPARATOR
. "/usr/bin" );
66 array_push ( $log , "Checking for system() call..." );
68 $disabled = explode ( ',' , ini_get ( 'disable_functions' ));
69 foreach ( $disabled as $function ) {
70 if ( trim ( $function ) == 'system' ) {
71 array_push ( $log , "Can not execute commands with PHP's system() function." );
76 if ( $stop == true ) {
80 array_push ( $log , "Checking for tar..." );
83 system ( "which tar >/dev/null" , $system_rc );
85 if ( $system_rc != 0 ) {
86 array_push ( $log , "Could not run tar executable (RC= $system_rc )." );
90 array_push ( $log , "Checking for gunzip..." );
93 system ( "which gunzip >/dev/null" , $system_rc );
95 if ( $system_rc != 0 ) {
96 array_push ( $log , "Could not run gunzip executable (RC= $system_rc )." );
100 array_push ( $log , "Checking for latest version..." );
102 $version_info = json_decode ( fetch_file_contents ( "http://tt-rss.org/version.php" ),
105 if (! is_array ( $version_info )) {
106 array_push ( $log , "Unable to fetch version information." );
110 $target_version = $version_info [ "version" ];
111 $target_dir = " $parent_dir /Tiny-Tiny-RSS- $target_version " ;
113 array_push ( $log , "Target version: $target_version " );
114 $params [ "target_version" ] = $target_version ;
116 if ( version_compare ( VERSION
, $target_version ) != - 1 && ! $force ) {
117 array_push ( $log , "Your Tiny Tiny RSS installation is up to date." );
121 if ( file_exists ( $target_dir )) {
122 array_push ( $log , "Target directory $target_dir already exists." );
128 $target_version = $params [ "target_version" ];
130 /* array_push($log, "Downloading checksums...");
131 $md5sum_data = fetch_file_contents("http://tt-rss.org/download/md5sum.txt");
134 array_push($log, "Could not download checksums.");
138 $md5sum_data = explode("\n", $md5sum_data);
140 foreach ($md5sum_data as $line) {
141 $pair = explode(" ", $line);
143 if ($pair[1] == "tt-rss-$target_version.tar.gz") {
144 $target_md5sum = $pair[0];
149 if (!$target_md5sum) {
150 array_push($log, "Unable to locate checksum for target version.");
154 $params["target_md5sum"] = $target_md5sum; */
156 array_push ( $log , "Proceeding to download..." );
160 $target_version = $params [ "target_version" ];
161 // $target_md5sum = $params["target_md5sum"];
163 array_push ( $log , "Downloading distribution tarball..." );
165 $tarball_url = "https://github.com/gothfox/Tiny-Tiny-RSS/archive/ $target_version .tar.gz" ;
166 $data = fetch_file_contents ( $tarball_url );
169 array_push ( $log , "Could not download distribution tarball ( $tarball_url )." );
173 /* array_push($log, "Verifying tarball checksum...");
175 $test_md5sum = md5($data);
177 if ($test_md5sum != $target_md5sum) {
178 array_push($log, "Downloaded checksum doesn't match (got $test_md5sum, expected $target_md5sum).");
182 $tmp_file = tempnam ( sys_get_temp_dir (), 'tt-rss' );
183 array_push ( $log , "Saving download to $tmp_file " );
185 if (! file_put_contents ( $tmp_file , $data )) {
186 array_push ( $log , "Unable to save download." );
190 $params [ "tmp_file" ] = $tmp_file ;
194 $tmp_file = $params [ "tmp_file" ];
195 $target_version = $params [ "target_version" ];
197 if (! chdir ( $parent_dir )) {
198 array_push ( $log , "Unable to change into parent directory." );
202 array_push ( $log , "Extracting tarball..." );
203 system ( "tar zxf $tmp_file " , $system_rc );
205 if ( $system_rc != 0 ) {
206 array_push ( $log , "Error while extracting tarball (RC= $system_rc )." );
210 $target_dir = " $parent_dir /Tiny-Tiny-RSS- $target_version " ;
212 if (! is_dir ( $target_dir )) {
213 array_push ( $log , "Target directory ( $target_dir ) not found." );
217 $old_dir = tmpdirname ( $parent_dir , "tt-rss-old" );
219 array_push ( $log , "Renaming tt-rss directory to " . basename ( $old_dir ));
220 if (! rename ( $work_dir , $old_dir )) {
221 array_push ( $log , "Unable to rename tt-rss directory." );
225 array_push ( $log , "Renaming target directory..." );
226 if (! rename ( $target_dir , $work_dir )) {
227 array_push ( $log , "Unable to rename target directory." );
231 if (! chdir ( $work_dir )) {
232 array_push ( $log , "Unable to change to work directory: $work_dir " );
236 array_push ( $log , "Copying config.php..." );
237 if (! copy ( " $old_dir /config.php" , " $work_dir /config.php" )) {
238 array_push ( $log , "Unable to copy config.php to $work_dir ." );
242 array_push ( $log , "Cleaning up..." );
245 array_push ( $log , "Fixing permissions..." );
247 $directories = array (
249 CACHE_DIR
. "/export" ,
250 CACHE_DIR
. "/images" ,
252 CACHE_DIR
. "/simplepie" ,
253 CACHE_DIR
. "/upload" ,
257 foreach ( $directories as $dir ) {
258 array_push ( $log , "-> $dir " );
262 if ( ICONS_DIR
== "feed-icons" ) {
263 array_push ( $log , "Migrating feed icons..." );
265 $icons = glob ( " $old_dir /feed-icons/*.ico" );
268 foreach ( $icons as $icon ) {
269 $icon = basename ( $icon );
271 if ( copy ( " $old_dir /feed-icons/ $icon " , " $work_dir /feed-icons/ $icon " )) {
276 array_push ( $log , "Done; $icons_copied files copied" );
279 array_push ( $log , "Not migrating feed icons, ICONS_DIR modified." );
282 array_push ( $log , "Upgrade completed." );
283 array_push ( $log , "Your old tt-rss directory is saved at $old_dir . " .
284 "Please migrate locally modified files (if any) and remove it." );
285 array_push ( $log , "You might need to re-enter current directory in shell to see new files." );
294 return array ( "step" => $step , "stop" => $stop , "params" => $params , "log" => $log );
297 function update_self_cli ( $force = false ) {
303 $rc = $this -> update_self_step ( $step , $params , $force );
305 $params = $rc [ 'params' ];
308 foreach ( $rc [ 'log' ] as $line ) {
315 function update_self ( $args ) {
316 _debug ( "READ THE FOLLOWING BEFORE CONTINUING!" );
317 _debug ( "* It is suggested to backup your tt-rss directory first." );
318 _debug ( "* Your database will not be modified." );
319 _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." );
320 _debug ( "Type 'yes' to continue." );
322 $input = read_stdin ();
324 if ( $input != 'yes' && $input != 'force' )
327 $this -> update_self_cli ( $input == 'force' );
330 function get_prefs_js () {
331 return file_get_contents ( dirname ( __FILE__
) . "/updater.js" );
334 function hook_prefs_tab ( $args ) {
335 if ( $args != "prefPrefs" ) return ;
337 if (( $_SESSION [ "access_level" ] >= 10 || SINGLE_USER_MODE
) && CHECK_FOR_NEW_VERSION
) {
338 print "<div dojoType= \" dijit.layout.AccordionPane \" title= \" " . __ ( 'Update Tiny Tiny RSS' ). " \" >" ;
340 if ( $_SESSION [ "pref_last_version_check" ] +
86400 +
rand (- 1000 , 1000 ) < time ()) {
341 $_SESSION [ "version_data" ] = @check_for_update
();
342 $_SESSION [ "pref_last_version_check" ] = time ();
345 if ( is_array ( $_SESSION [ "version_data" ])) {
346 $version = $_SESSION [ "version_data" ][ "version" ];
347 $version_id = $_SESSION [ "version_data" ][ "version_id" ];
348 print_notice ( T_sprintf ( "New version of Tiny Tiny RSS is available ( %s )." , "<b> $version </b>" ));
350 $details = "http://tt-rss.org/redmine/versions/ $version_id " ;
352 print "<p><button onclick= \" window.open(' $details ') \" dojoType= \" dijit.form.Button \" >" . __ ( "See the release notes" ). "</button>" ;
354 print " <button dojoType= \" dijit.form.Button \" onclick= \" return updateSelf() \" >" .
355 __ ( 'Update Tiny Tiny RSS' ). "</button></p>" ;
358 print_notice ( __ ( "Your Tiny Tiny RSS installation is up to date." ));
360 print "<br/> <button dojoType= \" dijit.form.Button \" onclick= \" return updateSelf() \" >" .
361 __ ( 'Force update' ). "</button></p>" ;
365 print "</div>" ; #pane
369 function updateSelf () {
370 print_warning ( __ ( "Do not close this dialog until updating is finished." ));
372 print "<form style='display : block' name='self_update_form' id='self_update_form'>" ;
374 print "<style type='text/css'>
375 li.notice { font-style : italic; color : red; }
378 print "<ul class='selfUpdateList' id='self_update_log'>" ;
379 print "<li class='notice'>" . __ ( "It is suggested to backup your tt-rss directory first." ) . "</li>" ;
380 print "<li class='notice'>" . __ ( "Your database will not be modified." ) . "</li>" ;
381 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>" ;
382 print "<li>" . __ ( "Ready to update." ) . "</li>" ;
385 print "<div class='dlgButtons'>" ;
386 print "<button id= \" self_update_start_btn \" dojoType= \" dijit.form.Button \" onclick= \" return dijit.byId('updateSelfDlg').start() \" >" .
387 __ ( "Start update" ). "</button>" ;
388 print "<button id= \" self_update_stop_btn \" onclick= \" return dijit.byId('updateSelfDlg').close() \" dojoType= \" dijit.form.Button \" >" .
389 __ ( "Close this window" ). "</button>" ;
394 function performUpdate () {
395 $step = ( int ) $_REQUEST [ "step" ];
396 $params = json_decode ( $_REQUEST [ "params" ], true );
397 $force = ( bool ) $_REQUEST [ "force" ];
399 if (( $_SESSION [ "access_level" ] >= 10 || SINGLE_USER_MODE
) && CHECK_FOR_NEW_VERSION
) {
400 print json_encode ( $this -> update_self_step ( $step , $params , $force ));
404 function api_version () {