From a25f2016dc8ead590c231f8850fe7804d1d00eb0 Mon Sep 17 00:00:00 2001 From: flightlevel Date: Wed, 6 Mar 2019 21:16:20 +1100 Subject: [PATCH] Make Mono.Posix usage conditional on .NET Core --- src/Jackett.Common/Jackett.Common.csproj | 1 - .../Interfaces/IFilePermissionService.cs | 7 ++++ src/Jackett.Common/Services/UpdateService.cs | 36 +++++++--------- src/Jackett.Server/Jackett.Server.csproj | 1 + .../Services/FilePermissionService.cs | 41 +++++++++++++++++++ src/Jackett.Server/Startup.cs | 1 + src/Jackett.Updater/Program.cs | 7 ++++ 7 files changed, 71 insertions(+), 23 deletions(-) create mode 100644 src/Jackett.Common/Services/Interfaces/IFilePermissionService.cs create mode 100644 src/Jackett.Server/Services/FilePermissionService.cs diff --git a/src/Jackett.Common/Jackett.Common.csproj b/src/Jackett.Common/Jackett.Common.csproj index b1848da18..5aa92ef1d 100644 --- a/src/Jackett.Common/Jackett.Common.csproj +++ b/src/Jackett.Common/Jackett.Common.csproj @@ -19,7 +19,6 @@ - diff --git a/src/Jackett.Common/Services/Interfaces/IFilePermissionService.cs b/src/Jackett.Common/Services/Interfaces/IFilePermissionService.cs new file mode 100644 index 000000000..df817df1a --- /dev/null +++ b/src/Jackett.Common/Services/Interfaces/IFilePermissionService.cs @@ -0,0 +1,7 @@ +namespace Jackett.Common.Services.Interfaces +{ + public interface IFilePermissionService + { + void MakeFileExecutable(string path); + } +} diff --git a/src/Jackett.Common/Services/UpdateService.cs b/src/Jackett.Common/Services/UpdateService.cs index cf0643523..d8199f070 100644 --- a/src/Jackett.Common/Services/UpdateService.cs +++ b/src/Jackett.Common/Services/UpdateService.cs @@ -17,7 +17,6 @@ using Jackett.Common.Models.GitHub; using Jackett.Common.Services.Interfaces; using Jackett.Common.Utils; using Jackett.Common.Utils.Clients; -//using Mono.Posix; using Newtonsoft.Json; using NLog; @@ -33,11 +32,12 @@ namespace Jackett.Common.Services ITrayLockService lockService; IProcessService processService; IServiceConfigService windowsService; + IFilePermissionService filePermissionService; private ServerConfig serverConfig; bool forceupdatecheck = false; Variants.JackettVariant variant = Variants.JackettVariant.NotFound; - public UpdateService(Logger l, WebClient c, IConfigurationService cfg, ITrayLockService ls, IProcessService ps, IServiceConfigService ws, ServerConfig sc) + public UpdateService(Logger l, WebClient c, IConfigurationService cfg, ITrayLockService ls, IProcessService ps, IServiceConfigService ws, IFilePermissionService fps, ServerConfig sc) { logger = l; client = c; @@ -46,6 +46,7 @@ namespace Jackett.Common.Services processService = ps; windowsService = ws; serverConfig = sc; + filePermissionService = fps; } private string ExePath() @@ -290,29 +291,20 @@ namespace Jackett.Common.Services gzipStream.Close(); inStream.Close(); - //Disabled as the Mono.Posix.NETStandard library causes issues outside of .NET Core - //https://github.com/xamarin/XamarinComponents/issues/282 - //if (variant == Variants.JackettVariant.CoreMacOs || variant == Variants.JackettVariant.CoreLinuxAmdx64 - //|| variant == Variants.JackettVariant.CoreLinuxArm32 || variant == Variants.JackettVariant.CoreLinuxArm64) - //{ - // // When the files get extracted, the execute permission for jackett and JackettUpdater don't get carried across + if (variant == Variants.JackettVariant.CoreMacOs || variant == Variants.JackettVariant.CoreLinuxAmdx64 + || variant == Variants.JackettVariant.CoreLinuxArm32 || variant == Variants.JackettVariant.CoreLinuxArm64) + { + //Calling the file permission service to limit usage to netcoreapp. The Mono.Posix.NETStandard library causes issues outside of .NET Core + //https://github.com/xamarin/XamarinComponents/issues/282 - // string jackettPath = tempDir + "/Jackett/jackett"; - // logger.Debug($"Giving execute permission to jackett from: {jackettPath}"); + // When the files get extracted, the execute permission for jackett and JackettUpdater don't get carried across - // UnixFileInfo jackettFI = new UnixFileInfo(jackettPath) - // { - // FileAccessPermissions = FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.GroupRead | FileAccessPermissions.OtherRead - // }; + string jackettPath = tempDir + "/Jackett/jackett"; + filePermissionService.MakeFileExecutable(jackettPath); - // string jackettUpdaterPath = tempDir + "/Jackett/JackettUpdater"; - // logger.Debug($"Giving execute permission to JackettUpdater from: {jackettUpdaterPath}"); - - // UnixFileInfo jackettUpdaterFI = new UnixFileInfo(jackettUpdaterPath) - // { - // FileAccessPermissions = FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.GroupRead | FileAccessPermissions.OtherRead - // }; - //} + string jackettUpdaterPath = tempDir + "/Jackett/JackettUpdater"; + filePermissionService.MakeFileExecutable(jackettUpdaterPath); + } } return tempDir; diff --git a/src/Jackett.Server/Jackett.Server.csproj b/src/Jackett.Server/Jackett.Server.csproj index d5a66a3b6..596bd97a7 100644 --- a/src/Jackett.Server/Jackett.Server.csproj +++ b/src/Jackett.Server/Jackett.Server.csproj @@ -22,6 +22,7 @@ + diff --git a/src/Jackett.Server/Services/FilePermissionService.cs b/src/Jackett.Server/Services/FilePermissionService.cs new file mode 100644 index 000000000..3b5ee07a5 --- /dev/null +++ b/src/Jackett.Server/Services/FilePermissionService.cs @@ -0,0 +1,41 @@ +using Jackett.Common.Services.Interfaces; +using NLog; +using System; +#if NETCOREAPP2_2 +using Mono.Unix; +#endif + +namespace Jackett.Server.Services +{ + public class FilePermissionService : IFilePermissionService + { + private Logger logger; + + public FilePermissionService(Logger l) + { + logger = l; + } + + public void MakeFileExecutable(string path) + { +#if NETCOREAPP2_2 + + //Calling the file permission service to limit usage to netcoreapp. The Mono.Posix.NETStandard library causes issues outside of .NET Core + //https://github.com/xamarin/XamarinComponents/issues/282 + + logger.Debug($"Attempting to give execute permission to: {path}"); + try + { + UnixFileInfo jackettUpdaterFI = new UnixFileInfo(path) + { + FileAccessPermissions = FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.GroupRead | FileAccessPermissions.OtherRead + }; + } + catch (Exception ex) + { + logger.Error(ex); + } +#endif + } + } +} diff --git a/src/Jackett.Server/Startup.cs b/src/Jackett.Server/Startup.cs index 17fb5506c..52b6259e6 100644 --- a/src/Jackett.Server/Startup.cs +++ b/src/Jackett.Server/Startup.cs @@ -83,6 +83,7 @@ namespace Jackett.Server builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); + builder.RegisterType().As().SingleInstance(); IContainer container = builder.Build(); Helper.ApplicationContainer = container; diff --git a/src/Jackett.Updater/Program.cs b/src/Jackett.Updater/Program.cs index 8d3f539ff..8aac956f3 100644 --- a/src/Jackett.Updater/Program.cs +++ b/src/Jackett.Updater/Program.cs @@ -377,6 +377,13 @@ namespace Jackett.Updater startInfo.FileName = "mono"; } + if (variant == Variants.JackettVariant.CoreMacOs || variant == Variants.JackettVariant.CoreLinuxAmdx64 + || variant == Variants.JackettVariant.CoreLinuxArm32 || variant == Variants.JackettVariant.CoreLinuxArm64) + { + startInfo.UseShellExecute = false; + startInfo.CreateNoWindow = true; + } + logger.Info("Starting Jackett: " + startInfo.FileName + " " + startInfo.Arguments); Process.Start(startInfo); }