From 577605940ef343540cf9c986c17cff652124022d Mon Sep 17 00:00:00 2001 From: Exodus4D Date: Mon, 11 Jan 2016 20:21:32 +0100 Subject: [PATCH] improved DB connection setup improved config (*.ini) file loading (merged ini files by "include") added MySQL "values" check to /setup process added HTML "title" tags for each "view" --- README.md | 17 +++--- app/config.ini | 8 +++ app/main/controller/appcontroller.php | 5 +- app/main/controller/controller.php | 49 ++++++++++++------ app/main/controller/mapcontroller.php | 10 ++-- app/main/controller/setup.php | 71 +++++++++++++++++--------- app/main/db/database.php | 39 +++++++------- app/pathfinder.ini | 2 +- app/requirements.ini | 17 ++++-- index.php | 12 ----- public/templates/view/index.html | 12 ++--- public/templates/view/landingpage.html | 5 +- public/templates/view/setup.html | 15 ++++-- sass/layout/_main.scss | 1 - 14 files changed, 157 insertions(+), 106 deletions(-) diff --git a/README.md b/README.md index 48c7f0c2..5f6e314b 100644 --- a/README.md +++ b/README.md @@ -9,13 +9,12 @@ Mapping tool for [*EVE ONLINE*](https://www.eveonline.com) - Licence [MIT](http://opensource.org/licenses/MIT) ##### IMPORTANT Information: -**The setup and installation process in ``v.0.0.17`` and is not backwards compatible with previous beta releases (check wiki)!** +**The setup and installation process in ``1.0.0RC1`` and is not backwards compatible with previous beta releases (check wiki)!** -**This project is still in beta phase and is not officially released! - Feel free to check the code for bugs and security issues. - Issues should be reported in the [Issue](https://github.com/exodus4d/pathfinder/issues) section.** +**Feel free to check the code for bugs and security issues. +Issues should be reported in the [Issue](https://github.com/exodus4d/pathfinder/issues) section.** -If you are looking for installation help, please check the [wiki](https://github.com/exodus4d/pathfinder/wiki) (DRAFT). +If you are looking for installation help, please check the [wiki](https://github.com/exodus4d/pathfinder/wiki). More information will be added once the beta is over and the first stable build is released. ## Project structure @@ -26,9 +25,11 @@ More information will be added once the beta is over and the first stable build |-- lib --> "Fat Free Framework" |-- main --> "PATHFINDER" root |-- config.ini --> config "f3" framework - |-- cron.ini --> config cronjobs - |-- pathfinder.ini --> config pathfinder - |-- routes.ini --> config routes + |-- cron.ini --> config - cronjobs + |-- environment.ini --> config - system environment + |-- pathfinder.ini --> config - pathfinder + |-- requirements.ini --> config - system requirements + |-- routes.ini --> config - routes |-- (0755) export --> DB export data |-- sql --> static DB data for import (pathfinder.sql) |-- (0755) favicon --> Favicons diff --git a/app/config.ini b/app/config.ini index 31aebcb7..5873cdc9 100644 --- a/app/config.ini +++ b/app/config.ini @@ -37,3 +37,11 @@ AUTOLOAD = app/main/ ; path to favicons folder FAVICON = /favicon + +; load additional config files +[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/main/controller/appcontroller.php b/app/main/controller/appcontroller.php index 7b710348..28e1c44b 100644 --- a/app/main/controller/appcontroller.php +++ b/app/main/controller/appcontroller.php @@ -16,11 +16,14 @@ class AppController extends Controller { * @param $f3 */ public function showLandingpage($f3) { + // page title + $f3->set('pageTitle', 'Login'); + // main page content $f3->set('pageContent', $f3->get('PATHFINDER.VIEW.LANDINGPAGE')); // body element class - $this->f3->set('bodyClass', 'pf-body pf-landing'); + $f3->set('bodyClass', 'pf-body pf-landing'); // landing page is always IGB trusted $f3->set('trusted', 1); diff --git a/app/main/controller/controller.php b/app/main/controller/controller.php index 3f74b859..46682770 100644 --- a/app/main/controller/controller.php +++ b/app/main/controller/controller.php @@ -260,39 +260,43 @@ class Controller { /** * get some server information - * @return array + * @param int $ttl cache time (default: 1h) + * @return object */ - static function getServerData(){ + static function getServerData($ttl = 3600){ $f3 = \Base::instance(); $cacheKey = 'PF_SERVER_INFO'; if( !$f3->exists($cacheKey) ){ $serverData = (object) []; - $serverData->type = '???'; - $serverData->version = '???'; - $serverData->requiredVersion = '???'; + $serverData->type = 'unknown'; + $serverData->version = 'unknown'; + $serverData->requiredVersion = 'unknown'; + $serverData->phpInterfaceType = php_sapi_name(); - if(strpos('nginx', strtolower($_SERVER['SERVER_SOFTWARE']) ) !== 1){ + if(strpos(strtolower($_SERVER['SERVER_SOFTWARE']), 'nginx' ) !== false){ // Nginx server $serverSoftwareArgs = explode('/', strtolower( $_SERVER['SERVER_SOFTWARE']) ); $serverData->type = reset($serverSoftwareArgs); $serverData->version = end($serverSoftwareArgs); $serverData->requiredVersion = $f3->get('REQUIREMENTS.SERVER.NGINX.VERSION'); - }elseif(strpos('apache', strtolower($_SERVER['SERVER_SOFTWARE']) ) !== 1){ + }elseif(strpos(strtolower($_SERVER['SERVER_SOFTWARE']), 'apache' ) !== false){ // Apache server - $matches = preg_split('/[\s,\/ ]+/', strtolower( apache_get_version() ) ); - if(count($matches)){ - $serverData->type = $matches[0]; + $serverData->type = 'apache'; + $serverData->requiredVersion = $f3->get('REQUIREMENTS.SERVER.APACHE.VERSION'); + + // try to get the apache version... + if(function_exists('apache_get_version')){ + // function does not exists if PHP is running as CGI/FPM module! + $matches = preg_split('/[\s,\/ ]+/', strtolower( apache_get_version() ) ); if(count($matches) > 1){ $serverData->version = $matches[1]; } } - - $serverData->requiredVersion = $f3->get('REQUIREMENTS.SERVER.APACHE.VERSION'); } // cache data for one day - $f3->set($cacheKey, $serverData, 60 * 60 * 24); + $f3->set($cacheKey, $serverData, $ttl); } return $f3->get($cacheKey); @@ -368,7 +372,6 @@ class Controller { if( $f3->exists($environmentKey) ){ $data = $f3->get($environmentKey); } - return $data; } @@ -390,6 +393,22 @@ class Controller { return self::getEnvironment() == 'PRODUCTION'; } + /** + * get required MySQL variable value + * @param $key + * @return mixed|null + */ + static function getRequiredMySqlVariables($key){ + $f3 = \Base::instance(); + $requiredMySqlVarKey = 'REQUIREMENTS[MYSQL][VARS][' . $key . ']'; + $data = null; + + if( $f3->exists($requiredMySqlVarKey) ){ + $data = $f3->get($requiredMySqlVarKey); + } + return $data; + } + /** * get a program URL by alias * -> if no $alias given -> get "default" route (index.php) @@ -475,7 +494,7 @@ class Controller { /** * Callback for framework "unload" - * -> config.ini + * check -> config.ini */ public function unload($f3){ return true; diff --git a/app/main/controller/mapcontroller.php b/app/main/controller/mapcontroller.php index 4d91c49a..cf1ffa63 100644 --- a/app/main/controller/mapcontroller.php +++ b/app/main/controller/mapcontroller.php @@ -12,16 +12,20 @@ class MapController extends \Controller\AccessController { public function showMap($f3) { + // page title + $f3->set('pageTitle', 'Maps'); + + // main page content $f3->set('pageContent', false); // body element class - $this->f3->set('bodyClass', 'pf-body'); + $f3->set('bodyClass', 'pf-body'); // set trust attribute to template - $this->f3->set('trusted', (int)self::isIGBTrusted()); + $f3->set('trusted', (int)self::isIGBTrusted()); // JS main file - $this->f3->set('jsView', 'mappage'); + $f3->set('jsView', 'mappage'); } } \ No newline at end of file diff --git a/app/main/controller/setup.php b/app/main/controller/setup.php index 19e0569c..2b254d33 100644 --- a/app/main/controller/setup.php +++ b/app/main/controller/setup.php @@ -79,15 +79,15 @@ class Setup extends Controller { * @param $f3 */ function beforeroute($f3) { - // load "requirements" info in "setup" route only - $f3->config('app/requirements.ini'); - - // body element class - $f3->set('bodyClass', 'pf-body pf-landing'); + // page title + $f3->set('pageTitle', 'Setup'); // main page content $f3->set('pageContent', $f3->get('PATHFINDER.VIEW.SETUP')); + // body element class + $f3->set('bodyClass', 'pf-body pf-landing'); + // js path (build/minified or raw uncompressed files) $f3->set('pathJs', 'public/js/' . $f3->get('PATHFINDER.VERSION') ); } @@ -185,32 +185,36 @@ class Setup extends Controller { // server type ------------------------------------------------------------------ - $serverData = self::getServerData(); + $serverData = self::getServerData(0); $checkRequirements = [ - 'servertype' => [ + 'serverType' => [ 'label' => 'Server type', 'version' => $serverData->type, 'check' => true ], - 'serverversion' => [ + 'serverVersion' => [ 'label' => 'Server version', 'required' => $serverData->requiredVersion, 'version' => $serverData->version, - 'check' => version_compare( $serverData->version, $serverData->requiredVersion, '>=') + 'check' => version_compare( $serverData->version, $serverData->requiredVersion, '>='), + 'tooltip' => 'If not specified, please check your \'ServerTokens\' server config. (not critical)' + ], + 'phpInterface' => [ + 'label' => 'PHP interface type', + 'version' => $serverData->phpInterfaceType, + 'check' => empty($serverData->phpInterfaceType) ? false : true ], 'php' => [ 'label' => 'PHP', 'required' => $f3->get('REQUIREMENTS.PHP.VERSION'), 'version' => phpversion(), - 'prefix' => 'v.', 'check' => version_compare( phpversion(), $f3->get('REQUIREMENTS.PHP.VERSION'), '>=') ], 'pcre' => [ 'label' => 'PCRE', 'required' => $f3->get('REQUIREMENTS.PHP.PCRE_VERSION'), 'version' => strstr(PCRE_VERSION, ' ', true), - 'prefix' => 'v.', 'check' => version_compare( strstr(PCRE_VERSION, ' ', true), $f3->get('REQUIREMENTS.PHP.PCRE_VERSION'), '>=') ], 'gd' => [ @@ -228,9 +232,14 @@ class Setup extends Controller { ]; if($serverData->type != 'nginx'){ + // default msg if module status not available + $modNotFoundMsg = 'Module status can not be identified. ' + . 'This can happen if PHP runs as \'FastCGI\'. Please check manual! '; + // mod_rewrite check ------------------------------------------------------------ $modRewriteCheck = false; $modRewriteVersion = 'disabled'; + $modRewriteTooltip = false; if(function_exists('apache_get_modules')){ if(in_array('mod_rewrite',apache_get_modules())){ $modRewriteCheck = true; @@ -238,19 +247,22 @@ class Setup extends Controller { } }else{ // e.g. Nginx server - $modRewriteVersion = '???'; + $modRewriteVersion = 'unknown'; + $modRewriteTooltip = $modNotFoundMsg; } $checkRequirements['mod_rewrite'] = [ 'label' => 'mod_rewrite', 'required' => 'enabled', 'version' => $modRewriteVersion, - 'check' => $modRewriteCheck + 'check' => $modRewriteCheck, + 'tooltip' => $modRewriteTooltip ]; // mod_headers check ------------------------------------------------------------ $modHeadersCheck = false; $modHeadersVersion = 'disabled'; + $modHeadersTooltip = false; if(function_exists('apache_get_modules')){ if(in_array('mod_headers',apache_get_modules())){ $modHeadersCheck = true; @@ -258,14 +270,16 @@ class Setup extends Controller { } }else{ // e.g. Nginx server - $modHeadersVersion = '???'; + $modHeadersVersion = 'unknown'; + $modHeadersTooltip = $modNotFoundMsg; } $checkRequirements['mod_headers'] = [ 'label' => 'mod_headers', 'required' => 'enabled', 'version' => $modHeadersVersion, - 'check' => $modHeadersCheck + 'check' => $modHeadersCheck, + 'tooltip' => $modHeadersTooltip ]; } @@ -290,7 +304,7 @@ class Setup extends Controller { // DB connection status $dbConnected = false; // DB type (e.g. MySql,..) - $dbDriver = '???'; + $dbDriver = 'unknown'; // enable database ::setup() function in UI $dbSetupEnable = false; // check of everything is OK (connection, tables, columns, indexes,..) @@ -554,7 +568,7 @@ class Setup extends Controller { // some db like "Maria DB" have some strange version strings.... $dbVersionString = $db->version(); $dbVersionParts = explode('-', $dbVersionString); - $dbVersion = '???'; + $dbVersion = 'unknown'; foreach($dbVersionParts as $dbVersionPart){ // check if this is a valid version number // hint: MariaDB´s version is always the last valid version number... @@ -566,23 +580,27 @@ class Setup extends Controller { $dbConfig = [ 'version' => [ 'label' => 'DB version', - 'required' => 'v.' . $f3->get('REQUIREMENTS.MYSQL.VERSION'), - 'version' => 'v.' . $dbVersion, + 'required' => $f3->get('REQUIREMENTS.MYSQL.VERSION'), + 'version' => $dbVersion, 'check' => version_compare($dbVersion, $f3->get('REQUIREMENTS.MYSQL.VERSION'), '>=' ) ] ]; // get specific MySQL config Value $getDBConfigValue = function($db, $param){ - $result = $db->exec('SELECT @@' . $param); - return !empty($result)? reset(reset($result)) : '???'; + $result = $db->exec([ + //"USE " . $db->name(), + "SHOW VARIABLES LIKE '" . strtolower($param) . "'" + ]); + $tmpResult = reset($result); + return !empty($result)? end($tmpResult) : 'unknown'; }; - $mySQLConfigParams = $f3->get('REQUIREMENTS.MYSQL.OPTIONS'); + $mySQLConfigParams = $f3->get('REQUIREMENTS.MYSQL.VARS'); foreach($mySQLConfigParams as $param => $requiredValue){ $value = $getDBConfigValue($db, $param); $dbConfig[] = [ - 'label' => $param, + 'label' => strtolower($param), 'required' => $requiredValue, 'version' => $value, 'check' => !empty($requiredValue) ? ($requiredValue == $value) : true @@ -605,6 +623,13 @@ class Setup extends Controller { $checkTables = []; if($db){ + // set/change default "character set" and "collation" + $db->exec('ALTER DATABASE ' . $db->name() + . ' CHARACTER SET ' . self::getRequiredMySqlVariables('CHARACTER_SET_DATABASE') + . ' COLLATE ' . self::getRequiredMySqlVariables('COLLATION_DATABASE') + ); + + // setup tables foreach($this->databases[$dbKey]['models'] as $modelClass){ $checkTables[] = call_user_func($modelClass . '::setup'); } diff --git a/app/main/db/database.php b/app/main/db/database.php index 0a3a6d41..bd4ac98a 100644 --- a/app/main/db/database.php +++ b/app/main/db/database.php @@ -30,34 +30,31 @@ class Database extends \Prefab { // "Hive" Key for DB storage $dbHiveKey = $this->getDbHiveKey($database); - if($database === 'CCP'){ - // CCP DB - $dns = Controller\Controller::getEnvironmentData('DB_CCP_DNS'); - $name = Controller\Controller::getEnvironmentData('DB_CCP_NAME'); - $user = Controller\Controller::getEnvironmentData('DB_CCP_USER'); - $password = Controller\Controller::getEnvironmentData('DB_CCP_PASS'); - }else{ - // Pathfinder(PF) DB - $dns = Controller\Controller::getEnvironmentData('DB_DNS'); - $name = Controller\Controller::getEnvironmentData('DB_NAME'); - $user = Controller\Controller::getEnvironmentData('DB_USER'); - $password = Controller\Controller::getEnvironmentData('DB_PASS'); - } - // check if DB connection already exists - if( - !$f3->exists( $dbHiveKey ) || - $name !== $f3->get( $dbHiveKey )->name() - ){ + if( !$f3->exists( $dbHiveKey ) ){ + if($database === 'CCP'){ + // CCP DB + $dns = Controller\Controller::getEnvironmentData('DB_CCP_DNS'); + $name = Controller\Controller::getEnvironmentData('DB_CCP_NAME'); + $user = Controller\Controller::getEnvironmentData('DB_CCP_USER'); + $password = Controller\Controller::getEnvironmentData('DB_CCP_PASS'); + }else{ + // Pathfinder(PF) DB + $dns = Controller\Controller::getEnvironmentData('DB_DNS'); + $name = Controller\Controller::getEnvironmentData('DB_NAME'); + $user = Controller\Controller::getEnvironmentData('DB_USER'); + $password = Controller\Controller::getEnvironmentData('DB_PASS'); + } + $db = $this->connect($dns, $name, $user, $password); if( !is_null($db) ){ // set DB timezone to UTC +00:00 (eve server time) $db->exec('SET @@session.time_zone = "+00:00";'); - // disable innoDB schema (relevant vor MySql 5.5) - // not necessary for MySql > v.5.6 - // $db->exec('SET GLOBAL innodb_stats_on_metadata = OFF;'); + // set default storage engine + $db->exec('SET @@session.default_storage_engine = "' . + Controller\Controller::getRequiredMySqlVariables('DEFAULT_STORAGE_ENGINE') . '"'); // store DB object $f3->set($dbHiveKey, $db); diff --git a/app/pathfinder.ini b/app/pathfinder.ini index 1d0f0381..d28ebd46 100644 --- a/app/pathfinder.ini +++ b/app/pathfinder.ini @@ -36,7 +36,7 @@ INVITE_LIMIT = 50 ; View ============================================================================================ [PATHFINDER.VIEW] -; static page temaplates +; static page templates INDEX = templates/view/index.html SETUP = templates/view/setup.html LANDINGPAGE = templates/view/landingpage.html diff --git a/app/requirements.ini b/app/requirements.ini index 3c664453..dce58551 100644 --- a/app/requirements.ini +++ b/app/requirements.ini @@ -10,7 +10,7 @@ NGINX.VERSION = 1.9 [REQUIREMENTS.PHP] ; recommended is >= 5.6 -VERSION = 5.4 +VERSION = 5.6 ; "Perl-Compatible Regular Expressions" ; usually shipped with PHP package, @@ -22,9 +22,16 @@ PCRE_VERSION = 8.02 ; newer "deviation" of MySQL like "MariaDB" > 10.1 are recommended VERSION = 5.6 -[REQUIREMENTS.MYSQL.OPTIONS] -STORAGE_ENGINE = InnoDB -CHARACTER_SET_SERVER = utf8 -FOREIGN_KEY_CHECKS = 1 +[REQUIREMENTS.MYSQL.VARS] +; MySql variables. Values are auto. set as 'SESSION' vars +; https://dev.mysql.com/doc/refman/5.5/en/show-variables.html +DEFAULT_STORAGE_ENGINE = InnoDB +CHARACTER_SET_DATABASE = utf8 +CHARACTER_SET_CLIENT = utf8 +CHARACTER_SET_RESULTS = utf8 +CHARACTER_SET_CONNECTION = utf8 +COLLATION_DATABASE = utf8_general_ci +COLLATION_CONNECTION = utf8_general_ci +FOREIGN_KEY_CHECKS = ON diff --git a/index.php b/index.php index d9d9f3eb..b373f027 100644 --- a/index.php +++ b/index.php @@ -4,18 +4,6 @@ $f3 = require('app/lib/base.php'); // load main config $f3->config('app/config.ini'); -// load route config -$f3->config('app/routes.ini'); - -// load environment config -$f3->config('app/environment.ini'); - -// load pathfinder config -$f3->config('app/pathfinder.ini'); - -// load cron config -$f3->config('app/cron.ini'); - // set base dir $f3->set('BASE', \Controller\Controller::getEnvironmentData('BASE')); diff --git a/public/templates/view/index.html b/public/templates/view/index.html index 3a648383..b20f3970 100644 --- a/public/templates/view/index.html +++ b/public/templates/view/index.html @@ -3,8 +3,7 @@ - + @@ -32,7 +31,7 @@ - Pathfinder + Pathfinder - {{ @pageTitle}} @@ -43,14 +42,13 @@ - + {* Chrome, Firefox OS and Opera *} - + {* Windows Phone *} - + {* iOS Safari *} - diff --git a/public/templates/view/landingpage.html b/public/templates/view/landingpage.html index bc883063..d4e4fd1c 100644 --- a/public/templates/view/landingpage.html +++ b/public/templates/view/landingpage.html @@ -69,10 +69,7 @@ - - - -{* login form*} +{* login form *}
diff --git a/public/templates/view/setup.html b/public/templates/view/setup.html index d203060d..92a5e3d0 100644 --- a/public/templates/view/setup.html +++ b/public/templates/view/setup.html @@ -131,21 +131,26 @@ - {{@requirement.label}} + + {{@requirement.label}} + + + + - {{@requirement.prefix}}{{@requirement.required}} + {{@requirement.required}} - {{@requirement.prefix}}{{@requirement.version}} + {{@requirement.version}} - {{@requirement.prefix}}{{@requirement.version}} + {{@requirement.version}} {* Check failed *} - + diff --git a/sass/layout/_main.scss b/sass/layout/_main.scss index 88957a52..9b7c8498 100644 --- a/sass/layout/_main.scss +++ b/sass/layout/_main.scss @@ -55,7 +55,6 @@ em{ @extend .txt-color-gray; @include transition( color 0.08s ease-out ); - &:hover{ @extend .txt-color-blue; }