From bb70258d48085058c75dd82714eca27819f84061 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 1 Aug 2020 05:55:27 +0000 Subject: [PATCH] Discovery of peers of other servers --- src/Model/GServer.php | 13 +++++-- src/Worker/UpdateServerPeers.php | 66 ++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 src/Worker/UpdateServerPeers.php diff --git a/src/Model/GServer.php b/src/Model/GServer.php index 0f47146eb7..9a8166158b 100644 --- a/src/Model/GServer.php +++ b/src/Model/GServer.php @@ -1591,9 +1591,9 @@ class GServer $gservers = DBA::p("SELECT `id`, `url`, `nurl`, `network`, `poco` FROM `gserver` WHERE NOT `failed` - AND `poco` != '' + AND `directory-type` != ? AND `last_poco_query` < ? - ORDER BY RAND()", $last_update + ORDER BY RAND()", self::DT_NONE, $last_update ); while ($gserver = DBA::fetch($gservers)) { @@ -1604,8 +1604,13 @@ class GServer continue; } - Logger::info('Update directory', ['server' => $gserver['url'], 'id' => $gserver['id']]); - Worker::add(PRIORITY_LOW, 'UpdateServerDirectory', $gserver); + Logger::info('Update peer list', ['server' => $gserver['url'], 'id' => $gserver['id']]); + Worker::add(PRIORITY_LOW, 'UpdateServerPeers', $gserver['url']); + + if ($gserver['directory-type'] == self::DT_POCO) { + Logger::info('Update directory', ['server' => $gserver['url'], 'id' => $gserver['id']]); + Worker::add(PRIORITY_LOW, 'UpdateServerDirectory', $gserver); + } if (--$no_of_queries == 0) { break; diff --git a/src/Worker/UpdateServerPeers.php b/src/Worker/UpdateServerPeers.php new file mode 100644 index 0000000000..ff0cdfa730 --- /dev/null +++ b/src/Worker/UpdateServerPeers.php @@ -0,0 +1,66 @@ +. + * + */ + +namespace Friendica\Worker; + +use Friendica\Core\Logger; +use Friendica\Core\Worker; +use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Util\Strings; + +class UpdateServerPeers +{ + /** + * Query the given server for their known peers + * @param string $gserver Server URL + */ + public static function execute(string $url) + { + $ret = DI::httpRequest()->get($url . '/api/v1/instance/peers'); + if (!$ret->isSuccess() || empty($ret->getBody())) { + Logger::info('Server is not reachable or does not offer the "peers" endpoint', ['url' => $url]); + return; + } + + $peers = json_decode($ret->getBody()); + if (empty($peers) || !is_array($peers)) { + Logger::info('Server does not have any peers listed', ['url' => $url]); + return; + } + + Logger::info('Server peer update start', ['url' => $url]); + + $total = 0; + $added = 0; + foreach ($peers as $peer) { + ++$total; + if (DBA::exists('gserver', ['nurl' => Strings::normaliseLink('http://' . $peer)])) { + // We already know this server + continue; + } + // This endpoint doesn't offer the schema. So we assume that it is HTTPS. + Worker::add(PRIORITY_LOW, 'UpdateGServer', 'https://' . $peer); + ++$added; + } + Logger::info('Server peer update ended', ['total' => $total, 'added' => $added, 'url' => $url]); + } +}