2022-01-17 11:15:46 +00:00
/ *
*
* ( c ) Copyright Ascensio System Limited 2010 - 2020
*
* This program is freeware . You can redistribute it and / or modify it under the terms of the GNU
* General Public License ( GPL ) version 3 as published by the Free Software Foundation ( https : //www.gnu.org/copyleft/gpl.html).
* In accordance with Section 7 ( a ) of the GNU GPL its Section 15 shall be amended to the effect that
* Ascensio System SIA expressly excludes the warranty of non - infringement of any third - party rights .
*
* THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY ; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE . For more details , see GNU GPL at https : //www.gnu.org/copyleft/gpl.html
*
* You can contact Ascensio System SIA by email at sales @onlyoffice . com
*
* The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display
* Appropriate Legal Notices , as required under Section 5 of the GNU GPL version 3.
*
* Pursuant to Section 7 § 3 ( b ) of the GNU GPL you must retain the original ONLYOFFICE logo which contains
* relevant author attributions when distributing the software . If the display of the logo in its graphic
* form is not reasonably feasible for technical reasons , you must include the words "Powered by ONLYOFFICE"
* in every copy of the program you distribute .
* Pursuant to Section 7 § 3 ( e ) we decline to grant you any rights under trademark law for use of our trademarks .
*
* /
2022-01-19 16:25:10 +00:00
namespace ASC.Data.Backup.Services ;
[Singletone]
2022-02-23 12:33:42 +00:00
public sealed class BackupSchedulerService : BackgroundService
2022-01-17 11:15:46 +00:00
{
2022-02-23 12:33:42 +00:00
private readonly TimeSpan _backupSchedulerPeriod ;
2022-01-19 16:25:10 +00:00
private readonly ILog _logger ;
private readonly CoreBaseSettings _coreBaseSettings ;
private readonly IServiceScopeFactory _scopeFactory ;
2022-02-23 12:33:42 +00:00
private readonly IEventBus _eventBus ;
2022-01-19 16:25:10 +00:00
public BackupSchedulerService (
IOptionsMonitor < ILog > options ,
IServiceScopeFactory scopeFactory ,
ConfigurationExtension configuration ,
CoreBaseSettings coreBaseSettings ,
2022-02-23 12:33:42 +00:00
BackupWorker backupWorker ,
IEventBus eventBus )
2022-01-17 11:15:46 +00:00
{
2022-01-19 16:25:10 +00:00
_logger = options . CurrentValue ;
_coreBaseSettings = coreBaseSettings ;
2022-02-23 12:33:42 +00:00
_backupSchedulerPeriod = configuration . GetSetting < BackupSettings > ( "backup" ) . Scheduler . Period ;
2022-01-19 16:25:10 +00:00
_scopeFactory = scopeFactory ;
2022-02-23 12:33:42 +00:00
_eventBus = eventBus ;
2022-01-19 16:25:10 +00:00
}
2022-01-17 11:15:46 +00:00
2022-02-23 12:33:42 +00:00
protected override async Task ExecuteAsync ( CancellationToken stoppingToken )
2022-01-19 16:25:10 +00:00
{
2022-02-24 14:15:39 +00:00
_logger . Debug ( "BackupSchedulerService is starting." ) ;
stoppingToken . Register ( ( ) = > _logger . Debug ( "#1 BackupSchedulerService background task is stopping." ) ) ;
2022-01-17 11:15:46 +00:00
2022-02-23 12:33:42 +00:00
while ( ! stoppingToken . IsCancellationRequested )
{
2022-02-24 15:01:32 +00:00
using var serviceScope = _scopeFactory . CreateScope ( ) ;
var registerInstanceService = serviceScope . ServiceProvider . GetService < IRegisterInstanceManager < BackupSchedulerService > > ( ) ;
if ( ! await registerInstanceService . IsActive ( RegisterInstanceWorkerService < BackupSchedulerService > . InstanceId ) )
{
_logger . Debug ( $"BackupSchedulerService background task with instance id {RegisterInstanceWorkerService<BackupSchedulerService>.InstanceId} is't active." ) ;
await Task . Delay ( 1000 , stoppingToken ) ;
continue ;
}
2022-02-24 14:15:39 +00:00
_logger . Debug ( "BackupSchedulerService background task is doing background work." ) ;
2022-02-24 15:01:32 +00:00
ExecuteBackupScheduler ( stoppingToken ) ;
2022-01-17 11:15:46 +00:00
2022-02-23 12:33:42 +00:00
await Task . Delay ( _backupSchedulerPeriod , stoppingToken ) ;
}
2022-01-17 11:15:46 +00:00
2022-02-24 14:15:39 +00:00
_logger . Debug ( "BackupSchedulerService background task is stopping." ) ;
2022-01-19 16:25:10 +00:00
}
2022-01-17 11:15:46 +00:00
2022-02-24 15:01:32 +00:00
private void ExecuteBackupScheduler ( CancellationToken stoppingToken )
2022-01-19 16:25:10 +00:00
{
using var serviceScope = _scopeFactory . CreateScope ( ) ;
2022-01-18 16:04:35 +00:00
2022-01-19 16:25:10 +00:00
var paymentManager = serviceScope . ServiceProvider . GetRequiredService < PaymentManager > ( ) ;
var backupRepository = serviceScope . ServiceProvider . GetRequiredService < BackupRepository > ( ) ; ;
var backupSchedule = serviceScope . ServiceProvider . GetRequiredService < Schedule > ( ) ;
var tenantManager = serviceScope . ServiceProvider . GetRequiredService < TenantManager > ( ) ;
2022-02-24 15:01:32 +00:00
2022-01-19 16:25:10 +00:00
_logger . DebugFormat ( "started to schedule backups" ) ;
2022-01-17 11:15:46 +00:00
2022-01-19 16:25:10 +00:00
var backupsToSchedule = backupRepository . GetBackupSchedules ( ) . Where ( schedule = > backupSchedule . IsToBeProcessed ( schedule ) ) . ToList ( ) ;
2022-01-17 11:15:46 +00:00
2022-01-19 16:25:10 +00:00
_logger . DebugFormat ( "{0} backups are to schedule" , backupsToSchedule . Count ) ;
2022-01-17 11:15:46 +00:00
2022-01-19 16:25:10 +00:00
foreach ( var schedule in backupsToSchedule )
{
2022-02-23 12:33:42 +00:00
if ( stoppingToken . IsCancellationRequested ) return ;
2022-01-19 16:25:10 +00:00
try
2022-01-17 11:15:46 +00:00
{
2022-01-19 16:25:10 +00:00
if ( _coreBaseSettings . Standalone | | tenantManager . GetTenantQuota ( schedule . TenantId ) . AutoBackup )
2022-01-17 11:15:46 +00:00
{
2022-01-19 16:25:10 +00:00
var tariff = paymentManager . GetTariff ( schedule . TenantId ) ;
2022-02-23 12:33:42 +00:00
2022-01-19 16:25:10 +00:00
if ( tariff . State < TariffState . Delay )
2022-01-17 11:15:46 +00:00
{
2022-01-19 16:25:10 +00:00
schedule . LastBackupTime = DateTime . UtcNow ;
backupRepository . SaveBackupSchedule ( schedule ) ;
2022-02-23 12:33:42 +00:00
2022-01-19 16:25:10 +00:00
_logger . DebugFormat ( "Start scheduled backup: {0}, {1}, {2}, {3}" , schedule . TenantId , schedule . BackupMail , schedule . StorageType , schedule . StorageBasePath ) ;
2022-02-23 12:33:42 +00:00
2022-02-24 16:53:49 +00:00
_eventBus . Publish ( new BackupRequestIntegrationEvent (
tenantId : schedule . TenantId ,
storageBasePath : schedule . StorageBasePath ,
storageParams : JsonConvert . DeserializeObject < Dictionary < string , string > > ( schedule . StorageParams ) ,
storageType : schedule . StorageType ,
backupMail : schedule . BackupMail ,
createBy : ASC . Core . Configuration . Constants . CoreSystem . ID ,
isScheduled : true ,
backupsStored : schedule . BackupsStored
) ) ;
2022-01-17 11:15:46 +00:00
}
else
{
2022-01-19 16:25:10 +00:00
_logger . DebugFormat ( "Skip portal {0} not paid" , schedule . TenantId ) ;
2022-01-17 11:15:46 +00:00
}
}
2022-01-19 16:25:10 +00:00
else
2022-01-17 11:15:46 +00:00
{
2022-01-19 16:25:10 +00:00
_logger . DebugFormat ( "Skip portal {0} haven't access" , schedule . TenantId ) ;
2022-01-17 11:15:46 +00:00
}
}
2022-01-19 16:25:10 +00:00
catch ( Exception error )
{
_logger . Error ( "error while scheduling backups: {0}" , error ) ;
}
2022-01-17 11:15:46 +00:00
}
}
}