Roundcube Community Forum

 

Upgrading from 1.2.3

Started by Monstr, March 22, 2017, 02:45:35 AM

Previous topic - Next topic

Monstr

Hi!

I execute the command:

# /tmp/roundcubemail-1.2.4/bin/installto.sh /var/www/roundcubemail-1.2.0


Outputs:

Upgrading from 1.2.3. Do you want to continue? (y/N)


I confirm:

y


Outputs:

Copying files to target location...Error 500: Failed to execute command: rsync -aC --out-format "%n" --delete /tmp/roundcubemail-1.2.4/program/* /var/www/roundcubemail-1.2.0/program/


What is the problem?

alec

Do you have rsync installed?

Monstr

Yes.

[root@mail roundcubemail-1.2.4]# rsync --version
rsync  version 3.0.9  protocol version 30
Copyright (C) 1996-2011 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace,
    append, ACLs, xattrs, iconv, symtimes

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.

alec

https://github.com/roundcube/roundcubemail/blob/master/bin/installto.sh#L60
What if you change this line of code to:

if (system($command, $ret) === false || $ret > 0) {

Monstr

Now issues:

/tmp/roundcubemail-1.2.4/bin/installto.sh /var/www/roundcubemail-1.2.0
Upgrading from 1.2.3. Do you want to continue? (y/N)
y
Copying files to target location...Error 500: Failed to execute command: rsync -a --out-format "%n" /tmp/roundcubemail-1.2.4/index.php /var/www/roundcubemail-1.2.0/index.php

alec

There's similar system() call a few lines below that need to be modified.

Monstr

#6
Made changes to the file and executed it:

[root@mail bin]# ./installto.sh /var/www/roundcubemail-1.2.0
Upgrading from 1.2.3. Do you want to continue? (y/N)
y
Copying files to target location...done.

Running update script at target...
All done.


I go into the browser, but the version is displayed old:

Roundcube Webmail 1.2.3


File installto.sh after change:


#!/usr/bin/env php
<?php
/*
 +-----------------------------------------------------------------------+
 | bin/installto.sh                                                      |
 |                                                                       |
 | This file is part of the Roundcube Webmail client                     |
 | Copyright (C) 2014-2016, The Roundcube Dev Team                       |
 |                                                                       |
 | Licensed under the GNU General Public License version 3 or            |
 | any later version with exceptions for skins & plugins.                |
 | See the README file for a full license statement.                     |
 |                                                                       |
 | PURPOSE:                                                              |
 |   Update an existing Roundcube installation with files from           |
 |   this version                                                        |
 +-----------------------------------------------------------------------+
 | Author: Thomas Bruederli <roundcube@gmail.com>                        |
 +-----------------------------------------------------------------------+
*/

define('INSTALL_PATH'realpath(__DIR__ '/..') . '/' );

require_once 
INSTALL_PATH 'program/include/clisetup.php';

$target_dir unslashify($_SERVER['argv'][1]);

if (empty(
$target_dir) || !is_dir(realpath($target_dir)))
  
rcube::raise_error("Invalid target: not a directory\nUsage: installto.sh <TARGET>"falsetrue);

// read version from iniset.php
$iniset = @file_get_contents($target_dir '/program/include/iniset.php');
if (!
preg_match('/define\(.RCMAIL_VERSION.,\s*.([0-9.]+[a-z-]*)/'$iniset$m))
  
rcube::raise_error("No valid Roundcube installation found at $target_dir"falsetrue);

$oldversion $m[1];

if (
version_compare(version_parse($oldversion), version_parse(RCMAIL_VERSION), '>='))
  
rcube::raise_error("Installation at target location is up-to-date!"falsetrue);

echo 
"Upgrading from $oldversion. Do you want to continue? (y/N)\n";
$input trim(fgets(STDIN));

if (
strtolower($input) == 'y') {
  echo 
"Copying files to target location...";

  
// Save a copy of original .htaccess file (#1490623)
  
if (file_exists("$target_dir/.htaccess")) {
    
$htaccess_copied copy("$target_dir/.htaccess""$target_dir/.htaccess.orig");
  }

  
$dirs = array('program','installer','bin','SQL','plugins','skins');
  if (
is_dir(INSTALL_PATH 'vendor') && !is_file(INSTALL_PATH 'composer.json')) {
    
$dirs[] = 'vendor';
  }
  foreach (
$dirs as $dir) {
    
// @FIXME: should we use --delete for all directories?
    
$delete  in_array($dir, array('program''installer')) ? '--delete ' '';
    
$command "rsync -aC --out-format \"%n\" " $delete INSTALL_PATH "$dir/* $target_dir/$dir/";
    
#if (!system($command, $ret) || $ret > 0) {
    
if (system($command$ret) === false || $ret 0) {
      
rcube::raise_error("Failed to execute command: $command"falsetrue);
    }
  }
  foreach (array(
'index.php','.htaccess','config/defaults.inc.php','composer.json-dist','CHANGELOG','README.md','UPGRADING','LICENSE','INSTALL') as $file) {
    
$command "rsync -a --out-format \"%n\" " INSTALL_PATH "$file $target_dir/$file";
    
#if (file_exists(INSTALL_PATH . $file) && (!system($command, $ret) || $ret > 0)) {
    
if (file_exists(INSTALL_PATH $file) && (system($command$ret) === false || $ret 0)) {
      
rcube::raise_error("Failed to execute command: $command"falsetrue);
    }
  }

  
// remove old (<1.0) .htaccess file
  
@unlink("$target_dir/program/.htaccess");
  echo 
"done.";

  
// Inform the user about .htaccess change
  
if (!empty($htaccess_copied)) {
    if (
file_get_contents("$target_dir/.htaccess") != file_get_contents("$target_dir/.htaccess.orig")) {
      echo 
"\n!! Old .htaccess file saved as .htaccess.orig !!";
    }
    else {
      @
unlink("$target_dir/.htaccess.orig");
    }
  }

  echo 
"\n\n";

  if (
is_dir("$target_dir/skins/default")) {
      echo 
"Removing old default skin...";
      
system("rm -rf $target_dir/skins/default $target_dir/plugins/jqueryui/themes/default");
      foreach (
glob(INSTALL_PATH "plugins/*/skins") as $plugin_skin_dir) {
          
$plugin_skin_dir preg_replace('!^.*' INSTALL_PATH '!'''$plugin_skin_dir);
          if (
is_dir("$target_dir/$plugin_skin_dir/classic"))
            
system("rm -rf $target_dir/$plugin_skin_dir/default");
      }
      echo 
"done.\n\n";
  }

  echo 
"Running update script at target...\n";
  
system("cd $target_dir && php bin/update.sh --version=$oldversion");
  echo 
"All done.\n";
}
else {
  echo 
"Update cancelled. See ya!\n";
}

?>




alec

So, maybe these rsync commands do not work at all. Do you run the script as root? Could you try executing one of the rsync commands and see what it returns?

Monstr

Yes, I run the file installto.sh as root.

Run command rsync from the file installto.sh ?


rsync -aC --out-format \"%n\" " . $delete . INSTALL_PATH . "$dir/* $target_dir/$dir/



What is mean ?:

\"%n\" " . $delete . INSTALL_PATH . "$dir/* $target_dir/$dir/

Monstr

Why ?:

--out-format \"%n\"


Maybe so right ?:

--out-format=%n

alec

Backslashes will be removed, it's PHP syntax, but you're right --out-format=%n should work as well. Does it work with this change?

Monstr


alec

That is a variable specifying rsync output format. Tells rsync to print (only) names of synced files.

Monstr

I know that this is a special variable. Вut why is nothing transferred to it?


Copying files to target location...Error 500: Failed to execute command: rsync -aC --out-format "%n" --delete /tmp/roundcubemail-1.2.4/program/* /var/www/roundcubemail-1.2.0/program/


--out-format "%n"
The error output shows that this variable is not assigned.


Why was it not used in previous versions?


foreach ($dirs as $dir) {
    // @FIXME: should we use --delete for all directories?
    $delete = in_array($dir, array('program', 'installer')) ? '--delete ' : '';
    if (!system("rsync -avC " . $delete . INSTALL_PATH . "$dir/* $target_dir/$dir/")) {
      $err = true;
      break;
    }
  }
  foreach (array('index.php','.htaccess','config/defaults.inc.php','composer.json-dist','CHANGELOG','README.md','UPGRADING','LICENSE','INSTALL') as $file) {
    if (!system("rsync -av " . INSTALL_PATH . "$file $target_dir/$file")) {
      $err = true;
      break;
    }
  }


alec

This is rsync format variable. It should not be resolved to anything. It should be as is. It's there to make the output more pretty.