Fixed: Auto-Updater rollback logic tries to restore unchanged files.

This commit is contained in:
Taloth Saldono
2016-09-09 01:05:27 +02:00
parent 09530b238f
commit 4bf3ef45b0
10 changed files with 244 additions and 23 deletions

View File

@@ -27,13 +27,14 @@ namespace NzbDrone.Update.UpdateEngine
public void Backup(string source)
{
_logger.Info("Creating backup of existing installation");
_diskTransferService.TransferFolder(source, _appFolderInfo.GetUpdateBackUpFolder(), TransferMode.Copy, false);
_diskTransferService.MirrorFolder(source, _appFolderInfo.GetUpdateBackUpFolder());
}
public void Restore(string target)
{
_logger.Info("Attempting to rollback upgrade");
_diskTransferService.TransferFolder(_appFolderInfo.GetUpdateBackUpFolder(), target, TransferMode.Copy, false);
var count = _diskTransferService.MirrorFolder(_appFolderInfo.GetUpdateBackUpFolder(), target);
_logger.Info("Rolled back {0} files", count);
}
}
}
}

View File

@@ -34,7 +34,15 @@ namespace NzbDrone.Update.UpdateEngine
_logger.Info("Backing up appdata (database/config)");
var backupFolderAppData = _appFolderInfo.GetUpdateBackUpAppDataFolder();
_diskProvider.CreateFolder(backupFolderAppData);
if (_diskProvider.FolderExists(backupFolderAppData))
{
_diskProvider.EmptyFolder(backupFolderAppData);
}
else
{
_diskProvider.CreateFolder(backupFolderAppData);
}
try
{

View File

@@ -0,0 +1,42 @@
using System;
using System.IO;
using NLog;
namespace NzbDrone.Update.UpdateEngine
{
public interface IDetectExistingVersion
{
string GetExistingVersion(string targetFolder);
}
public class DetectExistingVersion : IDetectExistingVersion
{
private readonly Logger _logger;
public DetectExistingVersion(Logger logger)
{
_logger = logger;
}
public string GetExistingVersion(string targetFolder)
{
try
{
var targetExecutable = Path.Combine(targetFolder, "NzbDrone.exe");
if (File.Exists(targetExecutable))
{
var versionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(targetExecutable);
return versionInfo.FileVersion;
}
}
catch (Exception ex)
{
_logger.Warn(ex, "Failed to get existing version from {0}", targetFolder);
}
return "(unknown)";
}
}
}

View File

@@ -18,6 +18,7 @@ namespace NzbDrone.Update.UpdateEngine
private readonly IDiskProvider _diskProvider;
private readonly IDiskTransferService _diskTransferService;
private readonly IDetectApplicationType _detectApplicationType;
private readonly IDetectExistingVersion _detectExistingVersion;
private readonly ITerminateNzbDrone _terminateNzbDrone;
private readonly IAppFolderInfo _appFolderInfo;
private readonly IBackupAndRestore _backupAndRestore;
@@ -29,6 +30,7 @@ namespace NzbDrone.Update.UpdateEngine
public InstallUpdateService(IDiskProvider diskProvider,
IDiskTransferService diskTransferService,
IDetectApplicationType detectApplicationType,
IDetectExistingVersion detectExistingVersion,
ITerminateNzbDrone terminateNzbDrone,
IAppFolderInfo appFolderInfo,
IBackupAndRestore backupAndRestore,
@@ -40,6 +42,7 @@ namespace NzbDrone.Update.UpdateEngine
_diskProvider = diskProvider;
_diskTransferService = diskTransferService;
_detectApplicationType = detectApplicationType;
_detectExistingVersion = detectExistingVersion;
_terminateNzbDrone = terminateNzbDrone;
_appFolderInfo = appFolderInfo;
_backupAndRestore = backupAndRestore;
@@ -76,30 +79,42 @@ namespace NzbDrone.Update.UpdateEngine
public void Start(string installationFolder, int processId)
{
_logger.Info("Installation Folder: {0}", installationFolder);
_logger.Info("Updating Sonarr from version {0} to version {1}", _detectExistingVersion.GetExistingVersion(installationFolder), BuildInfo.Version);
Verify(installationFolder, processId);
var appType = _detectApplicationType.GetAppType();
_processProvider.FindProcessByName(ProcessProvider.NZB_DRONE_CONSOLE_PROCESS_NAME);
_processProvider.FindProcessByName(ProcessProvider.NZB_DRONE_PROCESS_NAME);
if (OsInfo.IsWindows)
{
_terminateNzbDrone.Terminate(processId);
}
try
{
_processProvider.FindProcessByName(ProcessProvider.NZB_DRONE_CONSOLE_PROCESS_NAME);
_processProvider.FindProcessByName(ProcessProvider.NZB_DRONE_PROCESS_NAME);
_backupAndRestore.Backup(installationFolder);
_backupAppData.Backup();
if (OsInfo.IsWindows)
{
_terminateNzbDrone.Terminate(processId);
if (_processProvider.Exists(ProcessProvider.NZB_DRONE_CONSOLE_PROCESS_NAME) || _processProvider.Exists(ProcessProvider.NZB_DRONE_PROCESS_NAME))
{
_logger.Error("Sonarr was restarted prematurely by external process.");
return;
}
}
_backupAndRestore.Backup(installationFolder);
_backupAppData.Backup();
try
{
_logger.Info("Emptying installation folder");
_diskProvider.EmptyFolder(installationFolder);
_logger.Info("Copying new files to target folder");
_diskTransferService.TransferFolder(_appFolderInfo.GetUpdatePackageFolder(), installationFolder, TransferMode.Copy, false);
_diskTransferService.MirrorFolder(_appFolderInfo.GetUpdatePackageFolder(), installationFolder);
// Set executable flag on Sonarr app
if (OsInfo.IsOsx)
@@ -109,8 +124,9 @@ namespace NzbDrone.Update.UpdateEngine
}
catch (Exception e)
{
_logger.Fatal(e, "Failed to copy upgrade package to target folder.");
_logger.Error(e, "Failed to copy upgrade package to target folder.");
_backupAndRestore.Restore(installationFolder);
throw;
}
}
finally