Files
hasaddon/onedrive-backup/Orchestrator.cs
T
admins d70d81ebdf OneDrive Backup
OneDrive Backup
2023-07-28 22:36:06 +07:00

102 lines
4.0 KiB
C#

using hassio_onedrive_backup.Contracts;
using hassio_onedrive_backup.Graph;
using hassio_onedrive_backup.Hass;
using hassio_onedrive_backup.Sync;
using onedrive_backup.Graph;
using System.Collections;
namespace hassio_onedrive_backup
{
public class Orchestrator
{
private readonly IHassioClient _hassIoClient;
private readonly HassOnedriveFreeSpaceEntityState? _hassOnedriveFreeSpaceEntityState;
private readonly IGraphHelper _graphHelper;
private readonly IServiceProvider _serviceProvider;
private readonly AddonOptions _addonOptions;
private readonly BitArray _allowedBackupHours;
private bool _enabled = false;
public Orchestrator(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
_addonOptions = serviceProvider.GetService<AddonOptions>();
_graphHelper = serviceProvider.GetService<IGraphHelper>();
_hassIoClient = serviceProvider.GetService<IHassioClient>();
_hassOnedriveFreeSpaceEntityState = serviceProvider.GetService<HassOnedriveFreeSpaceEntityState>();
_allowedBackupHours = TimeRangeHelper.GetAllowedHours(_addonOptions.BackupAllowedHours);
BackupManager = new BackupManager(_serviceProvider, _allowedBackupHours, new TransferSpeedHelper(null));
}
public BackupManager BackupManager { get; set; }
public async Task Start()
{
_enabled = true;
string timeZoneId = await _hassIoClient.GetTimeZoneAsync();
DateTimeHelper.Initialize(timeZoneId);
TimeSpan intervalDelay = TimeSpan.FromMinutes(5);
ConsoleLogger.LogInfo($"Backup interval configured to every {_addonOptions.BackupIntervalHours} hours");
if (string.IsNullOrWhiteSpace(_addonOptions.BackupAllowedHours) == false)
{
ConsoleLogger.LogInfo($"Backups / Syncs will only run during these hours: {_allowedBackupHours.ToAllowedHoursText()}");
}
//if (_addonOptions.UploadSpeedCap)
//{
// ConsoleLogger.LogInfo($"Upload speed configured to cap at {_addonOptions.UploadSpeedCapKBPerSecond} KB/s");
//}
// Initialize File Sync Manager
if (_addonOptions.FileSyncEnabled)
{
ConsoleLogger.LogInfo($"File Sync Enabled");
var transferSpeedHelper = new TransferSpeedHelper(null);
var syncManager = new SyncManager(_serviceProvider, _allowedBackupHours, transferSpeedHelper);
var tokenSource = new CancellationTokenSource();
await _graphHelper.GetAndCacheUserTokenAsync();
var fileSyncTask = Task.Run(() => syncManager.SyncLoop(tokenSource.Token), tokenSource.Token);
}
else
{
ConsoleLogger.LogInfo($"File Sync Disabled");
}
while (_enabled)
{
try
{
// Refresh Graph Token
await _graphHelper.GetAndCacheUserTokenAsync();
// Update OneDrive Freespace Sensor
var oneDriveSpace = await _graphHelper.GetFreeSpaceInGB();
if (oneDriveSpace != null)
{
await _hassOnedriveFreeSpaceEntityState.UpdateOneDriveFreespaceSensorInHass(oneDriveSpace);
}
ConsoleLogger.LogVerbose("Checking backups");
BackupManager.PerformBackupsAsync();
}
catch (Exception ex)
{
ConsoleLogger.LogError($"Unexpected error. {ex}");
}
ConsoleLogger.LogVerbose("Backup Interval Completed.");
await Task.Delay(intervalDelay);
}
}
public void Stop()
{
_enabled = false;
}
}
}