aimeos /
aimeos-core
| 1 | <?php |
||
| 2 | |||
| 3 | /** |
||
| 4 | * @license LGPLv3, https://opensource.org/licenses/LGPL-3.0 |
||
| 5 | * @copyright Aimeos (aimeos.org), 2015-2024 |
||
| 6 | */ |
||
| 7 | |||
| 8 | |||
| 9 | require 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; |
||
| 10 | |||
| 11 | |||
| 12 | if( php_sapi_name() != 'cli' ) { |
||
| 13 | exit( 'Setup can only be started via command line for security reasons' ); |
||
| 14 | } |
||
| 15 | |||
| 16 | |||
| 17 | set_error_handler( function( $severity, $message, $file, $line ) { |
||
| 18 | if( $severity & E_DEPRECATED === 0 ) { |
||
| 19 | throw new ErrorException( $message, 0, $severity, $file, $line ); |
||
| 20 | } |
||
| 21 | error_log( $message . ' in ' . $file . ' on line ' . $line ); |
||
| 22 | }); |
||
| 23 | |||
| 24 | ini_set( 'display_errors', 1 ); |
||
| 25 | date_default_timezone_set( 'UTC' ); |
||
| 26 | |||
| 27 | |||
| 28 | /** |
||
| 29 | * Returns the configuration based on the given arguments |
||
| 30 | * |
||
| 31 | * @param array $options List of key/value string separated by colon (e.g. "key:value") |
||
| 32 | * @return array Associative list of key value pairs |
||
| 33 | */ |
||
| 34 | function config( array $options ) : array |
||
| 35 | { |
||
| 36 | $config = []; |
||
| 37 | |||
| 38 | foreach( $options as $option ) |
||
| 39 | { |
||
| 40 | list( $key, $val ) = explode( ':', $option ); |
||
| 41 | $config[$key] = $val; |
||
| 42 | } |
||
| 43 | |||
| 44 | return $config; |
||
| 45 | } |
||
| 46 | |||
| 47 | |||
| 48 | /** |
||
| 49 | * Returns the command options given by the user |
||
| 50 | * |
||
| 51 | * @param array &$params List of parameters |
||
| 52 | * @return array Associative list of option name and value(s) |
||
| 53 | */ |
||
| 54 | function options( array &$params ) |
||
| 55 | { |
||
| 56 | $options = []; |
||
| 57 | |||
| 58 | foreach( $params as $key => $option ) |
||
| 59 | { |
||
| 60 | if( $option === '--help' ) { |
||
| 61 | usage(); |
||
| 62 | } |
||
| 63 | |||
| 64 | if( !strncmp( $option, '--', 2 ) && ( $pos = strpos( $option, '=', 2 ) ) !== false ) |
||
| 65 | { |
||
| 66 | if( ( $name = substr( $option, 2, $pos - 2 ) ) !== false ) |
||
| 67 | { |
||
| 68 | if( isset( $options[$name] ) ) |
||
| 69 | { |
||
| 70 | $options[$name] = (array) $options[$name]; |
||
| 71 | $options[$name][] = substr( $option, $pos + 1 ); |
||
| 72 | } |
||
| 73 | else |
||
| 74 | { |
||
| 75 | $options[$name] = substr( $option, $pos + 1 ); |
||
| 76 | } |
||
| 77 | |||
| 78 | unset( $params[$key] ); |
||
| 79 | } |
||
| 80 | else |
||
| 81 | { |
||
| 82 | printf( "Invalid option \"%1\$s\"\n", $option ); |
||
| 83 | usage(); |
||
| 84 | } |
||
| 85 | } |
||
| 86 | elseif( $option[0] === '-' ) |
||
| 87 | { |
||
| 88 | $options[$option[1]] = substr( $option, 1 ); |
||
| 89 | unset( $params[$key] ); |
||
| 90 | } |
||
| 91 | } |
||
| 92 | |||
| 93 | return $options; |
||
| 94 | } |
||
| 95 | |||
| 96 | |||
| 97 | /** |
||
| 98 | * Returns the verbosity level based on the given arguments |
||
| 99 | * |
||
| 100 | * @param array $options Associative list of key value pairs |
||
| 101 | * @return string Verbosity level ("v", "vv", "vvv" or empty string) |
||
| 102 | */ |
||
| 103 | function verbose( array $options ) : string |
||
| 104 | { |
||
| 105 | return isset( $options['q'] ) ? '' : ( $options['v'] ?? 'vv' ); |
||
| 106 | } |
||
| 107 | |||
| 108 | |||
| 109 | /** |
||
| 110 | * Prints the command usage and options, exits the program after printing |
||
| 111 | */ |
||
| 112 | function usage() |
||
| 113 | { |
||
| 114 | printf( "Usage: php up.php [OPTION]* [sitecode] [tplsite]\n" ); |
||
| 115 | printf( " -q Quiet\n" ); |
||
| 116 | printf( " -v Important messages\n" ); |
||
| 117 | printf( " -vv Important and informational messages\n" ); |
||
| 118 | printf( " -vvv Important, informational and debug messages\n" ); |
||
| 119 | printf( " --extdir=<path> Extension directory, use several times for multiple\n" ); |
||
| 120 | printf( " --config=<path|file> Configuration directory, use several times for multiple\n" ); |
||
| 121 | printf( " --option=<key>:<value> Additional configuration key and value separated by a colon\n" ); |
||
| 122 | exit( 1 ); |
||
|
0 ignored issues
–
show
|
|||
| 123 | } |
||
| 124 | |||
| 125 | |||
| 126 | |||
| 127 | $exectimeStart = microtime( true ); |
||
| 128 | |||
| 129 | try |
||
| 130 | { |
||
| 131 | $params = $_SERVER['argv']; |
||
| 132 | array_shift( $params ); |
||
| 133 | |||
| 134 | $options = options( $params ); |
||
| 135 | |||
| 136 | if( ( $site = array_shift( $params ) ) === null ) { |
||
| 137 | $site = 'default'; |
||
| 138 | } |
||
| 139 | |||
| 140 | if( ( $tplsite = array_shift( $params ) ) === null ) { |
||
| 141 | $tplsite = 'default'; |
||
| 142 | } |
||
| 143 | |||
| 144 | $boostrap = new \Aimeos\Bootstrap( (array) ( $options['extdir'] ?? [] ) ); |
||
| 145 | \Aimeos\Setup::use( $boostrap, config( (array) ( $options['option'] ?? [] ) ) ) |
||
| 146 | ->verbose( verbose( $options ) ) |
||
| 147 | ->up( $site, $tplsite ); |
||
| 148 | } |
||
| 149 | catch( Throwable $t ) |
||
| 150 | { |
||
| 151 | echo "\n\nCaught PHP error while processing setup"; |
||
| 152 | echo "\n\nMessage:\n"; |
||
| 153 | echo $t->getMessage(); |
||
| 154 | echo "\n\nStack trace:\n"; |
||
| 155 | echo $t->getTraceAsString(); |
||
| 156 | echo "\n\n"; |
||
| 157 | exit( 1 ); |
||
| 158 | } |
||
| 159 | catch( \Exception $e ) |
||
| 160 | { |
||
| 161 | echo "\n\nCaught exception while processing setup"; |
||
| 162 | echo "\n\nMessage:\n"; |
||
| 163 | echo $e->getMessage(); |
||
| 164 | echo "\n\nStack trace:\n"; |
||
| 165 | echo $e->getTraceAsString(); |
||
| 166 | echo "\n\n"; |
||
| 167 | exit( 1 ); |
||
| 168 | } |
||
| 169 | |||
| 170 | $exectimeStop = microtime( true ); |
||
| 171 | |||
| 172 | if( verbose( $options ) ) { |
||
| 173 | printf( "Setup process took %1\$f sec\n\n", ( $exectimeStop - $exectimeStart ) ); |
||
| 174 | } |
||
| 175 |
In general, usage of exit should be done with care and only when running in a scripting context like a CLI script.