From cd52d0b3e9841bbae2df33a996c529296dbf5e53 Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 23 Jul 2018 13:40:52 +0200 Subject: [PATCH] Using getopt for CLI arguments (#5446) * Adding Argument class to Friendica * Adding Argument class to Friendica * Adding Argument class to Friendica * fixing arguments for `spawnWorker` * Adding `use Friendica\BaseObject` to `ApiTest.php` * Refactoring the argument-usages of Friendica * Refactoring the argument-usages of Friendica * removing superfluous [] --- bin/daemon.php | 8 +++++++- bin/worker.php | 11 ++++++++--- src/App.php | 23 ++++++++++++++++++----- src/Core/Worker.php | 8 +++----- tests/ApiTest.php | 3 ++- 5 files changed, 38 insertions(+), 15 deletions(-) diff --git a/bin/daemon.php b/bin/daemon.php index 449f92d127..bf82912ee2 100755 --- a/bin/daemon.php +++ b/bin/daemon.php @@ -12,6 +12,12 @@ use Friendica\Core\Config; use Friendica\Core\Worker; use Friendica\Database\DBA; +// Get options +$shortopts = ''; +$shortopts .= 'f'; +$longopts = [ 'foreground' ]; +$options = getopt($shortopts, $longopts); + // Ensure that daemon.php is executed from the base path of the installation if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) { $directory = dirname($_SERVER["argv"][0]); @@ -55,7 +61,7 @@ if (in_array("status", $_SERVER["argv"])) { $mode = "status"; } -$foreground = in_array("--foreground", $_SERVER["argv"]); +$foreground = array_key_exists('f', $options) || array_key_exists('foreground', $options); if (!isset($mode)) { die("Please use either 'start', 'stop' or 'status'.\n"); diff --git a/bin/worker.php b/bin/worker.php index 2abfa0ad92..0f8dd98adb 100755 --- a/bin/worker.php +++ b/bin/worker.php @@ -6,11 +6,16 @@ */ use Friendica\App; -use Friendica\BaseObject; use Friendica\Core\Addon; use Friendica\Core\Config; use Friendica\Core\Worker; +// Get options +$shortopts = ''; +$shortopts .= 'sc'; +$longopts = [ 'spawn', 'cron' ]; +$options = getopt($shortopts, $longopts); + // Ensure that worker.php is executed from the base path of the installation if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) { $directory = dirname($_SERVER["argv"][0]); @@ -41,14 +46,14 @@ $a->set_baseurl(Config::get('system', 'url')); Addon::loadHooks(); -$spawn = (($_SERVER["argc"] == 2) && ($_SERVER["argv"][1] == "spawn")); +$spawn = array_key_exists('s', $options) || array_key_exists('spawn', $options); if ($spawn) { Worker::spawnWorker(); killme(); } -$run_cron = (($_SERVER["argc"] <= 1) || ($_SERVER["argv"][1] != "no_cron")); +$run_cron = array_key_exists('c', $options) || array_key_exists('cron', $options); Worker::processQueue($run_cron); diff --git a/src/App.php b/src/App.php index 1e24c3214f..66bec51de7 100644 --- a/src/App.php +++ b/src/App.php @@ -1116,19 +1116,32 @@ class App return false; } - public function proc_run($args) + /** + * Executes a child process with 'proc_open' + * + * @param string $command The command to execute + * @param array $args Arguments to pass to the command ( [ 'key' => value, 'key2' => value2, ... ] + */ + public function proc_run($command, $args) { if (!function_exists('proc_open')) { return; } - array_unshift($args, $this->getConfigValue('config', 'php_path', 'php')); + $cmdline = $this->getConfigValue('config', 'php_path', 'php') . $command; - for ($x = 0; $x < count($args); $x ++) { - $args[$x] = escapeshellarg($args[$x]); + foreach ($args as $key => $value) { + if (!is_null($value) && is_bool($value) && !$value) { + continue; + } + + $cmdline .= ' --' . $key; + if (!is_null($value) && !is_bool($value)) { + $cmdline .= ' ' . $value; + } } - $cmdline = implode(' ', $args); + $cmdline = escapeshellarg($cmdline); if ($this->min_memory_reached()) { return; diff --git a/src/Core/Worker.php b/src/Core/Worker.php index 633b8e12e9..bbcda7dbfa 100644 --- a/src/Core/Worker.php +++ b/src/Core/Worker.php @@ -1010,13 +1010,11 @@ class Worker */ public static function spawnWorker($do_cron = false) { - $args = ["bin/worker.php"]; + $command = 'bin/worker.php'; - if (!$do_cron) { - $args[] = "no_cron"; - } + $args = [ 'cron' => $do_cron ]; - get_app()->proc_run($args); + get_app()->proc_run($command, $args); // after spawning we have to remove the flag. if (Config::get('system', 'worker_daemon_mode', false)) { diff --git a/tests/ApiTest.php b/tests/ApiTest.php index 4d19994e35..a3e1ced683 100644 --- a/tests/ApiTest.php +++ b/tests/ApiTest.php @@ -5,6 +5,7 @@ namespace Friendica\Test; +use Friendica\BaseObject; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Core\Protocol; @@ -28,7 +29,7 @@ class ApiTest extends DatabaseTest parent::setUp(); // Reusable App object - $this->app = \Friendica\BaseObject::getApp(); + $this->app = BaseObject::getApp(); // User data that the test database is populated with $this->selfUser = [