Skip to content

Commit 0e8ceeb

Browse files
author
epriestley
committedSep 6, 2016
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
1 parent 00bb0c9 commit 0e8ceeb

File tree

7 files changed

+62
-30
lines changed

7 files changed

+62
-30
lines changed
 

‎scripts/__init_script__.php

+1-22
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,3 @@
11
<?php
22

3-
function init_phabricator_script() {
4-
error_reporting(E_ALL | E_STRICT);
5-
ini_set('display_errors', 1);
6-
7-
$include_path = ini_get('include_path');
8-
ini_set(
9-
'include_path',
10-
$include_path.PATH_SEPARATOR.dirname(__FILE__).'/../../');
11-
@include_once 'libphutil/scripts/__init_script__.php';
12-
if (!@constant('__LIBPHUTIL__')) {
13-
echo "ERROR: Unable to load libphutil. Update your PHP 'include_path' to ".
14-
"include the parent directory of libphutil/.\n";
15-
exit(1);
16-
}
17-
18-
phutil_load_library('arcanist/src');
19-
phutil_load_library(dirname(__FILE__).'/../src/');
20-
21-
PhabricatorEnv::initializeScriptEnvironment();
22-
}
23-
24-
init_phabricator_script();
3+
require_once dirname(__FILE__).'/init/init-script.php';

‎scripts/init/init-script.php

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
// Initialize a standard script.
4+
5+
require_once dirname(__FILE__).'/lib.php';
6+
7+
init_phabricator_script(
8+
array(
9+
'config.optional' => false,
10+
));

‎scripts/init/init-setup.php

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
// Initialize a setup script which may run before database connections have
4+
// been configured. Scripts initialized in this way ignore database errors
5+
// while building database configuration and continue.
6+
7+
require_once dirname(__FILE__).'/lib.php';
8+
9+
init_phabricator_script(
10+
array(
11+
'config.optional' => true,
12+
));

‎scripts/init/lib.php

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
function init_phabricator_script(array $options) {
4+
error_reporting(E_ALL | E_STRICT);
5+
ini_set('display_errors', 1);
6+
7+
$include_path = ini_get('include_path');
8+
ini_set(
9+
'include_path',
10+
$include_path.PATH_SEPARATOR.dirname(__FILE__).'/../../../');
11+
@include_once 'libphutil/scripts/__init_script__.php';
12+
if (!@constant('__LIBPHUTIL__')) {
13+
echo "ERROR: Unable to load libphutil. Update your PHP 'include_path' to ".
14+
"include the parent directory of libphutil/.\n";
15+
exit(1);
16+
}
17+
18+
phutil_load_library('arcanist/src');
19+
phutil_load_library(dirname(__FILE__).'/../../src/');
20+
21+
$config_optional = $options['config.optional'];
22+
PhabricatorEnv::initializeScriptEnvironment($config_optional);
23+
}

‎scripts/setup/manage_config.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<?php
33

44
$root = dirname(dirname(dirname(__FILE__)));
5-
require_once $root.'/scripts/__init_script__.php';
5+
require_once $root.'/scripts/init/init-setup.php';
66

77
$args = new PhutilArgumentParser($argv);
88
$args->setTagline(pht('manage configuration'));

‎scripts/sql/manage_storage.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<?php
33

44
$root = dirname(dirname(dirname(__FILE__)));
5-
require_once $root.'/scripts/__init_script__.php';
5+
require_once $root.'/scripts/init/init-setup.php';
66

77
$args = new PhutilArgumentParser($argv);
88
$args->setTagline(pht('manage Phabricator storage and schemata'));

‎src/infrastructure/env/PhabricatorEnv.php

+14-6
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,11 @@ final class PhabricatorEnv extends Phobject {
6868
* @phutil-external-symbol class PhabricatorStartup
6969
*/
7070
public static function initializeWebEnvironment() {
71-
self::initializeCommonEnvironment();
71+
self::initializeCommonEnvironment(false);
7272
}
7373

74-
public static function initializeScriptEnvironment() {
75-
self::initializeCommonEnvironment();
74+
public static function initializeScriptEnvironment($config_optional) {
75+
self::initializeCommonEnvironment($config_optional);
7676

7777
// NOTE: This is dangerous in general, but we know we're in a script context
7878
// and are not vulnerable to CSRF.
@@ -88,11 +88,11 @@ public static function initializeScriptEnvironment() {
8888
}
8989

9090

91-
private static function initializeCommonEnvironment() {
91+
private static function initializeCommonEnvironment($config_optional) {
9292
PhutilErrorHandler::initialize();
9393

9494
self::resetUmask();
95-
self::buildConfigurationSourceStack();
95+
self::buildConfigurationSourceStack($config_optional);
9696

9797
// Force a valid timezone. If both PHP and Phabricator configuration are
9898
// invalid, use UTC.
@@ -174,7 +174,7 @@ public static function setLocaleCode($locale_code) {
174174
}
175175
}
176176

177-
private static function buildConfigurationSourceStack() {
177+
private static function buildConfigurationSourceStack($config_optional) {
178178
self::dropConfigCache();
179179

180180
$stack = new PhabricatorConfigStackSource();
@@ -235,6 +235,14 @@ private static function buildConfigurationSourceStack() {
235235
// If the database is not available, just skip this configuration
236236
// source. This happens during `bin/storage upgrade`, `bin/conf` before
237237
// schema setup, etc.
238+
} catch (AphrontConnectionQueryException $ex) {
239+
if (!$config_optional) {
240+
throw $ex;
241+
}
242+
} catch (AphrontInvalidCredentialsQueryException $ex) {
243+
if (!$config_optional) {
244+
throw $ex;
245+
}
238246
}
239247
}
240248

0 commit comments

Comments
 (0)
Failed to load comments.