From 2d1c4ab1f7cb0cb1f2028860d286af4e1583a3fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Duli=C3=A7i?= Date: Sun, 28 Jun 2020 09:39:20 +0300 Subject: [PATCH] removed php executable finder --- app/Utilities/Console.php | 22 +- app/Utilities/Installer.php | 2 +- bootstrap/autoload.php | 2 +- composer.json | 2 + overrides/Illuminate/Console/Application.php | 318 +++++++++++++++++++ resources/lang/en-GB/install.php | 1 + 6 files changed, 325 insertions(+), 22 deletions(-) create mode 100644 overrides/Illuminate/Console/Application.php diff --git a/app/Utilities/Console.php b/app/Utilities/Console.php index 642489e48..1ed13c947 100644 --- a/app/Utilities/Console.php +++ b/app/Utilities/Console.php @@ -2,15 +2,14 @@ namespace App\Utilities; -use Illuminate\Support\ProcessUtils; -use Symfony\Component\Process\PhpExecutableFinder; +use Illuminate\Console\Application; use Symfony\Component\Process\Process; class Console { public static function run($string, $all_output = false, $timeout = 0) { - $command = static::formatCommandString($string); + $command = Application::formatCommandString($string); logger('Console command:: ' . $command); @@ -29,21 +28,4 @@ class Console return $output; } - - public static function getPhpBinary() - { - $bin = ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false)); - - return !empty($bin) ? $bin : 'php'; - } - - public static function getArtisanBinary() - { - return defined('ARTISAN_BINARY') ? ProcessUtils::escapeArgument(ARTISAN_BINARY) : 'artisan'; - } - - public static function formatCommandString($string) - { - return sprintf('%s %s %s', static::getPhpBinary(), static::getArtisanBinary(), $string); - } } diff --git a/app/Utilities/Installer.php b/app/Utilities/Installer.php index 36d067e37..60c78426c 100644 --- a/app/Utilities/Installer.php +++ b/app/Utilities/Installer.php @@ -117,7 +117,7 @@ class Installer } if (Console::run('help') !== true) { - $requirements[] = trans('install.requirements.executable', ['php_version' => AKAUNTING_PHP]); + $requirements[] = trans('install.error.php_version', ['php_version' => AKAUNTING_PHP]); } return $requirements; diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php index e99ead36e..8c7d3df97 100644 --- a/bootstrap/autoload.php +++ b/bootstrap/autoload.php @@ -5,7 +5,7 @@ define('AKAUNTING_PHP', '7.2.5'); // Check PHP version if (version_compare(PHP_VERSION, AKAUNTING_PHP, '<')) { - die('ERROR: Your host needs to use PHP ' . AKAUNTING_PHP . ' or higher to run Akaunting'); + die('Error: Ask your hosting provider to use PHP ' . AKAUNTING_PHP . ' or higher for both HTTP and CLI.'); } define('LARAVEL_START', microtime(true)); diff --git a/composer.json b/composer.json index 2ce957c87..6ed5a9f02 100644 --- a/composer.json +++ b/composer.json @@ -74,6 +74,7 @@ "App\\": "app/", "Modules\\": "modules/", "Akaunting\\Module\\Commands\\": "overrides/akaunting/module/Commands/", + "Illuminate\\Console\\": "overrides/Illuminate/Console/", "Illuminate\\Translation\\": "overrides/Illuminate/Translation/" }, "exclude-from-classmap": [ @@ -81,6 +82,7 @@ "vendor/akaunting/module/src/Commands/DisableCommand.php", "vendor/akaunting/module/src/Commands/EnableCommand.php", "vendor/akaunting/module/src/Commands/InstallCommand.php", + "vendor/laravel/framework/src/Illuminate/Console/Application.php", "vendor/laravel/framework/src/Illuminate/Translation/MessageSelector.php" ], "files": [ diff --git a/overrides/Illuminate/Console/Application.php b/overrides/Illuminate/Console/Application.php new file mode 100644 index 000000000..fdf2f4cc3 --- /dev/null +++ b/overrides/Illuminate/Console/Application.php @@ -0,0 +1,318 @@ +laravel = $laravel; + $this->events = $events; + $this->setAutoExit(false); + $this->setCatchExceptions(false); + + $this->events->dispatch(new ArtisanStarting($this)); + + $this->bootstrap(); + } + + /** + * {@inheritdoc} + */ + public function run(InputInterface $input = null, OutputInterface $output = null) + { + $commandName = $this->getCommandName( + $input = $input ?: new ArgvInput + ); + + $this->events->dispatch( + new CommandStarting( + $commandName, $input, $output = $output ?: new ConsoleOutput + ) + ); + + $exitCode = parent::run($input, $output); + + $this->events->dispatch( + new CommandFinished($commandName, $input, $output, $exitCode) + ); + + return $exitCode; + } + + /** + * Determine the proper PHP executable. + * + * @return string + */ + public static function phpBinary() + { + // Not working on shared hosting due to "open_basedir" restriction applied by cPanel/Plesk + //return ProcessUtils::escapeArgument((new PhpExecutableFinder)->find(false)); + return 'php'; + } + + /** + * Determine the proper Artisan executable. + * + * @return string + */ + public static function artisanBinary() + { + return defined('ARTISAN_BINARY') ? ProcessUtils::escapeArgument(ARTISAN_BINARY) : 'artisan'; + } + + /** + * Format the given command as a fully-qualified executable command. + * + * @param string $string + * @return string + */ + public static function formatCommandString($string) + { + return sprintf('%s %s %s', static::phpBinary(), static::artisanBinary(), $string); + } + + /** + * Register a console "starting" bootstrapper. + * + * @param \Closure $callback + * @return void + */ + public static function starting(Closure $callback) + { + static::$bootstrappers[] = $callback; + } + + /** + * Bootstrap the console application. + * + * @return void + */ + protected function bootstrap() + { + foreach (static::$bootstrappers as $bootstrapper) { + $bootstrapper($this); + } + } + + /** + * Clear the console application bootstrappers. + * + * @return void + */ + public static function forgetBootstrappers() + { + static::$bootstrappers = []; + } + + /** + * Run an Artisan console command by name. + * + * @param string $command + * @param array $parameters + * @param \Symfony\Component\Console\Output\OutputInterface|null $outputBuffer + * @return int + * + * @throws \Symfony\Component\Console\Exception\CommandNotFoundException + */ + public function call($command, array $parameters = [], $outputBuffer = null) + { + [$command, $input] = $this->parseCommand($command, $parameters); + + if (! $this->has($command)) { + throw new CommandNotFoundException(sprintf('The command "%s" does not exist.', $command)); + } + + return $this->run( + $input, $this->lastOutput = $outputBuffer ?: new BufferedOutput + ); + } + + /** + * Parse the incoming Artisan command and its input. + * + * @param string $command + * @param array $parameters + * @return array + */ + protected function parseCommand($command, $parameters) + { + if (is_subclass_of($command, SymfonyCommand::class)) { + $callingClass = true; + + $command = $this->laravel->make($command)->getName(); + } + + if (! isset($callingClass) && empty($parameters)) { + $command = $this->getCommandName($input = new StringInput($command)); + } else { + array_unshift($parameters, $command); + + $input = new ArrayInput($parameters); + } + + return [$command, $input ?? null]; + } + + /** + * Get the output for the last run command. + * + * @return string + */ + public function output() + { + return $this->lastOutput && method_exists($this->lastOutput, 'fetch') + ? $this->lastOutput->fetch() + : ''; + } + + /** + * Add a command to the console. + * + * @param \Symfony\Component\Console\Command\Command $command + * @return \Symfony\Component\Console\Command\Command + */ + public function add(SymfonyCommand $command) + { + if ($command instanceof Command) { + $command->setLaravel($this->laravel); + } + + return $this->addToParent($command); + } + + /** + * Add the command to the parent instance. + * + * @param \Symfony\Component\Console\Command\Command $command + * @return \Symfony\Component\Console\Command\Command + */ + protected function addToParent(SymfonyCommand $command) + { + return parent::add($command); + } + + /** + * Add a command, resolving through the application. + * + * @param string $command + * @return \Symfony\Component\Console\Command\Command + */ + public function resolve($command) + { + return $this->add($this->laravel->make($command)); + } + + /** + * Resolve an array of commands through the application. + * + * @param array|mixed $commands + * @return $this + */ + public function resolveCommands($commands) + { + $commands = is_array($commands) ? $commands : func_get_args(); + + foreach ($commands as $command) { + $this->resolve($command); + } + + return $this; + } + + /** + * Get the default input definition for the application. + * + * This is used to add the --env option to every available command. + * + * @return \Symfony\Component\Console\Input\InputDefinition + */ + protected function getDefaultInputDefinition() + { + return tap(parent::getDefaultInputDefinition(), function ($definition) { + $definition->addOption($this->getEnvironmentOption()); + }); + } + + /** + * Get the global environment option for the definition. + * + * @return \Symfony\Component\Console\Input\InputOption + */ + protected function getEnvironmentOption() + { + $message = 'The environment the command should run under'; + + return new InputOption('--env', null, InputOption::VALUE_OPTIONAL, $message); + } + + /** + * Get the Laravel application instance. + * + * @return \Illuminate\Contracts\Foundation\Application + */ + public function getLaravel() + { + return $this->laravel; + } +} diff --git a/resources/lang/en-GB/install.php b/resources/lang/en-GB/install.php index c6263be39..3d933a042 100644 --- a/resources/lang/en-GB/install.php +++ b/resources/lang/en-GB/install.php @@ -39,6 +39,7 @@ return [ ], 'error' => [ + 'php_version' => 'Error: Ask your hosting provider to use PHP :php_version or higher for both HTTP and CLI.', 'connection' => 'Error: Could not connect to the database! Please, make sure the details are correct.', ],