<?php
define('COMMON_CONFIG_DIR', '/common/config'); define('ERP_CONFIG_FILE', '/erp/config/main.php'); define('MYSQL_DB_CONFIG_FILE', '/common/config/olddb.php'); define('POSTGRES_DB_CONFIG_FILE', '/common/config/db.php'); define('PARAMS_FILE', '/erp/config/params.php'); define('OLD_USERSIDE_CONFIG_FILE', '/userside3/main/config/config.php'); define('OLD_USERSIDE_MIGRATE', '/userside3/migrate.php'); $erpConfig = require (__DIR__ . ERP_CONFIG_FILE); $mysqlConfig = require (__DIR__ . MYSQL_DB_CONFIG_FILE); $pgsqlConfig = require (__DIR__ . POSTGRES_DB_CONFIG_FILE); $params = require (__DIR__ . PARAMS_FILE); if (($argc === 2 && ($argv[1] == '--quiet' || $argv[1] == '-q')) || !empty($setupQuiet)) define('QUIET', true); if (!chmod(__DIR__. COMMON_CONFIG_DIR, 0777)) { stdout("\nError changing mode for folder ".__DIR__. COMMON_CONFIG_DIR.". Please change folder mode to 777 manually.\n"); } if (!checkRequirements()) { stdout("\nError checking dependencies. Please fix any errors before you try again. Exiting...\n"); exit(1); } stdout("\nConfigure USERSIDE3\n\n"); if (empty($erpConfig['components']['request']['cookieValidationKey'])) { stdout(" => Generating cookieValidationKey: "); setCookieValidationKey(__DIR__ . ERP_CONFIG_FILE); stdout("Done!\n"); } else { stdout(" => cookieValidationKey already exists\n"); } if (file_exists(__DIR__ . OLD_USERSIDE_CONFIG_FILE)) { stdout("\n => Found configuration file of primary userside\n"); stdout(" => Parsing MySQL config from primary config: "); $zsqlserver = $zsqldb = $zsqlport = $zsqluser = $zsqlpass = $zsqlcp = $zpath = null; require __DIR__ . OLD_USERSIDE_CONFIG_FILE; $mysqlConfig['dsn'] = makeDsnString($zsqlserver, $zsqldb, $zsqlport, 'mysql'); $mysqlConfig['username'] = $zsqluser; $mysqlConfig['password'] = $zsqlpass; $mysqlConfig['charset'] = $zsqlcp; stdout("Done!\n"); stdout(" => Parsing URL of primary userside: "); $params['oldUsersideUrl'] = $zpath; stdout("Done!\n"); stdout(" => Saving parameters: "); saveArrayToConfigFile($params, __DIR__ . PARAMS_FILE); stdout("Done!\n"); saveArrayToConfigFile($mysqlConfig, __DIR__ . MYSQL_DB_CONFIG_FILE); } stdout("\n => Configuring PostgreSQL database:\n\n"); $pgsqlConfig = askUserAboutDbConfig($pgsqlConfig, 'pgsql'); while(!isDbConnectSuccess($pgsqlConfig)) { if(false === confirm("Do you want to change PostgreSQL settings? [Y/n] ", 'yes')) { stdout("PostgreSQL connection settings is wrong, but you do not want to change them. Aborting.\n"); exit("\n"); } $pgsqlConfig = askUserAboutDbConfig($pgsqlConfig, 'pgsql'); } stdout("\n => Saving PostgreSQL configuration: "); saveArrayToConfigFile($pgsqlConfig, __DIR__ . POSTGRES_DB_CONFIG_FILE); stdout("Done!\n"); stdout(" => Running migration\n"); shell_exec("php " . __DIR__ . DIRECTORY_SEPARATOR . "userside migrate --interactive=0"); stdout(" => Done!\n"); stdout(" => Change directories mode\n"); @chmod(__DIR__.'/erp/runtime/*', 755); @chmod(__DIR__.'/console/runtime/*', 755); @chmod(__DIR__.'/erp/web/assets/*', 755); stdout(" => Done!\n"); if (file_exists(__DIR__ . OLD_USERSIDE_MIGRATE)) { stdout(" => Running base USERSIDE migrations\n"); try { require __DIR__ . OLD_USERSIDE_MIGRATE; stdout(" => Done\n"); } catch (Exception $e) { stdout(" => Error: " . $e->getMessage() . "\n"); exit(1); } } stdout("\nWe're done!\n\n"); function stdout($text) { if (defined('QUIET')) return; fwrite(STDOUT, $text); } function stdin() { return trim(fgets(STDIN)); } function confirm($answer, $default) { stdout($answer); $in = stdin(); $choice = !empty($in) ? strtolower($in) : $default ; return ($choice === 'yes' || $choice === 'y') ? true : false; } function setCookieValidationKey($file) { $length = 32; $bytes = openssl_random_pseudo_bytes($length); $key = strtr(substr(base64_encode($bytes), 0, $length), '+/=', '_-.'); $content = preg_replace('/(("|\')cookieValidationKey("|\')\s*=>\s*)(""|\'\')/', "\\1'$key'", file_get_contents($file)); file_put_contents($file, $content); } function saveArrayToConfigFile(array $config, $file) { file_put_contents($file, sprintf( "<?php\nreturn %s;", var_export($config, true))); } function parseDsnString($string) { $host = $port = $dbname = null; preg_match_all('/(host|dbname|port)=([^;]+)/', $string, $matches); foreach($matches[1] as $key => $name) $$name = $matches[2][$key]; return array($host, $dbname, $port); } function makeDsnString($host, $dbname, $port, $dsn) { return sprintf("%s:host=%s;dbname=%s;port=%d", $dsn, $host, $dbname, !empty($port) ? $port : 3306); } function askUser($text, $defaultValue = null) { if (defined('QUIET')) return $defaultValue; $text .= " [$defaultValue]: "; stdout($text); $in = stdin(); return !empty($in) ? $in : $defaultValue; } function askUserAboutDbConfig(array $dbConfig, $dsn) { list($dbHost, $dbName, $dbPort) = parseDsnString($dbConfig['dsn']); $dbConfig['dsn'] = makeDsnString( askUser("Host", $dbHost), askUser("Database name", $dbName), askUser("Port", $dbPort), $dsn ); $dbConfig["username"] = askUser("Username", $dbConfig["username"]); $dbConfig["password"] = askUser("Password", $dbConfig["password"]); $dbConfig["charset"] = askUser("Encoding", $dbConfig["charset"]); return $dbConfig; } function isDbConnectSuccess(array $dbConfig) { try { $db = new PDO($dbConfig['dsn'], $dbConfig['username'], $dbConfig['password'], array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, )); } catch(PDOException $e) { stdout(sprintf( "\nCould not connect to database with given configuration.\nError: %s\n\n", $e->getMessage())); return false; } return true; } function checkRequirements() { $success = true; if (!version_compare(PHP_VERSION, '5.6.0', '>=')) { $success = false; stdout("Error! PHP 5.6.0 or higher is required."); } $extensions = array( 'Reflection', 'pcre', 'SPL', 'ctype', 'mbstring', 'openssl', 'intl', 'fileinfo', 'dom', 'pdo', 'pdo_pgsql', 'curl', 'soap', ); foreach ($extensions as $extension) { if (!extension_loaded($extension)) { $success = false; stdout(sprintf("Error! PHP Extension %s is not loaded (installed).\n", $extension)); } } foreach(array(__DIR__ . ERP_CONFIG_FILE, __DIR__ . MYSQL_DB_CONFIG_FILE, __DIR__ . POSTGRES_DB_CONFIG_FILE, __DIR__ . PARAMS_FILE) as $confFile) { if (!is_writable($confFile)) { $success = false; stdout("No write access to the file [" . $confFile . "]"); } } return $success; } 