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_Install
23: * @copyright Copyright (c) 2012 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: * Fylesystem installer
29: *
30: * @category Mage
31: * @package Mage_Install
32: * @author Magento Core Team <core@magentocommerce.com>
33: */
34: class Mage_Install_Model_Installer_Filesystem extends Mage_Install_Model_Installer_Abstract
35: {
36: const MODE_WRITE = 'write';
37: const MODE_READ = 'read';
38:
39: public function __construct()
40: {
41: }
42:
43: /**
44: * Check and prepare file system
45: *
46: */
47: public function install()
48: {
49: if (!$this->_checkFilesystem()) {
50: throw new Exception();
51: };
52: return $this;
53: }
54:
55: /**
56: * Check file system by config
57: *
58: * @return bool
59: */
60: protected function _checkFilesystem()
61: {
62: $res = true;
63: $config = Mage::getSingleton('install/config')->getPathForCheck();
64:
65: if (isset($config['writeable'])) {
66: foreach ($config['writeable'] as $item) {
67: $recursive = isset($item['recursive']) ? $item['recursive'] : false;
68: $existence = isset($item['existence']) ? $item['existence'] : false;
69: $checkRes = $this->_checkPath($item['path'], $recursive, $existence, 'write');
70: $res = $res && $checkRes;
71: }
72: }
73: return $res;
74: }
75:
76: /**
77: * Check file system path
78: *
79: * @param string $path
80: * @param bool $recursive
81: * @param bool $existence
82: * @param string $mode
83: * @return bool
84: */
85: protected function _checkPath($path, $recursive, $existence, $mode)
86: {
87: $res = true;
88: $fullPath = dirname(Mage::getRoot()) . $path;
89: if ($mode == self::MODE_WRITE) {
90: $setError = false;
91: if ($existence) {
92: if ((is_dir($fullPath) && !is_dir_writeable($fullPath)) || !is_writable($fullPath)) {
93: $setError = true;
94: }
95: }
96: else {
97: if (file_exists($fullPath) && !is_writable($fullPath)) {
98: $setError = true;
99: }
100: }
101:
102: if ($setError) {
103: $this->_getInstaller()->getDataModel()->addError(
104: Mage::helper('install')->__('Path "%s" must be writable.', $fullPath)
105: );
106: $res = false;
107: }
108: }
109:
110: if ($recursive && is_dir($fullPath)) {
111: foreach (new DirectoryIterator($fullPath) as $file) {
112: if (!$file->isDot() && $file->getFilename() != '.svn' && $file->getFilename() != '.htaccess') {
113: $res = $res && $this->_checkPath($path . DS . $file->getFilename(), $recursive, $existence, $mode);
114: }
115: }
116: }
117: return $res;
118: }
119: }
120: