]>
git.wh0rd.org - tt-rss.git/blob - plugins/updater/init.php
856a0cbf9a7977e42744e437535d07b398829b21
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 );
29 if (! is_array ( $params )) $params = array ();
33 if (! chdir ( $work_dir )) {
34 array_push ( $log , "Unable to change to work directory: $work_dir " );
41 array_push ( $log , "Work directory: $work_dir " );
43 if (! is_writable ( $work_dir ) ||
! is_writable ( " $parent_dir " )) {
44 $user = posix_getpwuid ( posix_geteuid ());
45 $user = $user [ "name" ];
46 array_push ( $log , "Both tt-rss and parent directories should be writable as current user ( $user )." );
50 if (! file_exists ( " $work_dir /config.php" ) ||
! file_exists ( " $work_dir /include/sanity_check.php" )) {
51 array_push ( $log , "Work directory $work_dir doesn't look like tt-rss installation." );
55 if (! is_writable ( sys_get_temp_dir ())) {
56 array_push ( $log , "System temporary directory should be writable as current user." );
61 putenv ( "PATH=" . getenv ( "PATH" ) . PATH_SEPARATOR
. "/bin" .
62 PATH_SEPARATOR
. "/usr/bin" );
64 array_push ( $log , "Checking for tar..." );
67 system ( "which tar >/dev/null" , $system_rc );
69 if ( $system_rc != 0 ) {
70 array_push ( $log , "Could not run tar executable (RC= $system_rc )." );
74 array_push ( $log , "Checking for gunzip..." );
77 system ( "which gunzip >/dev/null" , $system_rc );
79 if ( $system_rc != 0 ) {
80 array_push ( $log , "Could not run gunzip executable (RC= $system_rc )." );
84 array_push ( $log , "Checking for latest version..." );
86 $version_info = json_decode ( fetch_file_contents ( "http://tt-rss.org/version.php" ),
89 if (! is_array ( $version_info )) {
90 array_push ( $log , "Unable to fetch version information." );
94 $target_version = $version_info [ "version" ];
95 $target_dir = " $parent_dir /Tiny-Tiny-RSS- $target_version " ;
97 array_push ( $log , "Target version: $target_version " );
98 $params [ "target_version" ] = $target_version ;
100 if ( version_compare ( VERSION
, $target_version ) != - 1 && ! $force ) {
101 array_push ( $log , "Your Tiny Tiny RSS installation is up to date." );
105 if ( file_exists ( $target_dir )) {
106 array_push ( $log , "Target directory $target_dir already exists." );
112 $target_version = $params [ "target_version" ];
114 /* array_push($log, "Downloading checksums...");
115 $md5sum_data = fetch_file_contents("http://tt-rss.org/download/md5sum.txt");
118 array_push($log, "Could not download checksums.");
122 $md5sum_data = explode("\n", $md5sum_data);
124 foreach ($md5sum_data as $line) {
125 $pair = explode(" ", $line);
127 if ($pair[1] == "tt-rss-$target_version.tar.gz") {
128 $target_md5sum = $pair[0];
133 if (!$target_md5sum) {
134 array_push($log, "Unable to locate checksum for target version.");
138 $params["target_md5sum"] = $target_md5sum; */
140 array_push ( $log , "Proceeding to download..." );
144 $target_version = $params [ "target_version" ];
145 // $target_md5sum = $params["target_md5sum"];
147 array_push ( $log , "Downloading distribution tarball..." );
149 $tarball_url = "https://github.com/gothfox/Tiny-Tiny-RSS/archive/ $target_version .tar.gz" ;
150 $data = fetch_file_contents ( $tarball_url );
153 array_push ( $log , "Could not download distribution tarball ( $tarball_url )." );
157 /* array_push($log, "Verifying tarball checksum...");
159 $test_md5sum = md5($data);
161 if ($test_md5sum != $target_md5sum) {
162 array_push($log, "Downloaded checksum doesn't match (got $test_md5sum, expected $target_md5sum).");
166 $tmp_file = tempnam ( sys_get_temp_dir (), 'tt-rss' );
167 array_push ( $log , "Saving download to $tmp_file " );
169 if (! file_put_contents ( $tmp_file , $data )) {
170 array_push ( $log , "Unable to save download." );
174 $params [ "tmp_file" ] = $tmp_file ;
178 $tmp_file = $params [ "tmp_file" ];
179 $target_version = $params [ "target_version" ];
181 if (! chdir ( $parent_dir )) {
182 array_push ( $log , "Unable to change into parent directory." );
186 array_push ( $log , "Extracting tarball..." );
187 system ( "tar zxf $tmp_file " , $system_rc );
189 if ( $system_rc != 0 ) {
190 array_push ( $log , "Error while extracting tarball (RC= $system_rc )." );
194 $target_dir = " $parent_dir /Tiny-Tiny-RSS- $target_version " ;
196 if (! is_dir ( $target_dir )) {
197 array_push ( $log , "Target directory ( $target_dir ) not found." );
201 $old_dir = tmpdirname ( $parent_dir , "tt-rss-old" );
203 array_push ( $log , "Renaming tt-rss directory to " . basename ( $old_dir ));
204 if (! rename ( $work_dir , $old_dir )) {
205 array_push ( $log , "Unable to rename tt-rss directory." );
209 array_push ( $log , "Renaming target directory..." );
210 if (! rename ( $target_dir , $work_dir )) {
211 array_push ( $log , "Unable to rename target directory." );
215 if (! chdir ( $work_dir )) {
216 array_push ( $log , "Unable to change to work directory: $work_dir " );
220 array_push ( $log , "Copying config.php..." );
221 if (! copy ( " $old_dir /config.php" , " $work_dir /config.php" )) {
222 array_push ( $log , "Unable to copy config.php to $work_dir ." );
226 array_push ( $log , "Cleaning up..." );
229 array_push ( $log , "Fixing permissions..." );
231 $directories = array (
233 CACHE_DIR
. "/export" ,
234 CACHE_DIR
. "/images" ,
236 CACHE_DIR
. "/simplepie" ,
240 foreach ( $directories as $dir ) {
241 array_push ( $log , "-> $dir " );
245 if ( ICONS_DIR
== "feed-icons" ) {
246 array_push ( $log , "Migrating feed icons..." );
248 $icons = glob ( " $old_dir /feed-icons/*.ico" );
251 foreach ( $icons as $icon ) {
252 $icon = basename ( $icon );
254 if ( copy ( " $old_dir /feed-icons/ $icon " , " $work_dir /feed-icons/ $icon " )) {
259 array_push ( $log , "Done; $icons_copied files copied" );
262 array_push ( $log , "Not migrating feed icons, ICONS_DIR modified." );
265 array_push ( $log , "Upgrade completed." );
266 array_push ( $log , "Your old tt-rss directory is saved at $old_dir . " .
267 "Please migrate locally modified files (if any) and remove it." );
268 array_push ( $log , "You might need to re-enter current directory in shell to see new files." );
277 return array ( "step" => $step , "stop" => $stop , "params" => $params , "log" => $log );
280 function update_self_cli ( $force = false ) {
286 $rc = $this -> update_self_step ( $step , $params , $force );
288 $params = $rc [ 'params' ];
291 foreach ( $rc [ 'log' ] as $line ) {
298 function update_self ( $args ) {
299 _debug ( "READ THE FOLLOWING BEFORE CONTINUING!" );
300 _debug ( "* It is suggested to backup your tt-rss directory first." );
301 _debug ( "* Your database will not be modified." );
302 _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." );
303 _debug ( "Type 'yes' to continue." );
305 $input = read_stdin ();
307 if ( $input != 'yes' && $input != 'force' )
310 $this -> update_self_cli ( $input == 'force' );
313 function get_prefs_js () {
314 return file_get_contents ( dirname ( __FILE__
) . "/updater.js" );
317 function hook_prefs_tab ( $args ) {
318 if ( $args != "prefPrefs" ) return ;
320 if (( $_SESSION [ "access_level" ] >= 10 || SINGLE_USER_MODE
) && CHECK_FOR_NEW_VERSION
) {
321 print "<div dojoType= \" dijit.layout.AccordionPane \" title= \" " . __ ( 'Update Tiny Tiny RSS' ). " \" >" ;
323 if ( $_SESSION [ "pref_last_version_check" ] +
86400 +
rand (- 1000 , 1000 ) < time ()) {
324 $_SESSION [ "version_data" ] = @check_for_update
();
325 $_SESSION [ "pref_last_version_check" ] = time ();
328 if ( is_array ( $_SESSION [ "version_data" ])) {
329 $version = $_SESSION [ "version_data" ][ "version" ];
330 $version_id = $_SESSION [ "version_data" ][ "version_id" ];
331 print_notice ( T_sprintf ( "New version of Tiny Tiny RSS is available ( %s )." , "<b> $version </b>" ));
333 $details = "http://tt-rss.org/redmine/versions/ $version_id " ;
335 print "<p><button onclick= \" window.open(' $details ') \" dojoType= \" dijit.form.Button \" >" . __ ( "See the release notes" ). "</button>" ;
337 print " <button dojoType= \" dijit.form.Button \" onclick= \" return updateSelf() \" >" .
338 __ ( 'Update Tiny Tiny RSS' ). "</button></p>" ;
341 print_notice ( __ ( "Your Tiny Tiny RSS installation is up to date." ));
344 print "</div>" ; #pane
348 function updateSelf () {
349 print_warning ( __ ( "Do not close this dialog until updating is finished." ));
351 print "<form style='display : block' name='self_update_form' id='self_update_form'>" ;
353 print "<style type='text/css'>
354 li.notice { font-style : italic; color : red; }
357 print "<ul class='selfUpdateList' id='self_update_log'>" ;
358 print "<li class='notice'>" . __ ( "It is suggested to backup your tt-rss directory first." ) . "</li>" ;
359 print "<li class='notice'>" . __ ( "Your database will not be modified." ) . "</li>" ;
360 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>" ;
361 print "<li>" . __ ( "Ready to update." ) . "</li>" ;
364 print "<div class='dlgButtons'>" ;
365 print "<button id= \" self_update_start_btn \" dojoType= \" dijit.form.Button \" onclick= \" return dijit.byId('updateSelfDlg').start() \" >" .
366 __ ( "Start update" ). "</button>" ;
367 print "<button id= \" self_update_stop_btn \" onclick= \" return dijit.byId('updateSelfDlg').close() \" dojoType= \" dijit.form.Button \" >" .
368 __ ( "Close this window" ). "</button>" ;
373 function performUpdate () {
374 $step = ( int ) $_REQUEST [ "step" ];
375 $params = json_decode ( $_REQUEST [ "params" ], true );
376 $force = ( bool ) $_REQUEST [ "force" ];
378 if (( $_SESSION [ "access_level" ] >= 10 || SINGLE_USER_MODE
) && CHECK_FOR_NEW_VERSION
) {
379 print json_encode ( $this -> update_self_step ( $step , $params , $force ));