From 3545e9cfa806dc747af3c45461242c81bf999b6f Mon Sep 17 00:00:00 2001 From: Matthew Exon Date: Sun, 21 Mar 2021 18:44:37 +0100 Subject: [PATCH] Add "addon" console command to enable and disable addons --- src/Console/Addon.php | 215 ++++++++++++++++++++++++++++++++++++++++++ src/Core/Console.php | 2 + 2 files changed, 217 insertions(+) create mode 100644 src/Console/Addon.php diff --git a/src/Console/Addon.php b/src/Console/Addon.php new file mode 100644 index 000000000..c1d434bbe --- /dev/null +++ b/src/Console/Addon.php @@ -0,0 +1,215 @@ +. + * + */ + +namespace Friendica\Console; + +use Console_Table; +use Friendica\App; +use Friendica\Content\Pager; +use Friendica\Core\L10n; +use Friendica\Core\Addon as AddonCore; +use Friendica\Database\Database; +use Friendica\Util\Strings; +use RuntimeException; + +/** + * tool to manage addons on the current node + */ +class Addon extends \Asika\SimpleConsole\Console +{ + protected $helpOptions = ['h', 'help', '?']; + + /** + * @var App\Mode + */ + private $appMode; + /** + * @var L10n + */ + private $l10n; + /** + * @var Database + */ + private $dba; + + protected function getHelp() + { + $help = << [-h|--help|-?] [-v] + bin/console addon disable [-h|--help|-?] [-v] + +Description + Modify addon settings per console commands. + +Options + -h|--help|-? Show help information + -v Show more debug information +HELP; + return $help; + } + + public function __construct(App\Mode $appMode, L10n $l10n, Database $dba, array $argv = null) + { + parent::__construct($argv); + + $this->appMode = $appMode; + $this->l10n = $l10n; + $this->dba = $dba; + + AddonCore::loadAddons(); + } + + protected function doExecute() + { + if ($this->getOption('v')) { + $this->out('Class: ' . __CLASS__); + $this->out('Arguments: ' . var_export($this->args, true)); + $this->out('Options: ' . var_export($this->options, true)); + } + + if (count($this->args) == 0) { + $this->out($this->getHelp()); + return 0; + } + + if ($this->appMode->isInstall()) { + throw new RuntimeException('Database isn\'t ready or populated yet'); + } + + $command = $this->getArgument(0); + + switch ($command) { + case 'list': + return $this->list(); + case 'enable': + return $this->enable(); + case 'disable': + return $this->disable(); + default: + throw new \Asika\SimpleConsole\CommandArgsException('Wrong command.'); + } + } + + /** + * Lists plugins + * + * @return int Return code of this command + * + * @throws \Exception + */ + private function list() + { + $subCmd = $this->getArgument(1); + $start = $this->getOption(['s', 'start'], 0); + $count = $this->getOption(['c', 'count'], Pager::ITEMS_PER_PAGE); + + $table = new Console_Table(); + switch ($subCmd) { + case 'all': + $table->setHeaders(['Name', 'Enabled']); + break; + case 'enabled': + case 'disabled': + $table->setHeaders(['Name']); + break; + default: + $this->out($this->getHelp()); + return false; + } + foreach (AddonCore::getAvailableList() as $addon) { + $addon_name = $addon[0]; + $enabled = AddonCore::isEnabled($addon_name) ? "enabled" : "disabled"; + switch ($subCmd) { + case 'all': + $table->addRow([$addon_name, $enabled]); + break; + case 'enabled': + if (!$enabled) { + continue 2; + } + $table->addRow([$addon_name]); + case 'disabled': + if ($enabled) { + continue 2; + } + $table->addRow([$addon_name]); + break; + } + + } + $this->out($table->getTable()); + } + + /** + * Enables an addon + * + * @return int Return code of this command + * + * @throws \Exception + */ + private function enable() + { + $addonname = $this->getArgument(1); + + $addon = Strings::sanitizeFilePathItem($addonname); + if (!is_file("addon/$addon/$addon.php")) { + throw new RuntimeException($this->l10n->t('Addon not found')); + } + + if (AddonCore::isEnabled($addon)) { + throw new RuntimeException($this->l10n->t('Addon already enabled')); + } + + AddonCore::install($addon); + + return 0; + } + + /** + * Disables an addon + * + * @return int Return code of this command + * + * @throws \Exception + */ + private function disable() + { + $addonname = $this->getArgument(1); + + $addon = Strings::sanitizeFilePathItem($addonname); + if (!is_file("addon/$addon/$addon.php")) { + throw new RuntimeException($this->l10n->t('Addon not found')); + } + + if (!AddonCore::isEnabled($addon)) { + throw new RuntimeException($this->l10n->t('Addon already disabled')); + } + + AddonCore::uninstall($addon); + + return 0; + } +} diff --git a/src/Core/Console.php b/src/Core/Console.php index f43b89e9e..fe2c969f2 100644 --- a/src/Core/Console.php +++ b/src/Core/Console.php @@ -44,6 +44,7 @@ class Console extends \Asika\SimpleConsole\Console Usage: bin/console [--version] [-h|--help|-?] [] [-v] Commands: + addon Addon management cache Manage node cache config Edit site config createdoxygen Generate Doxygen headers @@ -74,6 +75,7 @@ HELP; } protected $subConsoles = [ + 'addon' => Friendica\Console\Addon::class, 'cache' => Friendica\Console\Cache::class, 'config' => Friendica\Console\Config::class, 'createdoxygen' => Friendica\Console\CreateDoxygen::class,