2019-05-02 04:01:43 +00:00
< ? php
namespace Friendica\Module\Admin ;
use Friendica\Core\Addon ;
2020-01-19 21:50:44 +00:00
use Friendica\Core\Config\Cache ;
2019-05-02 04:01:43 +00:00
use Friendica\Core\Logger ;
use Friendica\Core\Renderer ;
use Friendica\Core\Update ;
use Friendica\Database\DBA ;
use Friendica\Database\DBStructure ;
2019-12-15 21:34:11 +00:00
use Friendica\DI ;
2019-05-02 04:01:43 +00:00
use Friendica\Model\Register ;
2020-01-23 04:14:14 +00:00
use Friendica\Module\BaseAdmin ;
2019-10-28 21:24:46 +00:00
use Friendica\Network\HTTPException\InternalServerErrorException ;
2019-06-23 17:56:21 +00:00
use Friendica\Util\ConfigFileLoader ;
2019-05-02 04:01:43 +00:00
use Friendica\Util\DateTimeFormat ;
use Friendica\Util\Network ;
2020-01-23 04:14:14 +00:00
class Summary extends BaseAdmin
2019-05-02 04:01:43 +00:00
{
2019-11-05 21:48:54 +00:00
public static function content ( array $parameters = [])
2019-05-02 04:01:43 +00:00
{
2019-11-05 20:22:54 +00:00
parent :: content ( $parameters );
2019-05-02 04:01:43 +00:00
2019-12-15 21:34:11 +00:00
$a = DI :: app ();
2019-05-02 04:01:43 +00:00
// are there MyISAM tables in the DB? If so, trigger a warning message
$warningtext = [];
2019-05-20 20:15:39 +00:00
if ( DBA :: count ([ 'information_schema' => 'tables' ], [ 'engine' => 'myisam' , 'table_schema' => DBA :: databaseName ()])) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: 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 <a href="%s">here</a> for a guide that may be helpful converting the table engines. You may also use the command <tt>php bin/console.php dbstructure toinnodb</tt> of your Friendica installation for an automatic conversion.<br />' , 'https://dev.mysql.com/doc/refman/5.7/en/converting-tables-to-innodb.html' );
2019-05-02 04:01:43 +00:00
}
// 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
2020-01-19 20:21:13 +00:00
if ( DI :: config () -> get ( 'system' , 'check_new_version_url' , 'none' ) != 'none' ) {
$gitversion = DI :: config () -> get ( 'system' , 'git_friendica_version' );
2019-05-02 04:01:43 +00:00
if ( version_compare ( FRIENDICA_VERSION , $gitversion ) < 0 ) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: 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 );
2019-05-02 04:01:43 +00:00
}
}
2020-01-19 20:21:13 +00:00
if ( DI :: config () -> get ( 'system' , 'dbupdate' , DBStructure :: UPDATE_NOT_CHECKED ) == DBStructure :: UPDATE_NOT_CHECKED ) {
2019-05-02 04:01:43 +00:00
DBStructure :: update ( $a -> getBasePath (), false , true );
}
2020-01-19 20:21:13 +00:00
if ( DI :: config () -> get ( 'system' , 'dbupdate' ) == DBStructure :: UPDATE_FAILED ) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: 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.' );
2019-05-02 04:01:43 +00:00
}
2020-01-19 20:21:13 +00:00
if ( DI :: config () -> get ( 'system' , 'update' ) == Update :: FAILED ) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: 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.)' );
2019-05-02 04:01:43 +00:00
}
2020-01-19 20:21:13 +00:00
$last_worker_call = DI :: config () -> get ( 'system' , 'last_worker_execution' , false );
2019-05-02 04:01:43 +00:00
if ( ! $last_worker_call ) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: l10n () -> t ( 'The worker was never executed. Please check your database structure!' );
2019-05-02 04:01:43 +00:00
} elseif (( strtotime ( DateTimeFormat :: utcNow ()) - strtotime ( $last_worker_call )) > 60 * 60 ) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: l10n () -> t ( 'The last worker execution was on %s UTC. This is older than one hour. Please check your crontab settings.' , $last_worker_call );
2019-05-02 04:01:43 +00:00
}
// Legacy config file warning
if ( file_exists ( '.htconfig.php' )) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: 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 <code>.htconfig.php</code>. See <a href="%s">the Config help page</a> for help with the transition.' , DI :: baseUrl () -> get () . '/help/Config' );
2019-05-02 04:01:43 +00:00
}
if ( file_exists ( 'config/local.ini.php' )) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: 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 <code>config/local.ini.php</code>. See <a href="%s">the Config help page</a> for help with the transition.' , DI :: baseUrl () -> get () . '/help/Config' );
2019-05-02 04:01:43 +00:00
}
// Check server vitality
if ( ! self :: checkSelfHostMeta ()) {
2019-12-16 00:05:15 +00:00
$well_known = DI :: baseUrl () -> get () . '/.well-known/host-meta' ;
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: l10n () -> t ( '<a href="%s">%s</a> is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See <a href="%s">the installation page</a> for help.' ,
2019-12-16 00:05:15 +00:00
$well_known , $well_known , DI :: baseUrl () -> get () . '/help/Install' );
2019-05-02 04:01:43 +00:00
}
2019-05-26 12:33:09 +00:00
// Check logfile permission
2020-01-19 20:21:13 +00:00
if ( DI :: config () -> get ( 'system' , 'debugging' )) {
$file = DI :: config () -> get ( 'system' , 'logfile' );
2019-05-26 12:33:09 +00:00
2019-12-15 22:28:01 +00:00
$fileSystem = DI :: fs ();
2019-10-22 20:47:37 +00:00
try {
$stream = $fileSystem -> createStream ( $file );
2019-10-28 21:24:46 +00:00
if ( ! isset ( $stream )) {
throw new InternalServerErrorException ( 'Stream is null.' );
2019-10-22 20:47:37 +00:00
}
} catch ( \Throwable $exception ) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: l10n () -> t ( 'The logfile \'%s\' is not usable. No logging possible (error: \'%s\')' , $file , $exception -> getMessage ());
2019-05-26 12:33:09 +00:00
}
2020-01-19 20:21:13 +00:00
$file = DI :: config () -> get ( 'system' , 'dlogfile' );
2019-05-26 12:33:09 +00:00
2019-10-28 21:24:46 +00:00
try {
if ( ! empty ( $file )) {
$stream = $fileSystem -> createStream ( $file );
if ( ! isset ( $stream )) {
throw new InternalServerErrorException ( 'Stream is null.' );
}
}
} catch ( \Throwable $exception ) {
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: l10n () -> t ( 'The debug logfile \'%s\' is not usable. No logging possible (error: \'%s\')' , $file , $exception -> getMessage ());
2019-05-26 12:33:09 +00:00
}
}
2019-05-13 17:30:03 +00:00
// check legacy basepath settings
2019-12-15 22:52:15 +00:00
$configLoader = new ConfigFileLoader ( $a -> getBasePath ());
2020-01-19 21:50:44 +00:00
$configCache = new Cache ();
2019-05-13 17:30:03 +00:00
$configLoader -> setupCache ( $configCache );
$confBasepath = $configCache -> get ( 'system' , 'basepath' );
2019-12-15 22:44:33 +00:00
$currBasepath = DI :: config () -> get ( 'system' , 'basepath' );
2019-05-13 17:30:03 +00:00
if ( $confBasepath !== $currBasepath || ! is_dir ( $currBasepath )) {
2020-01-19 20:21:53 +00:00
if ( is_dir ( $confBasepath ) && DI :: config () -> set ( 'system' , 'basepath' , $confBasepath )) {
2019-12-15 22:46:56 +00:00
DI :: logger () -> info ( 'Friendica\'s system.basepath was updated successfully.' , [
2019-05-13 17:30:03 +00:00
'from' => $currBasepath ,
'to' => $confBasepath ,
]);
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: l10n () -> t ( 'Friendica\'s system.basepath was updated from \'%s\' to \'%s\'. Please remove the system.basepath from your db to avoid differences.' ,
2019-05-13 17:30:03 +00:00
$currBasepath ,
$confBasepath );
} elseif ( ! is_dir ( $currBasepath )) {
2019-12-15 22:46:56 +00:00
DI :: logger () -> alert ( 'Friendica\'s system.basepath is wrong.' , [
2019-05-13 17:30:03 +00:00
'from' => $currBasepath ,
'to' => $confBasepath ,
]);
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: l10n () -> t ( 'Friendica\'s current system.basepath \'%s\' is wrong and the config file \'%s\' isn\'t used.' ,
2019-05-13 17:30:03 +00:00
$currBasepath ,
$confBasepath );
} else {
2019-12-15 22:46:56 +00:00
DI :: logger () -> alert ( 'Friendica\'s system.basepath is wrong.' , [
2019-05-13 17:30:03 +00:00
'from' => $currBasepath ,
'to' => $confBasepath ,
]);
2020-01-18 19:52:34 +00:00
$warningtext [] = DI :: l10n () -> t ( 'Friendica\'s current system.basepath \'%s\' is not equal to the config file \'%s\'. Please fix your configuration.' ,
2019-05-13 17:30:03 +00:00
$currBasepath ,
$confBasepath );
}
}
2019-05-02 04:01:43 +00:00
$accounts = [
2020-01-18 19:52:34 +00:00
[ DI :: l10n () -> t ( 'Normal Account' ), 0 ],
[ DI :: l10n () -> t ( 'Automatic Follower Account' ), 0 ],
[ DI :: l10n () -> t ( 'Public Forum Account' ), 0 ],
[ DI :: l10n () -> t ( 'Automatic Friend Account' ), 0 ],
[ DI :: l10n () -> t ( 'Blog Account' ), 0 ],
[ DI :: l10n () -> t ( 'Private Forum Account' ), 0 ]
2019-05-02 04:01:43 +00:00
];
$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 ();
2019-08-12 05:30:33 +00:00
$deferred = DBA :: count ( 'workerqueue' , [ 'NOT `done` AND `retrial` > ?' , 0 ]);
2019-05-02 04:01:43 +00:00
2019-08-12 05:30:33 +00:00
$workerqueue = DBA :: count ( 'workerqueue' , [ 'NOT `done` AND `retrial` = ?' , 0 ]);
2019-05-02 04:01:43 +00:00
// We can do better, but this is a quick queue status
2020-01-18 19:52:34 +00:00
$queues = [ 'label' => DI :: l10n () -> t ( 'Message queues' ), 'deferred' => $deferred , 'workerq' => $workerqueue ];
2019-05-02 04:01:43 +00:00
$variables = DBA :: toArray ( DBA :: p ( 'SHOW variables LIKE "max_allowed_packet"' ));
$max_allowed_packet = $variables ? $variables [ 0 ][ 'Value' ] : 0 ;
$server_settings = [
2020-01-18 19:52:34 +00:00
'label' => DI :: l10n () -> t ( 'Server Settings' ),
2019-05-02 04:01:43 +00:00
'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 , [
2020-01-18 19:52:34 +00:00
'$title' => DI :: l10n () -> t ( 'Administration' ),
'$page' => DI :: l10n () -> t ( 'Summary' ),
2019-05-02 04:01:43 +00:00
'$queues' => $queues ,
2020-01-18 19:52:34 +00:00
'$users' => [ DI :: l10n () -> t ( 'Registered users' ), $users ],
2019-05-02 04:01:43 +00:00
'$accounts' => $accounts ,
2020-01-18 19:52:34 +00:00
'$pending' => [ DI :: l10n () -> t ( 'Pending registrations' ), $pending ],
'$version' => [ DI :: l10n () -> t ( 'Version' ), FRIENDICA_VERSION ],
2019-05-02 04:01:43 +00:00
'$platform' => FRIENDICA_PLATFORM ,
'$codename' => FRIENDICA_CODENAME ,
2020-01-19 20:21:13 +00:00
'$build' => DI :: config () -> get ( 'system' , 'build' ),
2020-01-18 19:52:34 +00:00
'$addons' => [ DI :: l10n () -> t ( 'Active addons' ), Addon :: getEnabledList ()],
2019-05-02 04:01:43 +00:00
'$serversettings' => $server_settings ,
'$warningtext' => $warningtext
]);
}
private static function checkSelfHostMeta ()
{
// Fetch the host-meta to check if this really is a vital server
2019-12-16 00:05:15 +00:00
return Network :: curl ( DI :: baseUrl () -> get () . '/.well-known/host-meta' ) -> isSuccess ();
2019-05-02 04:01:43 +00:00
}
}