[TASK] Move code from the system extension cli to core/Classes
authorHelmut Hummel <helmut.hummel@typo3.org>
Wed, 19 Sep 2012 21:07:28 +0000 (23:07 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Thu, 20 Sep 2012 17:21:35 +0000 (19:21 +0200)
Change-Id: Iafb916bc8a5cc74fe284d18a5430350f344e11c2
Resolves: #40949
Releases: 6.0
Reviewed-on: http://review.typo3.org/14746
Reviewed-by: Wouter Wolters
Tested-by: Wouter Wolters
Reviewed-by: Anja Leichsenring
Tested-by: Anja Leichsenring
Reviewed-by: Mattias Nilsson
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
t3lib/class.t3lib_cli.php
t3lib/core_autoload.php
typo3/cli_dispatch.phpsh
typo3/sysext/cli/Classes/CliBootstrap.php [deleted file]
typo3/sysext/cli/Classes/Controller/CommandLineController.php [deleted file]
typo3/sysext/core/Classes/Controller/CommandLineController.php [new file with mode: 0644]
typo3/sysext/core/Classes/Core/CliBootstrap.php [new file with mode: 0644]
typo3/sysext/core/Migrations/Code/ClassAliasMap201208221700.php
typo3/sysext/integrity/Classes/AdminCommand.php
typo3/sysext/integrity/Classes/CleanerCommand.php
typo3/sysext/scheduler/cli/scheduler_cli_dispatch.php

index 3b26f20..b28545b 100644 (file)
@@ -4,5 +4,5 @@
  * and will be removed by 7.0. The class was renamed and is now located at:
  * typo3/sysext/cli/Classes/Controller/CommandLineController.php
  */
-require_once \TYPO3\CMS\Core\Extension\ExtensionManager::extPath('cli') . 'Classes/Controller/CommandLineController.php';
+require_once \TYPO3\CMS\Core\Extension\ExtensionManager::extPath('core') . 'Classes/Core/Controller/CommandLineController.php';
 ?>
\ No newline at end of file
index 96c2896..47458ec 100644 (file)
@@ -43,7 +43,6 @@ $t3libClasses = array(
        't3lib_Cache\Frontend\VariableFrontend' => PATH_t3lib . 'cache/frontend/class.t3lib_Cache\Frontend\VariableFrontend.php',
        't3lib_cache_manager' => PATH_t3lib . 'cache/class.t3lib_cache_manager.php',
        't3lib_cachehash' => PATH_t3lib . 'class.t3lib_cacheHash.php',
-       't3lib_cli' => PATH_t3lib . 'class.t3lib_cli.php',
        't3lib_clipboard' => PATH_t3lib . 'class.t3lib_clipboard.php',
        't3lib_collection_abstractrecordcollection' => PATH_t3lib . 'collection/AbstractRecordCollection.php',
        't3lib_collection_collection' => PATH_t3lib . 'collection/interfaces/interface.t3lib_collection_collection.php',
index d564df5..4346749 100755 (executable)
@@ -42,8 +42,8 @@ define('TYPO3_cliMode', TRUE);
 
        // We use require instead of require_once here so we get a fatal error if classes/Bootstrap.php is accidentally included twice
        // (which would indicate a clear bug).
-require __DIR__ . '/sysext/cli/Classes/CliBootstrap.php';
-\TYPO3\CMS\Cli\CliBootstrap::checkEnvironmentOrDie();
+require __DIR__ . '/sysext/core/Classes/Core/CliBootstrap.php';
+\TYPO3\CMS\Core\Core\CliBootstrap::checkEnvironmentOrDie();
 
 require __DIR__ . '/sysext/core/Classes/Core/Bootstrap.php';
 \TYPO3\CMS\Core\Core\Bootstrap::getInstance()
@@ -74,7 +74,7 @@ require __DIR__ . '/sysext/core/Classes/Core/Bootstrap.php';
        ->defineLoggingAndExceptionConstants()
        ->unsetReservedGlobalVariables()
        ->initializeTypo3DbGlobal(TRUE);
-\TYPO3\CMS\Cli\CliBootstrap::initializeCliKeyOrDie();
+\TYPO3\CMS\Core\Core\CliBootstrap::initializeCliKeyOrDie();
 \TYPO3\CMS\Core\Core\Bootstrap::getInstance()
        ->loadExtensionTables(TRUE)
        ->initializeBackendUser()
diff --git a/typo3/sysext/cli/Classes/CliBootstrap.php b/typo3/sysext/cli/Classes/CliBootstrap.php
deleted file mode 100644 (file)
index ea7b0d3..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-namespace TYPO3\CMS\Cli;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 2012 Christian Kuhn <lolli@schwarzbu.ch>
- *  All rights reserved
- *
- *  This script is part of the TYPO3 project. The TYPO3 project is
- *  free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The GNU General Public License can be found at
- *  http://www.gnu.org/copyleft/gpl.html.
- *  A copy is found in the textfile GPL.txt and important notices to the license
- *  from the author is found in LICENSE.txt distributed with these scripts.
- *
- *
- *  This script is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  This copyright notice MUST APPEAR in all copies of the script!
- ***************************************************************/
-/**
- * This class encapsulates cli specific bootstrap methods.
- *
- * @author Christian Kuhn <lolli@schwarzbu.ch>
- * @package TYPO3
- * @subpackage core
- */
-class CliBootstrap {
-
-       /**
-        * Check the script is called from a cli environment.
-        *
-        * @return void
-        */
-       static public function checkEnvironmentOrDie() {
-               if (substr(php_sapi_name(), 0, 3) === 'cgi') {
-                       self::initializeCgiCompatibilityLayerOrDie();
-               } elseif (php_sapi_name() !== 'cli') {
-                       die('Not called from a command line interface (e.g. a shell or scheduler).' . chr(10));
-               }
-       }
-
-       /**
-        * Check and define cli parameters.
-        * First argument is a key that points to the script configuration.
-        * If it is not set or not valid, the script exits with an error message.
-        *
-        * @return void
-        */
-       static public function initializeCliKeyOrDie() {
-               if (!isset($_SERVER['argv'][1]) || !is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][$_SERVER['argv'][1]])) {
-                       if (!isset($_SERVER['argv'][1])) {
-                               $message = 'This script must have a \'cliKey\' as first argument.';
-                       } else {
-                               $message = 'The supplied \'cliKey\' is not valid.';
-                       }
-                       $message .= ' Valid keys are:
-
-';
-                       $cliKeys = array_keys($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']);
-                       asort($cliKeys);
-                       foreach ($cliKeys as $key => $value) {
-                               $message .= '  ' . $value . LF;
-                       }
-                       fwrite(STDERR, $message . LF);
-                       die(1);
-               }
-               define('TYPO3_cliKey', $_SERVER['argv'][1]);
-               define('TYPO3_cliInclude', \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][TYPO3_cliKey][0]));
-               $GLOBALS['MCONF']['name'] = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][TYPO3_cliKey][1];
-               // This is a compatibility layer: Some cli scripts rely on this, like ext:phpunit cli
-               $GLOBALS['temp_cliScriptPath'] = array_shift($_SERVER['argv']);
-               $GLOBALS['temp_cliKey'] = array_shift($_SERVER['argv']);
-               array_unshift($_SERVER['argv'], $GLOBALS['temp_cliScriptPath']);
-       }
-
-       /**
-        * Set up cgi sapi as de facto cli, but check no HTTP
-        * environment variables are set.
-        *
-        * @return void
-        */
-       static protected function initializeCgiCompatibilityLayerOrDie() {
-               // Sanity check: Ensure we're running in a shell or cronjob (and NOT via HTTP)
-               $checkEnvVars = array('HTTP_USER_AGENT', 'HTTP_HOST', 'SERVER_NAME', 'REMOTE_ADDR', 'REMOTE_PORT', 'SERVER_PROTOCOL');
-               foreach ($checkEnvVars as $var) {
-                       if (array_key_exists($var, $_SERVER)) {
-                               echo 'SECURITY CHECK FAILED! This script cannot be used within your browser!' . chr(10);
-                               echo 'If you are sure that we run in a shell or cronjob, please unset' . chr(10);
-                               echo 'environment variable ' . $var . ' (usually using \'unset ' . $var . '\')' . chr(10);
-                               echo 'before starting this script.' . chr(10);
-                               die;
-                       }
-               }
-               // Mimic CLI API in CGI API (you must use the -C/-no-chdir and the -q/--no-header switches!)
-               ini_set('html_errors', 0);
-               ini_set('implicit_flush', 1);
-               ini_set('max_execution_time', 0);
-               define(STDIN, fopen('php://stdin', 'r'));
-               define(STDOUT, fopen('php://stdout', 'w'));
-               define(STDERR, fopen('php://stderr', 'w'));
-       }
-
-}
-
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/cli/Classes/Controller/CommandLineController.php b/typo3/sysext/cli/Classes/Controller/CommandLineController.php
deleted file mode 100644 (file)
index 42eb84d..0000000
+++ /dev/null
@@ -1,313 +0,0 @@
-<?php
-namespace TYPO3\CMS\Cli\Controller;
-
-/***************************************************************
- *  Copyright notice
- *
- *  (c) 2006-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
- *  All rights reserved
- *
- *  This script is part of the TYPO3 project. The TYPO3 project is
- *  free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
- *  (at your option) any later version.
- *
- *  The GNU General Public License can be found at
- *  http://www.gnu.org/copyleft/gpl.html.
- *  A copy is found in the textfile GPL.txt and important notices to the license
- *  from the author is found in LICENSE.txt distributed with these scripts.
- *
- *
- *  This script is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *  GNU General Public License for more details.
- *
- *  This copyright notice MUST APPEAR in all copies of the script!
- ***************************************************************/
-/**
- * Contains base class for TYPO3 cli scripts
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- */
-/**
- * TYPO3 cli script basis
- *
- * @author Kasper Skårhøj <kasperYYYY@typo3.com>
- * @package TYPO3
- * @subpackage t3lib
- */
-class CommandLineController {
-
-       // Command line arguments, exploded into key => value-array pairs
-       /**
-        * @todo Define visibility
-        */
-       public $cli_args = array();
-
-       /**
-        * @todo Define visibility
-        */
-       public $cli_options = array(
-               array('-s', 'Silent operation, will only output errors and important messages.'),
-               array('--silent', 'Same as -s'),
-               array('-ss', 'Super silent, will not even output errors or important messages.')
-       );
-
-       /**
-        * @todo Define visibility
-        */
-       public $cli_help = array(
-               'name' => 'CLI base class (overwrite this...)',
-               'synopsis' => '###OPTIONS###',
-               'description' => 'Class with basic functionality for CLI scripts (overwrite this...)',
-               'examples' => 'Give examples...',
-               'options' => '',
-               'license' => 'GNU GPL - free software!',
-               'author' => '[Author name]'
-       );
-
-       /**
-        * @todo Define visibility
-        */
-       public $stdin = NULL;
-
-       /**
-        * Constructor
-        * Make sure child classes also call this!
-        *
-        * @return void
-        * @todo Define visibility
-        */
-       public function __construct() {
-               // Loads the cli_args array with command line arguments
-               $this->cli_args = $this->cli_getArgIndex();
-       }
-
-       /**
-        * Finds the arg token (like "-s") in argv and returns the rest of argv from that point on.
-        * This should only be used in special cases since this->cli_args should already be prepared with an index of values!
-        *
-        * @param string $option Option string, eg. "-s
-        * @param array $argv Input argv array
-        * @return array Output argv array with all options AFTER the found option.
-        * @todo Define visibility
-        */
-       public function cli_getArgArray($option, $argv) {
-               while (count($argv) && strcmp($argv[0], $option)) {
-                       array_shift($argv);
-               }
-               if (!strcmp($argv[0], $option)) {
-                       array_shift($argv);
-                       return count($argv) ? $argv : array('');
-               }
-       }
-
-       /**
-        * Return TRUE if option is found
-        *
-        * @param string $option Option string, eg. "-s
-        * @return boolean TRUE if option found
-        * @todo Define visibility
-        */
-       public function cli_isArg($option) {
-               return isset($this->cli_args[$option]);
-       }
-
-       /**
-        * Return argument value
-        *
-        * @param string $option Option string, eg. "-s
-        * @param integer $idx Value index, default is 0 (zero) = the first one...
-        * @return boolean TRUE if option found
-        * @todo Define visibility
-        */
-       public function cli_argValue($option, $idx = 0) {
-               return is_array($this->cli_args[$option]) ? $this->cli_args[$option][$idx] : '';
-       }
-
-       /**
-        * Will parse "_SERVER[argv]" into an index of options and values
-        * Argument names (eg. "-s") will be keys and values after (eg. "-s value1 value2 ..." or "-s=value1") will be in the array.
-        * Array is empty if no values
-        *
-        * @return array
-        * @todo Define visibility
-        */
-       public function cli_getArgIndex() {
-               $cli_options = array();
-               $index = '_DEFAULT';
-               foreach ($_SERVER['argv'] as $token) {
-                       // Options starting with a number is invalid - they could be negative values!
-                       if ($token[0] === '-' && !\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($token[1])) {
-                               list($index, $opt) = explode('=', $token, 2);
-                               if (isset($cli_options[$index])) {
-                                       echo 'ERROR: Option ' . $index . ' was used twice!' . LF;
-                                       die;
-                               }
-                               $cli_options[$index] = array();
-                               if (isset($opt)) {
-                                       $cli_options[$index][] = $opt;
-                               }
-                       } else {
-                               $cli_options[$index][] = $token;
-                       }
-               }
-               return $cli_options;
-       }
-
-       /**
-        * Validates if the input arguments in this->cli_args are all listed in this->cli_options and if not,
-        * will exit with an error.
-        *
-        * @todo Define visibility
-        */
-       public function cli_validateArgs() {
-               $cli_args_copy = $this->cli_args;
-               unset($cli_args_copy['_DEFAULT']);
-               $allOptions = array();
-               foreach ($this->cli_options as $cfg) {
-                       $allOptions[] = $cfg[0];
-                       $argSplit = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(' ', $cfg[0], 1);
-                       if (isset($cli_args_copy[$argSplit[0]])) {
-                               foreach ($argSplit as $i => $v) {
-                                       $ii = $i;
-                                       if ($i > 0) {
-                                               if (!isset($cli_args_copy[$argSplit[0]][($i - 1)]) && $v[0] != '[') {
-                                                       // Using "[]" around a paramter makes it optional
-                                                       echo 'ERROR: Option "' . $argSplit[0] . '" requires a value ("' . $v . '") on position ' . $i . LF;
-                                                       die;
-                                               }
-                                       }
-                               }
-                               $ii++;
-                               if (isset($cli_args_copy[$argSplit[0]][$ii - 1])) {
-                                       echo 'ERROR: Option "' . $argSplit[0] . '" does not support a value on position ' . $ii . LF;
-                                       die;
-                               }
-                               unset($cli_args_copy[$argSplit[0]]);
-                       }
-               }
-               if (count($cli_args_copy)) {
-                       echo wordwrap('ERROR: Option ' . implode(',', array_keys($cli_args_copy)) . ' was unknown to this script!' . LF . '(Options are: ' . implode(', ', $allOptions) . ')' . LF);
-                       die;
-               }
-       }
-
-       /**
-        * Asks stdin for keyboard input and returns the line (after enter is pressed)
-        *
-        * @return string
-        * @todo Define visibility
-        */
-       public function cli_keyboardInput() {
-               // Have to open the stdin stream only ONCE! otherwise I cannot read multiple lines from it... :
-               if (!$this->stdin) {
-                       $this->stdin = fopen('php://stdin', 'r');
-               }
-               while (FALSE == ($line = fgets($this->stdin, 1000))) {
-
-               }
-               return trim($line);
-       }
-
-       /**
-        * Asks for Yes/No from shell and returns TRUE if "y" or "yes" is found as input.
-        *
-        * @param string $msg String to ask before...
-        * @return boolean TRUE if "y" or "yes" is the input (case insensitive)
-        * @todo Define visibility
-        */
-       public function cli_keyboardInput_yes($msg = '') {
-               // ONLY makes sense to echo it out since we are awaiting keyboard input - that cannot be silenced
-               echo $msg . ' (Yes/No + return): ';
-               return \TYPO3\CMS\Core\Utility\GeneralUtility::inList('y,yes', strtolower($this->cli_keyboardInput()));
-       }
-
-       /**
-        * Echos strings to shell, but respective silent-modes
-        *
-        * @param string $string The string
-        * @param boolean $force If string should be written even if -s is set (-ss will subdue it!)
-        * @return boolean Returns TRUE if string was outputted.
-        * @todo Define visibility
-        */
-       public function cli_echo($string = '', $force = FALSE) {
-               if (isset($this->cli_args['-ss'])) {
-
-               } elseif (isset($this->cli_args['-s']) || isset($this->cli_args['--silent'])) {
-                       if ($force) {
-                               echo $string;
-                               return TRUE;
-                       }
-               } else {
-                       echo $string;
-                       return TRUE;
-               }
-               return FALSE;
-       }
-
-       /**
-        * Prints help-output from ->cli_help array
-        *
-        * @return void
-        * @todo Define visibility
-        */
-       public function cli_help() {
-               foreach ($this->cli_help as $key => $value) {
-                       $this->cli_echo(strtoupper($key) . ':
-');
-                       switch ($key) {
-                       case 'synopsis':
-                               $optStr = '';
-                               foreach ($this->cli_options as $v) {
-                                       $optStr .= ' [' . $v[0] . ']';
-                               }
-                               $this->cli_echo($this->cli_indent(str_replace('###OPTIONS###', trim($optStr), $value), 4) . '
-
-');
-                               break;
-                       case 'options':
-                               $this->cli_echo($this->cli_indent($value, 4) . LF);
-                               $maxLen = 0;
-                               foreach ($this->cli_options as $v) {
-                                       if (strlen($v[0]) > $maxLen) {
-                                               $maxLen = strlen($v[0]);
-                                       }
-                               }
-                               foreach ($this->cli_options as $v) {
-                                       $this->cli_echo($v[0] . substr($this->cli_indent(rtrim(($v[1] . LF . $v[2])), ($maxLen + 4)), strlen($v[0])) . LF);
-                               }
-                               $this->cli_echo(LF);
-                               break;
-                       default:
-                               $this->cli_echo($this->cli_indent($value, 4) . '
-
-');
-                               break;
-                       }
-               }
-       }
-
-       /**
-        * Indentation function for 75 char wide lines.
-        *
-        * @param string $str String to break and indent.
-        * @param integer $indent Number of space chars to indent.
-        * @return string Result
-        * @todo Define visibility
-        */
-       public function cli_indent($str, $indent) {
-               $lines = explode(LF, wordwrap($str, 75 - $indent));
-               $indentStr = str_pad('', $indent, ' ');
-               foreach ($lines as $k => $v) {
-                       $lines[$k] = $indentStr . $lines[$k];
-               }
-               return implode(LF, $lines);
-       }
-
-}
-
-
-?>
\ No newline at end of file
diff --git a/typo3/sysext/core/Classes/Controller/CommandLineController.php b/typo3/sysext/core/Classes/Controller/CommandLineController.php
new file mode 100644 (file)
index 0000000..f929f38
--- /dev/null
@@ -0,0 +1,313 @@
+<?php
+namespace TYPO3\CMS\Core\Controller;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2006-2011 Kasper Skårhøj (kasperYYYY@typo3.com)
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+/**
+ * Contains base class for TYPO3 cli scripts
+ *
+ * @author Kasper Skårhøj <kasperYYYY@typo3.com>
+ */
+/**
+ * TYPO3 cli script basis
+ *
+ * @author Kasper Skårhøj <kasperYYYY@typo3.com>
+ * @package TYPO3
+ * @subpackage t3lib
+ */
+class CommandLineController {
+
+       // Command line arguments, exploded into key => value-array pairs
+       /**
+        * @todo Define visibility
+        */
+       public $cli_args = array();
+
+       /**
+        * @todo Define visibility
+        */
+       public $cli_options = array(
+               array('-s', 'Silent operation, will only output errors and important messages.'),
+               array('--silent', 'Same as -s'),
+               array('-ss', 'Super silent, will not even output errors or important messages.')
+       );
+
+       /**
+        * @todo Define visibility
+        */
+       public $cli_help = array(
+               'name' => 'CLI base class (overwrite this...)',
+               'synopsis' => '###OPTIONS###',
+               'description' => 'Class with basic functionality for CLI scripts (overwrite this...)',
+               'examples' => 'Give examples...',
+               'options' => '',
+               'license' => 'GNU GPL - free software!',
+               'author' => '[Author name]'
+       );
+
+       /**
+        * @todo Define visibility
+        */
+       public $stdin = NULL;
+
+       /**
+        * Constructor
+        * Make sure child classes also call this!
+        *
+        * @return void
+        * @todo Define visibility
+        */
+       public function __construct() {
+               // Loads the cli_args array with command line arguments
+               $this->cli_args = $this->cli_getArgIndex();
+       }
+
+       /**
+        * Finds the arg token (like "-s") in argv and returns the rest of argv from that point on.
+        * This should only be used in special cases since this->cli_args should already be prepared with an index of values!
+        *
+        * @param string $option Option string, eg. "-s
+        * @param array $argv Input argv array
+        * @return array Output argv array with all options AFTER the found option.
+        * @todo Define visibility
+        */
+       public function cli_getArgArray($option, $argv) {
+               while (count($argv) && strcmp($argv[0], $option)) {
+                       array_shift($argv);
+               }
+               if (!strcmp($argv[0], $option)) {
+                       array_shift($argv);
+                       return count($argv) ? $argv : array('');
+               }
+       }
+
+       /**
+        * Return TRUE if option is found
+        *
+        * @param string $option Option string, eg. "-s
+        * @return boolean TRUE if option found
+        * @todo Define visibility
+        */
+       public function cli_isArg($option) {
+               return isset($this->cli_args[$option]);
+       }
+
+       /**
+        * Return argument value
+        *
+        * @param string $option Option string, eg. "-s
+        * @param integer $idx Value index, default is 0 (zero) = the first one...
+        * @return boolean TRUE if option found
+        * @todo Define visibility
+        */
+       public function cli_argValue($option, $idx = 0) {
+               return is_array($this->cli_args[$option]) ? $this->cli_args[$option][$idx] : '';
+       }
+
+       /**
+        * Will parse "_SERVER[argv]" into an index of options and values
+        * Argument names (eg. "-s") will be keys and values after (eg. "-s value1 value2 ..." or "-s=value1") will be in the array.
+        * Array is empty if no values
+        *
+        * @return array
+        * @todo Define visibility
+        */
+       public function cli_getArgIndex() {
+               $cli_options = array();
+               $index = '_DEFAULT';
+               foreach ($_SERVER['argv'] as $token) {
+                       // Options starting with a number is invalid - they could be negative values!
+                       if ($token[0] === '-' && !\TYPO3\CMS\Core\Utility\MathUtility::canBeInterpretedAsInteger($token[1])) {
+                               list($index, $opt) = explode('=', $token, 2);
+                               if (isset($cli_options[$index])) {
+                                       echo 'ERROR: Option ' . $index . ' was used twice!' . LF;
+                                       die;
+                               }
+                               $cli_options[$index] = array();
+                               if (isset($opt)) {
+                                       $cli_options[$index][] = $opt;
+                               }
+                       } else {
+                               $cli_options[$index][] = $token;
+                       }
+               }
+               return $cli_options;
+       }
+
+       /**
+        * Validates if the input arguments in this->cli_args are all listed in this->cli_options and if not,
+        * will exit with an error.
+        *
+        * @todo Define visibility
+        */
+       public function cli_validateArgs() {
+               $cli_args_copy = $this->cli_args;
+               unset($cli_args_copy['_DEFAULT']);
+               $allOptions = array();
+               foreach ($this->cli_options as $cfg) {
+                       $allOptions[] = $cfg[0];
+                       $argSplit = \TYPO3\CMS\Core\Utility\GeneralUtility::trimExplode(' ', $cfg[0], 1);
+                       if (isset($cli_args_copy[$argSplit[0]])) {
+                               foreach ($argSplit as $i => $v) {
+                                       $ii = $i;
+                                       if ($i > 0) {
+                                               if (!isset($cli_args_copy[$argSplit[0]][($i - 1)]) && $v[0] != '[') {
+                                                       // Using "[]" around a paramter makes it optional
+                                                       echo 'ERROR: Option "' . $argSplit[0] . '" requires a value ("' . $v . '") on position ' . $i . LF;
+                                                       die;
+                                               }
+                                       }
+                               }
+                               $ii++;
+                               if (isset($cli_args_copy[$argSplit[0]][$ii - 1])) {
+                                       echo 'ERROR: Option "' . $argSplit[0] . '" does not support a value on position ' . $ii . LF;
+                                       die;
+                               }
+                               unset($cli_args_copy[$argSplit[0]]);
+                       }
+               }
+               if (count($cli_args_copy)) {
+                       echo wordwrap('ERROR: Option ' . implode(',', array_keys($cli_args_copy)) . ' was unknown to this script!' . LF . '(Options are: ' . implode(', ', $allOptions) . ')' . LF);
+                       die;
+               }
+       }
+
+       /**
+        * Asks stdin for keyboard input and returns the line (after enter is pressed)
+        *
+        * @return string
+        * @todo Define visibility
+        */
+       public function cli_keyboardInput() {
+               // Have to open the stdin stream only ONCE! otherwise I cannot read multiple lines from it... :
+               if (!$this->stdin) {
+                       $this->stdin = fopen('php://stdin', 'r');
+               }
+               while (FALSE == ($line = fgets($this->stdin, 1000))) {
+
+               }
+               return trim($line);
+       }
+
+       /**
+        * Asks for Yes/No from shell and returns TRUE if "y" or "yes" is found as input.
+        *
+        * @param string $msg String to ask before...
+        * @return boolean TRUE if "y" or "yes" is the input (case insensitive)
+        * @todo Define visibility
+        */
+       public function cli_keyboardInput_yes($msg = '') {
+               // ONLY makes sense to echo it out since we are awaiting keyboard input - that cannot be silenced
+               echo $msg . ' (Yes/No + return): ';
+               return \TYPO3\CMS\Core\Utility\GeneralUtility::inList('y,yes', strtolower($this->cli_keyboardInput()));
+       }
+
+       /**
+        * Echos strings to shell, but respective silent-modes
+        *
+        * @param string $string The string
+        * @param boolean $force If string should be written even if -s is set (-ss will subdue it!)
+        * @return boolean Returns TRUE if string was outputted.
+        * @todo Define visibility
+        */
+       public function cli_echo($string = '', $force = FALSE) {
+               if (isset($this->cli_args['-ss'])) {
+
+               } elseif (isset($this->cli_args['-s']) || isset($this->cli_args['--silent'])) {
+                       if ($force) {
+                               echo $string;
+                               return TRUE;
+                       }
+               } else {
+                       echo $string;
+                       return TRUE;
+               }
+               return FALSE;
+       }
+
+       /**
+        * Prints help-output from ->cli_help array
+        *
+        * @return void
+        * @todo Define visibility
+        */
+       public function cli_help() {
+               foreach ($this->cli_help as $key => $value) {
+                       $this->cli_echo(strtoupper($key) . ':
+');
+                       switch ($key) {
+                       case 'synopsis':
+                               $optStr = '';
+                               foreach ($this->cli_options as $v) {
+                                       $optStr .= ' [' . $v[0] . ']';
+                               }
+                               $this->cli_echo($this->cli_indent(str_replace('###OPTIONS###', trim($optStr), $value), 4) . '
+
+');
+                               break;
+                       case 'options':
+                               $this->cli_echo($this->cli_indent($value, 4) . LF);
+                               $maxLen = 0;
+                               foreach ($this->cli_options as $v) {
+                                       if (strlen($v[0]) > $maxLen) {
+                                               $maxLen = strlen($v[0]);
+                                       }
+                               }
+                               foreach ($this->cli_options as $v) {
+                                       $this->cli_echo($v[0] . substr($this->cli_indent(rtrim(($v[1] . LF . $v[2])), ($maxLen + 4)), strlen($v[0])) . LF);
+                               }
+                               $this->cli_echo(LF);
+                               break;
+                       default:
+                               $this->cli_echo($this->cli_indent($value, 4) . '
+
+');
+                               break;
+                       }
+               }
+       }
+
+       /**
+        * Indentation function for 75 char wide lines.
+        *
+        * @param string $str String to break and indent.
+        * @param integer $indent Number of space chars to indent.
+        * @return string Result
+        * @todo Define visibility
+        */
+       public function cli_indent($str, $indent) {
+               $lines = explode(LF, wordwrap($str, 75 - $indent));
+               $indentStr = str_pad('', $indent, ' ');
+               foreach ($lines as $k => $v) {
+                       $lines[$k] = $indentStr . $lines[$k];
+               }
+               return implode(LF, $lines);
+       }
+
+}
+
+
+?>
\ No newline at end of file
diff --git a/typo3/sysext/core/Classes/Core/CliBootstrap.php b/typo3/sysext/core/Classes/Core/CliBootstrap.php
new file mode 100644 (file)
index 0000000..af9d700
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+namespace TYPO3\CMS\Core\Core;
+
+/***************************************************************
+ *  Copyright notice
+ *
+ *  (c) 2012 Christian Kuhn <lolli@schwarzbu.ch>
+ *  All rights reserved
+ *
+ *  This script is part of the TYPO3 project. The TYPO3 project is
+ *  free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  The GNU General Public License can be found at
+ *  http://www.gnu.org/copyleft/gpl.html.
+ *  A copy is found in the textfile GPL.txt and important notices to the license
+ *  from the author is found in LICENSE.txt distributed with these scripts.
+ *
+ *
+ *  This script is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  This copyright notice MUST APPEAR in all copies of the script!
+ ***************************************************************/
+/**
+ * This class encapsulates cli specific bootstrap methods.
+ *
+ * @author Christian Kuhn <lolli@schwarzbu.ch>
+ * @package TYPO3
+ * @subpackage core
+ */
+class CliBootstrap {
+
+       /**
+        * Check the script is called from a cli environment.
+        *
+        * @return void
+        */
+       static public function checkEnvironmentOrDie() {
+               if (substr(php_sapi_name(), 0, 3) === 'cgi') {
+                       self::initializeCgiCompatibilityLayerOrDie();
+               } elseif (php_sapi_name() !== 'cli') {
+                       die('Not called from a command line interface (e.g. a shell or scheduler).' . chr(10));
+               }
+       }
+
+       /**
+        * Check and define cli parameters.
+        * First argument is a key that points to the script configuration.
+        * If it is not set or not valid, the script exits with an error message.
+        *
+        * @return void
+        */
+       static public function initializeCliKeyOrDie() {
+               if (!isset($_SERVER['argv'][1]) || !is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][$_SERVER['argv'][1]])) {
+                       if (!isset($_SERVER['argv'][1])) {
+                               $message = 'This script must have a \'cliKey\' as first argument.';
+                       } else {
+                               $message = 'The supplied \'cliKey\' is not valid.';
+                       }
+                       $message .= ' Valid keys are:
+
+';
+                       $cliKeys = array_keys($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys']);
+                       asort($cliKeys);
+                       foreach ($cliKeys as $key => $value) {
+                               $message .= '  ' . $value . LF;
+                       }
+                       fwrite(STDERR, $message . LF);
+                       die(1);
+               }
+               define('TYPO3_cliKey', $_SERVER['argv'][1]);
+               define('TYPO3_cliInclude', \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][TYPO3_cliKey][0]));
+               $GLOBALS['MCONF']['name'] = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['GLOBAL']['cliKeys'][TYPO3_cliKey][1];
+               // This is a compatibility layer: Some cli scripts rely on this, like ext:phpunit cli
+               $GLOBALS['temp_cliScriptPath'] = array_shift($_SERVER['argv']);
+               $GLOBALS['temp_cliKey'] = array_shift($_SERVER['argv']);
+               array_unshift($_SERVER['argv'], $GLOBALS['temp_cliScriptPath']);
+       }
+
+       /**
+        * Set up cgi sapi as de facto cli, but check no HTTP
+        * environment variables are set.
+        *
+        * @return void
+        */
+       static protected function initializeCgiCompatibilityLayerOrDie() {
+               // Sanity check: Ensure we're running in a shell or cronjob (and NOT via HTTP)
+               $checkEnvVars = array('HTTP_USER_AGENT', 'HTTP_HOST', 'SERVER_NAME', 'REMOTE_ADDR', 'REMOTE_PORT', 'SERVER_PROTOCOL');
+               foreach ($checkEnvVars as $var) {
+                       if (array_key_exists($var, $_SERVER)) {
+                               echo 'SECURITY CHECK FAILED! This script cannot be used within your browser!' . chr(10);
+                               echo 'If you are sure that we run in a shell or cronjob, please unset' . chr(10);
+                               echo 'environment variable ' . $var . ' (usually using \'unset ' . $var . '\')' . chr(10);
+                               echo 'before starting this script.' . chr(10);
+                               die;
+                       }
+               }
+               // Mimic CLI API in CGI API (you must use the -C/-no-chdir and the -q/--no-header switches!)
+               ini_set('html_errors', 0);
+               ini_set('implicit_flush', 1);
+               ini_set('max_execution_time', 0);
+               define(STDIN, fopen('php://stdin', 'r'));
+               define(STDOUT, fopen('php://stdout', 'w'));
+               define(STDERR, fopen('php://stderr', 'w'));
+       }
+
+}
+
+
+?>
\ No newline at end of file
index ae0944b..23ad362 100644 (file)
@@ -163,7 +163,7 @@ return array(
        'Tx_Beuser_ViewHelpers_SpriteIconForRecordViewHelper' => 'TYPO3\\CMS\\Beuser\\ViewHelpers\\SpriteIconForRecordViewHelper',
        'Tx_Beuser_ViewHelpers_SpriteManagerIconViewHelper' => 'TYPO3\\CMS\\Beuser\\ViewHelpers\\SpriteManagerIconViewHelper',
        'Tx_Beuser_ViewHelpers_SUViewHelper' => 'TYPO3\\CMS\\Beuser\\ViewHelpers\\SuViewHelper',
-       't3lib_cli' => 'TYPO3\\CMS\\Cli\\Controller\\CommandLineController',
+       't3lib_cli' => 'TYPO3\\CMS\\Core\\Controller\\CommandLineController',
        'extDirect_DataProvider_ContextHelp' => 'TYPO3\\CMS\\ContextHelp\\ExtDirect\\ContextHelpDataProvider',
        't3lib_userAuth' => 'TYPO3\\CMS\\Core\\Authentication\\AbstractUserAuthentication',
        't3lib_beUserAuth' => 'TYPO3\\CMS\\Core\\Authentication\\BackendUserAuthentication',
@@ -1656,4 +1656,4 @@ return array(
        'Tx_Workspaces_Service_AutoPublishTask' => 'TYPO3\\CMS\\Workspaces\\Task\\AutoPublishTask',
        'Tx_Workspaces_Service_CleanupPreviewLinkTask' => 'TYPO3\\CMS\\Workspaces\\Task\\CleanupPreviewLinkTask'
 );
-?>
\ No newline at end of file
+?>
index a39e9f4..52124da 100644 (file)
@@ -38,7 +38,7 @@ namespace TYPO3\CMS\Integrity;
  * @package TYPO3
  * @subpackage tx_lowlevel
  */
-class AdminCommand extends \TYPO3\CMS\Cli\Controller\CommandLineController {
+class AdminCommand extends \TYPO3\CMS\Core\Controller\CommandLineController {
 
        /**
         * @todo Define visibility
index 38e37ed..8cbf79f 100644 (file)
@@ -38,7 +38,7 @@ namespace TYPO3\CMS\Integrity;
  * @package TYPO3
  * @subpackage tx_lowlevel
  */
-class CleanerCommand extends \TYPO3\CMS\Cli\Controller\CommandLineController {
+class CleanerCommand extends \TYPO3\CMS\Core\Controller\CommandLineController {
 
        /**
         * @todo Define visibility
index 08ecfea..07474db 100644 (file)
@@ -34,8 +34,8 @@ if (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_CLI && basename(PATH_thisScript) == 'c
        // Create an instance of the scheduler object
        /** @var $scheduler \TYPO3\CMS\Scheduler\Scheduler */
        $scheduler = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Scheduler\\Scheduler');
-       /** @var \TYPO3\CMS\Cli\Controller\CommandLineController $cli */
-       $cli = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Cli\\Controller\\CommandLineController');
+       /** @var \TYPO3\CMS\Core\Controller\CommandLineController $cli */
+       $cli = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Controller\\CommandLineController');
        // If a specific id is given in arguments, then run that task. Otherwise run scheduled tasks.
        if ($cli->cli_isArg('-i')) {
                $taskId = intval($cli->cli_argValue('-i'));