diff --git a/src/Jackett.Tray/Main.cs b/src/Jackett.Tray/Main.cs index 7a02445e8..1d677fbbe 100644 --- a/src/Jackett.Tray/Main.cs +++ b/src/Jackett.Tray/Main.cs @@ -42,6 +42,14 @@ namespace JackettTray Engine.Logger.Info("Starting server from tray"); Engine.Server.Start(); } + + Task.Factory.StartNew(WaitForEvent); + } + + private void WaitForEvent() + { + Engine.LockService.WaitForSignal(); + Application.Exit(); } void toolStripMenuItemWebUI_Click(object sender, EventArgs e) diff --git a/src/Jackett.Updater/Program.cs b/src/Jackett.Updater/Program.cs index d37d8b9f7..729425fb3 100644 --- a/src/Jackett.Updater/Program.cs +++ b/src/Jackett.Updater/Program.cs @@ -22,8 +22,6 @@ namespace Jackett.Updater private void Run(string[] args) { Engine.Logger.Info("Jackett Updater v" + GetCurrentVersion()); - Engine.Logger.Info("Waiting for Jackett to close.."); - Thread.Sleep(2000); try { var options = new UpdaterConsoleOptions(); @@ -60,7 +58,7 @@ namespace Jackett.Updater var isWindows = System.Environment.OSVersion.Platform != PlatformID.Unix; var trayRunning = false; - var trayProcesses = Process.GetProcessesByName("JackettTray.exe"); + var trayProcesses = Process.GetProcessesByName("JackettTray"); if (isWindows) { if (trayProcesses.Count() > 0) @@ -78,6 +76,9 @@ namespace Jackett.Updater } } + Engine.Logger.Info("Waiting for Jackett to close.."); + Thread.Sleep(2000); + var files = Directory.GetFiles(updateLocation, "*.*", SearchOption.AllDirectories); foreach(var file in files) { @@ -89,10 +90,15 @@ namespace Jackett.Updater { continue; } - - Engine.Logger.Info("Copying " + fileName); - var dest = Path.Combine(options.Path, file.Substring(updateLocation.Length)); - File.Copy(file, dest, true); + try { + Engine.Logger.Info("Copying " + fileName); + var dest = Path.Combine(options.Path, file.Substring(updateLocation.Length)); + File.Copy(file, dest, true); + } + catch(Exception e) + { + Engine.Logger.Error(e); + } } if (trayRunning) diff --git a/src/Jackett/Engine.cs b/src/Jackett/Engine.cs index 3b07f6098..9679b8b29 100644 --- a/src/Jackett/Engine.cs +++ b/src/Jackett/Engine.cs @@ -74,6 +74,14 @@ namespace Jackett } } + public static ITrayLockService LockService + { + get + { + return container.Resolve(); + } + } + public static IServerService Server { get diff --git a/src/Jackett/Jackett.csproj b/src/Jackett/Jackett.csproj index 102298a29..84b515891 100644 --- a/src/Jackett/Jackett.csproj +++ b/src/Jackett/Jackett.csproj @@ -271,6 +271,7 @@ + diff --git a/src/Jackett/Services/TrayLockService.cs b/src/Jackett/Services/TrayLockService.cs new file mode 100644 index 000000000..1627f5928 --- /dev/null +++ b/src/Jackett/Services/TrayLockService.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Jackett.Services +{ + public interface ITrayLockService + { + void WaitForSignal(); + void Signal(); + } + + public class TrayLockService : ITrayLockService + { + private readonly string EVENT_HANDLE_NAME = "JACKETT.TRAY"; + + private EventWaitHandle GetEventHandle() + { + return new EventWaitHandle(false, EventResetMode.ManualReset, EVENT_HANDLE_NAME); + } + + public void WaitForSignal() + { + if (System.Environment.OSVersion.Platform != PlatformID.Unix) + { + GetEventHandle().Reset(); + GetEventHandle().WaitOne(); + } + } + + public void Signal() + { + if (System.Environment.OSVersion.Platform != PlatformID.Unix) + { + GetEventHandle().Set(); + } + } + } +} diff --git a/src/Jackett/Services/UpdateService.cs b/src/Jackett/Services/UpdateService.cs index fbe892284..7c85a02c9 100644 --- a/src/Jackett/Services/UpdateService.cs +++ b/src/Jackett/Services/UpdateService.cs @@ -10,7 +10,9 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; +using System.Net.Security; using System.Reflection; +using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -29,12 +31,15 @@ namespace Jackett.Services IWebClient client; IConfigurationService configService; ManualResetEvent locker = new ManualResetEvent(false); + ITrayLockService lockService; + bool forceupdatecheck = false; - public UpdateService(Logger l, IWebClient c, IConfigurationService cfg) + public UpdateService(Logger l, IWebClient c, IConfigurationService cfg, ITrayLockService ls) { logger = l; client = c; configService = cfg; + lockService = ls; } private string ExePath() @@ -50,6 +55,7 @@ namespace Jackett.Services public void CheckForUpdatesNow() { + forceupdatecheck = true; locker.Set(); } @@ -63,15 +69,22 @@ namespace Jackett.Services } } + private bool AcceptCert(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + return true; + } + private async Task CheckForUpdates() { var config = configService.GetConfig(); - if (config.UpdateDisabled) + if (config.UpdateDisabled && !forceupdatecheck) { logger.Info($"Skipping update check as it is disabled."); return; } + forceupdatecheck = true; + var isWindows = System.Environment.OSVersion.Platform != PlatformID.Unix; if (Debugger.IsAttached) { @@ -81,7 +94,14 @@ namespace Jackett.Services try { + if (!isWindows) + { + // Linux distros don't seem to like these certs.. todo local cert verification? + System.Net.ServicePointManager.ServerCertificateValidationCallback += AcceptCert; + } + var github = new GitHubClient(new ProductHeaderValue("Jackett")); + if(config!=null && !string.IsNullOrWhiteSpace(config.GitHubToken)) { github.Credentials = new Credentials(config.GitHubToken); @@ -122,6 +142,13 @@ namespace Jackett.Services { logger.Error(e, "Error checking for updates."); } + finally + { + if (!isWindows) + { + System.Net.ServicePointManager.ServerCertificateValidationCallback -= AcceptCert; + } + } } private string GetCurrentVersion() @@ -224,6 +251,7 @@ namespace Jackett.Services var procInfo = Process.Start(startInfo); logger.Info($"Updater started process id: {procInfo.Id}"); logger.Info("Exiting Jackett.."); + lockService.Signal(); Environment.Exit(0); } }