Sonarr/src/NzbDrone.Update/UpdateEngine/InstallUpdateService.cs

145 lines
5.5 KiB
C#
Raw Normal View History

2013-05-21 04:03:05 +00:00
using System;
using System.IO;
using NLog;
using NzbDrone.Common.Disk;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Common.Extensions;
using NzbDrone.Common.Processes;
2013-05-21 04:03:05 +00:00
namespace NzbDrone.Update.UpdateEngine
{
public interface IInstallUpdateService
{
void Start(string installationFolder, int processId);
2013-05-21 04:03:05 +00:00
}
public class InstallUpdateService : IInstallUpdateService
{
private readonly IDiskProvider _diskProvider;
private readonly IDiskTransferService _diskTransferService;
2013-05-21 04:03:05 +00:00
private readonly IDetectApplicationType _detectApplicationType;
private readonly ITerminateNzbDrone _terminateNzbDrone;
private readonly IAppFolderInfo _appFolderInfo;
2013-05-21 04:03:05 +00:00
private readonly IBackupAndRestore _backupAndRestore;
2014-02-07 02:13:24 +00:00
private readonly IBackupAppData _backupAppData;
2013-05-21 04:03:05 +00:00
private readonly IStartNzbDrone _startNzbDrone;
private readonly IProcessProvider _processProvider;
2013-05-21 04:03:05 +00:00
private readonly Logger _logger;
2014-02-07 02:13:24 +00:00
public InstallUpdateService(IDiskProvider diskProvider,
IDiskTransferService diskTransferService,
2014-02-07 02:13:24 +00:00
IDetectApplicationType detectApplicationType,
ITerminateNzbDrone terminateNzbDrone,
IAppFolderInfo appFolderInfo,
IBackupAndRestore backupAndRestore,
IBackupAppData backupAppData,
IStartNzbDrone startNzbDrone,
IProcessProvider processProvider,
2014-02-07 02:13:24 +00:00
Logger logger)
2013-05-21 04:03:05 +00:00
{
_diskProvider = diskProvider;
_diskTransferService = diskTransferService;
2013-05-21 04:03:05 +00:00
_detectApplicationType = detectApplicationType;
_terminateNzbDrone = terminateNzbDrone;
_appFolderInfo = appFolderInfo;
2013-05-21 04:03:05 +00:00
_backupAndRestore = backupAndRestore;
2014-02-07 02:13:24 +00:00
_backupAppData = backupAppData;
2013-05-21 04:03:05 +00:00
_startNzbDrone = startNzbDrone;
_processProvider = processProvider;
2013-05-21 04:03:05 +00:00
_logger = logger;
}
private void Verify(string targetFolder, int processId)
2013-05-21 04:03:05 +00:00
{
_logger.Info("Verifying requirements before update...");
if (String.IsNullOrWhiteSpace(targetFolder))
throw new ArgumentException("Target folder can not be null or empty");
if (!_diskProvider.FolderExists(targetFolder))
throw new DirectoryNotFoundException("Target folder doesn't exist " + targetFolder);
if (processId < 1)
{
throw new ArgumentException("Invalid process ID: " + processId);
}
if (!_processProvider.Exists(processId))
{
throw new ArgumentException("Process with ID doesn't exist " + processId);
}
2013-05-21 04:03:05 +00:00
_logger.Info("Verifying Update Folder");
if (!_diskProvider.FolderExists(_appFolderInfo.GetUpdatePackageFolder()))
throw new DirectoryNotFoundException("Update folder doesn't exist " + _appFolderInfo.GetUpdatePackageFolder());
2013-05-21 04:03:05 +00:00
}
public void Start(string installationFolder, int processId)
2013-05-21 04:03:05 +00:00
{
Verify(installationFolder, processId);
2013-05-21 04:03:05 +00:00
var appType = _detectApplicationType.GetAppType();
try
{
if (OsInfo.IsWindows)
{
_terminateNzbDrone.Terminate(processId);
}
2013-05-21 04:03:05 +00:00
2014-02-07 02:13:24 +00:00
_backupAndRestore.Backup(installationFolder);
_backupAppData.Backup();
2013-05-21 04:03:05 +00:00
try
{
2014-12-17 16:26:28 +00:00
_logger.Info("Emptying installation folder");
_diskProvider.EmptyFolder(installationFolder);
2014-12-17 16:26:28 +00:00
_logger.Info("Copying new files to target folder");
_diskTransferService.TransferFolder(_appFolderInfo.GetUpdatePackageFolder(), installationFolder, TransferMode.Copy, false);
// Set executable flag on Sonarr app
if (OsInfo.IsOsx)
{
_diskProvider.SetPermissions(Path.Combine(installationFolder, "Sonarr"), "0755", null, null);
}
2013-05-21 04:03:05 +00:00
}
catch (Exception e)
{
_logger.FatalException("Failed to copy upgrade package to target folder.", e);
2014-12-17 16:26:28 +00:00
_backupAndRestore.Restore(installationFolder);
2013-05-21 04:03:05 +00:00
}
}
finally
{
if (OsInfo.IsWindows)
{
_startNzbDrone.Start(appType, installationFolder);
}
else
{
_terminateNzbDrone.Terminate(processId);
_logger.Info("Waiting for external auto-restart.");
for (int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(1000);
if (_processProvider.Exists(ProcessProvider.NZB_DRONE_PROCESS_NAME))
{
_logger.Info("Sonarr was restarted by external process.");
break;
}
}
if (!_processProvider.Exists(ProcessProvider.NZB_DRONE_PROCESS_NAME))
{
_startNzbDrone.Start(appType, installationFolder);
}
}
2013-05-21 04:03:05 +00:00
}
}
}
}