Lib_Mage - Version 1.7.0.0

Version Notes

1.7.0.0

Download this release

Release Info

Developer Magento Core Team
Extension Lib_Mage
Version 1.7.0.0
Comparing to
See all releases


Code changes from version 1.6.1.0 to 1.7.0.0

Files changed (37) hide show
  1. lib/Mage/Archive.php +5 -6
  2. lib/Mage/Archive/Abstract.php +8 -5
  3. lib/Mage/Archive/Bz.php +26 -16
  4. lib/Mage/Archive/Gz.php +26 -16
  5. lib/Mage/Archive/Helper/File.php +274 -0
  6. lib/Mage/Archive/Helper/File/Bz.php +92 -0
  7. lib/Mage/Archive/Helper/File/Gz.php +83 -0
  8. lib/Mage/Archive/Interface.php +2 -2
  9. lib/Mage/Archive/Tar.php +366 -50
  10. lib/Mage/Backup.php +59 -0
  11. lib/Mage/Backup/Abstract.php +318 -0
  12. lib/Mage/Backup/Archive/Tar.php +82 -0
  13. lib/Mage/Backup/Db.php +119 -0
  14. lib/Mage/Backup/Exception.php +36 -0
  15. lib/Mage/Backup/Exception/CantLoadSnapshot.php +36 -0
  16. lib/Mage/Backup/Exception/FtpConnectionFailed.php +36 -0
  17. lib/Mage/Backup/Exception/FtpValidationFailed.php +36 -0
  18. lib/Mage/Backup/Exception/NotEnoughFreeSpace.php +36 -0
  19. lib/Mage/Backup/Exception/NotEnoughPermissions.php +36 -0
  20. lib/Mage/Backup/Filesystem.php +284 -0
  21. lib/Mage/Backup/Filesystem/Helper.php +137 -0
  22. lib/Mage/Backup/Filesystem/Iterator/File.php +112 -0
  23. lib/Mage/Backup/Filesystem/Iterator/Filter.php +77 -0
  24. lib/Mage/Backup/Filesystem/Rollback/Abstract.php +57 -0
  25. lib/Mage/Backup/Filesystem/Rollback/Fs.php +78 -0
  26. lib/Mage/Backup/Filesystem/Rollback/Ftp.php +198 -0
  27. lib/Mage/Backup/Interface.php +88 -0
  28. lib/Mage/Backup/Media.php +99 -0
  29. lib/Mage/Backup/Nomedia.php +82 -0
  30. lib/Mage/Backup/Snapshot.php +140 -0
  31. lib/Mage/Connect/Ftp.php +2 -460
  32. lib/Mage/Connect/Packager.php +33 -29
  33. lib/Mage/Exception.php +3 -2
  34. lib/Mage/System/Args.php +4 -4
  35. lib/Mage/System/Dirs.php +1 -1
  36. lib/Mage/System/Ftp.php +509 -0
  37. package.xml +5 -5
lib/Mage/Archive.php CHANGED
@@ -20,7 +20,7 @@
20
*
21
* @category Mage
22
* @package Mage_Archive
23
- * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
@@ -143,7 +143,8 @@ class Mage_Archive
143
*
144
* @param string $source
145
* @param string $destination
146
- * @param boolean $tillTar
147
* @return string Path to file
148
*/
149
public function unpack($source, $destination='.', $tillTar=false, $clearInterm = true)
@@ -160,9 +161,7 @@ class Mage_Archive
160
$packed = rtrim($destination, DS) . DS . '~tmp-'. microtime(true) . $archivers[$i-1] . '.' . $archivers[$i-1];
161
}
162
$source = $this->_getArchiver($archivers[$i])->unpack($source, $packed);
163
-
164
- //var_dump($packed, $source);
165
-
166
if ($clearInterm && $interimSource && $i >= 0) {
167
unlink($interimSource);
168
}
@@ -218,5 +217,5 @@ class Mage_Archive
218
}
219
return false;
220
}
221
222
- }
20
*
21
* @category Mage
22
* @package Mage_Archive
23
+ * @copyright Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
143
*
144
* @param string $source
145
* @param string $destination
146
+ * @param bool $tillTar
147
+ * @param bool $clearInterm
148
* @return string Path to file
149
*/
150
public function unpack($source, $destination='.', $tillTar=false, $clearInterm = true)
161
$packed = rtrim($destination, DS) . DS . '~tmp-'. microtime(true) . $archivers[$i-1] . '.' . $archivers[$i-1];
162
}
163
$source = $this->_getArchiver($archivers[$i])->unpack($source, $packed);
164
+
165
if ($clearInterm && $interimSource && $i >= 0) {
166
unlink($interimSource);
167
}
217
}
218
return false;
219
}
220
+ }
221
lib/Mage/Archive/Abstract.php CHANGED
@@ -20,7 +20,7 @@
20
*
21
* @category Mage
22
* @package Mage_Archive
23
- * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
@@ -34,14 +34,16 @@
34
class Mage_Archive_Abstract
35
{
36
/**
37
- * Write data to file. If file can't be opened,
38
*
39
* @param string $destination
40
* @param string $data
41
* @return boolean
42
*/
43
protected function _writeFile($destination, $data)
44
{
45
if(false === file_put_contents($destination, $data)) {
46
throw new Mage_Exception("Can't write to file: " . $destination);
47
}
@@ -53,6 +55,7 @@ class Mage_Archive_Abstract
53
*
54
* @param string $source
55
* @return string
56
*/
57
protected function _readFile($source)
58
{
@@ -70,7 +73,8 @@ class Mage_Archive_Abstract
70
* Get file name from source (URI) without last extension.
71
*
72
* @param string $source
73
- * @return string
74
*/
75
public function getFilename($source, $withExtension=false)
76
{
@@ -80,5 +84,4 @@ class Mage_Archive_Abstract
80
}
81
return $file;
82
}
83
-
84
- }
20
*
21
* @category Mage
22
* @package Mage_Archive
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
34
class Mage_Archive_Abstract
35
{
36
/**
37
+ * Write data to file. If file can't be opened - throw exception
38
*
39
* @param string $destination
40
* @param string $data
41
* @return boolean
42
+ * @throws Mage_Exception
43
*/
44
protected function _writeFile($destination, $data)
45
{
46
+ $destination = trim($destination);
47
if(false === file_put_contents($destination, $data)) {
48
throw new Mage_Exception("Can't write to file: " . $destination);
49
}
55
*
56
* @param string $source
57
* @return string
58
+ * @throws Mage_Exception
59
*/
60
protected function _readFile($source)
61
{
73
* Get file name from source (URI) without last extension.
74
*
75
* @param string $source
76
+ * @param bool $withExtension
77
+ * @return mixed|string
78
*/
79
public function getFilename($source, $withExtension=false)
80
{
84
}
85
return $file;
86
}
87
+ }
lib/Mage/Archive/Bz.php CHANGED
@@ -20,7 +20,7 @@
20
*
21
* @category Mage
22
* @package Mage_Archive
23
- * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
@@ -43,9 +43,19 @@ class Mage_Archive_Bz extends Mage_Archive_Abstract implements Mage_Archive_Inte
43
*/
44
public function pack($source, $destination)
45
{
46
- $data = $this->_readFile($source);
47
- $bzData = bzcompress($data, 9);
48
- $this->_writeFile($destination, $bzData);
49
return $destination;
50
}
51
@@ -58,22 +68,22 @@ class Mage_Archive_Bz extends Mage_Archive_Abstract implements Mage_Archive_Inte
58
*/
59
public function unpack($source, $destination)
60
{
61
- $data = '';
62
- $bzPointer = bzopen($source, 'r' );
63
- if (empty($bzPointer)) {
64
- throw new Exception('Can\'t open BZ archive : ' . $source);
65
- }
66
- while (!feof($bzPointer)) {
67
- $data .= bzread($bzPointer, 131072);
68
- }
69
- bzclose($bzPointer);
70
if (is_dir($destination)) {
71
$file = $this->getFilename($source);
72
$destination = $destination . $file;
73
}
74
- echo $destination;
75
- $this->_writeFile($destination, $data);
76
return $destination;
77
}
78
79
- }
20
*
21
* @category Mage
22
* @package Mage_Archive
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
43
*/
44
public function pack($source, $destination)
45
{
46
+ $fileReader = new Mage_Archive_Helper_File($source);
47
+ $fileReader->open('r');
48
+
49
+ $archiveWriter = new Mage_Archive_Helper_File_Bz($destination);
50
+ $archiveWriter->open('w');
51
+
52
+ while (!$fileReader->eof()) {
53
+ $archiveWriter->write($fileReader->read());
54
+ }
55
+
56
+ $fileReader->close();
57
+ $archiveWriter->close();
58
+
59
return $destination;
60
}
61
68
*/
69
public function unpack($source, $destination)
70
{
71
if (is_dir($destination)) {
72
$file = $this->getFilename($source);
73
$destination = $destination . $file;
74
}
75
+
76
+ $archiveReader = new Mage_Archive_Helper_File_Bz($source);
77
+ $archiveReader->open('r');
78
+
79
+ $fileWriter = new Mage_Archive_Helper_File($destination);
80
+ $fileWriter->open('w');
81
+
82
+ while (!$archiveReader->eof()) {
83
+ $fileWriter->write($archiveReader->read());
84
+ }
85
+
86
return $destination;
87
}
88
89
+ }
lib/Mage/Archive/Gz.php CHANGED
@@ -20,7 +20,7 @@
20
*
21
* @category Mage
22
* @package Mage_Archive
23
- * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
@@ -42,9 +42,19 @@ class Mage_Archive_Gz extends Mage_Archive_Abstract implements Mage_Archive_Inte
42
*/
43
public function pack($source, $destination)
44
{
45
- $data = $this->_readFile($source);
46
- $gzData = gzencode($data, 9);
47
- $this->_writeFile($destination, $gzData);
48
return $destination;
49
}
50
@@ -57,21 +67,21 @@ class Mage_Archive_Gz extends Mage_Archive_Abstract implements Mage_Archive_Inte
57
*/
58
public function unpack($source, $destination)
59
{
60
- $gzPointer = gzopen($source, 'r' );
61
- if (empty($gzPointer)) {
62
- throw new Mage_Exception('Can\'t open GZ archive : ' . $source);
63
- }
64
- $data = '';
65
- while (!gzeof($gzPointer)) {
66
- $data .= gzread($gzPointer, 131072);
67
- }
68
- gzclose($gzPointer);
69
if (is_dir($destination)) {
70
$file = $this->getFilename($source);
71
$destination = $destination . $file;
72
}
73
- $this->_writeFile($destination, $data);
74
return $destination;
75
}
76
-
77
- }
20
*
21
* @category Mage
22
* @package Mage_Archive
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
42
*/
43
public function pack($source, $destination)
44
{
45
+ $fileReader = new Mage_Archive_Helper_File($source);
46
+ $fileReader->open('r');
47
+
48
+ $archiveWriter = new Mage_Archive_Helper_File_Gz($destination);
49
+ $archiveWriter->open('wb9');
50
+
51
+ while (!$fileReader->eof()) {
52
+ $archiveWriter->write($fileReader->read());
53
+ }
54
+
55
+ $fileReader->close();
56
+ $archiveWriter->close();
57
+
58
return $destination;
59
}
60
67
*/
68
public function unpack($source, $destination)
69
{
70
if (is_dir($destination)) {
71
$file = $this->getFilename($source);
72
$destination = $destination . $file;
73
}
74
+
75
+ $archiveReader = new Mage_Archive_Helper_File_Gz($source);
76
+ $archiveReader->open('r');
77
+
78
+ $fileWriter = new Mage_Archive_Helper_File($destination);
79
+ $fileWriter->open('w');
80
+
81
+ while (!$archiveReader->eof()) {
82
+ $fileWriter->write($archiveReader->read());
83
+ }
84
+
85
return $destination;
86
}
87
+ }
lib/Mage/Archive/Helper/File.php ADDED
@@ -0,0 +1,274 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Archive
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Helper class that simplifies files stream reading and writing
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Archive
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Mage_Archive_Helper_File
35
+ {
36
+ /**
37
+ * Full path to directory where file located
38
+ *
39
+ * @var string
40
+ */
41
+ protected $_fileLocation;
42
+
43
+ /**
44
+ * File name
45
+ *
46
+ * @var string
47
+ */
48
+ protected $_fileName;
49
+
50
+ /**
51
+ * Full path (directory + filename) to file
52
+ *
53
+ * @var string
54
+ */
55
+ protected $_filePath;
56
+
57
+ /**
58
+ * File permissions that will be set if file opened in write mode
59
+ *
60
+ * @var int
61
+ */
62
+ protected $_chmod;
63
+
64
+ /**
65
+ * File handler
66
+ *
67
+ * @var pointer
68
+ */
69
+ protected $_fileHandler;
70
+
71
+ /**
72
+ * Set file path via constructor
73
+ *
74
+ * @param string $filePath
75
+ */
76
+ public function __construct($filePath)
77
+ {
78
+ $pathInfo = pathinfo($filePath);
79
+
80
+ $this->_filePath = $filePath;
81
+ $this->_fileLocation = isset($pathInfo['dirname']) ? $pathInfo['dirname'] : '';
82
+ $this->_fileName = isset($pathInfo['basename']) ? $pathInfo['basename'] : '';
83
+ }
84
+
85
+ /**
86
+ * Close file if it's not closed before object destruction
87
+ */
88
+ public function __destruct()
89
+ {
90
+ if ($this->_fileHandler) {
91
+ $this->_close();
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Open file
97
+ *
98
+ * @param string $mode
99
+ * @param int $chmod
100
+ * @throws Mage_Exception
101
+ */
102
+ public function open($mode = 'w+', $chmod = 0666)
103
+ {
104
+ if ($this->_isWritableMode($mode)) {
105
+ if (!is_writable($this->_fileLocation)) {
106
+ throw new Mage_Exception('Permission denied to write to ' . $this->_fileLocation);
107
+ }
108
+
109
+ if (is_file($this->_filePath) && !is_writable($this->_filePath)) {
110
+ throw new Mage_Exception("Can't open file " . $this->_fileName . " for writing. Permission denied.");
111
+ }
112
+ }
113
+
114
+ if ($this->_isReadableMode($mode) && (!is_file($this->_filePath) || !is_readable($this->_filePath))) {
115
+ if (!is_file($this->_filePath)) {
116
+ throw new Mage_Exception('File ' . $this->_filePath . ' does not exist');
117
+ }
118
+
119
+ if (!is_readable($this->_filePath)) {
120
+ throw new Mage_Exception('Permission denied to read file ' . $this->_filePath);
121
+ }
122
+ }
123
+
124
+ $this->_open($mode);
125
+
126
+ $this->_chmod = $chmod;
127
+ }
128
+
129
+ /**
130
+ * Write data to file
131
+ *
132
+ * @param string $data
133
+ */
134
+ public function write($data)
135
+ {
136
+ $this->_checkFileOpened();
137
+ $this->_write($data);
138
+ }
139
+
140
+ /**
141
+ * Read data from file
142
+ *
143
+ * @param int $length
144
+ * @return string|boolean
145
+ */
146
+ public function read($length = 4096)
147
+ {
148
+ $data = false;
149
+ $this->_checkFileOpened();
150
+ if ($length > 0) {
151
+ $data = $this->_read($length);
152
+ }
153
+
154
+ return $data;
155
+ }
156
+
157
+ /**
158
+ * Check whether end of file reached
159
+ *
160
+ * @return boolean
161
+ */
162
+ public function eof()
163
+ {
164
+ $this->_checkFileOpened();
165
+ return $this->_eof();
166
+ }
167
+
168
+ /**
169
+ * Close file
170
+ */
171
+ public function close()
172
+ {
173
+ $this->_checkFileOpened();
174
+ $this->_close();
175
+ $this->_fileHandler = false;
176
+ @chmod($this->_filePath, $this->_chmod);
177
+ }
178
+
179
+ /**
180
+ * Implementation of file opening
181
+ *
182
+ * @param string $mode
183
+ * @throws Mage_Exception
184
+ */
185
+ protected function _open($mode)
186
+ {
187
+ $this->_fileHandler = @fopen($this->_filePath, $mode);
188
+
189
+ if (false === $this->_fileHandler) {
190
+ throw new Mage_Exception('Failed to open file ' . $this->_filePath);
191
+ }
192
+ }
193
+
194
+ /**
195
+ * Implementation of writing data to file
196
+ *
197
+ * @param string $data
198
+ * @throws Mage_Exception
199
+ */
200
+ protected function _write($data)
201
+ {
202
+ $result = @fwrite($this->_fileHandler, $data);
203
+
204
+ if (false === $result) {
205
+ throw new Mage_Exception('Failed to write data to ' . $this->_filePath);
206
+ }
207
+ }
208
+
209
+ /**
210
+ * Implementation of file reading
211
+ *
212
+ * @param int $length
213
+ * @throws Mage_Exception
214
+ */
215
+ protected function _read($length)
216
+ {
217
+ $result = fread($this->_fileHandler, $length);
218
+
219
+ if (false === $result) {
220
+ throw new Mage_Exception('Failed to read data from ' . $this->_filePath);
221
+ }
222
+
223
+ return $result;
224
+ }
225
+
226
+ /**
227
+ * Implementation of EOF indicator
228
+ *
229
+ * @return boolean
230
+ */
231
+ protected function _eof()
232
+ {
233
+ return feof($this->_fileHandler);
234
+ }
235
+
236
+ /**
237
+ * Implementation of file closing
238
+ */
239
+ protected function _close()
240
+ {
241
+ fclose($this->_fileHandler);
242
+ }
243
+
244
+ /**
245
+ * Check whether requested mode is writable mode
246
+ *
247
+ * @param string $mode
248
+ */
249
+ protected function _isWritableMode($mode)
250
+ {
251
+ return preg_match('/(^[waxc])|(\+$)/', $mode);
252
+ }
253
+
254
+ /**
255
+ * Check whether requested mode is readable mode
256
+ *
257
+ * @param string $mode
258
+ */
259
+ protected function _isReadableMode($mode) {
260
+ return !$this->_isWritableMode($mode);
261
+ }
262
+
263
+ /**
264
+ * Check whether file is opened
265
+ *
266
+ * @throws Mage_Exception
267
+ */
268
+ protected function _checkFileOpened()
269
+ {
270
+ if (!$this->_fileHandler) {
271
+ throw new Mage_Exception('File not opened');
272
+ }
273
+ }
274
+ }
lib/Mage/Archive/Helper/File/Bz.php ADDED
@@ -0,0 +1,92 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Archive
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Helper class that simplifies bz2 files stream reading and writing
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Archive
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Mage_Archive_Helper_File_Bz extends Mage_Archive_Helper_File
35
+ {
36
+ /**
37
+ * Open bz archive file
38
+ *
39
+ * @throws Mage_Exception
40
+ * @param string $mode
41
+ */
42
+ protected function _open($mode)
43
+ {
44
+ $this->_fileHandler = @bzopen($this->_filePath, $mode);
45
+
46
+ if (false === $this->_fileHandler) {
47
+ throw new Mage_Exception('Failed to open file ' . $this->_filePath);
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Write data to bz archive
53
+ *
54
+ * @throws Mage_Exception
55
+ * @param $data
56
+ */
57
+ protected function _write($data)
58
+ {
59
+ $result = @bzwrite($this->_fileHandler, $data);
60
+
61
+ if (false === $result) {
62
+ throw new Mage_Exception('Failed to write data to ' . $this->_filePath);
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Read data from bz archive
68
+ *
69
+ * @throws Mage_Exception
70
+ * @param int $length
71
+ * @return string
72
+ */
73
+ protected function _read($length)
74
+ {
75
+ $data = bzread($this->_fileHandler, $length);
76
+
77
+ if (false === $data) {
78
+ throw new Mage_Exception('Failed to read data from ' . $this->_filePath);
79
+ }
80
+
81
+ return $data;
82
+ }
83
+
84
+ /**
85
+ * Close bz archive
86
+ */
87
+ protected function _close()
88
+ {
89
+ bzclose($this->_fileHandler);
90
+ }
91
+ }
92
+
lib/Mage/Archive/Helper/File/Gz.php ADDED
@@ -0,0 +1,83 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Archive
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Helper class that simplifies gz files stream reading and writing
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Archive
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Mage_Archive_Helper_File_Gz extends Mage_Archive_Helper_File
35
+ {
36
+ /**
37
+ * @see Mage_Archive_Helper_File::_open()
38
+ */
39
+ protected function _open($mode)
40
+ {
41
+ $this->_fileHandler = @gzopen($this->_filePath, $mode);
42
+
43
+ if (false === $this->_fileHandler) {
44
+ throw new Mage_Exception('Failed to open file ' . $this->_filePath);
45
+ }
46
+ }
47
+
48
+ /**
49
+ * @see Mage_Archive_Helper_File::_write()
50
+ */
51
+ protected function _write($data)
52
+ {
53
+ $result = @gzwrite($this->_fileHandler, $data);
54
+
55
+ if (empty($result) && !empty($data)) {
56
+ throw new Mage_Exception('Failed to write data to ' . $this->_filePath);
57
+ }
58
+ }
59
+
60
+ /**
61
+ * @see Mage_Archive_Helper_File::_read()
62
+ */
63
+ protected function _read($length)
64
+ {
65
+ return gzread($this->_fileHandler, $length);
66
+ }
67
+
68
+ /**
69
+ * @see Mage_Archive_Helper_File::_eof()
70
+ */
71
+ protected function _eof()
72
+ {
73
+ return gzeof($this->_fileHandler);
74
+ }
75
+
76
+ /**
77
+ * @see Mage_Archive_Helper_File::_close()
78
+ */
79
+ protected function _close()
80
+ {
81
+ gzclose($this->_fileHandler);
82
+ }
83
+ }
lib/Mage/Archive/Interface.php CHANGED
@@ -20,7 +20,7 @@
20
*
21
* @category Mage
22
* @package Mage_Archive
23
- * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
@@ -50,4 +50,4 @@ interface Mage_Archive_Interface
50
* @return string
51
*/
52
public function unpack($source, $destination);
53
- }
20
*
21
* @category Mage
22
* @package Mage_Archive
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
50
* @return string
51
*/
52
public function unpack($source, $destination);
53
+ }
lib/Mage/Archive/Tar.php CHANGED
@@ -20,7 +20,7 @@
20
*
21
* @category Mage
22
* @package Mage_Archive
23
- * @copyright Copyright (c) 2009 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
@@ -34,9 +34,11 @@
34
class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Interface
35
{
36
/**
37
- * Constant is used for parse tar's header.
38
*/
39
- const FORMAT_PARSE_HEADER = 'a100name/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1type/a100symlink/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix/a12closer';
40
41
/**
42
* Keep file or directory for packing.
@@ -60,6 +62,122 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
60
*/
61
protected $_skipRoot;
62
63
/**
64
* Set option that define ability skip first catalog level.
65
*
@@ -80,7 +198,19 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
80
*/
81
protected function _setCurrentFile($file)
82
{
83
- $this->_currentFile = $file .((is_dir($file) && substr($file, -1)!=DS)?DS:'');
84
return $this;
85
}
86
@@ -124,6 +254,7 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
124
* Walk through directory and add to tar file or directory.
125
* Result is packed string on TAR format.
126
*
127
* @param boolean $skipRoot
128
* @return string
129
*/
@@ -154,10 +285,74 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
154
return $tarData;
155
}
156
157
/**
158
* Compose header for current file in TAR format.
159
* If length of file's name greater 100 characters,
160
- * method breaks header to two pieces. First conatins
161
* header and data with long name. Second contain only header.
162
*
163
* @param boolean $long
@@ -178,14 +373,16 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
178
}
179
$header = array();
180
$header['100-name'] = $long?'././@LongLink':substr($nameFile, 0, 100);
181
- $header['8-mode'] = $long?' ':str_pad(substr(sprintf("%07o", $infoFile['mode']),-4), 6, '0', STR_PAD_LEFT);
182
$header['8-uid'] = $long || $infoFile['uid']==0?"\0\0\0\0\0\0\0":sprintf("%07o", $infoFile['uid']);
183
$header['8-gid'] = $long || $infoFile['gid']==0?"\0\0\0\0\0\0\0":sprintf("%07o", $infoFile['gid']);
184
- $header['12-size'] = $long?sprintf("%011o", strlen($nameFile)):sprintf("%011o", is_dir($file) ? 0 : filesize($file));
185
$header['12-mtime'] = $long?'00000000000':sprintf("%011o", $infoFile['mtime']);
186
$header['8-check'] = sprintf('% 8s', '');
187
- $header['1-type'] = $long?'L':(is_link($file) ? 2 : is_dir ($file) ? 5 : 0);
188
- $header['100-symlink'] = is_link($file) == 2 ? readlink($item) : '';
189
$header['6-magic'] = 'ustar ';
190
$header['2-version'] = ' ';
191
$a=function_exists('posix_getpwuid')?posix_getpwuid (fileowner($file)):array('name'=>'');
@@ -219,38 +416,63 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
219
*
220
* @param string $destination path to file is unpacked
221
* @return array list of files
222
*/
223
protected function _unpackCurrentTar($destination)
224
{
225
- $file = $this->_getCurrentFile();
226
- $pointer = fopen($file, 'r');
227
- if (empty($pointer)) {
228
- throw new Mage_Exception('Can\'t open file: ' . $file);
229
- }
230
$list = array();
231
- while (!feof($pointer)) {
232
- $header = $this->_parseHeader($pointer);
233
- if ($header) {
234
- $currentFile = $destination . $header['name'];
235
- if ($header['type']=='5' && @mkdir($currentFile, 0777, true)) {
236
- $list[] = $currentFile . DS;
237
- } elseif (in_array($header['type'], array("0",chr(0), ''))) {
238
- $dirname = dirname($currentFile);
239
- if(!file_exists($dirname)) {
240
- @mkdir($dirname, 0777, true);
241
}
242
- $this->_writeFile($currentFile, $header['data']);
243
- $list[] = $currentFile;
244
}
245
}
246
}
247
- fclose($pointer);
248
return $list;
249
}
250
251
/**
252
* Get header from TAR string and unpacked it by format.
253
*
254
* @param resource $pointer
255
* @return string
256
*/
@@ -262,10 +484,9 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
262
return false;
263
}
264
265
- $fmt = self::FORMAT_PARSE_HEADER;
266
$header = unpack ($fmt, $firstLine);
267
268
-
269
$header['mode']=$header['mode']+0;
270
$header['uid']=octdec($header['uid']);
271
$header['gid']=octdec($header['gid']);
@@ -284,7 +505,7 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
284
}
285
286
$isUstar = 'ustar' == strtolower(substr($header['magic'], 0, 5));
287
-
288
$checksumOk = $header['checksum'] == $checksum;
289
if (isset($header['name']) && $checksumOk) {
290
if ($header['name'] == '././@LongLink' && $header['type'] == 'L') {
@@ -304,6 +525,90 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
304
return false;
305
}
306
307
/**
308
* Pack file to TAR (Tape Archiver).
309
*
@@ -312,14 +617,18 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
312
* @param boolean $skipRoot
313
* @return string
314
*/
315
- public function pack($source, $destination, $skipRoot=false)
316
{
317
$this->_setSkipRoot($skipRoot);
318
$source = realpath($source);
319
$tarData = $this->_setCurrentPath($source)
320
- ->_setCurrentFile($source)
321
- ->_packToTar($skipRoot);
322
- $this->_writeFile($destination, $tarData);
323
return $destination;
324
}
325
@@ -332,13 +641,13 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
332
*/
333
public function unpack($source, $destination)
334
{
335
- $tempFile = $destination . DS . '~tmp-'.microtime(true).'.tar';
336
- $data = $this->_readFile($source);
337
- $this->_writeFile($tempFile, $data);
338
- $this->_setCurrentFile($tempFile)
339
- ->_setCurrentPath($tempFile)
340
- ->_unpackCurrentTar($destination);
341
- unlink($tempFile);
342
return $destination;
343
}
344
@@ -352,21 +661,28 @@ class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Int
352
*/
353
public function extract($file, $source, $destination)
354
{
355
- $pointer = fopen($source, 'r');
356
- if (empty($pointer)) {
357
- throw new Mage_Exception('Can\'t open file: '.$source);
358
- }
359
- $list = array();
360
$extractedFile = '';
361
- while (!feof($pointer)) {
362
- $header = $this->_parseHeader($pointer);
363
if ($header['name'] == $file) {
364
$extractedFile = $destination . basename($header['name']);
365
- $this->_writeFile($extractedFile, $header['data']);
366
break;
367
}
368
}
369
- fclose($pointer);
370
return $extractedFile;
371
}
372
}
20
*
21
* @category Mage
22
* @package Mage_Archive
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
*/
26
34
class Mage_Archive_Tar extends Mage_Archive_Abstract implements Mage_Archive_Interface
35
{
36
/**
37
+ * Tar block size
38
+ *
39
+ * @const int
40
*/
41
+ const TAR_BLOCK_SIZE = 512;
42
43
/**
44
* Keep file or directory for packing.
62
*/
63
protected $_skipRoot;
64
65
+ /**
66
+ * Tarball data writer
67
+ *
68
+ * @var Mage_Archive_Helper_File
69
+ */
70
+ protected $_writer;
71
+
72
+ /**
73
+ * Tarball data reader
74
+ *
75
+ * @var Mage_Archive_Helper_File
76
+ */
77
+ protected $_reader;
78
+
79
+ /**
80
+ * Path to file where tarball should be placed
81
+ *
82
+ * @var string
83
+ */
84
+ protected $_destinationFilePath;
85
+
86
+ /**
87
+ * Initialize tarball writer
88
+ *
89
+ * @return Mage_Archive_Tar
90
+ */
91
+ protected function _initWriter()
92
+ {
93
+ $this->_writer = new Mage_Archive_Helper_File($this->_destinationFilePath);
94
+ $this->_writer->open('w');
95
+
96
+ return $this;
97
+ }
98
+
99
+ /**
100
+ * Returns string that is used for tar's header parsing
101
+ *
102
+ * @return string
103
+ */
104
+ protected static final function _getFormatParseHeader()
105
+ {
106
+ return 'a100name/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1type/a100symlink/a6magic/a2version/'
107
+ . 'a32uname/a32gname/a8devmajor/a8devminor/a155prefix/a12closer';
108
+ }
109
+
110
+ /**
111
+ * Destroy tarball writer
112
+ *
113
+ * @return Mage_Archive_Tar
114
+ */
115
+ protected function _destroyWriter()
116
+ {
117
+ if ($this->_writer instanceof Mage_Archive_Helper_File) {
118
+ $this->_writer->close();
119
+ $this->_writer = null;
120
+ }
121
+
122
+ return $this;
123
+ }
124
+
125
+ /**
126
+ * Get tarball writer
127
+ *
128
+ * @return Mage_Archive_Helper_File
129
+ */
130
+ protected function _getWriter()
131
+ {
132
+ if (!$this->_writer) {
133
+ $this->_initWriter();
134
+ }
135
+
136
+ return $this->_writer;
137
+ }
138
+
139
+ /**
140
+ * Initialize tarball reader
141
+ *
142
+ * @return Mage_Archive_Tar
143
+ */
144
+ protected function _initReader()
145
+ {
146
+ $this->_reader = new Mage_Archive_Helper_File($this->_getCurrentFile());
147
+ $this->_reader->open('r');
148
+
149
+ return $this;
150
+ }
151
+
152
+ /**
153
+ * Destroy tarball reader
154
+ *
155
+ * @return Mage_Archive_Tar
156
+ */
157
+ protected function _destroyReader()
158
+ {
159
+ if ($this->_reader instanceof Mage_Archive_Helper_File) {
160
+ $this->_reader->close();
161
+ $this->_reader = null;
162
+ }
163
+
164
+ return $this;
165
+ }
166
+
167
+ /**
168
+ * Get tarball reader
169
+ *
170
+ * @return Mage_Archive_Helper_File
171
+ */
172
+ protected function _getReader()
173
+ {
174
+ if (!$this->_reader) {
175
+ $this->_initReader();
176
+ }
177
+
178
+ return $this->_reader;
179
+ }
180
+
181
/**
182
* Set option that define ability skip first catalog level.
183
*
198
*/
199
protected function _setCurrentFile($file)
200
{
201
+ $this->_currentFile = $file .((!is_link($file) && is_dir($file) && substr($file, -1) != DS) ? DS : '');
202
+ return $this;
203
+ }
204
+
205
+ /**
206
+ * Set path to file where tarball should be placed
207
+ *
208
+ * @param string $destinationFilePath
209
+ * @return Mage_Archive_Tar
210
+ */
211
+ protected function _setDestinationFilePath($destinationFilePath)
212
+ {
213
+ $this->_destinationFilePath = $destinationFilePath;
214
return $this;
215
}
216
254
* Walk through directory and add to tar file or directory.
255
* Result is packed string on TAR format.
256
*
257
+ * @deprecated after 1.7.0.0
258
* @param boolean $skipRoot
259
* @return string
260
*/
285
return $tarData;
286
}
287
288
+ /**
289
+ * Recursively walk through file tree and create tarball
290
+ *
291
+ * @param boolean $skipRoot
292
+ * @param boolean $finalize
293
+ * @throws Mage_Exception
294
+ */
295
+ protected function _createTar($skipRoot = false, $finalize = false)
296
+ {
297
+ if (!$skipRoot) {
298
+ $this->_packAndWriteCurrentFile();
299
+ }
300
+
301
+ $file = $this->_getCurrentFile();
302
+
303
+ if (is_dir($file)) {
304
+ $dirFiles = scandir($file);
305
+
306
+ if (false === $dirFiles) {
307
+ throw new Mage_Exception('Can\'t scan dir: ' . $file);
308
+ }
309
+
310
+ array_shift($dirFiles); /* remove './'*/
311
+ array_shift($dirFiles); /* remove '../'*/
312
+
313
+ foreach ($dirFiles as $item) {
314
+ $this->_setCurrentFile($file . $item)->_createTar();
315
+ }
316
+ }
317
+
318
+ if ($finalize) {
319
+ $this->_getWriter()->write(str_repeat("\0", self::TAR_BLOCK_SIZE * 12));
320
+ }
321
+ }
322
+
323
+ /**
324
+ * Write current file to tarball
325
+ */
326
+ protected function _packAndWriteCurrentFile()
327
+ {
328
+ $archiveWriter = $this->_getWriter();
329
+ $archiveWriter->write($this->_composeHeader());
330
+
331
+ $currentFile = $this->_getCurrentFile();
332
+
333
+ $fileSize = 0;
334
+
335
+ if (is_file($currentFile) && !is_link($currentFile)) {
336
+ $fileReader = new Mage_Archive_Helper_File($currentFile);
337
+ $fileReader->open('r');
338
+
339
+ while (!$fileReader->eof()) {
340
+ $archiveWriter->write($fileReader->read());
341
+ }
342
+
343
+ $fileReader->close();
344
+
345
+ $fileSize = filesize($currentFile);
346
+ }
347
+
348
+ $appendZerosCount = (self::TAR_BLOCK_SIZE - $fileSize % self::TAR_BLOCK_SIZE) % self::TAR_BLOCK_SIZE;
349
+ $archiveWriter->write(str_repeat("\0", $appendZerosCount));
350
+ }
351
+
352
/**
353
* Compose header for current file in TAR format.
354
* If length of file's name greater 100 characters,
355
+ * method breaks header into two pieces. First contains
356
* header and data with long name. Second contain only header.
357
*
358
* @param boolean $long
373
}
374
$header = array();
375
$header['100-name'] = $long?'././@LongLink':substr($nameFile, 0, 100);
376
+ $header['8-mode'] = $long ? ' '
377
+ : str_pad(substr(sprintf("%07o", $infoFile['mode']),-4), 6, '0', STR_PAD_LEFT);
378
$header['8-uid'] = $long || $infoFile['uid']==0?"\0\0\0\0\0\0\0":sprintf("%07o", $infoFile['uid']);
379
$header['8-gid'] = $long || $infoFile['gid']==0?"\0\0\0\0\0\0\0":sprintf("%07o", $infoFile['gid']);
380
+ $header['12-size'] = $long ? sprintf("%011o", strlen($nameFile)) : sprintf("%011o", is_dir($file)
381
+ ? 0 : filesize($file));
382
$header['12-mtime'] = $long?'00000000000':sprintf("%011o", $infoFile['mtime']);
383
$header['8-check'] = sprintf('% 8s', '');
384
+ $header['1-type'] = $long ? 'L' : (is_link($file) ? 2 : (is_dir($file) ? 5 : 0));
385
+ $header['100-symlink'] = is_link($file) ? readlink($file) : '';
386
$header['6-magic'] = 'ustar ';
387
$header['2-version'] = ' ';
388
$a=function_exists('posix_getpwuid')?posix_getpwuid (fileowner($file)):array('name'=>'');
416
*
417
* @param string $destination path to file is unpacked
418
* @return array list of files
419
+ * @throws Mage_Exception
420
*/
421
protected function _unpackCurrentTar($destination)
422
{
423
+ $archiveReader = $this->_getReader();
424
$list = array();
425
+
426
+ while (!$archiveReader->eof()) {
427
+ $header = $this->_extractFileHeader();
428
+
429
+ if (!$header) {
430
+ continue;
431
+ }
432
+
433
+ $currentFile = $destination . $header['name'];
434
+ $dirname = dirname($currentFile);
435
+
436
+ if (in_array($header['type'], array("0",chr(0), ''))) {
437
+
438
+ if(!file_exists($dirname)) {
439
+ $mkdirResult = @mkdir($dirname, 0777, true);
440
+
441
+ if (false === $mkdirResult) {
442
+ throw new Mage_Exception('Failed to create directory ' . $dirname);
443
}
444
+ }
445
+
446
+ $this->_extractAndWriteFile($header, $currentFile);
447
+ $list[] = $currentFile;
448
+
449
+ } elseif ($header['type'] == '5') {
450
+
451
+ if(!file_exists($dirname)) {
452
+ $mkdirResult = @mkdir($currentFile, $header['mode'], true);
453
+
454
+ if (false === $mkdirResult) {
455
+ throw new Mage_Exception('Failed to create directory ' . $currentFile);
456
+ }
457
+ }
458
+ $list[] = $currentFile . DS;
459
+ } elseif ($header['type'] == '2') {
460
+
461
+ $symlinkResult = @symlink($header['symlink'], $currentFile);
462
+
463
+ if (false === $symlinkResult) {
464
+ throw new Mage_Exception('Failed to create symlink ' . $currentFile . ' to ' . $header['symlink']);
465
}
466
}
467
}
468
+
469
return $list;
470
}
471
472
/**
473
* Get header from TAR string and unpacked it by format.
474
*
475
+ * @deprecated after 1.7.0.0
476
* @param resource $pointer
477
* @return string
478
*/
484
return false;
485
}
486
487
+ $fmt = self::_getFormatParseHeader();
488
$header = unpack ($fmt, $firstLine);
489
490
$header['mode']=$header['mode']+0;
491
$header['uid']=octdec($header['uid']);
492
$header['gid']=octdec($header['gid']);
505
}
506
507
$isUstar = 'ustar' == strtolower(substr($header['magic'], 0, 5));
508
+
509
$checksumOk = $header['checksum'] == $checksum;
510
if (isset($header['name']) && $checksumOk) {
511
if ($header['name'] == '././@LongLink' && $header['type'] == 'L') {
525
return false;
526
}
527
528
+ /**
529
+ * Read and decode file header information from tarball
530
+ *
531
+ * @return array|boolean
532
+ */
533
+ protected function _extractFileHeader()
534
+ {
535
+ $archiveReader = $this->_getReader();
536
+
537
+ $headerBlock = $archiveReader->read(self::TAR_BLOCK_SIZE);
538
+
539
+ if (strlen($headerBlock) < self::TAR_BLOCK_SIZE) {
540
+ return false;
541
+ }
542
+
543
+ $header = unpack(self::_getFormatParseHeader(), $headerBlock);
544
+
545
+ $header['mode'] = octdec($header['mode']);
546
+ $header['uid'] = octdec($header['uid']);
547
+ $header['gid'] = octdec($header['gid']);
548
+ $header['size'] = octdec($header['size']);
549
+ $header['mtime'] = octdec($header['mtime']);
550
+ $header['checksum'] = octdec($header['checksum']);
551
+
552
+ if ($header['type'] == "5") {
553
+ $header['size'] = 0;
554
+ }
555
+
556
+ $checksum = 0;
557
+ $headerBlock = substr_replace($headerBlock, ' ', 148, 8);
558
+
559
+ for ($i = 0; $i < 512; $i++) {
560
+ $checksum += ord(substr($headerBlock, $i, 1));
561
+ }
562
+
563
+ $isUstar = 'ustar' == strtolower(substr($header['magic'], 0, 5));
564
+
565
+ $checksumOk = $header['checksum'] == $checksum;
566
+ if (isset($header['name']) && $checksumOk) {
567
+
568
+ if (!($header['name'] == '././@LongLink' && $header['type'] == 'L')) {
569
+ return $header;
570
+ }
571
+
572
+ $realNameBlockSize = floor(($header['size'] + self::TAR_BLOCK_SIZE - 1) / self::TAR_BLOCK_SIZE)
573
+ * self::TAR_BLOCK_SIZE;
574
+ $realNameBlock = $archiveReader->read($realNameBlockSize);
575
+ $realName = substr($realNameBlock, 0, $header['size']);
576
+
577
+ $headerMain = $this->_extractFileHeader();
578
+ $headerMain['name'] = $realName;
579
+ return $headerMain;
580
+ }
581
+
582
+ return false;
583
+ }
584
+
585
+ /**
586
+ * Extract next file from tarball by its $header information and save it to $destination
587
+ *
588
+ * @param array $fileHeader
589
+ * @param string $destination
590
+ */
591
+ protected function _extractAndWriteFile($fileHeader, $destination)
592
+ {
593
+ $fileWriter = new Mage_Archive_Helper_File($destination);
594
+ $fileWriter->open('w', $fileHeader['mode']);
595
+
596
+ $archiveReader = $this->_getReader();
597
+
598
+ $filesize = $fileHeader['size'];
599
+ $bytesExtracted = 0;
600
+
601
+ while ($filesize > $bytesExtracted && !$archiveReader->eof()) {
602
+ $block = $archiveReader->read(self::TAR_BLOCK_SIZE);
603
+ $nonExtractedBytesCount = $filesize - $bytesExtracted;
604
+
605
+ $data = substr($block, 0, $nonExtractedBytesCount);
606
+ $fileWriter->write($data);
607
+
608
+ $bytesExtracted += strlen($block);
609
+ }
610
+ }
611
+
612
/**
613
* Pack file to TAR (Tape Archiver).
614
*
617
* @param boolean $skipRoot
618
* @return string
619
*/
620
+ public function pack($source, $destination, $skipRoot = false)
621
{
622
$this->_setSkipRoot($skipRoot);
623
$source = realpath($source);
624
$tarData = $this->_setCurrentPath($source)
625
+ ->_setDestinationFilePath($destination)
626
+ ->_setCurrentFile($source);
627
+
628
+ $this->_initWriter();
629
+ $this->_createTar($skipRoot, true);
630
+ $this->_destroyWriter();
631
+
632
return $destination;
633
}
634
641
*/
642
public function unpack($source, $destination)
643
{
644
+ $this->_setCurrentFile($source)
645
+ ->_setCurrentPath($source);
646
+
647
+ $this->_initReader();
648
+ $this->_unpackCurrentTar($destination);
649
+ $this->_destroyReader();
650
+
651
return $destination;
652
}
653
661
*/
662
public function extract($file, $source, $destination)
663
{
664
+ $this->_setCurrentFile($source);
665
+ $this->_initReader();
666
+
667
+ $archiveReader = $this->_getReader();
668
$extractedFile = '';
669
+
670
+ while (!$archiveReader->eof()) {
671
+ $header = $this->_extractFileHeader();
672
if ($header['name'] == $file) {
673
$extractedFile = $destination . basename($header['name']);
674
+ $this->_extractAndWriteFile($header, $extractedFile);
675
break;
676
}
677
+
678
+ if ($header['type'] != 5){
679
+ $skipBytes = floor(($header['size'] + self::TAR_BLOCK_SIZE - 1) / self::TAR_BLOCK_SIZE)
680
+ * self::TAR_BLOCK_SIZE;
681
+ $archiveReader->read($skipBytes);
682
+ }
683
}
684
+
685
+ $this->_destroyReader();
686
return $extractedFile;
687
}
688
}
lib/Mage/Backup.php ADDED
@@ -0,0 +1,59 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Backup
23
+ * @copyright Copyright (c) 2011 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Class to work with backups
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Backup
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Mage_Backup
35
+ {
36
+ /**
37
+ * List of supported a backup types
38
+ *
39
+ * @var array
40
+ */
41
+ static protected $_allowedBackupTypes = array('db', 'snapshot', 'filesystem', 'media', 'nomedia');
42
+
43
+ /**
44
+ * get Backup Instance By File Name
45
+ *
46
+ * @param string $type
47
+ * @return Mage_Backup_Interface
48
+ */
49
+ static public function getBackupInstance($type)
50
+ {
51
+ $class = 'Mage_Backup_' . ucfirst($type);
52
+
53
+ if (!in_array($type, self::$_allowedBackupTypes) || !class_exists($class, true)){
54
+ throw new Mage_Exception('Current implementation not supported this type (' . $type . ') of backup.');
55
+ }
56
+
57
+ return new $class();
58
+ }
59
+ }
lib/Mage/Backup/Abstract.php ADDED
@@ -0,0 +1,318 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Backup
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Class to work with archives
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Backup
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ abstract class Mage_Backup_Abstract implements Mage_Backup_Interface
35
+ {
36
+ /**
37
+ * Backup name
38
+ *
39
+ * @var string
40
+ */
41
+ protected $_name;
42
+
43
+ /**
44
+ * Backup creation date
45
+ *
46
+ * @var int
47
+ */
48
+ protected $_time;
49
+
50
+ /**
51
+ * Backup file extension
52
+ *
53
+ * @var string
54
+ */
55
+ protected $_backupExtension;
56
+
57
+ /**
58
+ * Resource model
59
+ *
60
+ * @var object
61
+ */
62
+ protected $_resourceModel;
63
+
64
+ /**
65
+ * Magento's root directory
66
+ *
67
+ * @var string
68
+ */
69
+ protected $_rootDir;
70
+
71
+ /**
72
+ * Path to directory where backups stored
73
+ *
74
+ * @var string
75
+ */
76
+ protected $_backupsDir;
77
+
78
+ /**
79
+ * Is last operation completed successfully
80
+ *
81
+ * @var bool
82
+ */
83
+ protected $_lastOperationSucceed = false;
84
+
85
+ /**
86
+ * Last failed operation error message
87
+ *
88
+ * @var string
89
+ */
90
+ protected $_lastErrorMessage;
91
+
92
+
93
+ /**
94
+ * Set Backup Extension
95
+ *
96
+ * @param string $backupExtension
97
+ * @return Mage_Backup_Interface
98
+ */
99
+ public function setBackupExtension($backupExtension)
100
+ {
101
+ $this->_backupExtension = $backupExtension;
102
+ return $this;
103
+ }
104
+
105
+ /**
106
+ * Get Backup Extension
107
+ *
108
+ * @return string
109
+ */
110
+ public function getBackupExtension()
111
+ {
112
+ return $this->_backupExtension;
113
+ }
114
+
115
+ /**
116
+ * Set Resource Model
117
+ *
118
+ * @param object $resourceModel
119
+ * @return Mage_Backup_Interface
120
+ */
121
+ public function setResourceModel($resourceModel)
122
+ {
123
+ $this->_resourceModel = $resourceModel;
124
+ return $this;
125
+ }
126
+
127
+ /**
128
+ * Get Resource Model
129
+ *
130
+ * @return object
131
+ */
132
+ public function getResourceModel()
133
+ {
134
+ return $this->_resourceModel;
135
+ }
136
+
137
+ /**
138
+ * Set Time
139
+ *
140
+ * @param int $time
141
+ * @return Mage_Backup_Interface
142
+ */
143
+ public function setTime($time)
144
+ {
145
+ $this->_time = $time;
146
+ return $this;
147
+ }
148
+
149
+ /**
150
+ * Get Time
151
+ *
152
+ * @return int
153
+ */
154
+ public function getTime()
155
+ {
156
+ return $this->_time;
157
+ }
158
+
159
+ /**
160
+ * Set root directory of Magento installation
161
+ *
162
+ * @param string $rootDir
163
+ * @throws Mage_Exception
164
+ * @return Mage_Backup_Interface
165
+ */
166
+ public function setRootDir($rootDir)
167
+ {
168
+ if (!is_dir($rootDir)) {
169
+ throw new Mage_Exception('Bad root directory');
170
+ }
171
+
172
+ $this->_rootDir = $rootDir;
173
+ return $this;
174
+ }
175
+
176
+ /**
177
+ * Get Magento's root directory
178
+ * @return string
179
+ */
180
+ public function getRootDir()
181
+ {
182
+ return $this->_rootDir;
183
+ }
184
+
185
+ /**
186
+ * Set path to directory where backups stored
187
+ *
188
+ * @param string $backupsDir
189
+ * @return Mage_Backup_Interface
190
+ */
191
+ public function setBackupsDir($backupsDir)
192
+ {
193
+ $this->_backupsDir = $backupsDir;
194
+ return $this;
195
+ }
196
+
197
+ /**
198
+ * Get path to directory where backups stored
199
+ *
200
+ * @return string
201
+ */
202
+ public function getBackupsDir()
203
+ {
204
+ return $this->_backupsDir;
205
+ }
206
+
207
+ /**
208
+ * Get path to backup
209
+ *
210
+ * @return string
211
+ */
212
+ public function getBackupPath()
213
+ {
214
+ return $this->getBackupsDir() . DS . $this->getBackupFilename();
215
+ }
216
+
217
+ /**
218
+ * Get backup file name
219
+ *
220
+ * @return string
221
+ */
222
+ public function getBackupFilename()
223
+ {
224
+ $filename = $this->getTime() . '_' . $this->getType();
225
+
226
+ $name = $this->getName();
227
+
228
+ if (!empty($name)) {
229
+ $filename .= '_' . $name;
230
+ }
231
+
232
+ $filename .= '.' . $this->getBackupExtension();
233
+
234
+ return $filename;
235
+ }
236
+
237
+ /**
238
+ * Check whether last operation completed successfully
239
+ *
240
+ * @return bool
241
+ */
242
+ public function getIsSuccess()
243
+ {
244
+ return $this->_lastOperationSucceed;
245
+ }
246
+
247
+ /**
248
+ * Get last error message
249
+ *
250
+ * @return string
251
+ */
252
+ public function getErrorMessage()
253
+ {
254
+ return $this->_lastErrorMessage;
255
+ }
256
+
257
+ /**
258
+ * Set error message
259
+ *
260
+ * @param string $errorMessage
261
+ * @return string
262
+ */
263
+ public function setErrorMessage($errorMessage)
264
+ {
265
+ $this->_lastErrorMessage = $errorMessage;
266
+ }
267
+
268
+ /**
269
+ * Set backup name
270
+ *
271
+ * @param string $name
272
+ * @param bool $applyFilter
273
+ * @return Mage_Backup_Interface
274
+ */
275
+ public function setName($name, $applyFilter = true)
276
+ {
277
+ if ($applyFilter) {
278
+ $name = $this->_filterName($name);
279
+ }
280
+ $this->_name = $name;
281
+ return $this;
282
+ }
283
+
284
+ /**
285
+ * Get backup name
286
+ *
287
+ * @return string
288
+ */
289
+ public function getName()
290
+ {
291
+ return $this->_name;
292
+ }
293
+
294
+ /**
295
+ * Get backup display name
296
+ *
297
+ * @return string
298
+ */
299
+ public function getDisplayName()
300
+ {
301
+ return str_replace('_', ' ', $this->_name);
302
+ }
303
+
304
+ /**
305
+ * Removes disallowed characters and replaces spaces with underscores
306
+ *
307
+ * @param string $name
308
+ * @return string
309
+ */
310
+ protected function _filterName($name)
311
+ {
312
+ $name = trim(preg_replace('/[^\da-zA-Z ]/', '', $name));
313
+ $name = preg_replace('/\s{2,}/', ' ', $name);
314
+ $name = str_replace(' ', '_', $name);
315
+
316
+ return $name;
317
+ }
318
+ }
lib/Mage/Backup/Archive/Tar.php ADDED
@@ -0,0 +1,82 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Backup
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Extended version of Mage_Archive_Tar that supports filtering
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Backup
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Mage_Backup_Archive_Tar extends Mage_Archive_Tar
35
+ {
36
+ /**
37
+ * Filenames or filename parts that are used for filtering files
38
+ *
39
+ * @var array()
40
+ */
41
+ protected $_skipFiles = array();
42
+
43
+ /**
44
+ * Overridden Mage_Archive_Tar::_createTar method that does the same actions as it's parent but filters
45
+ * files using Mage_Backup_Filesystem_Iterator_Filter
46
+ *
47
+ * @see Mage_Archive_Tar::_createTar()
48
+ * @param bool $skipRoot
49
+ * @param bool $finalize
50
+ */
51
+ protected function _createTar($skipRoot = false, $finalize = false)
52
+ {
53
+ $path = $this->_getCurrentFile();
54
+
55
+ $filesystemIterator = new RecursiveIteratorIterator(
56
+ new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST
57
+ );
58
+
59
+ $iterator = new Mage_Backup_Filesystem_Iterator_Filter($filesystemIterator, $this->_skipFiles);
60
+
61
+ foreach ($iterator as $item) {
62
+ $this->_setCurrentFile($item->getPathname());
63
+ $this->_packAndWriteCurrentFile();
64
+ }
65
+
66
+ if ($finalize) {
67
+ $this->_getWriter()->write(str_repeat("\0", self::TAR_BLOCK_SIZE * 12));
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Set files that shouldn't be added to tarball
73
+ *
74
+ * @param array $skipFiles
75
+ * @return Mage_Backup_Archive_Tar
76
+ */
77
+ public function setSkipFiles(array $skipFiles)
78
+ {
79
+ $this->_skipFiles = $skipFiles;
80
+ return $this;
81
+ }
82
+ }
lib/Mage/Backup/Db.php ADDED
@@ -0,0 +1,119 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Backup
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Class to work with database backups
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Backup
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Mage_Backup_Db extends Mage_Backup_Abstract
35
+ {
36
+ /**
37
+ * Implements Rollback functionality for Db
38
+ *
39
+ * @return bool
40
+ */
41
+ public function rollback()
42
+ {
43
+ set_time_limit(0);
44
+ ignore_user_abort(true);
45
+
46
+ $this->_lastOperationSucceed = false;
47
+
48
+ $archiveManager = new Mage_Archive();
49
+ $source = $archiveManager->unpack($this->getBackupPath(), $this->getBackupsDir());
50
+
51
+ $file = new Mage_Backup_Filesystem_Iterator_File($source);
52
+ foreach ($file as $statement) {
53
+ $this->getResourceModel()->runCommand($statement);
54
+ }
55
+ @unlink($source);
56
+
57
+ $this->_lastOperationSucceed = true;
58
+
59
+ return true;
60
+ }
61
+
62
+ /**
63
+ * Checks whether the line is last in sql command
64
+ *
65
+ * @param $line
66
+ * @return bool
67
+ */
68
+ protected function _isLineLastInCommand($line)
69
+ {
70
+ $cleanLine = trim($line);
71
+ $lineLength = strlen($cleanLine);
72
+
73
+ $returnResult = false;
74
+ if ($lineLength > 0){
75
+ $lastSymbolIndex = $lineLength-1;
76
+ if ($cleanLine[$lastSymbolIndex] == ';'){
77
+ $returnResult = true;
78
+ }
79
+ }
80
+
81
+ return $returnResult;
82
+ }
83
+
84
+ /**
85
+ * Implements Create Backup functionality for Db
86
+ *
87
+ * @return bool
88
+ */
89
+ public function create()
90
+ {
91
+ set_time_limit(0);
92
+ ignore_user_abort(true);
93
+
94
+ $this->_lastOperationSucceed = false;
95
+
96
+ $backup = Mage::getModel('backup/backup')
97
+ ->setTime($this->getTime())
98
+ ->setType($this->getType())
99
+ ->setPath($this->getBackupsDir())
100
+ ->setName($this->getName());
101
+
102
+ $backupDb = Mage::getModel('backup/db');
103
+ $backupDb->createBackup($backup);
104
+
105
+ $this->_lastOperationSucceed = true;
106
+
107
+ return true;
108
+ }
109
+
110
+ /**
111
+ * Get Backup Type
112
+ *
113
+ * @return string
114
+ */
115
+ public function getType()
116
+ {
117
+ return 'db';
118
+ }
119
+ }
lib/Mage/Backup/Exception.php ADDED
@@ -0,0 +1,36 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Backup
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Exception
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Backup
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Mage_Backup_Exception extends Mage_Exception
35
+ {
36
+ }
lib/Mage/Backup/Exception/CantLoadSnapshot.php ADDED
@@ -0,0 +1,36 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Backup
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Exception
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Backup
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Mage_Backup_Exception_CantLoadSnapshot extends Mage_Backup_Exception
35
+ {
36
+ }
lib/Mage/Backup/Exception/FtpConnectionFailed.php ADDED
@@ -0,0 +1,36 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22
+ * @package Mage_Backup
23
+ * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Exception
29
+ *
30
+ * @category Mage
31
+ * @package Mage_Backup
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Mage_Backup_Exception_FtpConnectionFailed extends Mage_Backup_Exception
35
+ {
36
+ }
lib/Mage/Backup/Exception/FtpValidationFailed.php ADDED
@@ -0,0 +1,36 @@
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Mage
22