1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-01 19:22:42 +01:00

(stable) Continue on bad database configuration from select scripts

Summary: Ref T11589. Provide a way for scripts to say "just continue if database config fails", and use it in `bin/config` and `bin/storage`.

Test Plan:
  - Broke database config.
  - Ran `bin/config`, worked fine.
  - Ran `bin/storage`, got helpful "set up the database" message.
  - Ran `bin/repository`, got fatal.
  - Ran normal site with valid/invalid config, got proper feedback.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T11589

Differential Revision: https://secure.phabricator.com/D16502
This commit is contained in:
epriestley 2016-09-06 13:20:31 -07:00
parent a1338bd2d8
commit 32a580c720
7 changed files with 62 additions and 30 deletions

View file

@ -1,24 +1,3 @@
<?php <?php
function init_phabricator_script() { require_once dirname(__FILE__).'/init/init-script.php';
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
$include_path = ini_get('include_path');
ini_set(
'include_path',
$include_path.PATH_SEPARATOR.dirname(__FILE__).'/../../');
@include_once 'libphutil/scripts/__init_script__.php';
if (!@constant('__LIBPHUTIL__')) {
echo "ERROR: Unable to load libphutil. Update your PHP 'include_path' to ".
"include the parent directory of libphutil/.\n";
exit(1);
}
phutil_load_library('arcanist/src');
phutil_load_library(dirname(__FILE__).'/../src/');
PhabricatorEnv::initializeScriptEnvironment();
}
init_phabricator_script();

View file

@ -0,0 +1,10 @@
<?php
// Initialize a standard script.
require_once dirname(__FILE__).'/lib.php';
init_phabricator_script(
array(
'config.optional' => false,
));

View file

@ -0,0 +1,12 @@
<?php
// Initialize a setup script which may run before database connections have
// been configured. Scripts initialized in this way ignore database errors
// while building database configuration and continue.
require_once dirname(__FILE__).'/lib.php';
init_phabricator_script(
array(
'config.optional' => true,
));

23
scripts/init/lib.php Normal file
View file

@ -0,0 +1,23 @@
<?php
function init_phabricator_script(array $options) {
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
$include_path = ini_get('include_path');
ini_set(
'include_path',
$include_path.PATH_SEPARATOR.dirname(__FILE__).'/../../../');
@include_once 'libphutil/scripts/__init_script__.php';
if (!@constant('__LIBPHUTIL__')) {
echo "ERROR: Unable to load libphutil. Update your PHP 'include_path' to ".
"include the parent directory of libphutil/.\n";
exit(1);
}
phutil_load_library('arcanist/src');
phutil_load_library(dirname(__FILE__).'/../../src/');
$config_optional = $options['config.optional'];
PhabricatorEnv::initializeScriptEnvironment($config_optional);
}

View file

@ -2,7 +2,7 @@
<?php <?php
$root = dirname(dirname(dirname(__FILE__))); $root = dirname(dirname(dirname(__FILE__)));
require_once $root.'/scripts/__init_script__.php'; require_once $root.'/scripts/init/init-setup.php';
$args = new PhutilArgumentParser($argv); $args = new PhutilArgumentParser($argv);
$args->setTagline(pht('manage configuration')); $args->setTagline(pht('manage configuration'));

View file

@ -2,7 +2,7 @@
<?php <?php
$root = dirname(dirname(dirname(__FILE__))); $root = dirname(dirname(dirname(__FILE__)));
require_once $root.'/scripts/__init_script__.php'; require_once $root.'/scripts/init/init-setup.php';
$args = new PhutilArgumentParser($argv); $args = new PhutilArgumentParser($argv);
$args->setTagline(pht('manage Phabricator storage and schemata')); $args->setTagline(pht('manage Phabricator storage and schemata'));

View file

@ -68,11 +68,11 @@ final class PhabricatorEnv extends Phobject {
* @phutil-external-symbol class PhabricatorStartup * @phutil-external-symbol class PhabricatorStartup
*/ */
public static function initializeWebEnvironment() { public static function initializeWebEnvironment() {
self::initializeCommonEnvironment(); self::initializeCommonEnvironment(false);
} }
public static function initializeScriptEnvironment() { public static function initializeScriptEnvironment($config_optional) {
self::initializeCommonEnvironment(); self::initializeCommonEnvironment($config_optional);
// NOTE: This is dangerous in general, but we know we're in a script context // NOTE: This is dangerous in general, but we know we're in a script context
// and are not vulnerable to CSRF. // and are not vulnerable to CSRF.
@ -88,11 +88,11 @@ final class PhabricatorEnv extends Phobject {
} }
private static function initializeCommonEnvironment() { private static function initializeCommonEnvironment($config_optional) {
PhutilErrorHandler::initialize(); PhutilErrorHandler::initialize();
self::resetUmask(); self::resetUmask();
self::buildConfigurationSourceStack(); self::buildConfigurationSourceStack($config_optional);
// Force a valid timezone. If both PHP and Phabricator configuration are // Force a valid timezone. If both PHP and Phabricator configuration are
// invalid, use UTC. // invalid, use UTC.
@ -174,7 +174,7 @@ final class PhabricatorEnv extends Phobject {
} }
} }
private static function buildConfigurationSourceStack() { private static function buildConfigurationSourceStack($config_optional) {
self::dropConfigCache(); self::dropConfigCache();
$stack = new PhabricatorConfigStackSource(); $stack = new PhabricatorConfigStackSource();
@ -235,6 +235,14 @@ final class PhabricatorEnv extends Phobject {
// If the database is not available, just skip this configuration // If the database is not available, just skip this configuration
// source. This happens during `bin/storage upgrade`, `bin/conf` before // source. This happens during `bin/storage upgrade`, `bin/conf` before
// schema setup, etc. // schema setup, etc.
} catch (AphrontConnectionQueryException $ex) {
if (!$config_optional) {
throw $ex;
}
} catch (AphrontInvalidCredentialsQueryException $ex) {
if (!$config_optional) {
throw $ex;
}
} }
} }