summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorRobin McCorkell <rmccorkell@owncloud.com>2015-08-20 00:13:20 +0100
committerJoas Schilling <nickvergessen@owncloud.com>2016-01-14 15:02:54 +0100
commitb9d384d837b0400933d71701f0bcfcd38fe4285b (patch)
tree3ea18f40496f583db00eecc2054a1527489fd1af /core
parent8f89e3520d74e1805dc46947742a17683ece6ca7 (diff)
downloadnextcloud-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.php128
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;
+ }
+
}