source: branches/feature-module-update/data/class/pages/upgrade/LC_Page_Upgrade_Download.php @ 16623

Revision 16623, 8.5 KB checked in by adachi, 14 years ago (diff)

リファクタリング

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-httpd-php
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 . 'pages/LC_Page.php';
26require_once 'utils/LC_Utils_Upgrade.php';
27require_once 'utils/LC_Utils_Upgrade_Log.php';
28
29/**
30 * オーナーズストアからダウンロードデータを取得する.
31 *
32 * TODO 要リファクタリング
33 *
34 * @package Page
35 * @author LOCKON CO.,LTD.
36 * @version $Id$
37 */
38class LC_Page_Upgrade_Download extends LC_Page {
39
40    // }}}
41    // {{{ functions
42
43    /**
44     * Page を初期化する.
45     *
46     * @return void
47     */
48    function init() {
49        $this->objJson = new Services_Json();
50        $this->objLog = new LC_Utils_Upgrade_Log('Download');
51
52        $this->objForm = new SC_FormParam();
53        $this->objForm->addParam(
54            'product_id', 'product_id', INT_LEN, '',
55            array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK')
56        );
57        $this->objForm->setParam($_POST);
58
59    }
60
61    /**
62     * Page のプロセス.
63     *
64     * @return void
65     */
66    function process() {
67        $this->objLog->start();
68
69        // 管理画面ログインチェック
70        $this->objLog->log('* admin auth start');
71        if (LC_Utils_Upgrade::isLoggedInAdminPage() !== true) {
72            $arrErr = array(
73                'status'  => OWNERSSTORE_STATUS_ERROR,
74                'errcode' => OWNERSSTORE_ERR_DL_ADMIN_AUTH,
75                'body' => LC_Utils_Upgrade::getErrMessage(OWNERSSTORE_ERR_DL_ADMIN_AUTH)
76            );
77            echo $this->objJson->encode($arrErr);
78            $this->objLog->errLog($arrErr['errcode']);
79            exit;
80        }
81
82        // パラメーチェック
83        $this->objLog->log('* post parameter check start');
84        if ($this->objForm->checkError()) {
85            $arrErr = array(
86                'status'  => OWNERSSTORE_STATUS_ERROER,
87                'errcode' => OWNERSSTORE_ERR_DL_POST_PARAM,
88                'body' => LC_Utils_Upgrade::getErrMessage(OWNERSSTORE_ERR_DL_POST_PARAM)
89            );
90            echo $this->objJson->encode($arrErr);
91            $this->objLog->errLog($arrErr['errcode'], $_POST);
92            exit;
93        }
94
95        // TODO CSRF対策が必須
96
97        // ダウンロードリクエストを開始
98        $this->objLog->log('* http request start');
99        $objReq = LC_Utils_Upgrade::request(
100            'download',
101            array('product_id' => $this->objForm->getValue('product_id'))
102        );
103
104        // リクエストの懸賞
105        $this->objLog->log('* http request check start');
106        if (PEAR::isError($objReq)) {
107            $arrErr = array(
108                'status'  => OWNERSSTORE_STATUS_ERROR,
109                'errcode' => OWNERSSTORE_ERR_DL_HTTP_REQ,
110                'body' => LC_Utils_Upgrade::getErrMessage(OWNERSSTORE_ERR_DL_HTTP_REQ)
111            );
112            echo $this->objJson->encode($arrErr);
113            $this->objLog->errLog($arrErr['errcode'], $objReq);
114            exit;
115        }
116
117        // レスポンスの検証
118        $this->objLog->log('* http response check start');
119        if ($objReq->getResponseCode() !== 200) {
120            $arrErr = array(
121                'status'  => OWNERSSTORE_STATUS_ERROR,
122                'errcode' => OWNERSSTORE_ERR_DL_HTTP_RESP_CODE,
123                'body' => LC_Utils_Upgrade::getErrMessage(OWNERSSTORE_ERR_DL_HTTP_RESP_CODE)
124            );
125            echo $this->objJson->encode($arrErr);
126            $this->objLog->errLog($arrErr['errcode'], $objReq);
127            exit;
128        }
129
130        // JSONデータの検証
131        $body = $objReq->getResponseBody();
132        $objRet = $this->objJson->decode($body);
133
134        $this->objLog->log('* json data check start');
135        if (empty($objRet)) {
136            $arrErr = array(
137                'status'  => OWNERSSTORE_STATUS_ERROR,
138                'errcode' => OWNERSSTORE_ERR_DL_INVALID_JSON_DATA,
139                'body' => LC_Utils_Upgrade::getErrMessage(OWNERSSTORE_ERR_DL_INVALID_JSON_DATA)
140            );
141            echo $this->objJson->encode($arrErr);
142            $this->objLog->errLog($arrErr['errcode'], $objReq);
143            exit;
144        }
145        // ダウンロードデータの保存
146        if ($objRet->status === OWNERSSTORE_STATUS_SUCCESS) {
147           $this->objLog->log('* save file start');
148            $time = time();
149            $dir  = DATA_PATH . 'downloads/tmp/';
150            $filename = $time . '.tar.gz';
151
152            $data = base64_decode($objRet->body);
153
154            if ($fp = fopen($dir . $filename, "w")) {
155                fwrite($fp, $data);
156                fclose($fp);
157            } else {
158                $arrErr = array(
159                    'status'  => OWNERSSTORE_STATUS_ERROR,
160                    'errcode' => OWNERSSTORE_ERR_DL_FILE_WRITE,
161                    'body' => LC_Utils_Upgrade::getErrMessage(OWNERSSTORE_ERR_DL_FILE_WRITE)
162                );
163                echo $this->objJson->encode($arrErr);
164                $this->objLog->errLog($arrErr['errcode'], $dir . $filename);
165                exit;
166            }
167
168            // ダウンロードアーカイブを展開する
169            $exract_dir = $dir . $time;
170            if (!@mkdir($exract_dir)) {
171                $arrErr = array(
172                    'status'  => OWNERSSTORE_STATUS_ERROR,
173                    'errcode' => OWNERSSTORE_ERR_DL_MKDIR,
174                    'body' => LC_Utils_Upgrade::getErrMessage(OWNERSSTORE_ERR_DL_MKDIR)
175                );
176                echo $this->objJson->encode($arrErr);
177                $this->objLog->errLog($arrErr['errcode'], $exract_dir);
178                exit;
179            }
180
181            $tar = new Archive_Tar($dir . $filename);
182            $tar->extract($exract_dir);
183
184            include_once CLASS_PATH . 'batch/SC_Batch_Update.php';
185            $objBatch = new SC_Batch_Update();
186            $arrCopyLog = $objBatch->execute($exract_dir);
187
188            // テーブルの更新
189            $this->updateMdlTable($objRet->product_data);
190
191            // 配信サーバへ通知
192            $this->notifyDownload($objReq->getResponseCookies());
193
194            $arrParam = array(
195                'status'  => OWNERSSTORE_STATUS_SUCCESS,
196                'body' => 'インストール/アップデートに成功しました!'
197            );
198            echo $this->objJson->encode($arrParam);
199            $this->objLog->log('* file save ok');
200            exit;
201        } else {
202            echo $body;
203            $this->objLog->errLog($arrErr['errcode'], array($objRet, $objReq));
204            exit;
205        }
206    }
207
208    /**
209     * デストラクタ
210     *
211     * @return void
212     */
213    function destroy() {
214        $this->objLog->end();
215    }
216
217    /**
218     * dtb_moduleを更新する
219     *
220     * @param object $objRet
221     */
222    function updateMdlTable($objRet) {
223        $table = 'dtb_module';
224        $where = 'module_id = ?';
225        $objQuery = new SC_Query;
226
227        $count = $objQuery->count($table, $where, array($objRet->product_id));
228        if ($count) {
229            $arrUpdate = array(
230                'module_name' => $objRet->name,
231                'update_date' => 'NOW()'
232            );
233            $objQuery->update($table, $arrUpdate ,$where, array($objRet->product_id));
234        } else {
235            $arrInsert = array(
236                'module_id' => $objRet->product_id,
237                'module_name' => $objRet->name,
238                'auto_update_flg' => '0',
239                'create_date'     => 'NOW()',
240                'update_date' => 'NOW()'
241            );
242            $objQuery->insert($table, $arrInsert);
243        }
244    }
245
246    /**
247     * 配信サーバへダウンロード完了を通知する.
248     *
249     * FIXME エラーコード追加
250     * @param array #arrCookies Cookie配列
251     * @retrun
252     */
253    function notifyDownload($arrCookies) {
254        $objReq = LC_Utils_Upgrade::request('download_log', array(), $arrCookies);
255
256        return true;
257    }
258}
259?>
Note: See TracBrowser for help on using the repository browser.