source: branches/feature-module-update/data/class/batch/SC_Batch_Update.php @ 16984

Revision 16984, 8.1 KB checked in by satou, 14 years ago (diff)

アップデート機能のファイル種別追加

  • Property svn:eol-style set to LF
  • Property svn:keywords set to "Id Revision Date"
Line 
1<?php
2/*
3 * This file is part of EC-CUBE
4 *
5 * Copyright(c) 2000-2007 LOCKON CO.,LTD. All Rights Reserved.
6 *
7 * http://www.lockon.co.jp/
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22 */
23
24// {{{ requires
25require_once(CLASS_PATH . "batch/SC_Batch.php");
26
27/**
28 * アップデート機能 のバッチクラス.
29 *
30 * XXX Singleton にするべき...
31 *
32 * @package Batch
33 * @author LOCKON CO.,LTD.
34 * @version $Id$
35 */
36class SC_Batch_Update extends SC_Batch {
37
38    /**
39     * 変換したいファイルの拡張子をカンマ区切りで羅列.
40     */
41    var $includes = "php,inc,tpl,css,sql,js,png,jpg,gif,swf";
42
43    /**
44     * 除外するファイル名をカンマ区切りで羅列.
45     */
46    var $excludes = "distinfo.php";
47
48    /**
49     * バッチ処理を実行する.
50     *
51     * @param string $target アップデータファイルのディレクトリパス
52     * @return void
53     */
54    function execute($target = ".") {
55        $oldMask = umask(0);
56        $bkupDistInfoArray = array(); //バックアップファイル用のdistinfoファイル内容
57        $bkupPath = DATA_PATH . 'downloads/backup/update_' . time() . '/';
58        $bkupPathFile = $bkupPath . 'files/';
59        $this->mkdir_p($bkupPathFile . 'dummy');
60
61        $arrLog = array(
62            'err' =>  array(),
63            'ok'  => array(),
64            'buckup_path' => $bkupPath
65        );
66
67        if (!is_writable($bkupPath) || !is_writable($bkupPathFile)) {
68            $arrLog['err'][] = 'バックアップディレクトリの作成に失敗しました';
69            return $arrLog;
70        }
71
72        $includeArray = explode(',', $this->includes);
73        $excludeArray = explode(',', $this->excludes);
74        $fileArrays = $this->listdirs($target);
75
76        foreach ($fileArrays as $path) {
77            if (is_file($path)) {
78
79                // ファイル名を取得
80                $fileName = pathinfo($path, PATHINFO_BASENAME);
81
82                // 拡張子を取得
83                $suffix = pathinfo($path, PATHINFO_EXTENSION);
84
85                // distinfo の変数定義
86                $distinfo = isset($distinfo) ? $distinfo : "";
87
88                // distinfo.php を読み込む
89                if ($fileName == "distinfo.php") {
90                    include_once($path);
91                }
92
93                // 除外ファイルをスキップ
94                if (in_array($fileName, $excludeArray)) {
95                    $arrLog['ok'][] = "次のファイルは除外されました: " . $path;
96                    continue;
97                }
98
99                // sha1 を取得
100                $sha1 = sha1_file($path);
101
102                //$arrLog[] = $sha1 . " => " . $path;
103
104                // 変換対象を順に処理
105                foreach ($includeArray as $include) {
106                    if ($suffix == $include) {
107
108                        // ファイル内容を取得
109                        $contents = file_get_contents($path);
110
111                        // 書き出し先を取得
112                        if (!empty($distinfo[$sha1])) {
113                            $out = $distinfo[$sha1];
114                        } else {
115                            $arrLog['err'][] = "ハッシュ値が一致しないため, コピー先が取得できません: " . $path;
116                            break 2;
117                        }
118
119                        // パーミッションチェック
120                        /**
121                        if ($check_only) {
122                            if(!is_writable($out)) {
123                                $this->mkdir_p($out);
124                                if (!is_writable($out)) {
125                                    $arrLog['err'][] = "コピー先に書き込み権限がありません: " . $out;
126                                }
127                            }
128                            continue;
129                        }**/
130
131                        // バックアップを作成
132                        if (file_exists($out)) {
133                            $bkupTo = $bkupPathFile . pathinfo($out, PATHINFO_BASENAME);
134                            $bkupDistInfoArray[sha1_file($out)] = $out;
135
136                            if (!@copy($out, $bkupTo)) {
137                                $arrLog['err'][] = "バックアップファイルの作成に失敗しました: " . $out . ' -> ' . $bkupTo;
138                                break 2;
139                            }
140                            $arrLog['ok'][]
141                                 = "バックアップファイルの作成に成功しました: " . $out . ' -> ' . $bkupTo;
142                        }
143
144                        // ファイルを書き出しモードで開く
145                        $handle = @fopen($out, "w");
146                        if (!$handle) {
147                            // ディレクトリ作成を行ってリトライ
148                            $this->mkdir_p($out);
149                            $handle = @fopen($out, "w");
150                            if (!$handle) {
151                                $arrLog['err'][] = "コピー先に書き込み権限がありません: " . $out;
152                                continue;
153                            }
154                        }
155
156                        // 取得した内容を書き込む
157                        if (fwrite($handle, $contents) === false) {
158                            $arrLog['err'][] = "コピー先に書き込み権限がありません: " . $out;
159                            continue;
160                        }
161
162                        $arrLog['ok'][] =  "ファイルのコピーに成功しました: " . $out;
163                        // ファイルを閉じる
164                        fclose($handle);
165                    }
166                }
167            }
168        }
169        $src = $this->makeDistInfo($bkupDistInfoArray);
170        if (is_writable($bkupPath)) {
171            $handle = @fopen($bkupPath . 'distinfo.php', "w");
172            @fwrite($handle, $src);
173            @fclose($handle);
174            $arrLog['ok'][] =  "distinfoファイルの作成に成功しました: " . $bkupPath . 'distinfo.php';
175        } else {
176            $arrLog['err'][] = "distinfoファイルの作成に失敗しました: " . $bkupPath . 'distinfo.php';
177        }
178        umask($oldMask);
179        return $arrLog;
180    }
181
182    /**
183     * $dir を再帰的に辿ってパス名を配列で返す.
184     *
185     * @param string 任意のパス名
186     * @return array $dir より下層に存在するパス名の配列
187     * @see http://www.php.net/glob
188     */
189    function listdirs($dir) {
190        static $alldirs = array();
191        $dirs = glob($dir . '/*');
192        if (is_array($dirs) && count($dirs) > 0) {
193            foreach ($dirs as $d) $alldirs[] = $d;
194        }
195        if (is_array($dirs)) {
196            foreach ($dirs as $dir) $this->listdirs($dir);
197        }
198        return $alldirs;
199    }
200
201    /**
202     * mkdir -p
203     *
204     * @param string $path 絶対パス
205     */
206    function mkdir_p($path){
207        $path = dirname($path);
208        $path = str_replace ('\\', '/', $path);
209
210        $arrDirs = explode("/", $path);
211        $dir = '';
212
213        foreach($arrDirs as $n){
214            $dir .= $n . '/';
215            if(!file_exists($dir)) {
216                if (!@mkdir($dir)) break;
217            }
218        }
219    }
220
221    function makeDistInfo($bkupDistInfoArray) {
222        $src = "<?php\n"
223             . '$distifo = array(' . "\n";
224
225        foreach ($bkupDistInfoArray as $key => $value) {
226            $src .= "'${key}' => '${value}',\n";
227        }
228        $src .= ");\n?>";
229
230        return $src;
231    }
232}
233?>
Note: See TracBrowser for help on using the repository browser.