2020-06-08 10:40:26 +00:00
|
|
|
|
using System;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
|
|
|
|
|
using ASC.Common;
|
|
|
|
|
using ASC.Common.Logging;
|
|
|
|
|
using ASC.Core;
|
|
|
|
|
using ASC.Core.Tenants;
|
|
|
|
|
using ASC.Data.Backup.EF.Model;
|
|
|
|
|
using ASC.Notify.Cron;
|
|
|
|
|
|
|
|
|
|
using Microsoft.Extensions.Options;
|
|
|
|
|
|
|
|
|
|
namespace ASC.Data.Backup
|
2020-10-19 15:53:15 +00:00
|
|
|
|
{
|
|
|
|
|
[Scope]
|
2020-06-08 10:40:26 +00:00
|
|
|
|
public class Schedule
|
|
|
|
|
{
|
2020-08-12 09:58:08 +00:00
|
|
|
|
private TenantManager TenantManager { get; }
|
|
|
|
|
private IOptionsMonitor<ILog> Options { get; }
|
|
|
|
|
private TenantUtil TenantUtil { get; }
|
|
|
|
|
private BackupHelper BackupHelper { get; }
|
2020-06-08 10:40:26 +00:00
|
|
|
|
|
|
|
|
|
public Schedule(IOptionsMonitor<ILog> options, TenantManager tenantManager, TenantUtil tenantUtil, BackupHelper backupHelper)
|
|
|
|
|
{
|
|
|
|
|
Options = options;
|
|
|
|
|
TenantManager = tenantManager;
|
|
|
|
|
TenantUtil = tenantUtil;
|
|
|
|
|
BackupHelper = backupHelper;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool IsToBeProcessed(BackupSchedule backupSchedule)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (BackupHelper.ExceedsMaxAvailableSize(backupSchedule.TenantId)) throw new Exception("Backup file exceed " + backupSchedule.TenantId);
|
|
|
|
|
|
|
|
|
|
var cron = new CronExpression(backupSchedule.Cron);
|
|
|
|
|
var tenant = TenantManager.GetTenant(backupSchedule.TenantId);
|
|
|
|
|
var tenantTimeZone = tenant.TimeZone;
|
|
|
|
|
var culture = tenant.GetCulture();
|
|
|
|
|
Thread.CurrentThread.CurrentCulture = culture;
|
|
|
|
|
|
|
|
|
|
var lastBackupTime = backupSchedule.LastBackupTime.Equals(default)
|
|
|
|
|
? DateTime.UtcNow.Date.AddSeconds(-1)
|
|
|
|
|
: TenantUtil.DateTimeFromUtc(tenantTimeZone, backupSchedule.LastBackupTime);
|
|
|
|
|
|
|
|
|
|
var nextBackupTime = cron.GetTimeAfter(lastBackupTime);
|
|
|
|
|
|
|
|
|
|
if (!nextBackupTime.HasValue) return false;
|
|
|
|
|
var now = TenantUtil.DateTimeFromUtc(tenantTimeZone, DateTime.UtcNow);
|
|
|
|
|
return nextBackupTime <= now;
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
var log = Options.CurrentValue;
|
|
|
|
|
log.Error("Schedule " + backupSchedule.TenantId, e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|