mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2025-09-27 20:44:00 +02:00
Fixed: Auto-Updater rollback logic tries to restore unchanged files.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
{
|
||||
|
42
src/NzbDrone.Update/UpdateEngine/DetectExistingVersion.cs
Normal file
42
src/NzbDrone.Update/UpdateEngine/DetectExistingVersion.cs
Normal 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)";
|
||||
}
|
||||
}
|
||||
}
|
@@ -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
|
||||
|
Reference in New Issue
Block a user