diff --git a/console.php b/console.php index 7b067a84a3523..4e1acb00c978b 100644 --- a/console.php +++ b/console.php @@ -75,13 +75,16 @@ function exceptionHandler($exception) { $eventLogger->start('console:build_application', 'Build Application instance and load commands'); $application = \OCP\Server::get(Application::class); - $application->loadCommands(new ArgvInput(), new ConsoleOutput()); + /* base.php will have removed eventual debug options from argv in $_SERVER */ + $argv = $_SERVER['argv']; + $input = new ArgvInput($argv); + $application->loadCommands($input, new ConsoleOutput()); $eventLogger->end('console:build_application'); $eventLogger->start('console:run', 'Run the command'); $application->setAutoExit(false); - $exitCode = $application->run(); + $exitCode = $application->run($input); $eventLogger->end('console:run'); diff --git a/core/Listener/BeforeMessageLoggedEventListener.php b/core/Listener/BeforeMessageLoggedEventListener.php new file mode 100644 index 0000000000000..ef771ca0a81bd --- /dev/null +++ b/core/Listener/BeforeMessageLoggedEventListener.php @@ -0,0 +1,69 @@ + + */ +class BeforeMessageLoggedEventListener implements IEventListener { + public function __construct( + private int $level, + ) { + } + + public function handle(Event $event): void { + if (!$event instanceof BeforeMessageLoggedEvent) { + return; + } + if ($event->getLevel() < $this->level) { + return; + } + echo + match($event->getLevel()) { + 0 => '[debug]', + 1 => '[info]', + 2 => '[warning]', + 3 => '[error]', + 4 => '[fatal]', + default => '['.$event->getLevel().']', + } + .' ['.$event->getApp().'] ' + .$event->getMessage()['message'] + ."\n"; + } + + /** + * Register listener to log messages and remove debug options from $_SERVER['argv'] + */ + public static function setup(): void { + $eventDispatcher = Server::get(IEventDispatcher::class); + $argv = $_SERVER['argv']; + $level = 0; + foreach ($argv as $key => $arg) { + if ($arg === '--'.ReservedOptions::DEBUG_LOG) { + unset($argv[$key]); + } elseif (str_starts_with($arg, '--'.ReservedOptions::DEBUG_LOG_LEVEL.'=')) { + $level = (int)substr($arg, strlen('--'.ReservedOptions::DEBUG_LOG_LEVEL.'=')); + unset($argv[$key]); + } + } + $_SERVER['argv'] = array_values($argv); + $debugLoggerEventListener = new self($level); + $eventDispatcher->addListener(BeforeMessageLoggedEvent::class, $debugLoggerEventListener->handle(...)); + } +} diff --git a/lib/base.php b/lib/base.php index 91ca87426e156..c84a124628889 100644 --- a/lib/base.php +++ b/lib/base.php @@ -556,6 +556,7 @@ public static function init(): void { self::$composerAutoloader = require_once OC::$SERVERROOT . '/lib/composer/autoload.php'; self::$composerAutoloader->setApcuPrefix(null); + try { self::initPaths(); // setup 3rdparty autoloader @@ -578,6 +579,10 @@ public static function init(): void { self::$server = new \OC\Server(\OC::$WEBROOT, self::$config); self::$server->boot(); + if (self::$CLI && in_array('--'.\OCP\Console\ReservedOptions::DEBUG_LOG, $_SERVER['argv'])) { + \OC\Core\Listener\BeforeMessageLoggedEventListener::setup(); + } + $eventLogger = Server::get(\OCP\Diagnostics\IEventLogger::class); $eventLogger->log('autoloader', 'Autoloader', $loaderStart, $loaderEnd); $eventLogger->start('boot', 'Initialize'); diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 9fa3b5bf76559..ffd178374076c 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -220,6 +220,7 @@ 'OCP\\Config\\BeforePreferenceDeletedEvent' => $baseDir . '/lib/public/Config/BeforePreferenceDeletedEvent.php', 'OCP\\Config\\BeforePreferenceSetEvent' => $baseDir . '/lib/public/Config/BeforePreferenceSetEvent.php', 'OCP\\Console\\ConsoleEvent' => $baseDir . '/lib/public/Console/ConsoleEvent.php', + 'OCP\\Console\\ReservedOptions' => $baseDir . '/lib/public/Console/ReservedOptions.php', 'OCP\\Constants' => $baseDir . '/lib/public/Constants.php', 'OCP\\Contacts\\ContactsMenu\\IAction' => $baseDir . '/lib/public/Contacts/ContactsMenu/IAction.php', 'OCP\\Contacts\\ContactsMenu\\IActionFactory' => $baseDir . '/lib/public/Contacts/ContactsMenu/IActionFactory.php', @@ -1236,6 +1237,7 @@ 'OC\\Core\\Events\\PasswordResetEvent' => $baseDir . '/core/Events/PasswordResetEvent.php', 'OC\\Core\\Exception\\LoginFlowV2NotFoundException' => $baseDir . '/core/Exception/LoginFlowV2NotFoundException.php', 'OC\\Core\\Exception\\ResetPasswordException' => $baseDir . '/core/Exception/ResetPasswordException.php', + 'OC\\Core\\Listener\\BeforeMessageLoggedEventListener' => $baseDir . '/core/Listener/BeforeMessageLoggedEventListener.php', 'OC\\Core\\Listener\\BeforeTemplateRenderedListener' => $baseDir . '/core/Listener/BeforeTemplateRenderedListener.php', 'OC\\Core\\Middleware\\TwoFactorMiddleware' => $baseDir . '/core/Middleware/TwoFactorMiddleware.php', 'OC\\Core\\Migrations\\Version13000Date20170705121758' => $baseDir . '/core/Migrations/Version13000Date20170705121758.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 38d06cbc9e3be..4ca6c0d0a9b72 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -253,6 +253,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\Config\\BeforePreferenceDeletedEvent' => __DIR__ . '/../../..' . '/lib/public/Config/BeforePreferenceDeletedEvent.php', 'OCP\\Config\\BeforePreferenceSetEvent' => __DIR__ . '/../../..' . '/lib/public/Config/BeforePreferenceSetEvent.php', 'OCP\\Console\\ConsoleEvent' => __DIR__ . '/../../..' . '/lib/public/Console/ConsoleEvent.php', + 'OCP\\Console\\ReservedOptions' => __DIR__ . '/../../..' . '/lib/public/Console/ReservedOptions.php', 'OCP\\Constants' => __DIR__ . '/../../..' . '/lib/public/Constants.php', 'OCP\\Contacts\\ContactsMenu\\IAction' => __DIR__ . '/../../..' . '/lib/public/Contacts/ContactsMenu/IAction.php', 'OCP\\Contacts\\ContactsMenu\\IActionFactory' => __DIR__ . '/../../..' . '/lib/public/Contacts/ContactsMenu/IActionFactory.php', @@ -1269,6 +1270,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\Core\\Events\\PasswordResetEvent' => __DIR__ . '/../../..' . '/core/Events/PasswordResetEvent.php', 'OC\\Core\\Exception\\LoginFlowV2NotFoundException' => __DIR__ . '/../../..' . '/core/Exception/LoginFlowV2NotFoundException.php', 'OC\\Core\\Exception\\ResetPasswordException' => __DIR__ . '/../../..' . '/core/Exception/ResetPasswordException.php', + 'OC\\Core\\Listener\\BeforeMessageLoggedEventListener' => __DIR__ . '/../../..' . '/core/Listener/BeforeMessageLoggedEventListener.php', 'OC\\Core\\Listener\\BeforeTemplateRenderedListener' => __DIR__ . '/../../..' . '/core/Listener/BeforeTemplateRenderedListener.php', 'OC\\Core\\Middleware\\TwoFactorMiddleware' => __DIR__ . '/../../..' . '/core/Middleware/TwoFactorMiddleware.php', 'OC\\Core\\Migrations\\Version13000Date20170705121758' => __DIR__ . '/../../..' . '/core/Migrations/Version13000Date20170705121758.php', diff --git a/lib/public/Console/ReservedOptions.php b/lib/public/Console/ReservedOptions.php new file mode 100644 index 0000000000000..aff7a7daa3aad --- /dev/null +++ b/lib/public/Console/ReservedOptions.php @@ -0,0 +1,24 @@ +