diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2016-01-25 10:02:51 +0100 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2016-01-25 10:02:51 +0100 |
commit | ce753231eb3ed36a2f5250a2b9cc118fad8dad37 (patch) | |
tree | 39b200aa2889ad621075ed519336f0aa3fd03e00 /core/command | |
parent | 9d36972e0f3741c581b3307c5454d8829dfbfcd4 (diff) | |
parent | f2cb03e1553e50a7aa93197ba2c9805681d3d768 (diff) | |
download | nextcloud-server-ce753231eb3ed36a2f5250a2b9cc118fad8dad37.tar.gz nextcloud-server-ce753231eb3ed36a2f5250a2b9cc118fad8dad37.zip |
Merge pull request #18444 from owncloud/occ-config-types
occ config:system:set can now set other value types
Diffstat (limited to 'core/command')
-rw-r--r-- | core/command/config/system/deleteconfig.php | 60 | ||||
-rw-r--r-- | core/command/config/system/getconfig.php | 19 | ||||
-rw-r--r-- | core/command/config/system/setconfig.php | 133 |
3 files changed, 191 insertions, 21 deletions
diff --git a/core/command/config/system/deleteconfig.php b/core/command/config/system/deleteconfig.php index e64ff32ac71..374f5ac69b7 100644 --- a/core/command/config/system/deleteconfig.php +++ b/core/command/config/system/deleteconfig.php @@ -48,8 +48,8 @@ class DeleteConfig extends Base { ->setDescription('Delete a system config value') ->addArgument( 'name', - InputArgument::REQUIRED, - 'Name of the config to delete' + InputArgument::REQUIRED | InputArgument::IS_ARRAY, + 'Name of the config to delete, specify multiple for array parameter' ) ->addOption( 'error-if-not-exists', @@ -61,15 +61,57 @@ class DeleteConfig extends Base { } protected function execute(InputInterface $input, OutputInterface $output) { - $configName = $input->getArgument('name'); + $configNames = $input->getArgument('name'); + $configName = $configNames[0]; - if ($input->hasParameterOption('--error-if-not-exists') && !in_array($configName, $this->systemConfig->getKeys())) { - $output->writeln('<error>System config ' . $configName . ' could not be deleted because it did not exist</error>'); - return 1; + if (sizeof($configNames) > 1) { + if ($input->hasParameterOption('--error-if-not-exists') && !in_array($configName, $this->systemConfig->getKeys())) { + $output->writeln('<error>System config ' . implode(' => ', $configNames) . ' could not be deleted because it did not exist</error>'); + return 1; + } + + $value = $this->systemConfig->getValue($configName); + + try { + $value = $this->removeSubValue(array_slice($configNames, 1), $value, $input->hasParameterOption('--error-if-not-exists')); + } + catch (\UnexpectedValueException $e) { + $output->writeln('<error>System config ' . implode(' => ', $configNames) . ' could not be deleted because it did not exist</error>'); + return 1; + } + + $this->systemConfig->setValue($configName, $value); + $output->writeln('<info>System config value ' . implode(' => ', $configNames) . ' deleted</info>'); + return 0; + } else { + if ($input->hasParameterOption('--error-if-not-exists') && !in_array($configName, $this->systemConfig->getKeys())) { + $output->writeln('<error>System config ' . $configName . ' could not be deleted because it did not exist</error>'); + return 1; + } + + $this->systemConfig->deleteValue($configName); + $output->writeln('<info>System config value ' . $configName . ' deleted</info>'); + return 0; + } + } + + protected function removeSubValue($keys, $currentValue, $throwError) { + $nextKey = array_shift($keys); + + if (is_array($currentValue)) { + if (isset($currentValue[$nextKey])) { + if (empty($keys)) { + unset($currentValue[$nextKey]); + } else { + $currentValue[$nextKey] = $this->removeSubValue($keys, $currentValue[$nextKey], $throwError); + } + } else if ($throwError) { + throw new \UnexpectedValueException('Config parameter does not exist'); + } + } else if ($throwError) { + throw new \UnexpectedValueException('Config parameter does not exist'); } - $this->systemConfig->deleteValue($configName); - $output->writeln('<info>System config value ' . $configName . ' deleted</info>'); - return 0; + return $currentValue; } } diff --git a/core/command/config/system/getconfig.php b/core/command/config/system/getconfig.php index 80b41a68526..b76474112a0 100644 --- a/core/command/config/system/getconfig.php +++ b/core/command/config/system/getconfig.php @@ -48,8 +48,8 @@ class GetConfig extends Base { ->setDescription('Get a system config value') ->addArgument( 'name', - InputArgument::REQUIRED, - 'Name of the config to get' + InputArgument::REQUIRED | InputArgument::IS_ARRAY, + 'Name of the config to get, specify multiple for array parameter' ) ->addOption( 'default-value', @@ -68,7 +68,8 @@ class GetConfig extends Base { * @return null|int null or 0 if everything went fine, or an error code */ protected function execute(InputInterface $input, OutputInterface $output) { - $configName = $input->getArgument('name'); + $configNames = $input->getArgument('name'); + $configName = array_shift($configNames); $defaultValue = $input->getOption('default-value'); if (!in_array($configName, $this->systemConfig->getKeys()) && !$input->hasParameterOption('--default-value')) { @@ -79,6 +80,18 @@ class GetConfig extends Base { $configValue = $defaultValue; } else { $configValue = $this->systemConfig->getValue($configName); + if (!empty($configNames)) { + foreach ($configNames as $configName) { + if (isset($configValue[$configName])) { + $configValue = $configValue[$configName]; + } else if (!$input->hasParameterOption('--default-value')) { + return 1; + } else { + $configValue = $defaultValue; + break; + } + } + } } $this->writeMixedInOutputFormat($input, $output, $configValue); diff --git a/core/command/config/system/setconfig.php b/core/command/config/system/setconfig.php index 0100ad2dfb0..45ba01e9284 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,124 @@ 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 (sizeof($configNames) > 1) { + $existingValue = $this->systemConfig->getValue($configName); + + $newValue = $this->mergeArrayValue( + array_slice($configNames, 1), $existingValue, $configValue['value'], $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['value']); } - $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['readable-value'] . '</info>'); return 0; } + + /** + * @param string $value + * @param string $type + * @return mixed + * @throws \InvalidArgumentException + */ + protected function castValue($value, $type) { + switch ($type) { + case 'integer': + case 'int': + if (!is_numeric($value)) { + throw new \InvalidArgumentException('Non-numeric value specified'); + } + return [ + 'value' => (int) $value, + 'readable-value' => 'integer ' . (int) $value, + ]; + + case 'double': + case 'float': + if (!is_numeric($value)) { + throw new \InvalidArgumentException('Non-numeric value specified'); + } + return [ + 'value' => (double) $value, + 'readable-value' => 'double ' . (double) $value, + ]; + + case 'boolean': + case 'bool': + $value = strtolower($value); + switch ($value) { + case 'true': + return [ + 'value' => true, + 'readable-value' => 'boolean ' . $value, + ]; + + case 'false': + return [ + 'value' => false, + 'readable-value' => 'boolean ' . $value, + ]; + + default: + throw new \InvalidArgumentException('Unable to parse value as boolean'); + } + + case 'null': + return [ + 'value' => null, + 'readable-value' => 'null', + ]; + + case 'string': + $value = (string) $value; + return [ + 'value' => $value, + 'readable-value' => ($value === '') ? 'empty string' : 'string ' . $value, + ]; + + 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; + } + } |