1
|
|
|
<?php |
2
|
|
|
/* Copyright (C) NAVER <http://www.navercorp.com> */ |
3
|
|
|
/** |
4
|
|
|
* @class installController |
5
|
|
|
* @author NAVER ([email protected]) |
6
|
|
|
* @brief install module of the Controller class |
7
|
|
|
*/ |
8
|
|
|
class installController extends install |
9
|
|
|
{ |
10
|
|
|
var $db_tmp_config_file = ''; |
11
|
|
|
var $etc_tmp_config_file = ''; |
12
|
|
|
var $flagLicenseAgreement = './files/env/license_agreement'; |
13
|
|
|
|
14
|
|
|
/** |
15
|
|
|
* @brief Initialization |
16
|
|
|
*/ |
17
|
|
|
function init() |
18
|
|
|
{ |
19
|
|
|
// Error occurs if already installed |
20
|
|
|
if($this->act !== 'procInstallLicenseAggrement' && Context::isInstalled()) |
21
|
|
|
{ |
22
|
|
|
$this->stop('msg_already_installed'); |
23
|
|
|
} |
24
|
|
|
|
25
|
|
|
$this->db_tmp_config_file = _XE_PATH_.'files/config/tmpDB.config.php'; |
26
|
|
|
$this->etc_tmp_config_file = _XE_PATH_.'files/config/tmpEtc.config.php'; |
27
|
|
|
} |
28
|
|
|
|
29
|
|
|
/** |
30
|
|
|
* @brief cubrid db setting wrapper, becase Server Side Validator... |
31
|
|
|
* Server Side Validatro can use only one proc, one ruleset |
32
|
|
|
*/ |
33
|
|
|
function procCubridDBSetting() |
34
|
|
|
{ |
35
|
|
|
return $this->_procDBSetting(); |
36
|
|
|
} |
37
|
|
|
|
38
|
|
|
/** |
39
|
|
|
* @brief firebird db setting wrapper, becase Server Side Validator... |
40
|
|
|
* Server Side Validatro can use only one proc, one ruleset |
41
|
|
|
*/ |
42
|
|
|
function procFirebirdDBSetting() |
43
|
|
|
{ |
44
|
|
|
return $this->_procDBSetting(); |
45
|
|
|
} |
46
|
|
|
|
47
|
|
|
/** |
48
|
|
|
* @brief mssql db setting wrapper, becase Server Side Validator... |
49
|
|
|
* Server Side Validatro can use only one proc, one ruleset |
50
|
|
|
*/ |
51
|
|
|
function procMssqlDBSetting() |
52
|
|
|
{ |
53
|
|
|
return $this->_procDBSetting(); |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
/** |
57
|
|
|
* @brief mysql db setting wrapper, becase Server Side Validator... |
58
|
|
|
* Server Side Validatro can use only one proc, one ruleset |
59
|
|
|
*/ |
60
|
|
|
function procMysqlDBSetting() |
61
|
|
|
{ |
62
|
|
|
return $this->_procDBSetting(); |
63
|
|
|
} |
64
|
|
|
|
65
|
|
|
/** |
66
|
|
|
* @brief postgresql db setting wrapper, becase Server Side Validator... |
67
|
|
|
* Server Side Validatro can use only one proc, one ruleset |
68
|
|
|
*/ |
69
|
|
|
function procPostgresqlDBSetting() |
70
|
|
|
{ |
71
|
|
|
return $this->_procDBSetting(); |
72
|
|
|
} |
73
|
|
|
|
74
|
|
|
/** |
75
|
|
|
* @brief sqlite db setting wrapper, becase Server Side Validator... |
76
|
|
|
* Server Side Validatro can use only one proc, one ruleset |
77
|
|
|
*/ |
78
|
|
|
function procSqliteDBSetting() |
79
|
|
|
{ |
80
|
|
|
return $this->_procDBSetting(); |
81
|
|
|
} |
82
|
|
|
|
83
|
|
|
/** |
84
|
|
|
* @brief division install step... DB Config temp file create |
85
|
|
|
*/ |
86
|
|
|
function _procDBSetting() |
87
|
|
|
{ |
88
|
|
|
// Get DB-related variables |
89
|
|
|
$con_string = Context::gets('db_type','db_port','db_hostname','db_userid','db_password','db_database','db_table_prefix'); |
90
|
|
|
|
91
|
|
|
$db_info = new stdClass(); |
92
|
|
|
$db_info->master_db = get_object_vars($con_string); |
93
|
|
|
$db_info->slave_db = array($db_info->master_db); |
94
|
|
|
$db_info->default_url = Context::getRequestUri(); |
95
|
|
|
$db_info->lang_type = Context::getLangType(); |
96
|
|
|
$db_info->use_mobile_view = 'Y'; |
97
|
|
|
|
98
|
|
|
// Set DB type and information |
99
|
|
|
Context::setDBInfo($db_info); |
100
|
|
|
|
101
|
|
|
// Check if available to connect to the DB |
102
|
|
|
$oDB = &DB::getInstance(); |
103
|
|
|
$output = $oDB->getError(); |
104
|
|
|
if(!$output->toBool()) return $output; |
105
|
|
|
if(!$oDB->isConnected()) return $oDB->getError(); |
106
|
|
|
|
107
|
|
|
// Create a db temp config file |
108
|
|
|
if(!$this->makeDBConfigFile()) return new Object(-1, 'msg_install_failed'); |
|
|
|
|
109
|
|
|
|
110
|
|
View Code Duplication |
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) |
111
|
|
|
{ |
112
|
|
|
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'act', 'dispInstallConfigForm'); |
113
|
|
|
header('location:'.$returnUrl); |
114
|
|
|
return; |
115
|
|
|
} |
116
|
|
|
} |
117
|
|
|
|
118
|
|
|
/** |
119
|
|
|
* @brief division install step... rewrite, time_zone Config temp file create |
120
|
|
|
*/ |
121
|
|
|
function procConfigSetting() |
122
|
|
|
{ |
123
|
|
|
// Get variables |
124
|
|
|
$config_info = Context::gets('use_rewrite','time_zone'); |
125
|
|
|
if($config_info->use_rewrite!='Y') $config_info->use_rewrite = 'N'; |
126
|
|
|
|
127
|
|
|
// Create a db temp config file |
128
|
|
|
if(!$this->makeEtcConfigFile($config_info)) return new Object(-1, 'msg_install_failed'); |
129
|
|
|
|
130
|
|
View Code Duplication |
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) |
131
|
|
|
{ |
132
|
|
|
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'act', 'dispInstallManagerForm'); |
133
|
|
|
header('location:'.$returnUrl); |
134
|
|
|
return; |
135
|
|
|
} |
136
|
|
|
} |
137
|
|
|
|
138
|
|
|
/** |
139
|
|
|
* @brief Install with received information |
140
|
|
|
*/ |
141
|
|
|
function procInstall() |
142
|
|
|
{ |
143
|
|
|
// Check if it is already installed |
144
|
|
|
if(Context::isInstalled()) return new Object(-1, 'msg_already_installed'); |
145
|
|
|
|
146
|
|
|
// Assign a temporary administrator when installing |
147
|
|
|
$logged_info = new stdClass(); |
148
|
|
|
$logged_info->is_admin = 'Y'; |
149
|
|
|
Context::set('logged_info', $logged_info); |
|
|
|
|
150
|
|
|
|
151
|
|
|
// check install config |
152
|
|
|
if(Context::get('install_config')) |
153
|
|
|
{ |
154
|
|
|
$db_info = $this->_makeDbInfoByInstallConfig(); |
155
|
|
|
} |
156
|
|
|
// install by default XE UI |
157
|
|
|
else |
158
|
|
|
{ |
159
|
|
|
if(FileHandler::exists($this->db_tmp_config_file)) include $this->db_tmp_config_file; |
|
|
|
|
160
|
|
|
if(FileHandler::exists($this->etc_tmp_config_file)) include $this->etc_tmp_config_file; |
|
|
|
|
161
|
|
|
} |
162
|
|
|
|
163
|
|
|
// Set DB type and information |
164
|
|
|
Context::setDBInfo($db_info); |
|
|
|
|
165
|
|
|
// Create DB Instance |
166
|
|
|
$oDB = &DB::getInstance(); |
167
|
|
|
// Check if available to connect to the DB |
168
|
|
|
if(!$oDB->isConnected()) return $oDB->getError(); |
169
|
|
|
|
170
|
|
|
// Install all the modules |
171
|
|
|
try { |
172
|
|
|
$oDB->begin(); |
173
|
|
|
$this->installDownloadedModule(); |
174
|
|
|
$oDB->commit(); |
175
|
|
|
} catch(Exception $e) { |
176
|
|
|
$oDB->rollback(); |
177
|
|
|
return new Object(-1, $e->getMessage()); |
178
|
|
|
} |
179
|
|
|
|
180
|
|
|
// Create a config file |
181
|
|
|
if(!$this->makeConfigFile()) return new Object(-1, 'msg_install_failed'); |
|
|
|
|
182
|
|
|
|
183
|
|
|
// load script |
184
|
|
|
$scripts = FileHandler::readDir(_XE_PATH_ . 'modules/install/script', '/(\.php)$/'); |
185
|
|
|
if(count($scripts)>0) |
186
|
|
|
{ |
187
|
|
|
sort($scripts); |
188
|
|
|
foreach($scripts as $script) |
189
|
|
|
{ |
190
|
|
|
$script_path = FileHandler::getRealPath('./modules/install/script/'); |
191
|
|
|
$output = include($script_path . $script); |
192
|
|
|
} |
193
|
|
|
} |
194
|
|
|
|
195
|
|
|
// save selected lang info |
196
|
|
|
$oInstallAdminController = getAdminController('install'); |
197
|
|
|
$oInstallAdminController->saveLangSelected(array(Context::getLangType())); |
198
|
|
|
|
199
|
|
|
// Display a message that installation is completed |
200
|
|
|
$this->setMessage('msg_install_completed'); |
201
|
|
|
|
202
|
|
|
unset($_SESSION['use_rewrite']); |
203
|
|
|
|
204
|
|
View Code Duplication |
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) |
205
|
|
|
{ |
206
|
|
|
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl(''); |
207
|
|
|
header('location:'.$returnUrl); |
208
|
|
|
return new Object(); |
209
|
|
|
} |
210
|
|
|
} |
211
|
|
|
|
212
|
|
|
/** |
213
|
|
|
* @brief Make DB Information by Install Config |
214
|
|
|
*/ |
215
|
|
|
function _makeDbInfoByInstallConfig() |
216
|
|
|
{ |
217
|
|
|
$db_info = new stdClass(); |
218
|
|
|
$db_info->master_db = array( |
219
|
|
|
'db_type' => Context::get('db_type'), |
220
|
|
|
'db_port' => Context::get('db_port'), |
221
|
|
|
'db_hostname' => Context::get('db_hostname'), |
222
|
|
|
'db_userid' => Context::get('db_userid'), |
223
|
|
|
'db_password' => Context::get('db_password'), |
224
|
|
|
'db_database' => Context::get('db_database'), |
225
|
|
|
'db_table_prefix' => Context::get('db_table_prefix') |
226
|
|
|
); |
227
|
|
|
$db_info->slave_db = array($db_info->master_db); |
228
|
|
|
$db_info->default_url = Context::getRequestUri(); |
229
|
|
|
$db_info->lang_type = Context::get('lang_type') ? Context::get('lang_type') : Context::getLangType(); |
230
|
|
|
Context::setLangType($db_info->lang_type); |
231
|
|
|
$db_info->use_rewrite = Context::get('use_rewrite'); |
232
|
|
|
$db_info->time_zone = Context::get('time_zone'); |
233
|
|
|
|
234
|
|
|
if($_SERVER['HTTPS'] == 'on') |
235
|
|
|
{ |
236
|
|
|
$https_port = (Context::get('https_port')) ? Context::get('https_port') : $_SERVER['SERVER_PORT']; |
237
|
|
|
$https_port = (!$https_port != 443) ? $https_port : null; |
238
|
|
|
} |
239
|
|
|
else |
240
|
|
|
{ |
241
|
|
|
$http_port = (Context::get('http_port')) ? Context::get('http_port') : $_SERVER['SERVER_PORT']; |
242
|
|
|
$http_port = (!$http_port != 80) ? $http_port : null; |
243
|
|
|
} |
244
|
|
|
if($http_port) $db_info->http_port = $http_port; |
|
|
|
|
245
|
|
|
if($https_port) $db_info->https_port = $https_port; |
|
|
|
|
246
|
|
|
|
247
|
|
|
return $db_info; |
248
|
|
|
} |
249
|
|
|
|
250
|
|
|
/** |
251
|
|
|
* @brief Set FTP Information |
252
|
|
|
*/ |
253
|
|
|
function procInstallFTP() |
254
|
|
|
{ |
255
|
|
|
if(Context::isInstalled()) return new Object(-1, 'msg_already_installed'); |
256
|
|
|
$ftp_info = Context::gets('ftp_host', 'ftp_user','ftp_password','ftp_port','ftp_root_path'); |
257
|
|
|
$ftp_info->ftp_port = (int)$ftp_info->ftp_port; |
258
|
|
|
if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21; |
259
|
|
|
if(!$ftp_info->ftp_host) $ftp_info->ftp_host = '127.0.0.1'; |
260
|
|
|
if(!$ftp_info->ftp_root_path) $ftp_info->ftp_root_path = '/'; |
261
|
|
|
|
262
|
|
|
$buff = array('<?php if(!defined("__XE__")) exit();'); |
263
|
|
|
$buff[] = "\$ftp_info = new stdClass();"; |
264
|
|
|
foreach($ftp_info as $key => $val) |
|
|
|
|
265
|
|
|
{ |
266
|
|
|
$buff[] = sprintf("\$ftp_info->%s='%s';", $key, str_replace("'","\\'",$val)); |
267
|
|
|
} |
268
|
|
|
|
269
|
|
|
// If safe_mode |
270
|
|
|
if(ini_get('safe_mode')) |
271
|
|
|
{ |
272
|
|
|
if(!$ftp_info->ftp_user || !$ftp_info->ftp_password) return new Object(-1,'msg_safe_mode_ftp_needed'); |
273
|
|
|
|
274
|
|
|
require_once(_XE_PATH_.'libs/ftp.class.php'); |
275
|
|
|
$oFtp = new ftp(); |
276
|
|
View Code Duplication |
if(!$oFtp->ftp_connect($ftp_info->ftp_host, $ftp_info->ftp_port)) return new Object(-1, sprintf(Context::getLang('msg_ftp_not_connected'), 'host')); |
277
|
|
|
|
278
|
|
View Code Duplication |
if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) |
279
|
|
|
{ |
280
|
|
|
$oFtp->ftp_quit(); |
281
|
|
|
return new Object(-1,'msg_ftp_invalid_auth_info'); |
282
|
|
|
} |
283
|
|
|
|
284
|
|
View Code Duplication |
if(!is_dir(_XE_PATH_.'files') && !$oFtp->ftp_mkdir($ftp_info->ftp_root_path.'files')) |
285
|
|
|
{ |
286
|
|
|
$oFtp->ftp_quit(); |
287
|
|
|
return new Object(-1,'msg_ftp_mkdir_fail'); |
288
|
|
|
} |
289
|
|
|
|
290
|
|
View Code Duplication |
if(!$oFtp->ftp_site("CHMOD 777 ".$ftp_info->ftp_root_path.'files')) |
291
|
|
|
{ |
292
|
|
|
$oFtp->ftp_quit(); |
293
|
|
|
return new Object(-1,'msg_ftp_chmod_fail'); |
294
|
|
|
} |
295
|
|
|
|
296
|
|
View Code Duplication |
if(!is_dir(_XE_PATH_.'files/config') && !$oFtp->ftp_mkdir($ftp_info->ftp_root_path.'files/config')) |
297
|
|
|
{ |
298
|
|
|
$oFtp->ftp_quit(); |
299
|
|
|
return new Object(-1,'msg_ftp_mkdir_fail'); |
300
|
|
|
} |
301
|
|
|
|
302
|
|
View Code Duplication |
if(!$oFtp->ftp_site("CHMOD 777 ".$ftp_info->ftp_root_path.'files/config')) |
303
|
|
|
{ |
304
|
|
|
$oFtp->ftp_quit(); |
305
|
|
|
return new Object(-1,'msg_ftp_chmod_fail'); |
306
|
|
|
} |
307
|
|
|
|
308
|
|
|
$oFtp->ftp_quit(); |
309
|
|
|
} |
310
|
|
|
|
311
|
|
|
FileHandler::WriteFile(Context::getFTPConfigFile(), join(PHP_EOL, $buff)); |
312
|
|
|
} |
313
|
|
|
|
314
|
|
|
function procInstallCheckFtp() |
315
|
|
|
{ |
316
|
|
|
$ftp_info = Context::gets('ftp_user','ftp_password','ftp_port','sftp'); |
317
|
|
|
$ftp_info->ftp_port = (int)$ftp_info->ftp_port; |
318
|
|
|
if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21; |
319
|
|
|
if(!$ftp_info->sftp) $ftp_info->sftp = 'N'; |
320
|
|
|
|
321
|
|
|
if(!$ftp_info->ftp_user || !$ftp_info->ftp_password) return new Object(-1,'msg_safe_mode_ftp_needed'); |
322
|
|
|
|
323
|
|
|
if($ftp_info->sftp == 'Y') |
324
|
|
|
{ |
325
|
|
|
$connection = ssh2_connect('localhost', $ftp_info->ftp_port); |
326
|
|
|
if(!ssh2_auth_password($connection, $ftp_info->ftp_user, $ftp_info->ftp_password)) |
327
|
|
|
{ |
328
|
|
|
return new Object(-1,'msg_ftp_invalid_auth_info'); |
329
|
|
|
} |
330
|
|
|
} |
331
|
|
|
else |
332
|
|
|
{ |
333
|
|
|
require_once(_XE_PATH_.'libs/ftp.class.php'); |
334
|
|
|
$oFtp = new ftp(); |
335
|
|
|
if(!$oFtp->ftp_connect('127.0.0.1', $ftp_info->ftp_port)) return new Object(-1, sprintf(Context::getLang('msg_ftp_not_connected'), 'localhost')); |
336
|
|
|
|
337
|
|
View Code Duplication |
if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) |
338
|
|
|
{ |
339
|
|
|
$oFtp->ftp_quit(); |
340
|
|
|
return new Object(-1,'msg_ftp_invalid_auth_info'); |
341
|
|
|
} |
342
|
|
|
$oFtp->ftp_quit(); |
343
|
|
|
} |
344
|
|
|
|
345
|
|
|
$this->setMessage('msg_ftp_connect_success'); |
346
|
|
|
} |
347
|
|
|
|
348
|
|
|
/** |
349
|
|
|
* @brief Result returned after checking the installation environment |
350
|
|
|
*/ |
351
|
|
|
function checkInstallEnv() |
352
|
|
|
{ |
353
|
|
|
// Check each item |
354
|
|
|
$checklist = array(); |
355
|
|
|
// 0. check your version of php (5.2.4 or higher) |
356
|
|
|
$checklist['php_version'] = true; |
357
|
|
|
if(version_compare(PHP_VERSION, __XE_MIN_PHP_VERSION__, '<')) |
358
|
|
|
{ |
359
|
|
|
$checklist['php_version'] = false; |
360
|
|
|
} |
361
|
|
|
|
362
|
|
|
if(version_compare(PHP_VERSION, __XE_RECOMMEND_PHP_VERSION__, '<')) |
363
|
|
|
{ |
364
|
|
|
Context::set('phpversion_warning', true); |
|
|
|
|
365
|
|
|
} |
366
|
|
|
|
367
|
|
|
// 1. Check permission |
368
|
|
|
if(is_writable('./')||is_writable('./files')) $checklist['permission'] = true; |
369
|
|
|
else $checklist['permission'] = false; |
370
|
|
|
// 2. Check if xml_parser_create exists |
371
|
|
|
if(function_exists('xml_parser_create')) $checklist['xml'] = true; |
372
|
|
|
else $checklist['xml'] = false; |
373
|
|
|
// 3. Check if ini_get (session.auto_start) == 1 |
374
|
|
|
if(ini_get('session.auto_start')!=1) $checklist['session'] = true; |
375
|
|
|
else $checklist['session'] = false; |
376
|
|
|
// 4. Check if iconv exists |
377
|
|
|
if(function_exists('iconv')) $checklist['iconv'] = true; |
378
|
|
|
else $checklist['iconv'] = false; |
379
|
|
|
// 5. Check gd(imagecreatefromgif function) |
380
|
|
|
if(function_exists('imagecreatefromgif')) $checklist['gd'] = true; |
381
|
|
|
else $checklist['gd'] = false; |
382
|
|
|
// 6. Check DB |
383
|
|
|
if(DB::getEnableList()) $checklist['db'] = true; |
384
|
|
|
else $checklist['db'] = false; |
385
|
|
|
|
386
|
|
|
if(!$checklist['php_version'] || !$checklist['permission'] || !$checklist['xml'] || !$checklist['session'] || !$checklist['db']) $install_enable = false; |
387
|
|
|
else $install_enable = true; |
388
|
|
|
|
389
|
|
|
// Save the checked result to the Context |
390
|
|
|
Context::set('checklist', $checklist); |
|
|
|
|
391
|
|
|
Context::set('install_enable', $install_enable); |
|
|
|
|
392
|
|
|
Context::set('phpversion', PHP_VERSION); |
393
|
|
|
|
394
|
|
|
return $install_enable; |
395
|
|
|
} |
396
|
|
|
|
397
|
|
|
/** |
398
|
|
|
* @brief License agreement |
399
|
|
|
*/ |
400
|
|
|
function procInstallLicenseAggrement() |
401
|
|
|
{ |
402
|
|
|
$vars = Context::getRequestVars(); |
403
|
|
|
|
404
|
|
|
$license_agreement = ($vars->license_agreement == 'Y') ? true : false; |
405
|
|
|
|
406
|
|
|
if($license_agreement) |
407
|
|
|
{ |
408
|
|
|
$currentTime = $_SERVER['REQUEST_TIME']; |
409
|
|
|
FileHandler::writeFile($this->flagLicenseAgreement, $currentTime); |
410
|
|
|
} |
411
|
|
|
else |
412
|
|
|
{ |
413
|
|
|
FileHandler::removeFile($this->flagLicenseAgreement); |
414
|
|
|
return new Object(-1, 'msg_must_accept_license_agreement'); |
415
|
|
|
} |
416
|
|
|
|
417
|
|
|
if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) |
418
|
|
|
{ |
419
|
|
|
$returnUrl = Context::get('success_return_url') ? Context::get('success_return_url') : getNotEncodedUrl('', 'act', 'dispInstallCheckEnv'); |
420
|
|
|
$this->setRedirectUrl($returnUrl); |
421
|
|
|
} |
422
|
|
|
} |
423
|
|
|
|
424
|
|
|
/** |
425
|
|
|
* check this server can use rewrite module |
426
|
|
|
* make a file to files/config and check url approach by ".htaccess" rules |
427
|
|
|
* |
428
|
|
|
* @return bool |
429
|
|
|
*/ |
430
|
|
|
function checkRewriteUsable() { |
431
|
|
|
$checkString = "isApproached"; |
432
|
|
|
$checkFilePath = 'files/config/tmpRewriteCheck.txt'; |
433
|
|
|
|
434
|
|
|
FileHandler::writeFile(_XE_PATH_.$checkFilePath, trim($checkString)); |
435
|
|
|
|
436
|
|
|
$scheme = ($_SERVER['HTTPS'] === 'on') ? 'https' : 'http'; |
437
|
|
|
$hostname = $_SERVER['SERVER_NAME']; |
438
|
|
|
$port = $_SERVER['SERVER_PORT']; |
439
|
|
|
$str_port = ''; |
440
|
|
|
if($port) |
441
|
|
|
{ |
442
|
|
|
$str_port = ':' . $port; |
443
|
|
|
} |
444
|
|
|
|
445
|
|
|
$tmpPath = $_SERVER['DOCUMENT_ROOT']; |
446
|
|
|
|
447
|
|
|
//if DIRECTORY_SEPARATOR is not /(IIS) |
448
|
|
|
if(DIRECTORY_SEPARATOR !== '/') |
449
|
|
|
{ |
450
|
|
|
//change to slash for compare |
451
|
|
|
$tmpPath = str_replace(DIRECTORY_SEPARATOR, '/', $_SERVER['DOCUMENT_ROOT']); |
452
|
|
|
} |
453
|
|
|
|
454
|
|
|
$query = "/JUST/CHECK/REWRITE/" . $checkFilePath; |
455
|
|
|
$currentPath = str_replace($tmpPath, "", _XE_PATH_); |
456
|
|
|
if($currentPath != "") |
457
|
|
|
{ |
458
|
|
|
$query = $currentPath . $query; |
459
|
|
|
} |
460
|
|
|
$requestUrl = sprintf('%s://%s%s%s', $scheme, $hostname, $str_port, $query); |
461
|
|
|
$requestConfig = array(); |
462
|
|
|
$requestConfig['ssl_verify_peer'] = false; |
463
|
|
|
$buff = FileHandler::getRemoteResource($requestUrl, null, 3, 'GET', null, array(), array(), array(), $requestConfig); |
464
|
|
|
|
465
|
|
|
FileHandler::removeFile(_XE_PATH_.$checkFilePath); |
466
|
|
|
|
467
|
|
|
return (trim($buff) == $checkString); |
468
|
|
|
} |
469
|
|
|
|
470
|
|
|
/** |
471
|
|
|
* @brief Create files and subdirectories |
472
|
|
|
* Local evironment setting before installation by using DB information |
473
|
|
|
*/ |
474
|
|
|
function makeDefaultDirectory() |
475
|
|
|
{ |
476
|
|
|
$directory_list = array( |
477
|
|
|
'./files/config', |
478
|
|
|
'./files/cache/queries', |
479
|
|
|
'./files/cache/js_filter_compiled', |
480
|
|
|
'./files/cache/template_compiled', |
481
|
|
|
); |
482
|
|
|
|
483
|
|
|
foreach($directory_list as $dir) |
484
|
|
|
{ |
485
|
|
|
FileHandler::makeDir($dir); |
486
|
|
|
} |
487
|
|
|
} |
488
|
|
|
|
489
|
|
|
/** |
490
|
|
|
* @brief Install all the modules |
491
|
|
|
* |
492
|
|
|
* Create a table by using schema xml file in the shcema directory of each module |
493
|
|
|
*/ |
494
|
|
|
function installDownloadedModule() |
495
|
|
|
{ |
496
|
|
|
$oModuleModel = getModel('module'); |
497
|
|
|
// Create a table ny finding schemas/*.xml file in each module |
498
|
|
|
$module_list = FileHandler::readDir('./modules/', NULL, false, true); |
499
|
|
|
foreach($module_list as $module_path) |
500
|
|
|
{ |
501
|
|
|
// Get module name |
502
|
|
|
$tmp_arr = explode('/',$module_path); |
503
|
|
|
$module = $tmp_arr[count($tmp_arr)-1]; |
504
|
|
|
|
505
|
|
|
$xml_info = $oModuleModel->getModuleInfoXml($module); |
506
|
|
|
if(!$xml_info) continue; |
507
|
|
|
$modules[$xml_info->category][] = $module; |
|
|
|
|
508
|
|
|
} |
509
|
|
|
// Install "module" module in advance |
510
|
|
|
$this->installModule('module','./modules/module'); |
511
|
|
|
$oModule = getClass('module'); |
512
|
|
|
if($oModule->checkUpdate()) $oModule->moduleUpdate(); |
513
|
|
|
// Determine the order of module installation depending on category |
514
|
|
|
$install_step = array('system','content','member'); |
515
|
|
|
// Install all the remaining modules |
516
|
|
|
foreach($install_step as $category) |
517
|
|
|
{ |
518
|
|
|
if(count($modules[$category])) |
519
|
|
|
{ |
520
|
|
View Code Duplication |
foreach($modules[$category] as $module) |
|
|
|
|
521
|
|
|
{ |
522
|
|
|
if($module == 'module') continue; |
523
|
|
|
$this->installModule($module, sprintf('./modules/%s', $module)); |
524
|
|
|
|
525
|
|
|
$oModule = getClass($module); |
526
|
|
|
if(is_object($oModule) && method_exists($oModule, 'checkUpdate')) |
527
|
|
|
{ |
528
|
|
|
if($oModule->checkUpdate()) $oModule->moduleUpdate(); |
529
|
|
|
} |
530
|
|
|
} |
531
|
|
|
unset($modules[$category]); |
532
|
|
|
} |
533
|
|
|
} |
534
|
|
|
// Install all the remaining modules |
535
|
|
|
if(count($modules)) |
536
|
|
|
{ |
537
|
|
|
foreach($modules as $category => $module_list) |
538
|
|
|
{ |
539
|
|
|
if(count($module_list)) |
540
|
|
|
{ |
541
|
|
View Code Duplication |
foreach($module_list as $module) |
542
|
|
|
{ |
543
|
|
|
if($module == 'module') continue; |
544
|
|
|
$this->installModule($module, sprintf('./modules/%s', $module)); |
545
|
|
|
|
546
|
|
|
$oModule = getClass($module); |
547
|
|
|
if($oModule && method_exists($oModule, 'checkUpdate') && method_exists($oModule, 'moduleUpdate')) |
548
|
|
|
{ |
549
|
|
|
if($oModule->checkUpdate()) $oModule->moduleUpdate(); |
550
|
|
|
} |
551
|
|
|
} |
552
|
|
|
} |
553
|
|
|
} |
554
|
|
|
} |
555
|
|
|
|
556
|
|
|
return new Object(); |
557
|
|
|
} |
558
|
|
|
|
559
|
|
|
/** |
560
|
|
|
* @brief Install an each module |
561
|
|
|
*/ |
562
|
|
|
function installModule($module, $module_path) |
563
|
|
|
{ |
564
|
|
|
// create db instance |
565
|
|
|
$oDB = &DB::getInstance(); |
566
|
|
|
// Create a table if the schema xml exists in the "schemas" directory of the module |
567
|
|
|
$schema_dir = sprintf('%s/schemas/', $module_path); |
568
|
|
|
$schema_files = FileHandler::readDir($schema_dir, NULL, false, true); |
569
|
|
|
|
570
|
|
|
$file_cnt = count($schema_files); |
571
|
|
|
for($i=0;$i<$file_cnt;$i++) |
572
|
|
|
{ |
573
|
|
|
$file = trim($schema_files[$i]); |
574
|
|
|
if(!$file || substr($file,-4)!='.xml') continue; |
575
|
|
|
$output = $oDB->createTableByXmlFile($file); |
|
|
|
|
576
|
|
|
if($output === false) |
577
|
|
|
throw new Exception('msg_create_table_failed'); |
578
|
|
|
} |
579
|
|
|
// Create a table and module instance and then execute install() method |
580
|
|
|
unset($oModule); |
581
|
|
|
$oModule = getClass($module); |
582
|
|
|
if(method_exists($oModule, 'moduleInstall')) $oModule->moduleInstall(); |
583
|
|
|
return new Object(); |
584
|
|
|
} |
585
|
|
|
|
586
|
|
|
function _getDBConfigFileContents($db_info) |
587
|
|
|
{ |
588
|
|
|
if(substr($db_info->master_db['db_table_prefix'], -1) != '_') |
589
|
|
|
{ |
590
|
|
|
$db_info->master_db['db_table_prefix'] .= '_'; |
591
|
|
|
} |
592
|
|
|
|
593
|
|
|
foreach($db_info->slave_db as &$slave) |
594
|
|
|
{ |
595
|
|
|
if(substr($slave['db_table_prefix'], -1) != '_') |
596
|
|
|
{ |
597
|
|
|
$slave['db_table_prefix'] .= '_'; |
598
|
|
|
} |
599
|
|
|
} |
600
|
|
|
|
601
|
|
|
$buff = array(); |
602
|
|
|
$buff[] = '<?php if(!defined("__XE__")) exit();'; |
603
|
|
|
$buff[] = '$db_info = (object)' . var_export(get_object_vars($db_info), TRUE) . ';'; |
604
|
|
|
|
605
|
|
|
return implode(PHP_EOL, $buff); |
606
|
|
|
} |
607
|
|
|
|
608
|
|
|
/** |
609
|
|
|
* @brief Create DB temp config file |
610
|
|
|
* Create the config file when all settings are completed |
611
|
|
|
*/ |
612
|
|
|
function makeDBConfigFile() |
613
|
|
|
{ |
614
|
|
|
$db_tmp_config_file = $this->db_tmp_config_file; |
615
|
|
|
|
616
|
|
|
$db_info = Context::getDBInfo(); |
617
|
|
|
if(!$db_info) return; |
618
|
|
|
|
619
|
|
|
$buff = $this->_getDBConfigFileContents($db_info); |
620
|
|
|
|
621
|
|
|
FileHandler::writeFile($db_tmp_config_file, $buff); |
622
|
|
|
|
623
|
|
|
if(@file_exists($db_tmp_config_file)) return true; |
624
|
|
|
return false; |
625
|
|
|
} |
626
|
|
|
|
627
|
|
|
/** |
628
|
|
|
* @brief Create etc config file |
629
|
|
|
* Create the config file when all settings are completed |
630
|
|
|
*/ |
631
|
|
|
function makeEtcConfigFile($config_info) |
632
|
|
|
{ |
633
|
|
|
$etc_tmp_config_file = $this->etc_tmp_config_file; |
634
|
|
|
|
635
|
|
|
$buff = '<?php if(!defined("__XE__")) exit();'."\n"; |
636
|
|
|
foreach($config_info as $key => $val) |
637
|
|
|
{ |
638
|
|
|
$buff .= sprintf("\$db_info->%s = '%s';\n", $key, str_replace("'","\\'",$val)); |
639
|
|
|
} |
640
|
|
|
|
641
|
|
|
FileHandler::writeFile($etc_tmp_config_file, $buff); |
642
|
|
|
|
643
|
|
|
if(@file_exists($etc_tmp_config_file)) return true; |
644
|
|
|
return false; |
645
|
|
|
} |
646
|
|
|
|
647
|
|
|
/** |
648
|
|
|
* @brief Create config file |
649
|
|
|
* Create the config file when all settings are completed |
650
|
|
|
*/ |
651
|
|
|
function makeConfigFile() |
652
|
|
|
{ |
653
|
|
|
try { |
654
|
|
|
$config_file = Context::getConfigFile(); |
655
|
|
|
//if(file_exists($config_file)) return; |
656
|
|
|
|
657
|
|
|
$db_info = Context::getDBInfo(); |
658
|
|
|
if(!$db_info) return; |
659
|
|
|
|
660
|
|
|
$buff = $this->_getDBConfigFileContents($db_info); |
661
|
|
|
|
662
|
|
|
FileHandler::writeFile($config_file, $buff); |
663
|
|
|
|
664
|
|
|
if(@file_exists($config_file)) |
665
|
|
|
{ |
666
|
|
|
FileHandler::removeFile($this->db_tmp_config_file); |
667
|
|
|
FileHandler::removeFile($this->etc_tmp_config_file); |
668
|
|
|
return true; |
669
|
|
|
} |
670
|
|
|
return false; |
671
|
|
|
} catch (Exception $e) { |
672
|
|
|
return false; |
673
|
|
|
} |
674
|
|
|
} |
675
|
|
|
|
676
|
|
|
function installByConfig($install_config_file) |
677
|
|
|
{ |
678
|
|
|
include $install_config_file; |
679
|
|
|
if(!is_array($auto_config)) return false; |
|
|
|
|
680
|
|
|
|
681
|
|
|
$auto_config['module'] = 'install'; |
|
|
|
|
682
|
|
|
$auto_config['act'] = 'procInstall'; |
683
|
|
|
|
684
|
|
|
$fstr = "<%s><![CDATA[%s]]></%s>\r\n"; |
685
|
|
|
$fheader = "POST %s HTTP/1.1\r\nHost: %s\r\nContent-Type: application/xml\r\nContent-Length: %s\r\n\r\n%s\r\n"; |
686
|
|
|
$body = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\r\n<methodCall>\r\n<params>\r\n"; |
687
|
|
|
foreach($auto_config as $k => $v) |
688
|
|
|
{ |
689
|
|
|
if(!in_array($k,array('host','port','path'))) $body .= sprintf($fstr,$k,$v,$k); |
690
|
|
|
} |
691
|
|
|
$body .= "</params>\r\n</methodCall>"; |
692
|
|
|
|
693
|
|
|
$header = sprintf($fheader,$auto_config['path'],$auto_config['host'],strlen($body),$body); |
694
|
|
|
$fp = @fsockopen($auto_config['host'], $auto_config['port'], $errno, $errstr, 5); |
695
|
|
|
|
696
|
|
|
if($fp) |
697
|
|
|
{ |
698
|
|
|
fputs($fp, $header); |
699
|
|
|
while(!feof($fp)) |
700
|
|
|
{ |
701
|
|
|
$line = trim(fgets($fp, 4096)); |
702
|
|
|
if(strncmp('<error>', $line, 7) === 0) |
703
|
|
|
{ |
704
|
|
|
fclose($fp); |
705
|
|
|
return false; |
706
|
|
|
} |
707
|
|
|
} |
708
|
|
|
fclose($fp); |
709
|
|
|
} |
710
|
|
|
return true; |
711
|
|
|
|
712
|
|
|
} |
713
|
|
|
} |
714
|
|
|
/* End of file install.controller.php */ |
715
|
|
|
/* Location: ./modules/install/install.controller.php */ |
716
|
|
|
|
If an expression can have both
false
, andnull
as possible values. It is generally a good practice to always use strict comparison to clearly distinguish between those two values.