diff options
author | Robin McCorkell <rmccorkell@owncloud.com> | 2015-08-20 00:13:20 +0100 |
---|---|---|
committer | Joas Schilling <nickvergessen@owncloud.com> | 2016-01-14 15:02:54 +0100 |
commit | b9d384d837b0400933d71701f0bcfcd38fe4285b (patch) | |
tree | 3ea18f40496f583db00eecc2054a1527489fd1af /core | |
parent | 8f89e3520d74e1805dc46947742a17683ece6ca7 (diff) | |
download | nextcloud-server-b9d384d837b0400933d71701f0bcfcd38fe4285b.tar.gz nextcloud-server-b9d384d837b0400933d71701f0bcfcd38fe4285b.zip |
occ config:system:set can now set other value types
Integers, doubles, booleans and even arrays can now be set, with the
--type=... option. Array setting can be specified by passing multiple
name arguments, e.g. `./occ config:system:set redis port --value=123
--type=integer`
Diffstat (limited to 'core')
-rw-r--r-- | core/command/config/system/setconfig.php | 128 |
1 files changed, 119 insertions, 9 deletions
diff --git a/core/command/config/system/setconfig.php b/core/command/config/system/setconfig.php index 0100ad2dfb0..83a969fd55d 100644 --- a/core/command/config/system/setconfig.php +++ b/core/command/config/system/setconfig.php @@ -48,8 +48,15 @@ class SetConfig extends Base { ->setDescription('Set a system config value') ->addArgument( 'name', - InputArgument::REQUIRED, - 'Name of the config to set' + InputArgument::REQUIRED | InputArgument::IS_ARRAY, + 'Name of the config parameter, specify multiple for array parameter' + ) + ->addOption( + 'type', + null, + InputOption::VALUE_REQUIRED, + 'Value type [string, integer, double, boolean]', + 'string' ) ->addOption( 'value', @@ -67,16 +74,119 @@ class SetConfig extends Base { } protected function execute(InputInterface $input, OutputInterface $output) { - $configName = $input->getArgument('name'); + $configNames = $input->getArgument('name'); + $configName = $configNames[0]; + $configValue = $this->castValue($input->getOption('value'), $input->getOption('type')); + $updateOnly = $input->getOption('update-only'); + + if (count($configNames) > 1) { + $existingValue = $this->systemConfig->getValue($configName); + + $newValue = $this->mergeArrayValue( + array_slice($configNames, 1), $existingValue, $configValue, $updateOnly + ); + + $this->systemConfig->setValue($configName, $newValue); + } else { + if ($updateOnly && !in_array($configName, $this->systemConfig->getKeys(), true)) { + throw new \UnexpectedValueException('Config parameter does not exist'); + } - if (!in_array($configName, $this->systemConfig->getKeys()) && $input->hasParameterOption('--update-only')) { - $output->writeln('<comment>Config value ' . $configName . ' not updated, as it has not been set before.</comment>'); - return 1; + $this->systemConfig->setValue($configName, $configValue); } - $configValue = $input->getOption('value'); - $this->systemConfig->setValue($configName, $configValue); - $output->writeln('<info>System config value ' . $configName . ' set to ' . $configValue . '</info>'); + $output->writeln('<info>System config value ' . implode(' => ', $configNames) . ' set to ' . $configValue . '</info>'); return 0; } + + /** + * @param string $value + * @param string $type + * @return mixed + * @throws \InvalidArgumentException + */ + protected function castValue($value, $type) { + if ($value === null) { + return null; + } + + $type = strtolower($type); + switch ($type) { + case 'string': + case 'str': + case 's': + return $value; + + case 'integer': + case 'int': + case 'i': + if (!is_numeric($value)) { + throw new \InvalidArgumentException('Non-numeric value specified'); + } + return (int) $value; + + case 'double': + case 'd': + case 'float': + case 'f': + if (!is_numeric($value)) { + throw new \InvalidArgumentException('Non-numeric value specified'); + } + return (double) $value; + + case 'boolean': + case 'bool': + case 'b': + $value = strtolower($value); + switch ($value) { + case 'true': + case 'yes': + case 'y': + case '1': + return true; + + case 'false': + case 'no': + case 'n': + case '0': + return false; + + default: + throw new \InvalidArgumentException('Unable to parse value as boolean'); + } + + default: + throw new \InvalidArgumentException('Invalid type'); + } + } + + /** + * @param array $configNames + * @param mixed $existingValues + * @param mixed $value + * @param bool $updateOnly + * @return array merged value + * @throws \UnexpectedValueException + */ + protected function mergeArrayValue(array $configNames, $existingValues, $value, $updateOnly) { + $configName = array_shift($configNames); + if (!is_array($existingValues)) { + $existingValues = []; + } + if (!empty($configNames)) { + if (isset($existingValues[$configName])) { + $existingValue = $existingValues[$configName]; + } else { + $existingValue = []; + } + $existingValues[$configName] = $this->mergeArrayValue($configNames, $existingValue, $value, $updateOnly); + } else { + if (!isset($existingValues[$configName]) && $updateOnly) { + throw new \UnexpectedValueException('Config parameter does not exist'); + } + $existingValues[$configName] = $value; + } + return $existingValues; + } + } |