mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-24 11:08:45 +02:00
N°1488 - restore failed on production-modules
SVN:2.4[5827]
This commit is contained in:
@@ -99,8 +99,10 @@ class DBRestore extends DBBackup
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $sFile A file with the extension .zip or .tar.gz
|
||||
* @param string $sFile A file with the extension .zip or .tar.gz
|
||||
* @param string $sEnvironment Target environment
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function RestoreFromCompressedBackup($sFile, $sEnvironment = 'production')
|
||||
{
|
||||
@@ -111,7 +113,7 @@ class DBRestore extends DBBackup
|
||||
{
|
||||
$this->LogInfo('zip file detected');
|
||||
$oArchive = new ZipArchiveEx();
|
||||
$res = $oArchive->open($sFile);
|
||||
$oArchive->open($sFile);
|
||||
}
|
||||
elseif (substr($sNormalizedFile, -7) == '.tar.gz')
|
||||
{
|
||||
@@ -125,21 +127,22 @@ class DBRestore extends DBBackup
|
||||
|
||||
// Load the database
|
||||
//
|
||||
$sDataDir = tempnam(SetupUtils::GetTmpDir(), 'itop-');
|
||||
unlink($sDataDir); // I need a directory, not a file...
|
||||
$sDataDir = APPROOT.'data/tmp-backup-'.rand(10000, getrandmax());
|
||||
|
||||
SetupUtils::builddir($sDataDir); // Here is the directory
|
||||
$oArchive->extractFileTo($sDataDir, 'itop-dump.sql');
|
||||
$oArchive->extractTo($sDataDir);
|
||||
|
||||
$sDataFile = $sDataDir.'/itop-dump.sql';
|
||||
$this->LoadDatabase($sDataFile);
|
||||
SetupUtils::rrmdir($sDataDir);
|
||||
|
||||
// Update the code
|
||||
//
|
||||
$sDeltaFile = APPROOT.'data/'.$sEnvironment.'.delta.xml';
|
||||
if ($oArchive->hasFile('delta.xml') !== false)
|
||||
|
||||
if (is_file($sDataDir.'/delta.xml'))
|
||||
{
|
||||
// Extract and rename delta.xml => <env>.delta.xml;
|
||||
file_put_contents($sDeltaFile, $oArchive->getFromName('delta.xml'));
|
||||
rename($sDataDir.'/delta.xml', $sDeltaFile);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -149,16 +152,18 @@ class DBRestore extends DBBackup
|
||||
{
|
||||
SetupUtils::rrmdir(APPROOT.'data/production-modules/');
|
||||
}
|
||||
if ($oArchive->hasDir('production-modules/') !== false)
|
||||
if (is_dir($sDataDir.'/production-modules'))
|
||||
{
|
||||
$oArchive->extractDirTo(APPROOT.'data/', 'production-modules/');
|
||||
rename($sDataDir.'/production-modules', APPROOT.'data/production-modules/');
|
||||
}
|
||||
|
||||
$sConfigFile = APPROOT.'conf/'.$sEnvironment.'/config-itop.php';
|
||||
@chmod($sConfigFile, 0770); // Allow overwriting the file
|
||||
$oArchive->extractFileTo(APPROOT.'conf/'.$sEnvironment, 'config-itop.php');
|
||||
rename($sDataDir.'/config-itop.php', $sConfigFile);
|
||||
@chmod($sConfigFile, 0444); // Read-only
|
||||
|
||||
SetupUtils::rrmdir($sDataDir);
|
||||
|
||||
$oEnvironment = new RunTimeEnvironment($sEnvironment);
|
||||
$oEnvironment->CompileFrom($sEnvironment);
|
||||
}
|
||||
|
||||
@@ -626,6 +626,17 @@ class TarGzArchive implements BackupArchive
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p_path
|
||||
* @param null $aEntries
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function extractTo($p_path = '', $aEntries = null)
|
||||
{
|
||||
return $this->oArchive->extract($p_path);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $sDestinationDir
|
||||
* @param string $sArchiveFile
|
||||
|
||||
@@ -588,13 +588,7 @@ class SetupUtils
|
||||
throw new Exception("Attempting to delete directory: '$dir'");
|
||||
}
|
||||
self::tidydir($dir);
|
||||
if (@rmdir($dir) === false)
|
||||
{
|
||||
// Magic trick for windows
|
||||
// sometimes the folder is empty but rmdir fails
|
||||
closedir(opendir($dir));
|
||||
@rmdir($dir);
|
||||
}
|
||||
self::rmdir_safe($dir);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -617,13 +611,7 @@ class SetupUtils
|
||||
if(is_dir($dir.'/'.$file))
|
||||
{
|
||||
self::tidydir($dir.'/'.$file);
|
||||
if (@rmdir($dir.'/'.$file) === false)
|
||||
{
|
||||
// Magic trick for windows
|
||||
// sometimes the folder is empty but rmdir fails
|
||||
closedir(opendir($dir.'/'.$file));
|
||||
@rmdir($dir.'/'.$file);
|
||||
}
|
||||
self::rmdir_safe($dir.'/'.$file);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -657,6 +645,24 @@ class SetupUtils
|
||||
}
|
||||
}
|
||||
|
||||
public static function rmdir_safe($dir)
|
||||
{
|
||||
// avoid unnecessary warning
|
||||
// Try 100 times...
|
||||
$i = 100;
|
||||
while ((@rmdir($dir) === false) && $i > 0)
|
||||
{
|
||||
// Magic trick for windows
|
||||
// sometimes the folder is empty but rmdir fails
|
||||
closedir(opendir($dir));
|
||||
$i--;
|
||||
}
|
||||
if ($i == 0)
|
||||
{
|
||||
rmdir($dir);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to copy a directory to a target directory, skipping .SVN files (for developer's comfort!)
|
||||
* Returns true if successfull
|
||||
@@ -768,14 +774,14 @@ class SetupUtils
|
||||
self::tidydir($sSource);
|
||||
if($bRemoveSource === true)
|
||||
{
|
||||
rmdir($sSource);
|
||||
self::rmdir_safe($sSource);
|
||||
}
|
||||
|
||||
/**
|
||||
* We have tried the following implementation (based on a rename/mv)
|
||||
* But this does not work on some OSes.
|
||||
* More info: https://bugs.php.net/bug.php?id=54097
|
||||
*
|
||||
* More info: https://bugs.php.net/bug.php?id=54097
|
||||
*
|
||||
$aFiles = scandir($sSource);
|
||||
if(sizeof($aFiles) > 0)
|
||||
{
|
||||
|
||||
@@ -1,21 +1,42 @@
|
||||
<?php
|
||||
// Copyright (c) 2010-2017 Combodo SARL
|
||||
//
|
||||
// This file is part of iTop.
|
||||
//
|
||||
// iTop is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// iTop is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with iTop. If not, see <http://www.gnu.org/licenses/>
|
||||
//
|
||||
/**
|
||||
* File::CSV
|
||||
*
|
||||
* PHP versions 4 and 5
|
||||
*
|
||||
* Copyright (c) 1997-2008,
|
||||
* Vincent Blavet <vincent@phpconcept.net>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* @category File_Formats
|
||||
* @package Archive_Tar
|
||||
* @author Vincent Blavet <vincent@phpconcept.net>
|
||||
* @author Combodo
|
||||
* @copyright 1997-2018 The Authors
|
||||
* @license http://www.opensource.org/licenses/bsd-license.php New BSD License
|
||||
* @version CVS: $Id$
|
||||
* @link http://pear.php.net/package/Archive_Tar
|
||||
*/
|
||||
|
||||
define('ARCHIVE_TAR_ATT_SEPARATOR', 90001);
|
||||
define('ARCHIVE_TAR_END_BLOCK', pack("a512", ''));
|
||||
@@ -1188,8 +1209,19 @@ class ArchiveTar
|
||||
return false;
|
||||
}
|
||||
|
||||
while (($v_buffer = fread($v_file, 512)) != '') {
|
||||
$v_binary_data = pack("a512", "$v_buffer");
|
||||
$iLen = 1024*1024;
|
||||
while (($v_buffer = fread($v_file, $iLen)) != '') {
|
||||
$iBufferLen = strlen("$v_buffer");
|
||||
if ($iBufferLen != $iLen)
|
||||
{
|
||||
$iPack = ((int)($iBufferLen / 512) + 1) * 512;
|
||||
$sPack = sprintf('a%d', $iPack);
|
||||
}
|
||||
else
|
||||
{
|
||||
$sPack = sprintf('a%d', $iLen);
|
||||
}
|
||||
$v_binary_data = pack($sPack, "$v_buffer");
|
||||
$this->_writeBlock($v_binary_data);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user