From 1e020272826816df6c3add3ab5dc28ab96f8bf39 Mon Sep 17 00:00:00 2001 From: Exodus4D Date: Mon, 30 May 2016 20:17:54 +0200 Subject: [PATCH] closes #175 added alternative environment configuration --- app/config.ini | 2 +- app/environment.ini | 2 +- app/main/controller/controller.php | 29 +----- app/main/controller/setup.php | 100 +++++++++++++++++-- app/main/cron/ccpsystemsupdate.php | 5 +- app/main/cron/mapupdate.php | 4 +- app/main/lib/config.php | 150 +++++++++++++++++++++++++++++ app/main/model/charactermodel.php | 2 - index.php | 10 +- public/templates/view/setup.html | 27 +++++- 10 files changed, 275 insertions(+), 56 deletions(-) create mode 100644 app/main/lib/config.php diff --git a/app/config.ini b/app/config.ini index 5873cdc9..ea8ca2ee 100644 --- a/app/config.ini +++ b/app/config.ini @@ -39,9 +39,9 @@ AUTOLOAD = app/main/ FAVICON = /favicon ; load additional config files +; DO NOT load environment.ini, it is loaded automatically [configs] app/routes.ini = true -app/environment.ini = true app/pathfinder.ini = true app/requirements.ini = true app/cron.ini = true \ No newline at end of file diff --git a/app/environment.ini b/app/environment.ini index d0ca7b00..eea23f0c 100644 --- a/app/environment.ini +++ b/app/environment.ini @@ -38,7 +38,7 @@ CCP_XML = https://api.testeveonline.com ; SMTP settings (optional) SMTP_HOST = localhost SMTP_PORT = 25 -SMTP_SCHEME = "" +SMTP_SCHEME = TLS SMTP_USER = pathfinder SMTP_PASS = root diff --git a/app/main/controller/controller.php b/app/main/controller/controller.php index 2796e0d9..b4b415a5 100644 --- a/app/main/controller/controller.php +++ b/app/main/controller/controller.php @@ -9,6 +9,7 @@ namespace Controller; use Controller\Api as Api; use Controller\Ccp\Sso as Sso; +use lib\Config; use Model; use DB; @@ -760,33 +761,7 @@ class Controller { * @return string|null */ static function getEnvironmentData($key){ - $f3 = \Base::instance(); - $environment = self::getEnvironment(); - $environmentKey = 'ENVIRONMENT[' . $environment . '][' . $key . ']'; - $data = null; - - if( $f3->exists($environmentKey) ){ - $data = $f3->get($environmentKey); - } - return $data; - } - - /** - * get current server environment status - * -> "DEVELOP" or "PRODUCTION" - * @return string - */ - static function getEnvironment(){ - $f3 = \Base::instance(); - return $f3->get('ENVIRONMENT.SERVER'); - } - - /** - * check if current server is "PRODUCTION" - * @return bool - */ - static function isProduction(){ - return self::getEnvironment() == 'PRODUCTION'; + return Config::getEnvironmentData($key); } /** diff --git a/app/main/controller/setup.php b/app/main/controller/setup.php index a2d794b4..9a76a161 100644 --- a/app/main/controller/setup.php +++ b/app/main/controller/setup.php @@ -11,11 +11,46 @@ namespace Controller; use DB; use DB\SQL; use DB\SQL\MySQL as MySQL; - +use lib\Config; use Model; class Setup extends Controller { + /** + * required environment variables + * @var array + */ + protected $environmentVars = [ + 'TYPE', + 'BASE', + 'URL', + 'DEBUG', + 'DB_DNS', + 'DB_NAME', + 'DB_USER', + 'DB_PASS', + 'DB_CCP_DNS', + 'DB_CCP_NAME', + 'DB_CCP_USER', + 'DB_CCP_PASS', + 'CCP_CREST_URL', + 'SSO_CCP_URL', + 'SSO_CCP_CLIENT_ID', + 'SSO_CCP_SECRET_KEY', + 'CCP_XML', + 'SMTP_HOST', + 'SMTP_PORT', + 'SMTP_SCHEME', + 'SMTP_USER', + 'SMTP_PASS', + 'SMTP_FROM', + 'SMTP_ERROR' + ]; + + /** + * required database setup + * @var array + */ protected $databases = [ 'PF' => [ 'info' => [], @@ -104,7 +139,7 @@ class Setup extends Controller { * works as dispatcher for setup functions * @param \Base $f3 */ - public function init($f3){ + public function init(\Base $f3){ $params = $f3->get('GET'); // enables automatic column fix @@ -128,22 +163,69 @@ class Setup extends Controller { $fixColumns = true; } - // set server information for page render + // set template data ---------------------------------------------------------------- + // set environment information + $f3->set('environmentInformation', $this->getEnvironmentInformation($f3)); + + // set server information $f3->set('serverInformation', $this->getServerInformation($f3)); - // set requirement check information for page render + // set requirement check information $f3->set('checkRequirements', $this->checkRequirements($f3)); - // set database connection information for page render + // set database connection information $f3->set('checkDatabase', $this->checkDatabase($f3, $fixColumns)); } + /** + * set environment information + * @param \Base $f3 + * @return array + */ + protected function getEnvironmentInformation(\Base $f3){ + $environmentData = []; + // exclude some sensitive data (e.g. database, passwords) + $excludeVars = ['DB_DNS', 'DB_NAME', 'DB_USER', + 'DB_PASS', 'DB_CCP_DNS', 'DB_CCP_NAME', + 'DB_CCP_USER', 'DB_CCP_PASS' + ]; + + // obscure some values + $obscureVars = ['SSO_CCP_CLIENT_ID', 'SSO_CCP_SECRET_KEY', 'SMTP_PASS']; + + foreach($this->environmentVars as $var){ + if( !in_array($var, $excludeVars) ){ + $value = Config::getEnvironmentData($var); + $check = true; + + if(is_null($value)){ + // variable missing + $check = false; + $value = '[missing]'; + }elseif( in_array($var, $obscureVars)){ + $length = strlen($value); + $hideChars = ($length < 10) ? $length : 10; + $value = substr_replace($value, str_repeat('.', 3), -$hideChars); + $value .= ' [' . $length . ']'; + } + + $environmentData[$var] = [ + 'label' => $var, + 'value' => ((empty($value)) ? ' ' : $value), + 'check' => $check + ]; + } + } + + return $environmentData; + } + /** * get server information * @param \Base $f3 * @return array */ - protected function getServerInformation($f3){ + protected function getServerInformation(\Base $f3){ $serverInfo = [ 'time' => [ 'label' => 'Time', @@ -180,7 +262,7 @@ class Setup extends Controller { * @param \Base $f3 * @return array */ - protected function checkRequirements($f3){ + protected function checkRequirements(\Base $f3){ // server type ------------------------------------------------------------------ @@ -291,7 +373,7 @@ class Setup extends Controller { * @param bool|false $exec * @return array */ - protected function checkDatabase($f3, $exec = false){ + protected function checkDatabase(\Base $f3, $exec = false){ foreach($this->databases as $dbKey => $dbData){ @@ -575,7 +657,7 @@ class Setup extends Controller { * @param $db * @return array */ - protected function checkDBConfig($f3, $db){ + protected function checkDBConfig(\Base $f3, $db){ // some db like "Maria DB" have some strange version strings.... $dbVersionString = $db->version(); diff --git a/app/main/cron/ccpsystemsupdate.php b/app/main/cron/ccpsystemsupdate.php index c17fe87a..29051583 100644 --- a/app/main/cron/ccpsystemsupdate.php +++ b/app/main/cron/ccpsystemsupdate.php @@ -9,6 +9,7 @@ namespace Cron; use Controller; use DB; +use lib\Config; class CcpSystemsUpdate { @@ -83,7 +84,7 @@ class CcpSystemsUpdate { // get current jump Data ------------------------------------------------------- $time_start = microtime(true); - $apiPath = $f3->get('ENVIRONMENT.PRODUCTION.CCP_XML') . '/map/Jumps.xml.aspx'; + $apiPath = Config::getEnvironmentData('CCP_XML') . '/map/Jumps.xml.aspx'; $apiResponse = \Web::instance()->request($apiPath, $this->apiRequestOptions ); @@ -108,7 +109,7 @@ class CcpSystemsUpdate { // get current kill Data ------------------------------------------------------- $time_start = microtime(true); - $apiPath = $f3->get('ENVIRONMENT.PRODUCTION.CCP_XML') . '/map/Kills.xml.aspx'; + $apiPath = Config::getEnvironmentData('CCP_XML') . '/map/Kills.xml.aspx'; $apiResponse = \Web::instance()->request($apiPath, $this->apiRequestOptions ); $killData = []; diff --git a/app/main/cron/mapupdate.php b/app/main/cron/mapupdate.php index f92fd2d1..8104ee45 100644 --- a/app/main/cron/mapupdate.php +++ b/app/main/cron/mapupdate.php @@ -20,7 +20,7 @@ class MapUpdate { /** * deactivate all "private" maps whose lifetime is over * >> php index.php "/cron/deactivateMapData" - * @param $f3 + * @param \Base $f3 */ function deactivateMapData($f3){ @@ -46,7 +46,7 @@ class MapUpdate { /** * delete all deactivated maps * >> php index.php "/cron/deleteMapData" - * @param $f3 + * @param \Base $f3 */ function deleteMapData($f3){ diff --git a/app/main/lib/config.php b/app/main/lib/config.php new file mode 100644 index 00000000..49a7840e --- /dev/null +++ b/app/main/lib/config.php @@ -0,0 +1,150 @@ + CGI params (Nginx) + // -> .htaccess (Apache) + $this->setServerData(); + // set environment data + $this->setAllEnvironmentData(); + // set hive configuration variables + // -> overwrites default configuration + $this->setHiveVariables(); + } + + /** + * get environment configuration data + * @return array|null + */ + protected function getAllEnvironmentData(){ + $f3 = \Base::instance(); + $environmentData = null; + + if( $f3->exists(self::HIVE_KEY_ENVIRONMENT) ){ + $environmentData = $f3->get(self::HIVE_KEY_ENVIRONMENT); + }else{ + $environmentData = $this->setAllEnvironmentData(); + } + return $environmentData; + } + + /** + * set some global framework variables + * that depend on environment settings + */ + protected function setHiveVariables(){ + $f3 = \Base::instance(); + + // hive keys that should be overwritten by environment config + $hiveKeys = ['BASE', 'URL', 'DEBUG']; + foreach($hiveKeys as $key){ + $f3->set($key, self::getEnvironmentData($key)); + } + } + + /** + * set all environment configuration data + * @return array|null + */ + protected function setAllEnvironmentData(){ + $environmentData = null; + $f3 = \Base::instance(); + + if( !empty($this->serverConfigData['ENV']) ){ + // get environment config from $_SERVER data + $environmentData = (array)$this->serverConfigData['ENV']; + $environmentData['TYPE'] = 'PHP: environment variables'; + }else{ + // get environment data from *.ini file config + $f3->config('app/environment.ini'); + + if( + $f3->exists(self::HIVE_KEY_ENVIRONMENT) && + ($environment = $f3->get(self::HIVE_KEY_ENVIRONMENT . '.SERVER')) && + ($environmentData = $f3->get(self::HIVE_KEY_ENVIRONMENT . '.' . $environment)) + ){ + $environmentData['TYPE'] = 'Config: environment.ini'; + } + } + + if( !is_null($environmentData) ){ + ksort($environmentData); + $f3->set(self::HIVE_KEY_ENVIRONMENT, $environmentData); + } + + return $environmentData; + } + + /** + * get/extract all server data passed to PHP + * this can be done by either: + * OS Environment variables: + * -> add to /etc/environment + * OR: + * Nginx (server config): + * -> FastCGI syntax + * fastcgi_param PF-ENV-DEBUG 3; + * + * @return array + */ + protected function setServerData(){ + $data = []; + foreach($_SERVER as $key => $value){ + if( strpos($key, self::PREFIX_KEY . self::ARRAY_DELIMITER) === 0 ){ + $path = explode( self::ARRAY_DELIMITER, $key); + // remove prefix + array_shift($path); + + $tmp = &$data; + foreach ($path as $segment) { + $tmp[$segment] = (array)$tmp[$segment]; + $tmp = &$tmp[$segment]; + } + + // type cast values + // (e.g. '1.2' => (float); '4' => (int),...) + $tmp = is_numeric($value) ? $value + 0 : $value; + } + } + + $this->serverConfigData = $data; + } + + /** + * get a environment variable by hive key + * @param $key + * @return string|null + */ + static function getEnvironmentData($key){ + $f3 = \Base::instance(); + $hiveKey = self::HIVE_KEY_ENVIRONMENT . '.' . $key; + $data = null; + if( $f3->exists($hiveKey) ){ + $data = $f3->get($hiveKey); + } + + return $data; + } + +} \ No newline at end of file diff --git a/app/main/model/charactermodel.php b/app/main/model/charactermodel.php index 7676c7d5..e1b1e5e5 100644 --- a/app/main/model/charactermodel.php +++ b/app/main/model/charactermodel.php @@ -105,8 +105,6 @@ class CharacterModel extends BasicModel { * @return \stdClass */ public function getData($addCharacterLogData = false){ - $characterData = null; - $cacheKeyModifier = ''; // check if there is cached data diff --git a/index.php b/index.php index b373f027..8bcde159 100644 --- a/index.php +++ b/index.php @@ -4,14 +4,8 @@ $f3 = require('app/lib/base.php'); // load main config $f3->config('app/config.ini'); -// set base dir -$f3->set('BASE', \Controller\Controller::getEnvironmentData('BASE')); - -// set debug level (stacktrace) -$f3->set('DEBUG', \Controller\Controller::getEnvironmentData('DEBUG')); - -// set debug level (stacktrace) -$f3->set('URL', \Controller\Controller::getEnvironmentData('URL')); +// load environment dependent config +lib\Config::instance(); // initiate cron-jobs Cron::instance(); diff --git a/public/templates/view/setup.html b/public/templates/view/setup.html index 1d84b617..8bce1a98 100644 --- a/public/templates/view/setup.html +++ b/public/templates/view/setup.html @@ -58,10 +58,6 @@ Version {{ @PATHFINDER.VERSION }} - - Environment - {{ @ENVIRONMENT.SERVER }} - Contact {{ @PATHFINDER.CONTACT }} @@ -73,6 +69,29 @@ + + + + + + + + + + + +
{{@environmentData.label}} + + + {{@environmentData.value | raw}} + + + {{@environmentData.value | raw}} + + +