mirror of
https://github.com/nextcloud/server.git
synced 2026-02-20 00:12:30 -05:00
Sync federated clouds using a cron job
This commit is contained in:
parent
9b4c9a0357
commit
7909c47b7c
7 changed files with 171 additions and 35 deletions
|
|
@ -28,6 +28,8 @@ use OCA\Federation\DAV\FedAuth;
|
|||
use OCA\Federation\DbHandler;
|
||||
use OCA\Federation\Hooks;
|
||||
use OCA\Federation\Middleware\AddServerMiddleware;
|
||||
use OCA\Federation\SyncFederationAddressBooks;
|
||||
use OCA\Federation\SyncJob;
|
||||
use OCA\Federation\TrustedServers;
|
||||
use OCP\API;
|
||||
use OCP\App;
|
||||
|
|
@ -163,4 +165,17 @@ class Application extends \OCP\AppFramework\App {
|
|||
});
|
||||
}
|
||||
|
||||
public function setupCron() {
|
||||
$jl = $this->getContainer()->getServer()->getJobList();
|
||||
$jl->add(new SyncJob());
|
||||
}
|
||||
|
||||
/**
|
||||
* @return SyncFederationAddressBooks
|
||||
*/
|
||||
public function getSyncService() {
|
||||
$dbHandler = $this->getContainer()->query('DbHandler');
|
||||
return new SyncFederationAddressBooks($dbHandler);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
23
apps/federation/appinfo/install.php
Normal file
23
apps/federation/appinfo/install.php
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
$app = new \OCA\Federation\AppInfo\Application();
|
||||
$app->setupCron();
|
||||
|
|
@ -1,8 +1,7 @@
|
|||
<?php
|
||||
|
||||
$dbConnection = \OC::$server->getDatabaseConnection();
|
||||
$l10n = \OC::$server->getL10N('federation');
|
||||
$dbHandler = new \OCA\Federation\DbHandler($dbConnection, $l10n);
|
||||
$app = new \OCA\Federation\AppInfo\Application();
|
||||
$syncService = $app->getSyncService();
|
||||
|
||||
/** @var Symfony\Component\Console\Application $application */
|
||||
$application->add(new \OCA\Federation\Command\SyncFederationAddressBooks($dbHandler));
|
||||
$application->add(new \OCA\Federation\Command\SyncFederationAddressBooks($syncService));
|
||||
|
|
|
|||
23
apps/federation/appinfo/update.php
Normal file
23
apps/federation/appinfo/update.php
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
$app = new \OCA\Federation\AppInfo\Application();
|
||||
$app->setupCron();
|
||||
|
|
@ -2,9 +2,7 @@
|
|||
|
||||
namespace OCA\Federation\Command;
|
||||
|
||||
use OCA\DAV\CardDAV\SyncService;
|
||||
use OCA\Federation\DbHandler;
|
||||
use OCA\Federation\TrustedServers;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Helper\ProgressBar;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
|
|
@ -12,20 +10,16 @@ use Symfony\Component\Console\Output\OutputInterface;
|
|||
|
||||
class SyncFederationAddressBooks extends Command {
|
||||
|
||||
/** @var DbHandler */
|
||||
protected $dbHandler;
|
||||
|
||||
/** @var SyncService */
|
||||
/** @var \OCA\Federation\SyncFederationAddressBooks */
|
||||
private $syncService;
|
||||
|
||||
/**
|
||||
* @param DbHandler $dbHandler
|
||||
*/
|
||||
function __construct(DbHandler $dbHandler) {
|
||||
function __construct(\OCA\Federation\SyncFederationAddressBooks $syncService) {
|
||||
parent::__construct();
|
||||
|
||||
$this->syncService = \OC::$server->query('CardDAVSyncService');
|
||||
$this->dbHandler = $dbHandler;
|
||||
$this->syncService = $syncService;
|
||||
}
|
||||
|
||||
protected function configure() {
|
||||
|
|
@ -42,30 +36,14 @@ class SyncFederationAddressBooks extends Command {
|
|||
|
||||
$progress = new ProgressBar($output);
|
||||
$progress->start();
|
||||
$trustedServers = $this->dbHandler->getAllServer();
|
||||
foreach ($trustedServers as $trustedServer) {
|
||||
$progress->advance();
|
||||
$url = $trustedServer['url'];
|
||||
$sharedSecret = $trustedServer['shared_secret'];
|
||||
$syncToken = $trustedServer['sync_token'];
|
||||
|
||||
if (is_null($sharedSecret)) {
|
||||
continue;
|
||||
}
|
||||
$targetBookId = sha1($url);
|
||||
$targetPrincipal = "principals/system/system";
|
||||
$targetBookProperties = [
|
||||
'{DAV:}displayname' => $url
|
||||
];
|
||||
try {
|
||||
$newToken = $this->syncService->syncRemoteAddressBook($url, 'system', $sharedSecret, $syncToken, $targetPrincipal, $targetBookId, $targetBookProperties);
|
||||
if ($newToken !== $syncToken) {
|
||||
$this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken);
|
||||
}
|
||||
} catch (\Exception $ex) {
|
||||
$this->syncService->syncThemAll(function($url, $ex) use ($progress, $output) {
|
||||
if ($ex instanceof \Exception) {
|
||||
$output->writeln("Error while syncing $url : " . $ex->getMessage());
|
||||
} else {
|
||||
$progress->advance();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$progress->finish();
|
||||
$output->writeln('');
|
||||
}
|
||||
|
|
|
|||
55
apps/federation/lib/syncfederationaddressbooks.php
Normal file
55
apps/federation/lib/syncfederationaddressbooks.php
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
<?php
|
||||
|
||||
namespace OCA\Federation;
|
||||
|
||||
use OCA\DAV\CardDAV\SyncService;
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Helper\ProgressBar;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class SyncFederationAddressBooks {
|
||||
|
||||
/** @var DbHandler */
|
||||
protected $dbHandler;
|
||||
|
||||
/** @var SyncService */
|
||||
private $syncService;
|
||||
|
||||
/**
|
||||
* @param DbHandler $dbHandler
|
||||
*/
|
||||
function __construct(DbHandler $dbHandler) {
|
||||
|
||||
$this->syncService = \OC::$server->query('CardDAVSyncService');
|
||||
$this->dbHandler = $dbHandler;
|
||||
}
|
||||
|
||||
public function syncThemAll(\Closure $callback) {
|
||||
|
||||
$trustedServers = $this->dbHandler->getAllServer();
|
||||
foreach ($trustedServers as $trustedServer) {
|
||||
$url = $trustedServer['url'];
|
||||
$callback($url);
|
||||
$sharedSecret = $trustedServer['shared_secret'];
|
||||
$syncToken = $trustedServer['sync_token'];
|
||||
|
||||
if (is_null($sharedSecret)) {
|
||||
continue;
|
||||
}
|
||||
$targetBookId = sha1($url);
|
||||
$targetPrincipal = "principals/system/system";
|
||||
$targetBookProperties = [
|
||||
'{DAV:}displayname' => $url
|
||||
];
|
||||
try {
|
||||
$newToken = $this->syncService->syncRemoteAddressBook($url, 'system', $sharedSecret, $syncToken, $targetPrincipal, $targetBookId, $targetBookProperties);
|
||||
if ($newToken !== $syncToken) {
|
||||
$this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken);
|
||||
}
|
||||
} catch (\Exception $ex) {
|
||||
$callback($url, $ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
43
apps/federation/lib/syncjob.php
Normal file
43
apps/federation/lib/syncjob.php
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\Federation;
|
||||
|
||||
use OC\BackgroundJob\TimedJob;
|
||||
use OCA\Federation\AppInfo\Application;
|
||||
|
||||
class SyncJob extends TimedJob {
|
||||
|
||||
public function __construct() {
|
||||
// Run once a day
|
||||
$this->setInterval(24 * 60 * 60);
|
||||
}
|
||||
|
||||
protected function run($argument) {
|
||||
$app = new Application();
|
||||
$ss = $app->getSyncService();
|
||||
$ss->syncThemAll(function($url, $ex) {
|
||||
if ($ex instanceof \Exception) {
|
||||
\OC::$server->getLogger()->error("Error while syncing $url : " . $ex->getMessage(), ['app' => 'fed-sync']);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue