From 6387a77b52a3c4b01c3ae0a1542afa9dfe11dd74 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 14 Apr 2019 11:13:18 -0400 Subject: [PATCH] Move admin summary to src/Module - Add BaseAdminModule class - Add Module\Admin\Summary class - Add Route for Admin\Summary module - Remove admin_page_summary() in mod/admin - Remove $showwarning variable from admin/summary.tpl --- mod/admin.php | 133 ----------------- src/App/Router.php | 4 + src/Module/Admin/Summary.php | 149 ++++++++++++++++++++ src/Module/BaseAdminModule.php | 74 ++++++++++ view/templates/admin/summary.tpl | 2 +- view/theme/frio/templates/admin/summary.tpl | 2 +- 6 files changed, 229 insertions(+), 135 deletions(-) create mode 100644 src/Module/Admin/Summary.php create mode 100644 src/Module/BaseAdminModule.php diff --git a/mod/admin.php b/mod/admin.php index 22bb66265..0c7724573 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -298,8 +298,6 @@ function admin_content(App $a) default: notice(L10n::t("Item not found.")); } - } else { - $o = admin_page_summary($a); } if ($a->isAjax()) { @@ -837,137 +835,6 @@ function admin_page_workerqueue(App $a, $deferred) ]); } -/** - * @brief Admin Summary Page - * - * The summary page is the "start page" of the admin panel. It gives the admin - * a first overview of the open adminastrative tasks. - * - * The returned string contains the HTML content of the generated page. - * - * @param App $a - * @return string - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - */ -function admin_page_summary(App $a) -{ - // are there MyISAM tables in the DB? If so, trigger a warning message - $r = q("SELECT `engine` FROM `information_schema`.`tables` WHERE `engine` = 'myisam' AND `table_schema` = '%s' LIMIT 1", DBA::escape(DBA::databaseName())); - $showwarning = false; - $warningtext = []; - if (DBA::isResult($r)) { - $showwarning = true; - $warningtext[] = L10n::t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the command php bin/console.php dbstructure toinnodb of your Friendica installation for an automatic conversion.
', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); - } - // Check if github.com/friendica/master/VERSION is higher then - // the local version of Friendica. Check is opt-in, source may be master or devel branch - if (Config::get('system', 'check_new_version_url', 'none') != 'none') { - $gitversion = Config::get('system', 'git_friendica_version'); - if (version_compare(FRIENDICA_VERSION, $gitversion) < 0) { - $warningtext[] = L10n::t('There is a new version of Friendica available for download. Your current version is %1$s, upstream version is %2$s', FRIENDICA_VERSION, $gitversion); - $showwarning = true; - } - } - - if (Config::get('system', 'dbupdate', DBStructure::UPDATE_NOT_CHECKED) == DBStructure::UPDATE_NOT_CHECKED) { - DBStructure::update($a->getBasePath(), false, true); - } - if (Config::get('system', 'dbupdate') == DBStructure::UPDATE_FAILED) { - $showwarning = true; - $warningtext[] = L10n::t('The database update failed. Please run "php bin/console.php dbstructure update" from the command line and have a look at the errors that might appear.'); - } - if (Config::get('system', 'update') == Update::FAILED) { - $showwarning = true; - $warningtext[] = L10n::t('The last update failed. Please run "php bin/console.php dbstructure update" from the command line and have a look at the errors that might appear. (Some of the errors are possibly inside the logfile.)'); - } - - $last_worker_call = Config::get('system', 'last_worker_execution', false); - if (!$last_worker_call) { - $showwarning = true; - $warningtext[] = L10n::t('The worker was never executed. Please check your database structure!'); - } elseif ((strtotime(DateTimeFormat::utcNow()) - strtotime($last_worker_call)) > 60 * 60) { - $showwarning = true; - $warningtext[] = L10n::t('The last worker execution was on %s UTC. This is older than one hour. Please check your crontab settings.', $last_worker_call); - } - - // Legacy config file warning - if (file_exists('.htconfig.php')) { - $showwarning = true; - $warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from .htconfig.php. See the Config help page for help with the transition.', $a->getBaseURL() . '/help/Config'); - } - if (file_exists('config/local.ini.php')) { - $showwarning = true; - $warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from config/local.ini.php. See the Config help page for help with the transition.', $a->getBaseURL() . '/help/Config'); - } - - // Check server vitality - if (!admin_page_server_vital()) { - $showwarning = true; - $well_known = $a->getBaseURL() . '/.well-known/host-meta'; - $warningtext[] = L10n::t('%s is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See the installation page for help.', - $well_known, $well_known, $a->getBaseURL() . '/help/Install'); - } - - $r = q("SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`"); - $accounts = [ - [L10n::t('Normal Account'), 0], - [L10n::t('Automatic Follower Account'), 0], - [L10n::t('Public Forum Account'), 0], - [L10n::t('Automatic Friend Account'), 0], - [L10n::t('Blog Account'), 0], - [L10n::t('Private Forum Account'), 0] - ]; - - $users = 0; - foreach ($r as $u) { - $accounts[$u['page-flags']][1] = $u['count']; - $users += $u['count']; - } - - Logger::log('accounts: ' . print_r($accounts, true), Logger::DATA); - - $pending = Register::getPendingCount(); - - $deferred = DBA::count('workerqueue', ["`executed` <= ? AND NOT `done` AND `next_try` > ?", - DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); - - $workerqueue = DBA::count('workerqueue', ["`executed` <= ? AND NOT `done` AND `next_try` < ?", - DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); - - // We can do better, but this is a quick queue status - - $queues = ['label' => L10n::t('Message queues'), 'deferred' => $deferred, 'workerq' => $workerqueue]; - - - $r = q("SHOW variables LIKE 'max_allowed_packet'"); - $max_allowed_packet = (($r) ? $r[0]['Value'] : 0); - - $server_settings = ['label' => L10n::t('Server Settings'), - 'php' => ['upload_max_filesize' => ini_get('upload_max_filesize'), - 'post_max_size' => ini_get('post_max_size'), - 'memory_limit' => ini_get('memory_limit')], - 'mysql' => ['max_allowed_packet' => $max_allowed_packet]]; - - $t = Renderer::getMarkupTemplate('admin/summary.tpl'); - return Renderer::replaceMacros($t, [ - '$title' => L10n::t('Administration'), - '$page' => L10n::t('Summary'), - '$queues' => $queues, - '$users' => [L10n::t('Registered users'), $users], - '$accounts' => $accounts, - '$pending' => [L10n::t('Pending registrations'), $pending], - '$version' => [L10n::t('Version'), FRIENDICA_VERSION], - '$baseurl' => System::baseUrl(), - '$platform' => FRIENDICA_PLATFORM, - '$codename' => FRIENDICA_CODENAME, - '$build' => Config::get('system', 'build'), - '$addons' => [L10n::t('Active addons'), Addon::getEnabledList()], - '$serversettings' => $server_settings, - '$showwarning' => $showwarning, - '$warningtext' => $warningtext - ]); -} - /** * @brief Process send data from Admin Site Page * diff --git a/src/App/Router.php b/src/App/Router.php index cdd40ac9d..85134bf44 100644 --- a/src/App/Router.php +++ b/src/App/Router.php @@ -117,6 +117,10 @@ class Router $this->routeCollector->addRoute(['GET'], '/tos', Module\Tos::class); $this->routeCollector->addRoute(['GET'], '/webfinger', Module\WebFinger::class); $this->routeCollector->addRoute(['GET'], '/xrd', Module\Xrd::class); + + $this->routeCollector->addGroup('/admin', function (RouteCollector $collector) { + $collector->addRoute(['GET'] , '[/]' , Module\Admin\Summary::class); + }); } public function __construct(RouteCollector $routeCollector = null) diff --git a/src/Module/Admin/Summary.php b/src/Module/Admin/Summary.php new file mode 100644 index 000000000..49ad59cdf --- /dev/null +++ b/src/Module/Admin/Summary.php @@ -0,0 +1,149 @@ + 'myisam', 'table_schema' => DBA::databaseName()])) { + $warningtext[] = L10n::t('Your DB still runs with MyISAM tables. You should change the engine type to InnoDB. As Friendica will use InnoDB only features in the future, you should change this! See here for a guide that may be helpful converting the table engines. You may also use the command php bin/console.php dbstructure toinnodb of your Friendica installation for an automatic conversion.
', 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html'); + } + + // Check if github.com/friendica/master/VERSION is higher then + // the local version of Friendica. Check is opt-in, source may be master or devel branch + if (Config::get('system', 'check_new_version_url', 'none') != 'none') { + $gitversion = Config::get('system', 'git_friendica_version'); + if (version_compare(FRIENDICA_VERSION, $gitversion) < 0) { + $warningtext[] = L10n::t('There is a new version of Friendica available for download. Your current version is %1$s, upstream version is %2$s', FRIENDICA_VERSION, $gitversion); + } + } + + if (Config::get('system', 'dbupdate', DBStructure::UPDATE_NOT_CHECKED) == DBStructure::UPDATE_NOT_CHECKED) { + DBStructure::update($a->getBasePath(), false, true); + } + + if (Config::get('system', 'dbupdate') == DBStructure::UPDATE_FAILED) { + $warningtext[] = L10n::t('The database update failed. Please run "php bin/console.php dbstructure update" from the command line and have a look at the errors that might appear.'); + } + + if (Config::get('system', 'update') == Update::FAILED) { + $warningtext[] = L10n::t('The last update failed. Please run "php bin/console.php dbstructure update" from the command line and have a look at the errors that might appear. (Some of the errors are possibly inside the logfile.)'); + } + + $last_worker_call = Config::get('system', 'last_worker_execution', false); + if (!$last_worker_call) { + $warningtext[] = L10n::t('The worker was never executed. Please check your database structure!'); + } elseif ((strtotime(DateTimeFormat::utcNow()) - strtotime($last_worker_call)) > 60 * 60) { + $warningtext[] = L10n::t('The last worker execution was on %s UTC. This is older than one hour. Please check your crontab settings.', $last_worker_call); + } + + // Legacy config file warning + if (file_exists('.htconfig.php')) { + $warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from .htconfig.php. See the Config help page for help with the transition.', $a->getBaseURL() . '/help/Config'); + } + + if (file_exists('config/local.ini.php')) { + $warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.config.php, please copy config/local-sample.config.php and move your config from config/local.ini.php. See the Config help page for help with the transition.', $a->getBaseURL() . '/help/Config'); + } + + // Check server vitality + if (!self::checkSelfHostMeta()) { + $well_known = $a->getBaseURL() . '/.well-known/host-meta'; + $warningtext[] = L10n::t('%s is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See the installation page for help.', + $well_known, $well_known, $a->getBaseURL() . '/help/Install'); + } + + $accounts = [ + [L10n::t('Normal Account'), 0], + [L10n::t('Automatic Follower Account'), 0], + [L10n::t('Public Forum Account'), 0], + [L10n::t('Automatic Friend Account'), 0], + [L10n::t('Blog Account'), 0], + [L10n::t('Private Forum Account'), 0] + ]; + + $users = 0; + $pageFlagsCountStmt = DBA::p('SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`'); + while ($pageFlagsCount = DBA::fetch($pageFlagsCountStmt)) { + $accounts[$pageFlagsCount['page-flags']][1] = $pageFlagsCount['count']; + $users += $pageFlagsCount['count']; + } + DBA::close($pageFlagsCountStmt); + + Logger::log('accounts: ' . print_r($accounts, true), Logger::DATA); + + $pending = Register::getPendingCount(); + + $queue = DBA::count('queue', []); + + $deferred = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` > ?', + DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); + + $workerqueue = DBA::count('workerqueue', ['`executed` <= ? AND NOT `done` AND `next_try` < ?', + DBA::NULL_DATETIME, DateTimeFormat::utcNow()]); + + // We can do better, but this is a quick queue status + $queues = ['label' => L10n::t('Message queues'), 'queue' => $queue, 'deferred' => $deferred, 'workerq' => $workerqueue]; + + $variables = DBA::toArray(DBA::p('SHOW variables LIKE "max_allowed_packet"')); + $max_allowed_packet = $variables ? $variables[0]['Value'] : 0; + + $server_settings = [ + 'label' => L10n::t('Server Settings'), + 'php' => [ + 'upload_max_filesize' => ini_get('upload_max_filesize'), + 'post_max_size' => ini_get('post_max_size'), + 'memory_limit' => ini_get('memory_limit') + ], + 'mysql' => [ + 'max_allowed_packet' => $max_allowed_packet + ] + ]; + + $t = Renderer::getMarkupTemplate('admin/summary.tpl'); + return Renderer::replaceMacros($t, [ + '$title' => L10n::t('Administration'), + '$page' => L10n::t('Summary'), + '$queues' => $queues, + '$users' => [L10n::t('Registered users'), $users], + '$accounts' => $accounts, + '$pending' => [L10n::t('Pending registrations'), $pending], + '$version' => [L10n::t('Version'), FRIENDICA_VERSION], + '$baseurl' => System::baseUrl(), + '$platform' => FRIENDICA_PLATFORM, + '$codename' => FRIENDICA_CODENAME, + '$build' => Config::get('system', 'build'), + '$addons' => [L10n::t('Active addons'), Addon::getEnabledList()], + '$serversettings' => $server_settings, + '$warningtext' => $warningtext + ]); + } + + private static function checkSelfHostMeta() + { + // Fetch the host-meta to check if this really is a vital server + return Network::curl(System::baseUrl() . '/.well-known/host-meta')->isSuccess(); + } + +} \ No newline at end of file diff --git a/src/Module/BaseAdminModule.php b/src/Module/BaseAdminModule.php new file mode 100644 index 000000000..4664c90fc --- /dev/null +++ b/src/Module/BaseAdminModule.php @@ -0,0 +1,74 @@ +page['htmlhead'] .= Renderer::replaceMacros(Renderer::getMarkupTemplate('admin/settings_head.tpl'), []); + + /* + * Side bar links + */ + + // array(url, name, extra css classes) + // not part of $aside to make the template more adjustable + $aside_sub = [ + 'information' => [L10n::t('Information'), [ + 'overview' => ['admin' , L10n::t('Overview') , 'overview'], + ]], + ]; + + $addons_admin = []; + $addonsAdminStmt = DBA::select('addon', ['name'], ['plugin_admin' => 1], ['order' => ['name']]); + foreach (DBA::toArray($addonsAdminStmt) as $addon) { + $addons_admin[] = ['admin/addons/' . $addon['name'], $addon['name'], 'addon']; + } + + $t = Renderer::getMarkupTemplate('admin/aside.tpl'); + $a->page['aside'] .= Renderer::replaceMacros($t, [ + '$admin' => ['addons_admin' => $addons_admin], + '$subpages' => $aside_sub, + '$admtxt' => L10n::t('Admin'), + '$plugadmtxt' => L10n::t('Addon Features'), + '$h_pending' => L10n::t('User registrations waiting for confirmation'), + '$admurl' => 'admin/' + ]); + + return ''; + } +} diff --git a/view/templates/admin/summary.tpl b/view/templates/admin/summary.tpl index 09419929d..7b655a8ec 100644 --- a/view/templates/admin/summary.tpl +++ b/view/templates/admin/summary.tpl @@ -1,7 +1,7 @@

{{$title}} - {{$page}}

-{{if $showwarning}} +{{if $warningtext|count}}
{{foreach $warningtext as $wt}}

{{$wt nofilter}}

diff --git a/view/theme/frio/templates/admin/summary.tpl b/view/theme/frio/templates/admin/summary.tpl index d183e3fa2..9dbd3f7e6 100644 --- a/view/theme/frio/templates/admin/summary.tpl +++ b/view/theme/frio/templates/admin/summary.tpl @@ -2,7 +2,7 @@

{{$title}} - {{$page}}

- {{if $showwarning}} + {{if $warningtext|count}}
{{foreach $warningtext as $wt}}

{{$wt nofilter}}