public function execute(PhutilArgumentParser $args) { $console = PhutilConsole::getConsole(); $argv = $args->getArg('args'); if (count($argv) == 0) { throw new PhutilArgumentUsageException('Specify a configuration key to get.'); } $key = $argv[0]; if (count($argv) > 1) { throw new PhutilArgumentUsageException('Too many arguments: expected one key.'); } $options = PhabricatorApplicationConfigOptions::loadAllOptions(); if (empty($options[$key])) { throw new PhutilArgumentUsageException("No such configuration key '{$key}'! Use `config list` to list all " . "keys."); } $config = new PhabricatorConfigLocalSource(); $values = $config->getKeys(array($key)); $result = array(); foreach ($values as $key => $value) { $result[] = array('key' => $key, 'source' => 'local', 'value' => $value); } $result = array('config' => $result); $json = new PhutilJSON(); $console->writeOut($json->encodeFormatted($result)); }
protected function executeChecks() { $adapter = PhabricatorEnv::getEnvConfig('metamta.mail-adapter'); switch ($adapter) { case 'PhabricatorMailImplementationPHPMailerLiteAdapter': if (!Filesystem::pathExists('/usr/bin/sendmail') && !Filesystem::pathExists('/usr/sbin/sendmail')) { $message = pht('Mail is configured to send via sendmail, but this system has ' . 'no sendmail binary. Install sendmail or choose a different ' . 'mail adapter.'); $this->newIssue('config.metamta.mail-adapter')->setShortName(pht('Missing Sendmail'))->setName(pht('No Sendmail Binary Found'))->setMessage($message)->addRelatedPhabricatorConfig('metamta.mail-adapter'); } break; case 'PhabricatorMailImplementationAmazonSESAdapter': if (PhabricatorEnv::getEnvConfig('metamta.can-send-as-user')) { $message = pht('Amazon SES does not support sending email as users. Disable ' . 'send as user, or choose a different mail adapter.'); $this->newIssue('config.can-send-as-user')->setName(pht("SES Can't Send As User"))->setMessage($message)->addRelatedPhabricatorConfig('metamta.mail-adapter')->addPhabricatorConfig('metamta.can-send-as-user'); } if (!PhabricatorEnv::getEnvConfig('amazon-ses.access-key')) { $message = pht('Amazon SES is selected as the mail adapter, but no SES access ' . 'key is configured. Provide an SES access key, or choose a ' . 'different mail adapter.'); $this->newIssue('config.amazon-ses.access-key')->setName(pht('Amazon SES Access Key Not Set'))->setMessage($message)->addRelatedPhabricatorConfig('metamta.mail-adapter')->addPhabricatorConfig('amazon-ses.access-key'); } if (!PhabricatorEnv::getEnvConfig('amazon-ses.secret-key')) { $message = pht('Amazon SES is selected as the mail adapter, but no SES secret ' . 'key is configured. Provide an SES secret key, or choose a ' . 'different mail adapter.'); $this->newIssue('config.amazon-ses.secret-key')->setName(pht('Amazon SES Secret Key Not Set'))->setMessage($message)->addRelatedPhabricatorConfig('metamta.mail-adapter')->addPhabricatorConfig('amazon-ses.secret-key'); } $address_key = 'metamta.default-address'; $options = PhabricatorApplicationConfigOptions::loadAllOptions(); $default = $options[$address_key]->getDefault(); $value = PhabricatorEnv::getEnvConfig($address_key); if ($default === $value) { $message = pht('Amazon SES requires verification of the "From" address, but ' . 'you have not configured a "From" address. Configure and verify ' . 'a "From" address, or choose a different mail adapter.'); $this->newIssue('config.metamta.default-address')->setName(pht('No SES From Address Configured'))->setMessage($message)->addRelatedPhabricatorConfig('metamta.mail-adapter')->addPhabricatorConfig('metamta.default-address'); } break; } }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $db_values = id(new PhabricatorConfigEntry())->loadAllWhere('namespace = %s', 'default'); $db_values = mpull($db_values, null, 'getConfigKey'); $rows = array(); $options = PhabricatorApplicationConfigOptions::loadAllOptions(); ksort($options); foreach ($options as $option) { $key = $option->getKey(); if ($option->getHidden()) { $value = phutil_tag('em', array(), pht('Hidden')); } else { $value = PhabricatorEnv::getEnvConfig($key); $value = PhabricatorConfigJSON::prettyPrintJSON($value); } $db_value = idx($db_values, $key); $rows[] = array(phutil_tag('a', array('href' => $this->getApplicationURI('edit/' . $key . '/')), $key), $value, $db_value && !$db_value->getIsDeleted() ? pht('Customized') : ''); } $table = id(new AphrontTableView($rows))->setColumnClasses(array('', 'wide'))->setHeaders(array(pht('Key'), pht('Value'), pht('Customized'))); $title = pht('Current Settings'); $crumbs = $this->buildApplicationCrumbs()->addTextCrumb($title); $panel = new PHUIObjectBoxView(); $panel->setHeaderText(pht('Current Settings')); $panel->setTable($table); $nav = $this->buildSideNavView(); $nav->selectFilter('all/'); $view = id(new PHUITwoColumnView())->setNavigation($nav)->setMainColumn(array($panel)); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($view); }
public function execute(PhutilArgumentParser $args) { $options = PhabricatorApplicationConfigOptions::loadAllOptions(); ksort($options); $console = PhutilConsole::getConsole(); foreach ($options as $option) { $console->writeOut($option->getKey() . "\n"); } return 0; }
private function renderPhabricatorConfig(array $configs, $related = false) { $issue = $this->getIssue(); $table_info = phutil_tag('p', array(), pht('The current Phabricator configuration has these %d value(s):', count($configs))); $options = PhabricatorApplicationConfigOptions::loadAllOptions(); $hidden = array(); foreach ($options as $key => $option) { if ($option->getHidden()) { $hidden[$key] = true; } } $table = null; $dict = array(); foreach ($configs as $key) { if (isset($hidden[$key])) { $dict[$key] = null; } else { $dict[$key] = PhabricatorEnv::getUnrepairedEnvConfig($key); } } $table = $this->renderValueTable($dict, $hidden); if ($this->getIssue()->getIsFatal()) { $update_info = phutil_tag('p', array(), pht('To update these %d value(s), run these command(s) from the command ' . 'line:', count($configs))); $update = array(); foreach ($configs as $key) { $update[] = hsprintf('<tt>phabricator/ $</tt> ./bin/config set %s <em>value</em>', $key); } $update = phutil_tag('pre', array(), phutil_implode_html("\n", $update)); } else { $update = array(); foreach ($configs as $config) { if (idx($options, $config) && $options[$config]->getLocked()) { $name = pht('View "%s"', $config); } else { $name = pht('Edit "%s"', $config); } $link = phutil_tag('a', array('href' => '/config/edit/' . $config . '/?issue=' . $issue->getIssueKey()), $name); $update[] = phutil_tag('li', array(), $link); } if ($update) { $update = phutil_tag('ul', array(), $update); if (!$related) { $update_info = phutil_tag('p', array(), pht('You can update these %d value(s) here:', count($configs))); } else { $update_info = phutil_tag('p', array(), pht('These %d configuration value(s) are related:', count($configs))); } } else { $update = null; $update_info = null; } } return phutil_tag('div', array('class' => 'setup-issue-config'), array($table_info, $table, $update_info, $update)); }
protected function executeChecks() { $ancient_config = self::getAncientConfig(); $all_keys = PhabricatorEnv::getAllConfigKeys(); $all_keys = array_keys($all_keys); sort($all_keys); $defined_keys = PhabricatorApplicationConfigOptions::loadAllOptions(); foreach ($all_keys as $key) { if (isset($defined_keys[$key])) { continue; } if (isset($ancient_config[$key])) { $summary = pht('This option has been removed. You may delete it at your ' . 'convenience.'); $message = pht("The configuration option '%s' has been removed. You may delete " . "it at your convenience." . "\n\n%s", $key, $ancient_config[$key]); $short = pht('Obsolete Config'); $name = pht('Obsolete Configuration Option "%s"', $key); } else { $summary = pht('This option is not recognized. It may be misspelled.'); $message = pht("The configuration option '%s' is not recognized. It may be " . "misspelled, or it might have existed in an older version of " . "Phabricator. It has no effect, and should be corrected or deleted.", $key); $short = pht('Unknown Config'); $name = pht('Unknown Configuration Option "%s"', $key); } $issue = $this->newIssue('config.unknown.' . $key)->setShortName($short)->setName($name)->setSummary($summary); $stack = PhabricatorEnv::getConfigSourceStack(); $stack = $stack->getStack(); $found = array(); $found_local = false; $found_database = false; foreach ($stack as $source_key => $source) { $value = $source->getKeys(array($key)); if ($value) { $found[] = $source->getName(); if ($source instanceof PhabricatorConfigDatabaseSource) { $found_database = true; } if ($source instanceof PhabricatorConfigLocalSource) { $found_local = true; } } } $message = $message . "\n\n" . pht('This configuration value is defined in these %d ' . 'configuration source(s): %s.', count($found), implode(', ', $found)); $issue->setMessage($message); if ($found_local) { $command = csprintf('phabricator/ $ ./bin/config delete %s', $key); $issue->addCommand($command); } if ($found_database) { $issue->addPhabricatorConfig($key); } } $this->executeManiphestFieldChecks(); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $nav = $this->buildSideNavView(); $nav->selectFilter('application/'); $groups = PhabricatorApplicationConfigOptions::loadAll(); $apps_list = $this->buildConfigOptionsList($groups, 'apps'); $title = pht('Application Settings'); $header = id(new PHUIHeaderView())->setHeader($title)->setProfileHeader(true); $crumbs = $this->buildApplicationCrumbs()->addTextCrumb(pht('Applications'))->setBorder(true); $content = id(new PhabricatorConfigPageView())->setHeader($header)->setContent($apps_list); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->setNavigation($nav)->appendChild($content)->addClass('white-background'); }
protected function executeChecks() { $groups = PhabricatorApplicationConfigOptions::loadAll(); foreach ($groups as $group) { $options = $group->getOptions(); foreach ($options as $option) { try { $group->validateOption($option, PhabricatorEnv::getUnrepairedEnvConfig($option->getKey())); } catch (PhabricatorConfigValidationException $ex) { $this->newIssue('config.invalid.' . $option->getKey())->setName(pht("Config '%s' Invalid", $option->getKey()))->setMessage(pht("Configuration option '%s' has invalid value and " . "was restored to the default: %s", $option->getKey(), $ex->getMessage()))->addPhabricatorConfig($option->getKey()); } } } }
public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $db_values = id(new PhabricatorConfigEntry())->loadAllWhere('namespace = %s', 'default'); $db_values = mpull($db_values, null, 'getConfigKey'); $rows = array(); $options = PhabricatorApplicationConfigOptions::loadAllOptions(); ksort($options); foreach ($options as $option) { $key = $option->getKey(); if ($option->getMasked()) { $value = phutil_tag('em', array(), pht('Masked')); } else { if ($option->getHidden()) { $value = phutil_tag('em', array(), pht('Hidden')); } else { $value = PhabricatorEnv::getEnvConfig($key); $value = PhabricatorConfigJSON::prettyPrintJSON($value); } } $db_value = idx($db_values, $key); $rows[] = array(phutil_tag('a', array('href' => $this->getApplicationURI('edit/' . $key . '/')), $key), $value, $db_value && !$db_value->getIsDeleted() ? pht('Customized') : ''); } $table = id(new AphrontTableView($rows))->setColumnClasses(array('', 'wide'))->setHeaders(array(pht('Key'), pht('Value'), pht('Customized'))); $title = pht('Current Settings'); $crumbs = $this->buildApplicationCrumbs()->addTextCrumb($title); $panel = new PHUIObjectBoxView(); $panel->setHeaderText(pht('Current Settings')); $panel->appendChild($table); $versions = $this->loadVersions(); $version_property_list = id(new PHUIPropertyListView()); foreach ($versions as $version) { list($name, $hash) = $version; $version_property_list->addProperty($name, $hash); } $object_box = id(new PHUIObjectBoxView())->setHeaderText(pht('Current Version'))->addPropertyList($version_property_list); $phabricator_root = dirname(phutil_get_library_root('phabricator')); $version_path = $phabricator_root . '/conf/local/VERSION'; if (Filesystem::pathExists($version_path)) { $version_from_file = Filesystem::readFile($version_path); $version_property_list->addProperty(pht('Local Version'), $version_from_file); } $nav = $this->buildSideNavView(); $nav->selectFilter('all/'); $nav->setCrumbs($crumbs); $nav->appendChild($object_box); $nav->appendChild($panel); return $this->buildApplicationPage($nav, array('title' => $title)); }
public function execute(PhutilArgumentParser $args) { $console = PhutilConsole::getConsole(); $key_count = 0; $options = PhabricatorApplicationConfigOptions::loadAllOptions(); $local_config = new PhabricatorConfigLocalSource(); $database_config = new PhabricatorConfigDatabaseSource('default'); $config_sources = PhabricatorEnv::getConfigSourceStack()->getStack(); $console->writeOut("%s\n", pht('Migrating file-based config to more modern config...')); foreach ($config_sources as $config_source) { if (!$config_source instanceof PhabricatorConfigFileSource) { $console->writeOut("%s\n", pht('Skipping config of source type %s...', get_class($config_source))); continue; } $console->writeOut("%s\n", pht('Migrating file source...')); $all_keys = $config_source->getAllKeys(); foreach ($all_keys as $key => $value) { $option = idx($options, $key); if (!$option) { $console->writeOut("%s\n", pht('Skipping obsolete option: %s', $key)); continue; } $in_local = $local_config->getKeys(array($option->getKey())); if ($in_local) { $console->writeOut("%s\n", pht('Skipping option "%s"; already in local config.', $key)); continue; } $is_locked = $option->getLocked(); if ($is_locked) { $local_config->setKeys(array($option->getKey() => $value)); $key_count++; $console->writeOut("%s\n", pht('Migrated option "%s" from file to local config.', $key)); } else { $in_database = $database_config->getKeys(array($option->getKey())); if ($in_database) { $console->writeOut("%s\n", pht('Skipping option "%s"; already in database config.', $key)); continue; } else { $config_entry = PhabricatorConfigEntry::loadConfigEntry($key); $config_entry->setValue($value); $config_entry->save(); $key_count++; $console->writeOut("%s\n", pht('Migrated option "%s" from file to database config.', $key)); } } } } $console->writeOut("%s\n", pht('Done. Migrated %d keys.', $key_count)); return 0; }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $nav = $this->buildSideNavView(); $nav->selectFilter('/'); $groups = PhabricatorApplicationConfigOptions::loadAll(); $core_list = $this->buildConfigOptionsList($groups, 'core'); $apps_list = $this->buildConfigOptionsList($groups, 'apps'); $title = pht('Phabricator Configuration'); $core = id(new PHUIObjectBoxView())->setHeaderText($title)->setObjectList($core_list); $apps = id(new PHUIObjectBoxView())->setHeaderText(pht('Applications Configuration'))->setObjectList($apps_list); $crumbs = $this->buildApplicationCrumbs()->addTextCrumb(pht('Config'), $this->getApplicationURI()); $view = id(new PHUITwoColumnView())->setNavigation($nav)->setMainColumn(array($core, $apps)); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($view); }
public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $nav = $this->buildSideNavView(); $nav->selectFilter('/'); $groups = PhabricatorApplicationConfigOptions::loadAll(); $list = $this->buildConfigOptionsList($groups); $title = pht('Phabricator Configuration'); $box = id(new PHUIObjectBoxView())->setHeaderText($title)->appendChild($list); $nav->appendChild(array($box)); $crumbs = $this->buildApplicationCrumbs()->addTextCrumb(pht('Config'), $this->getApplicationURI()); $nav->setCrumbs($crumbs); return $this->buildApplicationPage($nav, array('title' => $title)); }
public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $groups = PhabricatorApplicationConfigOptions::loadAll(); $options = idx($groups, $this->groupKey); if (!$options) { return new Aphront404Response(); } $title = pht('%s Configuration', $options->getName()); $list = $this->buildOptionList($options->getOptions()); $box = id(new PHUIObjectBoxView())->setHeaderText($title)->setObjectList($list); $crumbs = $this->buildApplicationCrumbs()->addTextCrumb(pht('Config'), $this->getApplicationURI())->addTextCrumb($options->getName(), $this->getApplicationURI()); return $this->buildApplicationPage(array($crumbs, $box), array('title' => $title)); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $group_key = $request->getURIData('key'); $groups = PhabricatorApplicationConfigOptions::loadAll(); $options = idx($groups, $group_key); if (!$options) { return new Aphront404Response(); } $title = pht('%s Configuration', $options->getName()); $list = $this->buildOptionList($options->getOptions()); $box = id(new PHUIObjectBoxView())->setObjectList($list); $crumbs = $this->buildApplicationCrumbs()->addTextCrumb(pht('Config'), $this->getApplicationURI())->addTextCrumb($options->getName(), $this->getApplicationURI())->setBorder(true); $header = id(new PHUIHeaderView())->setHeader($title)->setHeaderIcon('fa-sliders'); $view = id(new PHUITwoColumnView())->setHeader($header)->setFooter($box); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($view); }
protected function applyCustomInternalTransaction(PhabricatorLiskDAO $object, PhabricatorApplicationTransaction $xaction) { switch ($xaction->getTransactionType()) { case PhabricatorConfigTransaction::TYPE_EDIT: $v = $xaction->getNewValue(); // If this is a defined configuration option (vs a straggler from an // old version of Phabricator or a configuration file misspelling) // submit it to the validation gauntlet. $key = $object->getConfigKey(); $all_options = PhabricatorApplicationConfigOptions::loadAllOptions(); $option = idx($all_options, $key); if ($option) { $option->getGroup()->validateOption($option, $v['value']); } $object->setIsDeleted((int) $v['deleted']); $object->setValue($v['value']); break; } }
public function execute(PhutilArgumentParser $args) { $console = PhutilConsole::getConsole(); $argv = $args->getArg('args'); if (count($argv) == 0) { throw new PhutilArgumentUsageException(pht('Specify a configuration key to get.')); } $key = $argv[0]; if (count($argv) > 1) { throw new PhutilArgumentUsageException(pht('Too many arguments: expected one key.')); } $options = PhabricatorApplicationConfigOptions::loadAllOptions(); if (empty($options[$key])) { throw new PhutilArgumentUsageException(pht("No such configuration key '%s'! Use `%s` to list all keys.", $key, 'config list')); } $values = array(); $config = new PhabricatorConfigLocalSource(); $local_value = $config->getKeys(array($key)); if (empty($local_value)) { $values['local'] = array('key' => $key, 'value' => null, 'status' => 'unset', 'errorInfo' => null); } else { $values['local'] = array('key' => $key, 'value' => reset($local_value), 'status' => 'set', 'errorInfo' => null); } try { $database_config = new PhabricatorConfigDatabaseSource('default'); $database_value = $database_config->getKeys(array($key)); if (empty($database_value)) { $values['database'] = array('key' => $key, 'value' => null, 'status' => 'unset', 'errorInfo' => null); } else { $values['database'] = array('key' => $key, 'value' => reset($database_value), 'status' => 'set', 'errorInfo' => null); } } catch (Exception $e) { $values['database'] = array('key' => $key, 'value' => null, 'status' => 'error', 'errorInfo' => pht('Database source is not configured properly')); } $result = array(); foreach ($values as $source => $value) { $result[] = array('key' => $value['key'], 'source' => $source, 'value' => $value['value'], 'status' => $value['status'], 'errorInfo' => $value['errorInfo']); } $result = array('config' => $result); $json = new PhutilJSON(); $console->writeOut($json->encodeFormatted($result)); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $group_key = $request->getURIData('key'); $groups = PhabricatorApplicationConfigOptions::loadAll(); $options = idx($groups, $group_key); if (!$options) { return new Aphront404Response(); } $group_uri = PhabricatorConfigGroupConstants::getGroupURI($options->getGroup()); $group_name = PhabricatorConfigGroupConstants::getGroupShortName($options->getGroup()); $nav = $this->buildSideNavView(); $nav->selectFilter($group_uri); $title = pht('%s Configuration', $options->getName()); $list = $this->buildOptionList($options->getOptions()); $crumbs = $this->buildApplicationCrumbs()->addTextCrumb($group_name, $this->getApplicationURI($group_uri))->addTextCrumb($options->getName())->setBorder(true); $header = id(new PHUIHeaderView())->setHeader($title)->setProfileHeader(true); $content = id(new PhabricatorConfigPageView())->setHeader($header)->setContent($list); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->setNavigation($nav)->appendChild($content)->addClass('white-background'); }
public function renderContextualDescription(PhabricatorConfigOption $option, AphrontRequest $request) { switch ($option->getKey()) { case 'asana.workspace-id': break; case 'asana.project-ids': return $this->renderContextualProjectDescription($option, $request); default: return parent::renderContextualDescription($option, $request); } $viewer = $request->getUser(); $provider = PhabricatorAsanaAuthProvider::getAsanaProvider(); if (!$provider) { return null; } $account = id(new PhabricatorExternalAccountQuery())->setViewer($viewer)->withUserPHIDs(array($viewer->getPHID()))->withAccountTypes(array($provider->getProviderType()))->withAccountDomains(array($provider->getProviderDomain()))->requireCapabilities(array(PhabricatorPolicyCapability::CAN_VIEW, PhabricatorPolicyCapability::CAN_EDIT))->executeOne(); if (!$account) { return null; } $token = $provider->getOAuthAccessToken($account); if (!$token) { return null; } try { $workspaces = id(new PhutilAsanaFuture())->setAccessToken($token)->setRawAsanaQuery('workspaces')->resolve(); } catch (Exception $ex) { return null; } if (!$workspaces) { return null; } $out = array(); $out[] = pht('| Workspace ID | Workspace Name |'); $out[] = '| ------------ | -------------- |'; foreach ($workspaces as $workspace) { $out[] = sprintf('| `%s` | `%s` |', $workspace['id'], $workspace['name']); } $out = implode("\n", $out); $out = pht("The Asana Workspaces your linked account has access to are:\n\n%s", $out); return PhabricatorMarkupEngine::renderOneObject(id(new PhabricatorMarkupOneOff())->setContent($out), 'default', $viewer); }
public function loadExternalOptions() { $options = PhabricatorApplicationConfigOptions::loadAllOptions(true); $options = mpull($options, 'getDefault'); $this->setKeys($options); }
public function execute(PhutilArgumentParser $args) { $console = PhutilConsole::getConsole(); $argv = $args->getArg('args'); if (count($argv) == 0) { throw new PhutilArgumentUsageException(pht('Specify a configuration key and a value to set it to.')); } $key = $argv[0]; if (count($argv) == 1) { throw new PhutilArgumentUsageException(pht("Specify a value to set the key '%s' to.", $key)); } $value = $argv[1]; if (count($argv) > 2) { throw new PhutilArgumentUsageException(pht('Too many arguments: expected one key and one value.')); } $options = PhabricatorApplicationConfigOptions::loadAllOptions(); if (empty($options[$key])) { throw new PhutilArgumentUsageException(pht("No such configuration key '%s'! Use `%s` to list all keys.", $key, 'config list')); } $option = $options[$key]; $type = $option->getType(); switch ($type) { case 'string': case 'class': case 'enum': $value = (string) $value; break; case 'int': if (!ctype_digit($value)) { throw new PhutilArgumentUsageException(pht("Config key '%s' is of type '%s'. Specify an integer.", $key, $type)); } $value = (int) $value; break; case 'bool': if ($value == 'true') { $value = true; } else { if ($value == 'false') { $value = false; } else { throw new PhutilArgumentUsageException(pht("Config key '%s' is of type '%s'. Specify '%s' or '%s'.", $key, $type, 'true', 'false')); } } break; default: $value = json_decode($value, true); if (!is_array($value)) { switch ($type) { case 'set': $command = csprintf('./bin/config set %R %s', $key, '{"value1": true, "value2": true}'); $message = sprintf("%s\n\n %s\n", pht('Config key "%s" is of type "%s". Specify it in JSON. ' . 'For example:', $key, $type), $command); break; default: if (preg_match('/^list</', $type)) { $command = csprintf('./bin/config set %R %s', $key, '["a", "b", "c"]'); $message = sprintf("%s\n\n %s\n", pht('Config key "%s" is of type "%s". Specify it in JSON. ' . 'For example:', $key, $type), $command); } else { $message = pht('Config key "%s" is of type "%s". Specify it in JSON.', $key, $type); } break; } throw new PhutilArgumentUsageException($message); } break; } $use_database = $args->getArg('database'); if ($option->getLocked() && $use_database) { throw new PhutilArgumentUsageException(pht('Config key "%s" is locked and can only be set in local ' . 'configuration. To learn more, see "%s" in the documentation.', $key, pht('Configuration Guide: Locked and Hidden Configuration'))); } try { $option->getGroup()->validateOption($option, $value); } catch (PhabricatorConfigValidationException $validation) { // Convert this into a usage exception so we don't dump a stack trace. throw new PhutilArgumentUsageException($validation->getMessage()); } if ($use_database) { $config_type = 'database'; $config_entry = PhabricatorConfigEntry::loadConfigEntry($key); $config_entry->setValue($value); $config_entry->save(); } else { $config_type = 'local'; id(new PhabricatorConfigLocalSource())->setKeys(array($key => $value)); } $console->writeOut("%s\n", pht("Set '%s' in %s configuration.", $key, $config_type)); }
public static final function repairConfig() { $needs_repair = false; $options = PhabricatorApplicationConfigOptions::loadAllOptions(); foreach ($options as $option) { try { $option->getGroup()->validateOption($option, PhabricatorEnv::getEnvConfig($option->getKey())); } catch (PhabricatorConfigValidationException $ex) { PhabricatorEnv::repairConfig($option->getKey(), $option->getDefault()); $needs_repair = true; } } return $needs_repair; }
public function execute(PhutilArgumentParser $args) { $console = PhutilConsole::getConsole(); $argv = $args->getArg('args'); if (count($argv) == 0) { throw new PhutilArgumentUsageException('Specify a configuration key and a value to set it to.'); } $key = $argv[0]; if (count($argv) == 1) { throw new PhutilArgumentUsageException("Specify a value to set the key '{$key}' to."); } $value = $argv[1]; if (count($argv) > 2) { throw new PhutilArgumentUsageException('Too many arguments: expected one key and one value.'); } $options = PhabricatorApplicationConfigOptions::loadAllOptions(); if (empty($options[$key])) { throw new PhutilArgumentUsageException("No such configuration key '{$key}'! Use `config list` to list all " . "keys."); } $option = $options[$key]; $type = $option->getType(); switch ($type) { case 'string': case 'class': case 'enum': $value = (string) $value; break; case 'int': if (!ctype_digit($value)) { throw new PhutilArgumentUsageException("Config key '{$key}' is of type '{$type}'. Specify an integer."); } $value = (int) $value; break; case 'bool': if ($value == 'true') { $value = true; } else { if ($value == 'false') { $value = false; } else { throw new PhutilArgumentUsageException("Config key '{$key}' is of type '{$type}'. " . "Specify 'true' or 'false'."); } } break; default: $value = json_decode($value, true); if (!is_array($value)) { throw new PhutilArgumentUsageException("Config key '{$key}' is of type '{$type}'. Specify it in JSON."); } break; } try { $option->getGroup()->validateOption($option, $value); } catch (PhabricatorConfigValidationException $validation) { // Convert this into a usage exception so we don't dump a stack trace. throw new PhutilArgumentUsageException($validation->getMessage()); } $config = new PhabricatorConfigLocalSource(); $config->setKeys(array($key => $value)); $console->writeOut(pht("Set '%s' in local configuration.", $key) . "\n"); }
public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); $key = $request->getURIData('key'); $options = PhabricatorApplicationConfigOptions::loadAllOptions(); if (empty($options[$key])) { $ancient = PhabricatorExtraConfigSetupCheck::getAncientConfig(); if (isset($ancient[$key])) { $desc = pht("This configuration has been removed. You can safely delete " . "it.\n\n%s", $ancient[$key]); } else { $desc = pht('This configuration option is unknown. It may be misspelled, ' . 'or have existed in a previous version of Phabricator.'); } // This may be a dead config entry, which existed in the past but no // longer exists. Allow it to be edited so it can be reviewed and // deleted. $option = id(new PhabricatorConfigOption())->setKey($key)->setType('wild')->setDefault(null)->setDescription($desc); $group = null; $group_uri = $this->getApplicationURI(); } else { $option = $options[$key]; $group = $option->getGroup(); $group_uri = $this->getApplicationURI('group/' . $group->getKey() . '/'); } $issue = $request->getStr('issue'); if ($issue) { // If the user came here from an open setup issue, send them back. $done_uri = $this->getApplicationURI('issue/' . $issue . '/'); } else { $done_uri = $group_uri; } // Check if the config key is already stored in the database. // Grab the value if it is. $config_entry = id(new PhabricatorConfigEntry())->loadOneWhere('configKey = %s AND namespace = %s', $key, 'default'); if (!$config_entry) { $config_entry = id(new PhabricatorConfigEntry())->setConfigKey($key)->setNamespace('default')->setIsDeleted(true); $config_entry->setPHID($config_entry->generatePHID()); } $e_value = null; $errors = array(); if ($request->isFormPost() && !$option->getLocked()) { $result = $this->readRequest($option, $request); list($e_value, $value_errors, $display_value, $xaction) = $result; $errors = array_merge($errors, $value_errors); if (!$errors) { $editor = id(new PhabricatorConfigEditor())->setActor($viewer)->setContinueOnNoEffect(true)->setContentSourceFromRequest($request); try { $editor->applyTransactions($config_entry, array($xaction)); return id(new AphrontRedirectResponse())->setURI($done_uri); } catch (PhabricatorConfigValidationException $ex) { $e_value = pht('Invalid'); $errors[] = $ex->getMessage(); } } } else { if ($config_entry->getIsDeleted()) { $display_value = null; } else { $display_value = $this->getDisplayValue($option, $config_entry, $config_entry->getValue()); } } $form = id(new AphrontFormView())->setEncType('multipart/form-data'); $error_view = null; if ($errors) { $error_view = id(new PHUIInfoView())->setErrors($errors); } $status_items = array(); if ($option->getHidden()) { $message = pht('This configuration is hidden and can not be edited or viewed from ' . 'the web interface.'); $status_items[] = id(new PHUIStatusItemView())->setIcon('fa-eye-slash red')->setTarget(phutil_tag('strong', array(), pht('Configuration Hidden')))->setNote($message); } else { if ($option->getLocked()) { $message = $option->getLockedMessage(); $status_items[] = id(new PHUIStatusItemView())->setIcon('fa-lock red')->setTarget(phutil_tag('strong', array(), pht('Configuration Locked')))->setNote($message); } } if ($status_items) { $doc_href = PhabricatorEnv::getDoclink('Configuration Guide: Locked and Hidden Configuration'); $doc_link = phutil_tag('a', array('href' => $doc_href, 'target' => '_blank'), pht('Configuration Guide: Locked and Hidden Configuration')); $status_items[] = id(new PHUIStatusItemView())->setIcon('fa-book')->setTarget(phutil_tag('strong', array(), pht('Learn More')))->setNote($doc_link); } if ($option->getHidden() || $option->getLocked()) { $controls = array(); } else { $controls = $this->renderControls($option, $display_value, $e_value); } $engine = new PhabricatorMarkupEngine(); $engine->setViewer($viewer); $engine->addObject($option, 'description'); $engine->process(); $description = phutil_tag('div', array('class' => 'phabricator-remarkup'), $engine->getOutput($option, 'description')); $form->setUser($viewer)->addHiddenInput('issue', $request->getStr('issue')); if ($status_items) { $status_view = id(new PHUIStatusListView()); foreach ($status_items as $status_item) { $status_view->addItem($status_item); } $form->appendControl(id(new AphrontFormMarkupControl())->setValue($status_view)); } $description = $option->getDescription(); if (strlen($description)) { $description_view = new PHUIRemarkupView($viewer, $description); $form->appendChild(id(new AphrontFormMarkupControl())->setLabel(pht('Description'))->setValue($description_view)); } if ($group) { $extra = $group->renderContextualDescription($option, $request); if ($extra !== null) { $form->appendChild(id(new AphrontFormMarkupControl())->setValue($extra)); } } foreach ($controls as $control) { $form->appendControl($control); } if (!$option->getLocked()) { $form->appendChild(id(new AphrontFormSubmitControl())->addCancelButton($done_uri)->setValue(pht('Save Config Entry'))); } if (!$option->getHidden()) { $form->appendChild(id(new AphrontFormMarkupControl())->setLabel(pht('Current Configuration'))->setValue($this->renderDefaults($option, $config_entry))); } $examples = $this->renderExamples($option); if ($examples) { $form->appendChild(id(new AphrontFormMarkupControl())->setLabel(pht('Examples'))->setValue($examples)); } $title = pht('Edit Option: %s', $key); $header_icon = 'fa-pencil'; $short = pht('Edit'); $form_box = id(new PHUIObjectBoxView())->setHeaderText(pht('Config Option'))->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)->setForm($form); if ($error_view) { $form_box->setInfoView($error_view); } $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Config'), $this->getApplicationURI()); if ($group) { $crumbs->addTextCrumb($group->getName(), $group_uri); } $crumbs->addTextCrumb($key, '/config/edit/' . $key); $crumbs->setBorder(true); $timeline = $this->buildTransactionTimeline($config_entry, new PhabricatorConfigTransactionQuery()); $timeline->setShouldTerminate(true); $header = id(new PHUIHeaderView())->setHeader($title)->setHeaderIcon($header_icon); $view = id(new PHUITwoColumnView())->setHeader($header)->setFooter($form_box); return $this->newPage()->setTitle($title)->setCrumbs($crumbs)->appendChild($view); }
public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $options = PhabricatorApplicationConfigOptions::loadAllOptions(); if (empty($options[$this->key])) { $ancient = PhabricatorExtraConfigSetupCheck::getAncientConfig(); if (isset($ancient[$this->key])) { $desc = pht("This configuration has been removed. You can safely delete " . "it.\n\n%s", $ancient[$this->key]); } else { $desc = pht('This configuration option is unknown. It may be misspelled, ' . 'or have existed in a previous version of Phabricator.'); } // This may be a dead config entry, which existed in the past but no // longer exists. Allow it to be edited so it can be reviewed and // deleted. $option = id(new PhabricatorConfigOption())->setKey($this->key)->setType('wild')->setDefault(null)->setDescription($desc); $group = null; $group_uri = $this->getApplicationURI(); } else { $option = $options[$this->key]; $group = $option->getGroup(); $group_uri = $this->getApplicationURI('group/' . $group->getKey() . '/'); } $issue = $request->getStr('issue'); if ($issue) { // If the user came here from an open setup issue, send them back. $done_uri = $this->getApplicationURI('issue/' . $issue . '/'); } else { $done_uri = $group_uri; } // Check if the config key is already stored in the database. // Grab the value if it is. $config_entry = id(new PhabricatorConfigEntry())->loadOneWhere('configKey = %s AND namespace = %s', $this->key, 'default'); if (!$config_entry) { $config_entry = id(new PhabricatorConfigEntry())->setConfigKey($this->key)->setNamespace('default')->setIsDeleted(true); $config_entry->setPHID($config_entry->generatePHID()); } $e_value = null; $errors = array(); if ($request->isFormPost() && !$option->getLocked()) { $result = $this->readRequest($option, $request); list($e_value, $value_errors, $display_value, $xaction) = $result; $errors = array_merge($errors, $value_errors); if (!$errors) { $editor = id(new PhabricatorConfigEditor())->setActor($user)->setContinueOnNoEffect(true)->setContentSourceFromRequest($request); try { $editor->applyTransactions($config_entry, array($xaction)); return id(new AphrontRedirectResponse())->setURI($done_uri); } catch (PhabricatorConfigValidationException $ex) { $e_value = pht('Invalid'); $errors[] = $ex->getMessage(); } } } else { if ($config_entry->getIsDeleted()) { $display_value = null; } else { $display_value = $this->getDisplayValue($option, $config_entry, $config_entry->getValue()); } } $form = new AphrontFormView(); $error_view = null; if ($errors) { $error_view = id(new PHUIInfoView())->setErrors($errors); } else { if ($option->getHidden()) { $msg = pht('This configuration is hidden and can not be edited or viewed from ' . 'the web interface.'); $error_view = id(new PHUIInfoView())->setTitle(pht('Configuration Hidden'))->setSeverity(PHUIInfoView::SEVERITY_WARNING)->appendChild(phutil_tag('p', array(), $msg)); } else { if ($option->getLocked()) { $msg = $option->getLockedMessage(); $error_view = id(new PHUIInfoView())->setTitle(pht('Configuration Locked'))->setSeverity(PHUIInfoView::SEVERITY_NOTICE)->appendChild(phutil_tag('p', array(), $msg)); } } } if ($option->getHidden()) { $control = null; } else { $control = $this->renderControl($option, $display_value, $e_value); } $engine = new PhabricatorMarkupEngine(); $engine->setViewer($user); $engine->addObject($option, 'description'); $engine->process(); $description = phutil_tag('div', array('class' => 'phabricator-remarkup'), $engine->getOutput($option, 'description')); $form->setUser($user)->addHiddenInput('issue', $request->getStr('issue'))->appendChild(id(new AphrontFormMarkupControl())->setLabel(pht('Description'))->setValue($description)); if ($group) { $extra = $group->renderContextualDescription($option, $request); if ($extra !== null) { $form->appendChild(id(new AphrontFormMarkupControl())->setValue($extra)); } } $form->appendChild($control); $submit_control = id(new AphrontFormSubmitControl())->addCancelButton($done_uri); if (!$option->getLocked()) { $submit_control->setValue(pht('Save Config Entry')); } $form->appendChild($submit_control); $examples = $this->renderExamples($option); if ($examples) { $form->appendChild(id(new AphrontFormMarkupControl())->setLabel(pht('Examples'))->setValue($examples)); } if (!$option->getHidden()) { $form->appendChild(id(new AphrontFormMarkupControl())->setLabel(pht('Default'))->setValue($this->renderDefaults($option, $config_entry))); } $title = pht('Edit %s', $this->key); $short = pht('Edit'); $form_box = id(new PHUIObjectBoxView())->setHeaderText($title)->setForm($form); if ($error_view) { $form_box->setInfoView($error_view); } $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Config'), $this->getApplicationURI()); if ($group) { $crumbs->addTextCrumb($group->getName(), $group_uri); } $crumbs->addTextCrumb($this->key, '/config/edit/' . $this->key); $timeline = $this->buildTransactionTimeline($config_entry, new PhabricatorConfigTransactionQuery()); $timeline->setShouldTerminate(true); return $this->buildApplicationPage(array($crumbs, $form_box, $timeline), array('title' => $title)); }