EC-CUBE /
ec-cube
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
| 1 | <?php |
||
| 2 | |||
| 3 | if (php_sapi_name() !== 'cli') { |
||
| 4 | exit(1); |
||
| 5 | } |
||
| 6 | |||
| 7 | require __DIR__.'/autoload.php'; |
||
| 8 | set_time_limit(0); |
||
| 9 | ini_set('display_errors', 1); |
||
| 10 | |||
| 11 | define('COMPOSER_FILE', 'composer.phar'); |
||
| 12 | define('COMPOSER_SETUP_FILE', 'composer-setup.php'); |
||
| 13 | |||
| 14 | setUseAnsi($argv); |
||
| 15 | |||
| 16 | $argv = is_array($argv) ? $argv : array(); |
||
| 17 | |||
| 18 | $argv[1] = isset($argv[1]) ? $argv[1] : null; |
||
| 19 | $argv[2] = isset($argv[2]) ? $argv[2] : null; |
||
| 20 | |||
| 21 | if (in_array('--help', $argv) || empty($argv[1])) { |
||
| 22 | displayHelp($argv); |
||
| 23 | exit(1); |
||
| 24 | } |
||
| 25 | out('EC-CUBE3 installer use database driver of ', null, false); |
||
| 26 | |||
| 27 | $database_driver = 'pdo_sqlite'; |
||
| 28 | switch($argv[1]) { |
||
| 29 | case 'mysql': |
||
| 30 | $database_driver = 'pdo_mysql'; |
||
| 31 | break; |
||
| 32 | case 'pgsql': |
||
| 33 | $database_driver = 'pdo_pgsql'; |
||
| 34 | break; |
||
| 35 | default: |
||
| 36 | case 'sqlite': |
||
| 37 | case 'sqlite3': |
||
| 38 | case 'sqlite3-in-memory': |
||
| 39 | $database_driver = 'pdo_sqlite'; |
||
| 40 | } |
||
| 41 | out($database_driver); |
||
| 42 | |||
| 43 | $database = getDatabaseConfig($database_driver); |
||
| 44 | $connectionParams = $database['database']; |
||
| 45 | |||
| 46 | if ($argv[2] != 'none') { |
||
| 47 | composerSetup(); |
||
| 48 | composerInstall(); |
||
| 49 | } |
||
| 50 | |||
| 51 | createConfigFiles($database_driver); |
||
| 52 | createDatabase($connectionParams); |
||
| 53 | |||
| 54 | $app = createApplication(); |
||
| 55 | initializeDatabase($app); |
||
| 56 | out('EC-CUBE3 install finished successfully!', 'success'); |
||
| 57 | if (PHP_VERSION_ID >= 50400) { |
||
| 58 | out('PHP built-in web server to run applications, `php -S localhost:8080 -t html`', 'info'); |
||
| 59 | out('Open your browser and access the http://localhost:8080/', 'info'); |
||
| 60 | } |
||
| 61 | exit(0); |
||
| 62 | |||
| 63 | function displayHelp($argv) |
||
| 64 | { |
||
| 65 | echo <<<EOF |
||
| 66 | EC-CUBE3 Installer |
||
| 67 | ------------------ |
||
| 68 | Usage: |
||
| 69 | ${argv[0]} [mysql|pgsql|sqlite3] [none] [options] |
||
| 70 | |||
| 71 | Arguments[1]: |
||
| 72 | Specify database types |
||
| 73 | |||
| 74 | Arguments[2]: |
||
| 75 | Specifying the "none" to skip the installation of Composer |
||
| 76 | |||
| 77 | Options: |
||
| 78 | --help this help |
||
| 79 | --ansi force ANSI color output |
||
| 80 | --no-ansi disable ANSI color output |
||
| 81 | |||
| 82 | Environment variables: |
||
| 83 | ADMIN_USER=admin |
||
| 84 | ADMIN_PASS=password |
||
| 85 | [email protected] |
||
| 86 | SHOP_NAME=EC-CUBE SHOP |
||
| 87 | ADMIN_ROUTE=admin |
||
| 88 | DBSERVER=127.0.0.1 |
||
| 89 | DBNAME=cube3_dev |
||
| 90 | DBUSER=cube3_dev_user |
||
| 91 | DBPASS=password |
||
| 92 | DBPORT=<database port> |
||
| 93 | MAIL_BACKEND=smtp |
||
| 94 | MAIL_HOST=localhost |
||
| 95 | MAIL_PORT=25 |
||
| 96 | MAIL_USER=<SMTP AUTH user> |
||
| 97 | MAIL_PASS=<SMTP AUTH password> |
||
| 98 | |||
| 99 | EOF; |
||
| 100 | } |
||
| 101 | |||
| 102 | function composerSetup() |
||
| 103 | { |
||
| 104 | if (!file_exists(__DIR__.'/'.COMPOSER_FILE)) { |
||
| 105 | if (!file_exists(__DIR__.'/'.COMPOSER_SETUP_FILE)) { |
||
| 106 | copy('https://getcomposer.org/installer', COMPOSER_SETUP_FILE); |
||
| 107 | } |
||
| 108 | |||
| 109 | $sha = hash_file('SHA384', COMPOSER_SETUP_FILE).PHP_EOL; |
||
| 110 | out(COMPOSER_SETUP_FILE.': '.$sha); |
||
| 111 | |||
| 112 | $command = 'php '.COMPOSER_SETUP_FILE; |
||
| 113 | out("execute: $command", 'info'); |
||
| 114 | passthru($command); |
||
| 115 | unlink(COMPOSER_SETUP_FILE); |
||
| 116 | } else { |
||
| 117 | $command = 'php '.COMPOSER_FILE.' self-update'; |
||
| 118 | passthru($command); |
||
| 119 | } |
||
| 120 | } |
||
| 121 | |||
| 122 | function composerInstall() |
||
| 123 | { |
||
| 124 | $command = 'php '.COMPOSER_FILE.' install --dev --no-interaction'; |
||
| 125 | passthru($command); |
||
| 126 | } |
||
| 127 | |||
| 128 | function createDatabase(array $connectionParams) |
||
| 129 | { |
||
| 130 | $dbname = $connectionParams['dbname']; |
||
| 131 | switch ($connectionParams['driver']) { |
||
| 132 | case 'pdo_pgsql': |
||
| 133 | $connectionParams['dbname'] = 'postgres'; |
||
| 134 | $connectionParams['user'] = (getenv('ROOTUSER') ? getenv('ROOTUSER') : (getenv('DBUSER') ? getenv('DBUSER') : 'postgres')); |
||
| 135 | $connectionParams['password'] = (getenv('ROOTPASS') ? getenv('ROOTPASS') : (getenv('DBPASS') ? getenv('DBPASS') : 'password')); |
||
| 136 | break; |
||
| 137 | case 'pdo_mysql': |
||
| 138 | $connectionParams['dbname'] = 'mysql'; |
||
| 139 | $connectionParams['user'] = (getenv('ROOTUSER') ? getenv('ROOTUSER') : (getenv('DBUSER') ? getenv('DBUSER') : 'root')); |
||
| 140 | if (getenv('TRAVIS')) { |
||
| 141 | $connectionParams['password'] = ''; |
||
| 142 | } else { |
||
| 143 | $connectionParams['password'] = (getenv('ROOTPASS') ? getenv('ROOTPASS') : (getenv('DBPASS') ? getenv('DBPASS') : 'password')); |
||
| 144 | } |
||
| 145 | break; |
||
| 146 | default: |
||
| 147 | case 'pdo_sqlite': |
||
| 148 | $connectionParams['dbname'] = $database['database']['path']; |
||
| 149 | if (file_exists($dbname)) { |
||
| 150 | out('remove database to '.$dbname, 'info'); |
||
| 151 | unlink($dbname); |
||
| 152 | } |
||
| 153 | break; |
||
| 154 | } |
||
| 155 | |||
| 156 | $config = new \Doctrine\DBAL\Configuration(); |
||
| 157 | $conn = \Doctrine\DBAL\DriverManager::getConnection($connectionParams, $config); |
||
| 158 | $sm = $conn->getSchemaManager(); |
||
| 159 | out('Created database connection...', 'info'); |
||
| 160 | |||
| 161 | if ($connectionParams['driver'] != 'pdo_sqlite') { |
||
| 162 | $databases = $sm->listDatabases(); |
||
| 163 | if (in_array($dbname, $databases)) { |
||
| 164 | out('database exists '.$dbname, 'info'); |
||
| 165 | out('drop database to '.$dbname, 'info'); |
||
| 166 | $sm->dropDatabase($dbname); |
||
| 167 | } |
||
| 168 | } |
||
| 169 | out('create database to '.$dbname, 'info'); |
||
| 170 | $sm->createDatabase($dbname); |
||
| 171 | } |
||
| 172 | |||
| 173 | /** |
||
| 174 | * @return \Eccube\Application |
||
| 175 | */ |
||
| 176 | function createApplication() |
||
| 177 | { |
||
| 178 | $app = \Eccube\Application::getInstance(); |
||
| 179 | $app['debug'] = true; |
||
| 180 | $app->initDoctrine(); |
||
| 181 | $app->initSecurity(); |
||
| 182 | $app->register(new \Silex\Provider\FormServiceProvider()); |
||
| 183 | $app->register(new \Eccube\ServiceProvider\EccubeServiceProvider()); |
||
| 184 | $app->boot(); |
||
| 185 | return $app; |
||
| 186 | } |
||
| 187 | |||
| 188 | function initializeDatabase(\Eccube\Application $app) |
||
| 189 | { |
||
| 190 | // Get an instance of your entity manager |
||
| 191 | $entityManager = $app['orm.em']; |
||
| 192 | |||
| 193 | $pdo = $entityManager->getConnection()->getWrappedConnection(); |
||
| 194 | |||
| 195 | // Clear Doctrine to be safe |
||
| 196 | $entityManager->getConnection()->getConfiguration()->setSQLLogger(null); |
||
| 197 | $entityManager->clear(); |
||
| 198 | gc_collect_cycles(); |
||
| 199 | |||
| 200 | // Schema Tool to process our entities |
||
| 201 | $tool = new \Doctrine\ORM\Tools\SchemaTool($entityManager); |
||
| 202 | $classes = $entityManager->getMetaDataFactory()->getAllMetaData(); |
||
| 203 | |||
| 204 | // Drop all classes and re-build them for each test case |
||
| 205 | out('Dropping database schema...', 'info'); |
||
| 206 | $tool->dropSchema($classes); |
||
| 207 | out('Creating database schema...', 'info'); |
||
| 208 | $tool->createSchema($classes); |
||
| 209 | out('Database schema created successfully!', 'success'); |
||
| 210 | $config = new \Doctrine\DBAL\Migrations\Configuration\Configuration($app['db']); |
||
| 211 | $config->setMigrationsNamespace('DoctrineMigrations'); |
||
| 212 | |||
| 213 | $migrationDir = __DIR__.'/src/Eccube/Resource/doctrine/migration'; |
||
| 214 | $config->setMigrationsDirectory($migrationDir); |
||
| 215 | $config->registerMigrationsFromDirectory($migrationDir); |
||
| 216 | |||
| 217 | $migration = new \Doctrine\DBAL\Migrations\Migration($config); |
||
| 218 | $migration->migrate(); |
||
| 219 | out('Database migration successfully!', 'success'); |
||
| 220 | |||
| 221 | $login_id = (getenv('ADMIN_USER') ? getenv('ADMIN_USER') : 'admin'); |
||
| 222 | $login_password = (getenv('ADMIN_PASS') ? getenv('ADMIN_PASS') : 'password'); |
||
| 223 | $passwordEncoder = new \Eccube\Security\Core\Encoder\PasswordEncoder($app['config']); |
||
| 224 | $salt = \Eccube\Util\Str::random(32); |
||
| 225 | $encodedPassword = $passwordEncoder->encodePassword($login_password, $salt); |
||
| 226 | |||
| 227 | out('Creating admin accounts...', 'info'); |
||
| 228 | $sql = "INSERT INTO dtb_member (member_id, login_id, password, salt, work, del_flg, authority, creator_id, rank, update_date, create_date,name,department) VALUES (2, :login_id, :admin_pass , :salt , '1', '0', '0', '1', '1', current_timestamp, current_timestamp,'管理者', 'EC-CUBE SHOP');"; |
||
| 229 | $stmt = $pdo->prepare($sql); |
||
| 230 | $stmt->execute( |
||
| 231 | array( |
||
| 232 | ':login_id' => $login_id, |
||
| 233 | ':admin_pass' => $encodedPassword, |
||
| 234 | ':salt' => $salt |
||
| 235 | ) |
||
| 236 | ); |
||
| 237 | $stmt->closeCursor(); |
||
| 238 | |||
| 239 | $shop_name = (getenv('SHOP_NAME') ? getenv('SHOP_NAME') : 'EC-CUBE SHOP'); |
||
|
0 ignored issues
–
show
|
|||
| 240 | $admin_mail = (getenv('ADMIN_MAIL') ? getenv('ADMIN_MAIL') : '[email protected]'); |
||
| 241 | $sql = "INSERT INTO dtb_base_info (id, shop_name, email01, email02, email03, email04, update_date, option_product_tax_rule) VALUES (1, :shop_name, :admin_mail1, :admin_mail2, :admin_mail3, :admin_mail4, current_timestamp, 0)"; |
||
| 242 | $stmt = $pdo->prepare($sql); |
||
| 243 | $stmt->execute( |
||
| 244 | array( |
||
| 245 | ':shop_name' => $login_id, |
||
| 246 | ':admin_mail1' => $admin_mail, |
||
| 247 | ':admin_mail2' => $admin_mail, |
||
| 248 | ':admin_mail3' => $admin_mail, |
||
| 249 | ':admin_mail4' => $admin_mail, |
||
| 250 | ) |
||
| 251 | ); |
||
| 252 | $stmt->closeCursor(); |
||
| 253 | } |
||
| 254 | |||
| 255 | function createConfigFiles($database_driver) |
||
| 256 | { |
||
| 257 | $config_path = __DIR__.'/app/config/eccube'; |
||
| 258 | createYaml(getConfig(), $config_path.'/config.yml'); |
||
| 259 | createYaml(getDatabaseConfig($database_driver), $config_path.'/database.yml'); |
||
| 260 | createYaml(getMailConfig(), $config_path.'/mail.yml'); |
||
| 261 | createYaml(getPathConfig(), $config_path.'/path.yml'); |
||
| 262 | } |
||
| 263 | |||
| 264 | function createYaml($config, $path) |
||
| 265 | { |
||
| 266 | $content = \Symfony\Component\Yaml\Yaml::dump($config); |
||
| 267 | $fs = new \Symfony\Component\Filesystem\Filesystem(); |
||
| 268 | $fs->dumpFile($path, $content); |
||
| 269 | } |
||
| 270 | |||
| 271 | function getConfig() |
||
| 272 | { |
||
| 273 | $config = array ( |
||
| 274 | 'auth_magic' => \Eccube\Util\Str::random(32), |
||
| 275 | 'password_hash_algos' => 'sha256', |
||
| 276 | 'shop_name' => (getenv('SHOP_NAME') ? getenv('SHOP_NAME') : 'admin'), |
||
| 277 | 'force_ssl' => NULL, |
||
| 278 | 'admin_allow_host' => |
||
| 279 | array ( |
||
| 280 | ), |
||
| 281 | 'cookie_lifetime' => 0, |
||
| 282 | 'locale' => 'ja', |
||
| 283 | 'timezone' => 'Asia/Tokyo', |
||
| 284 | 'eccube_install' => 1, |
||
| 285 | ); |
||
| 286 | return $config; |
||
| 287 | } |
||
| 288 | |||
| 289 | function getDatabaseConfig($database_driver) |
||
| 290 | { |
||
| 291 | $database = array ( |
||
| 292 | 'database' => |
||
| 293 | array ( |
||
| 294 | 'driver' => $database_driver, |
||
| 295 | ) |
||
| 296 | ); |
||
| 297 | |||
| 298 | switch ($database_driver) { |
||
| 299 | case 'pdo_sqlite': |
||
| 300 | $database['database']['dbname'] = $database['database']['path'] = __DIR__.'/app/config/eccube/eccube.db'; |
||
| 301 | |||
| 302 | break; |
||
| 303 | case 'pdo_mysql': |
||
| 304 | $database['database']['host'] = (getenv('DBSERVER') ? getenv('DBSERVER') : 'localhost'); |
||
| 305 | |||
| 306 | $database['database']['dbname'] = (getenv('DBNAME') ? getenv('DBNAME') : 'cube3_dev'); |
||
| 307 | $database['database']['user'] = (getenv('DBUSER') ? getenv('DBUSER') : 'cube3_dev_user'); |
||
| 308 | $database['database']['port'] = (getenv('DBPORT') ? getenv('DBPORT') : '3306'); |
||
| 309 | if (getenv('TRAVIS')) { |
||
| 310 | $database['database']['password'] = ''; |
||
| 311 | } else { |
||
| 312 | $database['database']['password'] = (getenv('DBPASS') ? getenv('DBPASS') : 'password'); |
||
| 313 | } |
||
| 314 | break; |
||
| 315 | case 'pdo_pgsql': |
||
| 316 | $database['database']['host'] = (getenv('DBSERVER') ? getenv('DBSERVER') : 'localhost'); |
||
| 317 | |||
| 318 | $database['database']['dbname'] = (getenv('DBNAME') ? getenv('DBNAME') : 'cube3_dev'); |
||
| 319 | $database['database']['user'] = (getenv('DBUSER') ? getenv('DBUSER') : 'cube3_dev_user'); |
||
| 320 | $database['database']['password'] = (getenv('DBPASS') ? getenv('DBPASS') : 'password'); |
||
| 321 | $database['database']['port'] = (getenv('DBPORT') ? getenv('DBPORT') : '5432'); |
||
| 322 | break; |
||
| 323 | } |
||
| 324 | $database['database']['charset'] = 'utf8'; |
||
| 325 | $database['database']['defaultTableOptions'] = array('collate' => 'utf8_general_ci'); |
||
| 326 | return $database; |
||
| 327 | } |
||
| 328 | |||
| 329 | function getMailConfig() |
||
| 330 | { |
||
| 331 | $mail = array ( |
||
| 332 | 'mail' => |
||
| 333 | array ( |
||
| 334 | 'transport' => (getenv('MAIL_BACKEND') ? getenv('MAIL_BACKEND') : 'smtp'), |
||
| 335 | 'host' => (getenv('MAIL_HOST') ? getenv('MAIL_HOST') : 'localhost'), |
||
| 336 | 'port' => (getenv('MAIL_PORT') ? getenv('MAIL_PORT') : 25), |
||
| 337 | 'username' => (getenv('MAIL_USER') ? getenv('MAIL_USER') : null), |
||
| 338 | 'password' => (getenv('MAIL_PASS') ? getenv('MAIL_PASS') : null), |
||
| 339 | 'encryption' => NULL, |
||
| 340 | 'auth_mode' => NULL, |
||
| 341 | 'charset_iso_2022_jp' => false, |
||
| 342 | ), |
||
| 343 | ); |
||
| 344 | return $mail; |
||
| 345 | } |
||
| 346 | |||
| 347 | function getPathConfig() |
||
| 348 | { |
||
| 349 | $root_dir = realpath(__DIR__); |
||
| 350 | // TODO path.yml.dist から取得したい |
||
| 351 | // TODO root_urlpath を指定できるようにする |
||
| 352 | $path = array ( |
||
| 353 | 'root' => '/', |
||
| 354 | 'admin_dir' => (getenv('ADMIN_ROUTE') ? getenv('ADMIN_ROUTE') : 'admin'), |
||
| 355 | 'tpl' => '/user_data/packages/default/', |
||
| 356 | 'admin_tpl' => '/user_data/packages/admin/', |
||
| 357 | 'image_path' => '/upload/save_image/', |
||
| 358 | 'root_dir' => $root_dir, |
||
| 359 | 'root_urlpath' => NULL, |
||
| 360 | 'template_code' => 'default', |
||
| 361 | 'admin_route' => 'admin', |
||
| 362 | 'user_data_route' => 'user_data', |
||
| 363 | 'public_path' => '/html', |
||
| 364 | 'public_path_realdir' => $root_dir.'/html', |
||
| 365 | 'image_save_realdir' => $root_dir.'/html/upload/save_image', |
||
| 366 | 'image_temp_realdir' => $root_dir.'/html/upload/temp_image', |
||
| 367 | 'user_data_realdir' => $root_dir.'/html/user_data', |
||
| 368 | 'block_default_realdir' => $root_dir.'/src/Eccube/Resource/template/default/Block', |
||
| 369 | 'block_realdir' => $root_dir.'/app/template/default/Block', |
||
| 370 | 'template_default_realdir' => $root_dir.'/src/Eccube/Resource/template/default', |
||
| 371 | 'template_default_html_realdir' => $root_dir.'/html/template/default', |
||
| 372 | 'template_admin_realdir' => $root_dir.'/src/Eccube/Resource/template/admin', |
||
| 373 | 'template_admin_html_realdir' => $root_dir.'/html/template/admin', |
||
| 374 | 'template_realdir' => $root_dir.'/app/template/default', |
||
| 375 | 'template_html_realdir' => $root_dir.'/html/template/default', |
||
| 376 | 'template_temp_realdir' => $root_dir.'/app/cache/eccube/template', |
||
| 377 | 'csv_temp_realdir' => $root_dir.'/app/cache/eccube/csv', |
||
| 378 | 'plugin_realdir' => $root_dir.'/app/Plugin', |
||
| 379 | 'plugin_temp_realdir' => $root_dir.'/app/cache/plugin', |
||
| 380 | 'plugin_html_realdir' => $root_dir.'/html/plugin', |
||
| 381 | 'admin_urlpath' => '/template/admin', |
||
| 382 | 'front_urlpath' => '/template/default', |
||
| 383 | 'image_save_urlpath' => '/upload/save_image', |
||
| 384 | 'image_temp_urlpath' => '/upload/temp_image', |
||
| 385 | 'user_data_urlpath' => '/user_data', |
||
| 386 | 'plugin_urlpath' => '/plugin', |
||
| 387 | ); |
||
| 388 | return $path; |
||
| 389 | } |
||
| 390 | |||
| 391 | /** |
||
| 392 | * @link https://github.com/composer/windows-setup/blob/master/src/php/installer.php |
||
| 393 | */ |
||
| 394 | function setUseAnsi($argv) |
||
| 395 | { |
||
| 396 | // --no-ansi wins over --ansi |
||
| 397 | if (in_array('--no-ansi', $argv)) { |
||
| 398 | define('USE_ANSI', false); |
||
| 399 | } elseif (in_array('--ansi', $argv)) { |
||
| 400 | define('USE_ANSI', true); |
||
| 401 | } else { |
||
| 402 | // On Windows, default to no ANSI, except in ANSICON and ConEmu. |
||
| 403 | // Everywhere else, default to ANSI if stdout is a terminal. |
||
| 404 | define( |
||
| 405 | 'USE_ANSI', |
||
| 406 | (DIRECTORY_SEPARATOR == '\\') |
||
| 407 | ? (false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI')) |
||
| 408 | : (function_exists('posix_isatty') && posix_isatty(1)) |
||
| 409 | ); |
||
| 410 | } |
||
| 411 | } |
||
| 412 | |||
| 413 | /** |
||
| 414 | * @link https://github.com/composer/windows-setup/blob/master/src/php/installer.php |
||
| 415 | */ |
||
| 416 | function out($text, $color = null, $newLine = true) |
||
| 417 | { |
||
| 418 | $styles = array( |
||
| 419 | 'success' => "\033[0;32m%s\033[0m", |
||
| 420 | 'error' => "\033[31;31m%s\033[0m", |
||
| 421 | 'info' => "\033[33;33m%s\033[0m" |
||
| 422 | ); |
||
| 423 | $format = '%s'; |
||
| 424 | if (isset($styles[$color]) && USE_ANSI) { |
||
| 425 | $format = $styles[$color]; |
||
| 426 | } |
||
| 427 | if ($newLine) { |
||
| 428 | $format .= PHP_EOL; |
||
| 429 | } |
||
| 430 | printf($format, $text); |
||
| 431 | } |
||
| 432 |
This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.
Both the
$myVarassignment in line 1 and the$higherassignment in line 2 are dead. The first because$myVaris never used and the second because$higheris always overwritten for every possible time line.