Failed Conditions
Pull Request — master (#1798)
by Kentaro
31:49
created

eccube_install.php ➔ composerInstall()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 0
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 11 and the first side effect is on line 4.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
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)
0 ignored issues
show
Coding Style introduced by
Consider putting global function "displayHelp" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
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()
0 ignored issues
show
Coding Style introduced by
Consider putting global function "composerSetup" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
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()
0 ignored issues
show
Coding Style introduced by
Consider putting global function "composerInstall" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
123
{
124
    $command = 'php '.COMPOSER_FILE.' install --dev --no-interaction';
125
    passthru($command);
126
}
127
128
function createDatabase(array $connectionParams)
0 ignored issues
show
Coding Style introduced by
Consider putting global function "createDatabase" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
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()
0 ignored issues
show
Coding Style introduced by
Consider putting global function "createApplication" in a static class
Loading history...
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;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
186
}
187
188
function initializeDatabase(\Eccube\Application $app)
0 ignored issues
show
Coding Style introduced by
Consider putting global function "initializeDatabase" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
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(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
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
Unused Code introduced by
$shop_name is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
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)
0 ignored issues
show
Coding Style introduced by
Consider putting global function "createConfigFiles" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
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)
0 ignored issues
show
Coding Style introduced by
Consider putting global function "createYaml" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
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()
0 ignored issues
show
Coding Style introduced by
Consider putting global function "getConfig" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
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,
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
278
        'admin_allow_host' =>
279
        array (
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
280
        ),
281
        'cookie_lifetime' => 0,
282
        'locale' => 'ja',
283
        'timezone' => 'Asia/Tokyo',
284
        'eccube_install' => 1,
285
    );
286
    return $config;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
287
}
288
289
function getDatabaseConfig($database_driver)
0 ignored issues
show
Coding Style introduced by
Consider putting global function "getDatabaseConfig" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
290
{
291
    $database = array (
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
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;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
327
}
328
329
function getMailConfig()
0 ignored issues
show
Coding Style introduced by
Consider putting global function "getMailConfig" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
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,
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
340
            'auth_mode' => NULL,
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
341
            'charset_iso_2022_jp' => false,
342
        ),
343
    );
344
    return $mail;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
345
}
346
347
function getPathConfig()
0 ignored issues
show
Coding Style introduced by
Consider putting global function "getPathConfig" in a static class
Loading history...
introduced by
Missing function doc comment
Loading history...
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,
0 ignored issues
show
Coding Style introduced by
TRUE, FALSE and NULL must be lowercase; expected null, but found NULL.
Loading history...
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;
0 ignored issues
show
introduced by
Missing blank line before return statement
Loading history...
389
}
390
391
/**
0 ignored issues
show
introduced by
Doc comment for parameter "$argv" missing
Loading history...
392
 * @link https://github.com/composer/windows-setup/blob/master/src/php/installer.php
393
 */
394
function setUseAnsi($argv)
0 ignored issues
show
Coding Style introduced by
Consider putting global function "setUseAnsi" in a static class
Loading history...
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
/**
0 ignored issues
show
introduced by
Doc comment for parameter "$text" missing
Loading history...
introduced by
Doc comment for parameter "$color" missing
Loading history...
introduced by
Doc comment for parameter "$newLine" missing
Loading history...
414
 * @link https://github.com/composer/windows-setup/blob/master/src/php/installer.php
415
 */
416
function out($text, $color = null, $newLine = true)
0 ignored issues
show
Coding Style introduced by
Consider putting global function "out" in a static class
Loading history...
417
{
418
    $styles = array(
0 ignored issues
show
introduced by
Add a comma after each item in a multi-line array
Loading history...
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