From cd9b864045588308e18e16f7a1c1029fd380d8fd Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 30 Jun 2018 14:40:09 -0400 Subject: [PATCH] Rework App modes - Replace App mode constants with capability-based flags - Add App->isInstallMode() - Add file config fallback in (P)Config abstraction - Removed logger disabling code --- bin/daemon.php | 2 +- include/text.php | 24 ++------- index.php | 26 +++++----- src/App.php | 55 +++++++++++++++------ src/Core/Config.php | 10 ++-- src/Core/Console/Config.php | 4 +- src/Core/Console/GlobalCommunityBlock.php | 2 +- src/Core/Console/GlobalCommunitySilence.php | 2 +- src/Core/Console/Maintenance.php | 2 +- src/Core/Console/NewPassword.php | 2 +- src/Core/PConfig.php | 10 ++-- src/Core/System.php | 14 ------ 12 files changed, 74 insertions(+), 79 deletions(-) diff --git a/bin/daemon.php b/bin/daemon.php index 2813100267..65ae2a53b6 100755 --- a/bin/daemon.php +++ b/bin/daemon.php @@ -28,7 +28,7 @@ require_once "include/dba.php"; $a = new App(dirname(__DIR__)); -if ($a->mode === App::MODE_INSTALL) { +if ($a->isInstallMode()) { die("Friendica isn't properly installed yet.\n"); } diff --git a/include/text.php b/include/text.php index 3ee23ff164..d48986161d 100644 --- a/include/text.php +++ b/include/text.php @@ -608,17 +608,9 @@ function logger($msg, $level = 0) { $a = get_app(); global $LOGGER_LEVELS; - // turn off logger in install mode - if ( - $a->mode == App::MODE_INSTALL - || !dba::$connected - ) { - return; - } - - $debugging = Config::get('system','debugging'); - $logfile = Config::get('system','logfile'); - $loglevel = intval(Config::get('system','loglevel')); + $debugging = Config::get('system', 'debugging'); + $logfile = Config::get('system', 'logfile'); + $loglevel = intval(Config::get('system', 'loglevel')); if ( !$debugging @@ -687,14 +679,6 @@ function logger($msg, $level = 0) { function dlogger($msg, $level = 0) { $a = get_app(); - // turn off logger in install mode - if ( - $a->mode == App::MODE_INSTALL - || !dba::$connected - ) { - return; - } - $logfile = Config::get('system', 'dlogfile'); if (!$logfile) { return; @@ -716,7 +700,7 @@ function dlogger($msg, $level = 0) { $process_id = session_id(); if ($process_id == '') { - $process_id = get_app()->process_id; + $process_id = $a->process_id; } $callers = debug_backtrace(); diff --git a/index.php b/index.php index 5da31f100e..a8098942c2 100644 --- a/index.php +++ b/index.php @@ -35,20 +35,20 @@ $a->backend = false; require_once "include/dba.php"; -if (!$a->mode == App::MODE_INSTALL) { - /** - * Load configs from db. Overwrite configs from config/local.ini.php - */ - - Config::load(); +// Missing DB connection: ERROR +if ($a->mode & App::MODE_LOCALCONFIGPRESENT && !($a->mode & App::MODE_DBAVAILABLE)) { + System::httpExit(500, ['title' => 'Error 500 - Internal Server Error', 'description' => 'Apologies but the website is unavailable at the moment.']); +} +// Max Load Average reached: ERROR if ($a->isMaxProcessesReached() || $a->isMaxLoadReached()) { - header($_SERVER["SERVER_PROTOCOL"] . ' 503 Service Temporarily Unavailable'); - header('Retry-After: 120'); - header('Refresh: 120; url=' . System::baseUrl() . "/" . $a->query_string); - die("System is currently unavailable. Please try again later"); - } + header('Retry-After: 120'); + header('Refresh: 120; url=' . System::baseUrl() . "/" . $a->query_string); + System::httpExit(503, ['title' => 'Error 503 - Service Temporarily Unavailable', 'description' => 'System is currently overloaded. Please try again later.']); +} + +if ($a->isInstallMode()) { if (Config::get('system', 'force_ssl') && ($a->get_scheme() == "http") && (intval(Config::get('system', 'ssl_policy')) == SSL_POLICY_FULL) && (substr(System::baseUrl(), 0, 8) == "https://") @@ -167,9 +167,9 @@ $_SESSION['last_updated'] = defaults($_SESSION, 'last_updated', []); // in install mode, any url loads install module // but we need "view" module for stylesheet -if ($a->mode == App::MODE_INSTALL && $a->module!="view") { +if ($a->isInstallMode() && $a->module!="view") { $a->module = 'install'; -} elseif ($a->mode == App::MODE_MAINTENANCE && $a->module!="view") { +} elseif (!($a->mode & App::MODE_MAINTENANCEDISABLED) && $a->module != "view") { $a->module = 'maintenance'; } else { check_url($a); diff --git a/src/App.php b/src/App.php index eca5c4b7db..6773140f26 100644 --- a/src/App.php +++ b/src/App.php @@ -34,9 +34,20 @@ require_once 'include/text.php'; */ class App { - const MODE_NORMAL = 0; - const MODE_INSTALL = 1; - const MODE_MAINTENANCE = 2; + const MODE_LOCALCONFIGPRESENT = 1; + const MODE_DBAVAILABLE = 2; + const MODE_DBCONFIGAVAILABLE = 4; + const MODE_MAINTENANCEDISABLED = 8; + + /** + * @deprecated since version 2008.08 Use App->isInstallMode() instead to check for install mode. + */ + const MODE_INSTALL = 0; + + /** + * @deprecated since version 2008.08 Use the precise mode constant to check for a specific capability instead. + */ + const MODE_NORMAL = App::MODE_LOCALCONFIGPRESENT | App::MODE_DBAVAILABLE | App::MODE_DBCONFIGAVAILABLE | App::MODE_MAINTENANCEDISABLED; public $module_loaded = false; public $module_class = null; @@ -59,7 +70,7 @@ class App public $argv; public $argc; public $module; - public $mode = App::MODE_NORMAL; + public $mode = App::MODE_INSTALL; public $strings; public $basepath; public $urlpath; @@ -152,7 +163,9 @@ class App $this->determineUrlPath(); - if ($this->mode === self::MODE_NORMAL) { + Config::load(); + + if ($this->mode & self::MODE_DBAVAILABLE) { Core\Addon::loadHooks(); $this->loadAddonConfig(); @@ -449,30 +462,32 @@ class App */ private function determineMode() { - $this->mode = App::MODE_INSTALL; + $this->mode = 0; - // Missing local config files: MODE_INSTALL if (!file_exists($this->basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php') && !file_exists($this->basepath . DIRECTORY_SEPARATOR . '.htconfig.php')) { return; } - // Missing DB connection: ERROR + $this->mode |= App::MODE_LOCALCONFIGPRESENT; + if (!\dba::connected()) { - System::unavailable(); + return; } - // Working DB connection, missing tables: MODE_INSTALL + $this->mode |= App::MODE_DBAVAILABLE; + if (\dba::fetch_first("SHOW TABLES LIKE 'config'") === false) { return; } - // Maintenance mode check + $this->mode |= App::MODE_DBCONFIGAVAILABLE; + if (Config::get('system', 'maintenance')) { - $this->mode = App::MODE_MAINTENANCE; - } else { - $this->mode = App::MODE_NORMAL; + return; } + + $this->mode |= App::MODE_MAINTENANCEDISABLED; } public function loadDatabase() @@ -520,6 +535,16 @@ class App $this->save_timestamp($stamp1, "network"); } + /** + * Install mode is when the local config file is missing or the DB schema hasn't been installed yet. + * + * @return bool + */ + public function isInstallMode() + { + return !($this->mode & App::MODE_LOCALCONFIGPRESENT) || !($this->mode & App::MODE_DBCONFIGAVAILABLE); + } + /** * @brief Returns the base filesystem path of the App * @@ -1311,7 +1336,7 @@ class App */ public function getCurrentTheme() { - if ($this->mode == App::MODE_INSTALL) { + if ($this->isInstallMode()) { return ''; } diff --git a/src/Core/Config.php b/src/Core/Config.php index b327eb133f..93cb266577 100644 --- a/src/Core/Config.php +++ b/src/Core/Config.php @@ -30,7 +30,7 @@ class Config extends BaseObject public static function init() { // Database isn't ready or populated yet - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return; } @@ -54,7 +54,7 @@ class Config extends BaseObject public static function load($family = "config") { // Database isn't ready or populated yet - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return; } @@ -87,7 +87,7 @@ class Config extends BaseObject public static function get($family, $key, $default_value = null, $refresh = false) { // Database isn't ready or populated yet, fallback to file config - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return self::getApp()->getConfigValue($family, $key, $default_value); } @@ -115,7 +115,7 @@ class Config extends BaseObject public static function set($family, $key, $value) { // Database isn't ready or populated yet - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return false; } @@ -140,7 +140,7 @@ class Config extends BaseObject public static function delete($family, $key) { // Database isn't ready or populated yet - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return false; } diff --git a/src/Core/Console/Config.php b/src/Core/Console/Config.php index a6083ddb9f..f619afade0 100644 --- a/src/Core/Console/Config.php +++ b/src/Core/Console/Config.php @@ -92,7 +92,7 @@ HELP; throw new CommandArgsException('Too many arguments'); } - if ($a->mode === \Friendica\App::MODE_INSTALL) { + if (!($a->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { $this->out('Database isn\'t ready or populated yet, showing file config only'); } @@ -126,7 +126,7 @@ HELP; if (count($this->args) == 0) { Core\Config::load(); - if (Core\Config::get('system', 'config_adapter') != 'preload' && $a->mode !== \Friendica\App::MODE_INSTALL) { + if (Core\Config::get('system', 'config_adapter') != 'preload' && $a->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE) { $this->out('Warning: The JIT (Just In Time) Config adapter doesn\'t support loading the entire configuration, showing file config only'); } diff --git a/src/Core/Console/GlobalCommunityBlock.php b/src/Core/Console/GlobalCommunityBlock.php index 5fcc6be160..59a5d9cfdc 100644 --- a/src/Core/Console/GlobalCommunityBlock.php +++ b/src/Core/Console/GlobalCommunityBlock.php @@ -56,7 +56,7 @@ HELP; throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments'); } - if ($a->mode == \Friendica\App::MODE_INSTALL) { + if ($a->isInstallMode()) { throw new \RuntimeException('Database isn\'t ready or populated yet'); } diff --git a/src/Core/Console/GlobalCommunitySilence.php b/src/Core/Console/GlobalCommunitySilence.php index a70888e454..ccd6014e9c 100644 --- a/src/Core/Console/GlobalCommunitySilence.php +++ b/src/Core/Console/GlobalCommunitySilence.php @@ -64,7 +64,7 @@ HELP; throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments'); } - if ($a->mode == \Friendica\App::MODE_INSTALL) { + if ($a->isInstallMode()) { throw new \RuntimeException('Database isn\'t ready or populated yet'); } diff --git a/src/Core/Console/Maintenance.php b/src/Core/Console/Maintenance.php index 68d33337ab..90449c4787 100644 --- a/src/Core/Console/Maintenance.php +++ b/src/Core/Console/Maintenance.php @@ -64,7 +64,7 @@ HELP; throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments'); } - if ($a->mode == \Friendica\App::MODE_INSTALL) { + if ($a->isInstallMode()) { throw new \RuntimeException('Database isn\'t ready or populated yet'); } diff --git a/src/Core/Console/NewPassword.php b/src/Core/Console/NewPassword.php index e5f9349190..0035974727 100644 --- a/src/Core/Console/NewPassword.php +++ b/src/Core/Console/NewPassword.php @@ -58,7 +58,7 @@ HELP; throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments'); } - if ($a->mode == \Friendica\App::MODE_INSTALL) { + if ($a->isInstallMode()) { throw new \RuntimeException('Database isn\'t ready or populated yet'); } diff --git a/src/Core/PConfig.php b/src/Core/PConfig.php index 3b01bceeaf..aa5f75abe7 100644 --- a/src/Core/PConfig.php +++ b/src/Core/PConfig.php @@ -29,7 +29,7 @@ class PConfig extends BaseObject public static function init($uid) { // Database isn't ready or populated yet - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return; } @@ -54,7 +54,7 @@ class PConfig extends BaseObject public static function load($uid, $family) { // Database isn't ready or populated yet - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return; } @@ -83,7 +83,7 @@ class PConfig extends BaseObject public static function get($uid, $family, $key, $default_value = null, $refresh = false) { // Database isn't ready or populated yet - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return; } @@ -112,7 +112,7 @@ class PConfig extends BaseObject public static function set($uid, $family, $key, $value) { // Database isn't ready or populated yet - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return false; } @@ -138,7 +138,7 @@ class PConfig extends BaseObject public static function delete($uid, $family, $key) { // Database isn't ready or populated yet - if (self::getApp()->mode === \Friendica\App::MODE_INSTALL) { + if (!(self::getApp()->mode & \Friendica\App::MODE_DBCONFIGAVAILABLE)) { return false; } diff --git a/src/Core/System.php b/src/Core/System.php index e3dc4e5870..4e2b63f044 100644 --- a/src/Core/System.php +++ b/src/Core/System.php @@ -85,20 +85,6 @@ class System extends BaseObject return implode(', ', $callstack2); } - /** - * @brief Called from db initialisation when db is dead. - */ - static public function unavailable() { -echo <<< EOT - - System Unavailable - Apologies but this site is unavailable at the moment. Please try again later. - -EOT; - - killme(); - } - /** * Generic XML return * Outputs a basic dfrn XML status structure to STDOUT, with a variable