Added update check early in startup if the package requested a post-install update check

pull/3610/head
Taloth Saldono 5 years ago
parent 19764014be
commit 25abf52b3f

@ -95,7 +95,7 @@ chown -R $USER:$GROUP /usr/lib/sonarr
sed -i "s:User=sonarr:User=$USER:g; s:Group=sonarr:Group=$GROUP:g; s:-data=/var/lib/sonarr:-data=$CONFDIR:g" /lib/systemd/system/sonarr.service sed -i "s:User=sonarr:User=$USER:g; s:Group=sonarr:Group=$GROUP:g; s:-data=/var/lib/sonarr:-data=$CONFDIR:g" /lib/systemd/system/sonarr.service
#BEGIN BUILTIN UPDATER #BEGIN BUILTIN UPDATER
if [ $1 = "upgrade" ] && [ "$UPDATER" = "BuiltIn" ]; then if [ "$UPDATER" = "BuiltIn" ]; then
# If we upgraded, signal Sonarr to do an update check on startup instead of scheduled. # If we upgraded, signal Sonarr to do an update check on startup instead of scheduled.
touch $CONFDIR/update_required touch $CONFDIR/update_required
chown $USER:$GROUP $CONFDIR/update_required chown $USER:$GROUP $CONFDIR/update_required

@ -0,0 +1,9 @@
using NzbDrone.Common.Messaging;
namespace NzbDrone.Core.Lifecycle
{
public class ApplicationStartingEvent : IEvent
{
}
}

@ -1,6 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Threading;
using NLog; using NLog;
using NzbDrone.Common; using NzbDrone.Common;
using NzbDrone.Common.Disk; using NzbDrone.Common.Disk;
@ -11,12 +13,14 @@ using NzbDrone.Common.Instrumentation.Extensions;
using NzbDrone.Common.Processes; using NzbDrone.Common.Processes;
using NzbDrone.Core.Backup; using NzbDrone.Core.Backup;
using NzbDrone.Core.Configuration; using NzbDrone.Core.Configuration;
using NzbDrone.Core.Lifecycle;
using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Messaging.Commands;
using NzbDrone.Core.Messaging.Events;
using NzbDrone.Core.Update.Commands; using NzbDrone.Core.Update.Commands;
namespace NzbDrone.Core.Update namespace NzbDrone.Core.Update
{ {
public class InstallUpdateService : IExecute<ApplicationUpdateCommand> public class InstallUpdateService : IExecute<ApplicationUpdateCommand>, IHandle<ApplicationStartingEvent>
{ {
private readonly ICheckUpdateService _checkUpdateService; private readonly ICheckUpdateService _checkUpdateService;
private readonly Logger _logger; private readonly Logger _logger;
@ -70,7 +74,7 @@ namespace NzbDrone.Core.Update
_logger = logger; _logger = logger;
} }
private void InstallUpdate(UpdatePackage updatePackage) private bool InstallUpdate(UpdatePackage updatePackage)
{ {
EnsureAppDataSafety(); EnsureAppDataSafety();
@ -93,7 +97,7 @@ namespace NzbDrone.Core.Update
if (_appFolderInfo.StartUpFolder.EndsWith("_output")) if (_appFolderInfo.StartUpFolder.EndsWith("_output"))
{ {
_logger.ProgressDebug("Running in developer environment, not updating."); _logger.ProgressDebug("Running in developer environment, not updating.");
return; return false;
} }
var updateSandboxFolder = _appFolderInfo.GetUpdateSandboxFolder(); var updateSandboxFolder = _appFolderInfo.GetUpdateSandboxFolder();
@ -131,7 +135,7 @@ namespace NzbDrone.Core.Update
if (OsInfo.IsNotWindows && _configFileProvider.UpdateMechanism == UpdateMechanism.Script) if (OsInfo.IsNotWindows && _configFileProvider.UpdateMechanism == UpdateMechanism.Script)
{ {
InstallUpdateWithScript(updateSandboxFolder); InstallUpdateWithScript(updateSandboxFolder);
return; return true;
} }
_logger.Info("Preparing client"); _logger.Info("Preparing client");
@ -141,6 +145,8 @@ namespace NzbDrone.Core.Update
_logger.ProgressInfo("Sonarr will restart shortly."); _logger.ProgressInfo("Sonarr will restart shortly.");
_processProvider.Start(_appFolderInfo.GetUpdateClientExePath(), GetUpdaterArgs(updateSandboxFolder)); _processProvider.Start(_appFolderInfo.GetUpdateClientExePath(), GetUpdaterArgs(updateSandboxFolder));
return true;
} }
private void EnsureValidBranch(UpdatePackage package) private void EnsureValidBranch(UpdatePackage package)
@ -252,5 +258,65 @@ namespace NzbDrone.Core.Update
throw new CommandFailedException(ex); throw new CommandFailedException(ex);
} }
} }
public void Handle(ApplicationStartingEvent message)
{
// Check if we have to do an application update on startup
try
{
// Don't do a prestartup update check unless BuiltIn update is enabled
if (_configFileProvider.UpdateAutomatically ||
_configFileProvider.UpdateMechanism != UpdateMechanism.BuiltIn ||
_deploymentInfoProvider.IsExternalUpdateMechanism)
{
return;
}
var updateMarker = Path.Combine(_appFolderInfo.AppDataFolder, "update_required");
if (!_diskProvider.FileExists(updateMarker))
{
return;
}
_logger.Debug("Post-install update check requested");
var latestAvailable = _checkUpdateService.AvailableUpdate();
if (latestAvailable == null)
{
_logger.Debug("No post-install update available");
_diskProvider.DeleteFile(updateMarker);
return;
}
_logger.Info("Installing post-install update from {0} to {1}", BuildInfo.Version, latestAvailable.Version);
_diskProvider.DeleteFile(updateMarker);
var installing = InstallUpdate(latestAvailable);
if (installing)
{
_logger.Debug("Install in progress, giving installer 30 seconds.");
var watch = Stopwatch.StartNew();
while (watch.Elapsed < TimeSpan.FromSeconds(30))
{
Thread.Sleep(1000);
}
_logger.Error("Post-install update not completed within 30 seconds. Attempting to continue normal operation.");
}
else
{
_logger.Debug("Post-install update cancelled for unknown reason. Attempting to continue normal operation.");
}
}
catch (Exception ex)
{
_logger.Error(ex, "Failed to perform the post-install update check. Attempting to continue normal operation.");
}
}
} }
} }

@ -58,6 +58,14 @@ namespace NzbDrone.Host
_runtimeInfo.IsExiting = false; _runtimeInfo.IsExiting = false;
DbFactory.RegisterDatabase(_container); DbFactory.RegisterDatabase(_container);
_container.Resolve<IEventAggregator>().PublishEvent(new ApplicationStartingEvent());
if (_runtimeInfo.IsExiting)
{
return;
}
_hostController.StartServer(); _hostController.StartServer();
if (!_startupContext.Flags.Contains(StartupContext.NO_BROWSER) if (!_startupContext.Flags.Contains(StartupContext.NO_BROWSER)

Loading…
Cancel
Save