]> git.mxchange.org Git - friendica.git/blobdiff - mod/admin.php
Rename App Methods
[friendica.git] / mod / admin.php
index 54b7e6504e35f220a8d93b24a80cc9df129a287a..f186f127adbda35d819a5bda267d4dd379999d35 100644 (file)
@@ -14,15 +14,17 @@ use Friendica\Core\L10n;
 use Friendica\Core\System;
 use Friendica\Core\Theme;
 use Friendica\Core\Worker;
-use Friendica\Database\DBM;
+use Friendica\Database\DBA;
 use Friendica\Database\DBStructure;
 use Friendica\Model\Contact;
 use Friendica\Model\Item;
 use Friendica\Model\User;
 use Friendica\Module\Login;
 use Friendica\Module\Tos;
+use Friendica\Util\Arrays;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Temporal;
+use Friendica\Util\Network;
 
 require_once 'include/enotify.php';
 require_once 'include/text.php';
@@ -471,14 +473,14 @@ function admin_page_contactblock(App $a)
 {
        $condition = ['uid' => 0, 'blocked' => true];
 
-       $total = dba::count('contact', $condition);
+       $total = DBA::count('contact', $condition);
 
-       $a->set_pager_total($total);
-       $a->set_pager_itemspage(30);
+       $a->setPagerTotal($total);
+       $a->setPagerItemsPage(30);
 
-       $statement = dba::select('contact', [], $condition, ['limit' => [$a->pager['start'], $a->pager['itemspage']]]);
+       $statement = DBA::select('contact', [], $condition, ['limit' => [$a->pager['start'], $a->pager['itemspage']]]);
 
-       $contacts = dba::inArray($statement);
+       $contacts = DBA::toArray($statement);
 
        $t = get_markup_template('admin/contactblock.tpl');
        $o = replace_macros($t, [
@@ -745,10 +747,18 @@ function admin_page_federation(App $a)
 function admin_page_queue(App $a)
 {
        // get content from the queue table
-       $r = q("SELECT `c`.`name`, `c`.`nurl`, `q`.`id`, `q`.`network`, `q`.`created`, `q`.`last`
-                       FROM `queue` AS `q`, `contact` AS `c`
-                       WHERE `c`.`id` = `q`.`cid`
-                       ORDER BY `q`.`cid`, `q`.`created`;");
+       $entries = DBA::p("SELECT `contact`.`name`, `contact`.`nurl`,
+                `queue`.`id`, `queue`.`network`, `queue`.`created`, `queue`.`last`
+                FROM `queue` INNER JOIN `contact` ON `contact`.`id` = `queue`.`cid`
+                ORDER BY `queue`.`cid`, `queue`.`created`");
+
+       $r = [];
+       while ($entry = DBA::fetch($entries)) {
+               $entry['created'] = DateTimeFormat::local($entry['created']);
+               $entry['last'] = DateTimeFormat::local($entry['last']);
+               $r[] = $entry;
+       }
+       DBA::close($entries);
 
        $t = get_markup_template('admin/queue.tpl');
        return replace_macros($t, [
@@ -780,8 +790,16 @@ function admin_page_queue(App $a)
 function admin_page_workerqueue(App $a)
 {
        // get jobs from the workerqueue table
-       $statement = dba::select('workerqueue', ['id', 'parameter', 'created', 'priority'], ['done' => 0], ['order'=> ['priority']]);
-       $r = dba::inArray($statement);
+       $entries = DBA::select('workerqueue', ['id', 'parameter', 'created', 'priority'], ['done' => 0], ['order'=> ['priority']]);
+
+       $r = [];
+       while ($entry = DBA::fetch($entries)) {
+               // fix GH-5469. ref: src/Core/Worker.php:217
+               $entry['parameter'] = Arrays::recursiveImplode(json_decode($entry['parameter'], true), ': ');
+               $entry['created'] = DateTimeFormat::local($entry['created']);
+               $r[] = $entry;
+       }
+       DBA::close($entries);
 
        $t = get_markup_template('admin/workerqueue.tpl');
        return replace_macros($t, [
@@ -811,10 +829,10 @@ function admin_page_workerqueue(App $a)
 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", dbesc(dba::database_name()));
+       $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 (DBM::is_result($r)) {
+       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 <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');
        }
@@ -845,6 +863,20 @@ function admin_page_summary(App $a)
                $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.ini.php, please copy config/local-sample.ini.php and move your config from <code>.htconfig.php</code>. See <a href="%s">the Config help page</a> 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('<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.',
+                       $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],
@@ -877,6 +909,15 @@ function admin_page_summary(App $a)
        $queues = ['label' => L10n::t('Message queues'), 'queue' => $queue, '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 = get_markup_template('admin/summary.tpl');
        return replace_macros($t, [
                '$title' => L10n::t('Administration'),
@@ -891,6 +932,7 @@ function admin_page_summary(App $a)
                '$codename' => FRIENDICA_CODENAME,
                '$build' => Config::get('system', 'build'),
                '$addons' => [L10n::t('Active addons'), $a->addons],
+               '$serversettings' => $server_settings,
                '$showwarning' => $showwarning,
                '$warningtext' => $warningtext
        ]);
@@ -938,10 +980,8 @@ function admin_page_site_post(App $a)
 
                function update_table($table_name, $fields, $old_url, $new_url)
                {
-                       global $a;
-
-                       $dbold = dbesc($old_url);
-                       $dbnew = dbesc($new_url);
+                       $dbold = DBA::escape($old_url);
+                       $dbnew = DBA::escape($new_url);
 
                        $upd = [];
                        foreach ($fields as $f) {
@@ -952,8 +992,8 @@ function admin_page_site_post(App $a)
 
                        $r = q("UPDATE %s SET %s;", $table_name, $upds);
 
-                       if (!DBM::is_result($r)) {
-                               notice("Failed updating '$table_name': " . dba::errorMessage());
+                       if (!DBA::isResult($r)) {
+                               notice("Failed updating '$table_name': " . DBA::errorMessage());
                                goaway('admin/site');
                        }
                }
@@ -972,7 +1012,7 @@ function admin_page_site_post(App $a)
                // update config
                Config::set('system', 'hostname', parse_url($new_url,  PHP_URL_HOST));
                Config::set('system', 'url', $new_url);
-               $a->set_baseurl($new_url);
+               $a->setBaseURL($new_url);
 
                // send relocate
                $users = q("SELECT `uid` FROM `user` WHERE `account_removed` = 0 AND `account_expired` = 0");
@@ -1084,7 +1124,7 @@ function admin_page_site_post(App $a)
                Worker::add(PRIORITY_LOW, 'Directory');
        }
 
-       if ($a->get_path() != "") {
+       if ($a->getURLpath() != "") {
                $diaspora_enabled = false;
        }
        if ($ssl_policy != intval(Config::get('system', 'ssl_policy'))) {
@@ -1221,7 +1261,7 @@ function admin_page_site_post(App $a)
        Config::set('system', 'dbclean-expire-unclaimed', $dbclean_unclaimed);
 
        if ($itemcache != '') {
-               $itemcache = App::realpath($itemcache);
+               $itemcache = App::getRealPath($itemcache);
        }
 
        Config::set('system', 'itemcache', $itemcache);
@@ -1229,13 +1269,13 @@ function admin_page_site_post(App $a)
        Config::set('system', 'max_comments', $max_comments);
 
        if ($temppath != '') {
-               $temppath = App::realpath($temppath);
+               $temppath = App::getRealPath($temppath);
        }
 
        Config::set('system', 'temppath', $temppath);
 
        if ($basepath != '') {
-               $basepath = App::realpath($basepath);
+               $basepath = App::getRealPath($basepath);
        }
 
        Config::set('system', 'basepath', $basepath);
@@ -1378,18 +1418,16 @@ function admin_page_site(App $a)
                "develop" => L10n::t("check the development version")
        ];
 
-       if ($a->config['hostname'] == "") {
-               $a->config['hostname'] = $a->get_hostname();
+       if (empty(Config::get('config', 'hostname'))) {
+               Config::set('config', 'hostname', $a->getHostName());
        }
-       $diaspora_able = ($a->get_path() == "");
+       $diaspora_able = ($a->getURLpath() == "");
 
        $optimize_max_tablesize = Config::get('system', 'optimize_max_tablesize', -1);
 
        if ($optimize_max_tablesize <= 0) {
                $optimize_max_tablesize = -1;
        }
-       // Default list of forbidden names, classic role names from RFC 2142
-       $default_forbidden_nicknames = 'info, marketing, sales, support, abuse, noc, security, postmaster, hostmaster, usenet, news, webmaster, www, uucp, ftp, root, sysop';
 
        $t = get_markup_template('admin/site.tpl');
        return replace_macros($t, [
@@ -1408,9 +1446,9 @@ function admin_page_site(App $a)
                '$relocate' => L10n::t('Relocate - WARNING: advanced function. Could make this server unreachable.'),
                '$baseurl' => System::baseUrl(true),
                // name, label, value, help string, extra data...
-               '$sitename'             => ['sitename', L10n::t("Site name"), $a->config['sitename'],''],
-               '$hostname'             => ['hostname', L10n::t("Host name"), $a->config['hostname'], ""],
-               '$sender_email'         => ['sender_email', L10n::t("Sender Email"), $a->config['sender_email'], L10n::t("The email address your server shall use to send notification emails from."), "", "", "email"],
+               '$sitename'             => ['sitename', L10n::t("Site name"), Config::get('config', 'sitename'),''],
+               '$hostname'             => ['hostname', L10n::t("Host name"), Config::get('config', 'hostname'), ""],
+               '$sender_email'         => ['sender_email', L10n::t("Sender Email"), Config::get('config', 'sender_email'), L10n::t("The email address your server shall use to send notification emails from."), "", "", "email"],
                '$banner'               => ['banner', L10n::t("Banner/Logo"), $banner, ""],
                '$shortcut_icon'        => ['shortcut_icon', L10n::t("Shortcut icon"), Config::get('system','shortcut_icon'),  L10n::t("Link to an icon that will be used for browsers.")],
                '$touch_icon'           => ['touch_icon', L10n::t("Touch icon"), Config::get('system','touch_icon'),  L10n::t("Link to an icon that will be used for tablets and mobiles.")],
@@ -1426,10 +1464,10 @@ function admin_page_site(App $a)
                '$maximagelength'       => ['maximagelength', L10n::t("Maximum image length"), Config::get('system','max_image_length'), L10n::t("Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits.")],
                '$jpegimagequality'     => ['jpegimagequality', L10n::t("JPEG image quality"), Config::get('system','jpeg_quality'), L10n::t("Uploaded JPEGS will be saved at this quality setting [0-100]. Default is 100, which is full quality.")],
 
-               '$register_policy'      => ['register_policy', L10n::t("Register policy"), $a->config['register_policy'], "", $register_choices],
+               '$register_policy'      => ['register_policy', L10n::t("Register policy"), Config::get('config', 'register_policy'), "", $register_choices],
                '$daily_registrations'  => ['max_daily_registrations', L10n::t("Maximum Daily Registrations"), Config::get('system', 'max_daily_registrations'), L10n::t("If registration is permitted above, this sets the maximum number of new user registrations to accept per day.  If register is set to closed, this setting has no effect.")],
-               '$register_text'        => ['register_text', L10n::t("Register text"), $a->config['register_text'], L10n::t("Will be displayed prominently on the registration page. You can use BBCode here.")],
-               '$forbidden_nicknames' => ['forbidden_nicknames', L10n::t('Forbidden Nicknames'), Config::get('system', 'forbidden_nicknames', $default_forbidden_nicknames), L10n::t('Comma separated list of nicknames that are forbidden from registration. Preset is a list of role names according RFC 2142.')],
+               '$register_text'        => ['register_text', L10n::t("Register text"), Config::get('config', 'register_text'), L10n::t("Will be displayed prominently on the registration page. You can use BBCode here.")],
+               '$forbidden_nicknames' => ['forbidden_nicknames', L10n::t('Forbidden Nicknames'), Config::get('system', 'forbidden_nicknames'), L10n::t('Comma separated list of nicknames that are forbidden from registration. Preset is a list of role names according RFC 2142.')],
                '$abandon_days'         => ['abandon_days', L10n::t('Accounts abandoned after x days'), Config::get('system','account_abandon_days'), L10n::t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')],
                '$allowed_sites'        => ['allowed_sites', L10n::t("Allowed friend domains"), Config::get('system','allowed_sites'), L10n::t("Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains")],
                '$allowed_email'        => ['allowed_email', L10n::t("Allowed email domains"), Config::get('system','allowed_email'), L10n::t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")],
@@ -1450,7 +1488,7 @@ function admin_page_site(App $a)
                '$community_page_style' => ['community_page_style', L10n::t("Community pages for visitors"), Config::get('system','community_page_style'), L10n::t("Which community pages should be available for visitors. Local users always see both pages."), $community_page_style_choices],
                '$max_author_posts_community_page' => ['max_author_posts_community_page', L10n::t("Posts per user on community page"), Config::get('system','max_author_posts_community_page'), L10n::t("The maximum number of posts per user on the community page. \x28Not valid for 'Global Community'\x29")],
                '$ostatus_disabled'     => ['ostatus_disabled', L10n::t("Enable OStatus support"), !Config::get('system','ostatus_disabled'), L10n::t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")],
-               '$ostatus_full_threads' => ['ostatus_full_threads', L10n::t("Only import OStatus threads from our contacts"), Config::get('system','ostatus_full_threads'), L10n::t("Normally we import every content from our OStatus contacts. With this option we only store threads that are started by a contact that is known on our system.")],
+               '$ostatus_full_threads' => ['ostatus_full_threads', L10n::t("Only import OStatus/ActivityPub threads from our contacts"), Config::get('system','ostatus_full_threads'), L10n::t("Normally we import every content from our OStatus and ActivityPub contacts. With this option we only store threads that are started by a contact that is known on our system.")],
                '$ostatus_not_able'     => L10n::t("OStatus support can only be enabled if threading is enabled."),
                '$diaspora_able'        => $diaspora_able,
                '$diaspora_not_able'    => L10n::t("Diaspora support can't be enabled because Friendica was installed into a sub directory."),
@@ -1574,7 +1612,7 @@ function admin_page_dbsync(App $a)
        $failed = [];
        $r = q("SELECT `k`, `v` FROM `config` WHERE `cat` = 'database' ");
 
-       if (DBM::is_result($r)) {
+       if (DBA::isResult($r)) {
                foreach ($r as $rr) {
                        $upd = intval(substr($rr['k'], 7));
                        if ($upd < 1139 || $rr['v'] === 'success') {
@@ -1666,15 +1704,18 @@ function admin_page_users_post(App $a)
 
                        Thank you and welcome to %4$s.'));
 
-               $preamble = sprintf($preamble, $user['username'], $a->config['sitename']);
-               $body = sprintf($body, System::baseUrl(), $user['email'], $result['password'], $a->config['sitename']);
+               $preamble = sprintf($preamble, $user['username'], Config::get('config', 'sitename'));
+               $body = sprintf($body, System::baseUrl(), $user['email'], $result['password'], Config::get('config', 'sitename'));
 
                notification([
-                       'type' => SYSTEM_EMAIL,
+                       'type'     => SYSTEM_EMAIL,
+                       'language' => $user['language'],
+                       'to_name'  => $user['username'],
                        'to_email' => $user['email'],
-                       'subject' => L10n::t('Registration details for %s', $a->config['sitename']),
+                       'uid'      => $user['uid'],
+                       'subject'  => L10n::t('Registration details for %s', Config::get('config', 'sitename')),
                        'preamble' => $preamble,
-                       'body' => $body]);
+                       'body'     => $body]);
        }
 
        if (x($_POST, 'page_users_block')) {
@@ -1723,8 +1764,8 @@ function admin_page_users(App $a)
 {
        if ($a->argc > 2) {
                $uid = $a->argv[3];
-               $user = dba::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]);
-               if (!DBM::is_result($user)) {
+               $user = DBA::selectFirst('user', ['username', 'blocked'], ['uid' => $uid]);
+               if (!DBA::isResult($user)) {
                        notice('User not found' . EOL);
                        goaway('admin/users');
                        return ''; // NOTREACHED
@@ -1760,8 +1801,8 @@ function admin_page_users(App $a)
        /* get users */
        $total = q("SELECT COUNT(*) AS `total` FROM `user` WHERE 1");
        if (count($total)) {
-               $a->set_pager_total($total[0]['total']);
-               $a->set_pager_itemspage(100);
+               $a->setPagerTotal($total[0]['total']);
+               $a->setPagerItemsPage(100);
        }
 
        /* ordering */
@@ -1797,39 +1838,38 @@ function admin_page_users(App $a)
                                ORDER BY $sql_order $sql_order_direction LIMIT %d, %d", intval($a->pager['start']), intval($a->pager['itemspage'])
        );
 
-       $adminlist = explode(",", str_replace(" ", "", $a->config['admin_email']));
+       $adminlist = explode(",", str_replace(" ", "", Config::get('config', 'admin_email')));
        $_setup_users = function ($e) use ($adminlist) {
                $page_types = [
-                       PAGE_NORMAL => L10n::t('Normal Account Page'),
-                       PAGE_SOAPBOX => L10n::t('Soapbox Page'),
-                       PAGE_COMMUNITY => L10n::t('Public Forum'),
-                       PAGE_FREELOVE => L10n::t('Automatic Friend Page'),
-                       PAGE_PRVGROUP => L10n::t('Private Forum')
+                       Contact::PAGE_NORMAL    => L10n::t('Normal Account Page'),
+                       Contact::PAGE_SOAPBOX   => L10n::t('Soapbox Page'),
+                       Contact::PAGE_COMMUNITY => L10n::t('Public Forum'),
+                       Contact::PAGE_FREELOVE  => L10n::t('Automatic Friend Page'),
+                       Contact::PAGE_PRVGROUP  => L10n::t('Private Forum')
                ];
                $account_types = [
-                       ACCOUNT_TYPE_PERSON => L10n::t('Personal Page'),
-                       ACCOUNT_TYPE_ORGANISATION => L10n::t('Organisation Page'),
-                       ACCOUNT_TYPE_NEWS => L10n::t('News Page'),
-                       ACCOUNT_TYPE_COMMUNITY => L10n::t('Community Forum')
+                       Contact::ACCOUNT_TYPE_PERSON       => L10n::t('Personal Page'),
+                       Contact::ACCOUNT_TYPE_ORGANISATION => L10n::t('Organisation Page'),
+                       Contact::ACCOUNT_TYPE_NEWS         => L10n::t('News Page'),
+                       Contact::ACCOUNT_TYPE_COMMUNITY    => L10n::t('Community Forum')
                ];
 
-
-
-               $e['page-flags-raw'] = $e['page-flags'];
+               $e['page_flags_raw'] = $e['page-flags'];
                $e['page-flags'] = $page_types[$e['page-flags']];
 
-               $e['account-type-raw'] = ($e['page_flags_raw'] == 0) ? $e['account-type'] : -1;
+               $e['account_type_raw'] = ($e['page_flags_raw'] == 0) ? $e['account-type'] : -1;
                $e['account-type'] = ($e['page_flags_raw'] == 0) ? $account_types[$e['account-type']] : "";
 
                $e['register_date'] = Temporal::getRelativeDate($e['register_date']);
                $e['login_date'] = Temporal::getRelativeDate($e['login_date']);
                $e['lastitem_date'] = Temporal::getRelativeDate($e['lastitem_date']);
-               //$e['is_admin'] = ($e['email'] === $a->config['admin_email']);
                $e['is_admin'] = in_array($e['email'], $adminlist);
                $e['is_deletable'] = (intval($e['uid']) != local_user());
                $e['deleted'] = ($e['account_removed'] ? Temporal::getRelativeDate($e['account_expires_on']) : False);
+
                return $e;
        };
+
        $users = array_map($_setup_users, $users);
 
 
@@ -1875,6 +1915,7 @@ function admin_page_users(App $a)
                '$deny' => L10n::t('Deny'),
                '$delete' => L10n::t('Delete'),
                '$block' => L10n::t('Block'),
+               '$blocked' => L10n::t('User blocked'),
                '$unblock' => L10n::t('Unblock'),
                '$siteadmin' => L10n::t('Site admin'),
                '$accountexpired' => L10n::t('Account expired'),
@@ -2350,11 +2391,12 @@ function admin_page_logs_post(App $a)
 function admin_page_logs(App $a)
 {
        $log_choices = [
-               LOGGER_NORMAL   => 'Normal',
-               LOGGER_TRACE    => 'Trace',
-               LOGGER_DEBUG    => 'Debug',
-               LOGGER_DATA     => 'Data',
-               LOGGER_ALL      => 'All'
+               LOGGER_WARNING => 'Warning',
+               LOGGER_INFO    => 'Info',
+               LOGGER_TRACE   => 'Trace',
+               LOGGER_DEBUG   => 'Debug',
+               LOGGER_DATA    => 'Data',
+               LOGGER_ALL     => 'All'
        ];
 
        if (ini_get('log_errors')) {
@@ -2378,7 +2420,7 @@ function admin_page_logs(App $a)
                '$loglevel' => ['loglevel', L10n::t("Log level"), Config::get('system', 'loglevel'), "", $log_choices],
                '$form_security_token' => get_form_security_token("admin_logs"),
                '$phpheader' => L10n::t("PHP logging"),
-               '$phphint' => L10n::t("To enable logging of PHP errors and warnings you can add the following to the .htconfig.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."),
+               '$phphint' => L10n::t("To temporarily enable logging of PHP errors and warnings you can prepend the following to the index.php file of your installation. The filename set in the 'error_log' line is relative to the friendica top-level directory and must be writeable by the web server. The option '1' for 'log_errors' and 'display_errors' is to enable these options, set to '0' to disable them."),
                '$phplogcode' => "error_reporting(E_ERROR | E_WARNING | E_PARSE);\nini_set('error_log','php.out');\nini_set('log_errors','1');\nini_set('display_errors', '1');",
                '$phplogenabled' => $phplogenabled,
        ]);
@@ -2521,3 +2563,10 @@ function admin_page_features(App $a)
                return $o;
        }
 }
+
+function admin_page_server_vital()
+{
+       // Fetch the host-meta to check if this really is a vital server
+       $serverret = Network::curl(System::baseUrl() . '/.well-known/host-meta');
+       return $serverret["success"];
+}