Radarr/src/NzbDrone.Host/SingleInstancePolicy.cs

89 lines
2.8 KiB
C#
Raw Permalink Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
2013-11-26 02:46:12 +00:00
using NLog;
using NzbDrone.Common.Processes;
namespace NzbDrone.Host
2013-11-26 02:46:12 +00:00
{
public interface ISingleInstancePolicy
{
void PreventStartIfAlreadyRunning();
void KillAllOtherInstance();
void WarnIfAlreadyRunning();
2013-11-26 02:46:12 +00:00
}
public class SingleInstancePolicy : ISingleInstancePolicy
{
private readonly IProcessProvider _processProvider;
private readonly IBrowserService _browserService;
private readonly Logger _logger;
public SingleInstancePolicy(IProcessProvider processProvider,
IBrowserService browserService,
Logger logger)
2013-11-26 02:46:12 +00:00
{
_processProvider = processProvider;
_browserService = browserService;
_logger = logger;
}
public void PreventStartIfAlreadyRunning()
2013-11-26 02:46:12 +00:00
{
if (IsAlreadyRunning())
{
2017-01-05 19:42:02 +00:00
_logger.Warn("Another instance of Radarr is already running.");
2013-11-26 02:46:12 +00:00
_browserService.LaunchWebUI();
2017-01-05 19:42:02 +00:00
throw new TerminateApplicationException("Another instance is already running");
2013-11-26 02:46:12 +00:00
}
}
public void KillAllOtherInstance()
{
foreach (var processId in GetOtherNzbDroneProcessIds())
{
_processProvider.Kill(processId);
}
}
public void WarnIfAlreadyRunning()
{
if (IsAlreadyRunning())
{
_logger.Debug("Another instance of Radarr is already running.");
}
}
2013-11-26 02:46:12 +00:00
private bool IsAlreadyRunning()
{
return GetOtherNzbDroneProcessIds().Any();
}
private List<int> GetOtherNzbDroneProcessIds()
2013-11-26 02:46:12 +00:00
{
try
{
var currentId = _processProvider.GetCurrentProcess().Id;
2018-11-23 07:03:32 +00:00
var otherProcesses = _processProvider.FindProcessByName(ProcessProvider.RADARR_CONSOLE_PROCESS_NAME)
.Union(_processProvider.FindProcessByName(ProcessProvider.RADARR_PROCESS_NAME))
.Select(c => c.Id)
.Except(new[] { currentId })
.ToList();
if (otherProcesses.Any())
{
_logger.Info("{0} instance(s) of Radarr are running", otherProcesses.Count);
}
2013-11-26 02:46:12 +00:00
return otherProcesses;
}
catch (Exception ex)
{
_logger.Warn(ex, "Failed to check for multiple instances of Radarr.");
return new List<int>();
}
}
2013-11-26 02:46:12 +00:00
}
}