Make Mono.Posix usage conditional on .NET Core

This commit is contained in:
flightlevel 2019-03-06 21:16:20 +11:00
parent a5f0e2b5db
commit a25f2016dc
7 changed files with 71 additions and 23 deletions

View File

@ -19,7 +19,6 @@
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
<PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
<PackageReference Include="MimeMapping" Version="1.0.1.12" />
<!--<PackageReference Include="Mono.Posix.NETStandard" Version="1.0.0" />-->
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
<PackageReference Include="NLog" Version="4.5.11" />
<PackageReference Include="SharpZipLib" Version="1.1.0" />

View File

@ -0,0 +1,7 @@
namespace Jackett.Common.Services.Interfaces
{
public interface IFilePermissionService
{
void MakeFileExecutable(string path);
}
}

View File

@ -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;

View File

@ -22,6 +22,7 @@
<!-- Conditionally obtain references for the .NET Core App 2.2 target -->
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp2.2' ">
<PackageReference Include="Mono.Posix.NETStandard" Version="1.0.0" />
<PackageReference Include="System.Security.Cryptography.ProtectedData" Version="4.5.0" />
</ItemGroup>

View File

@ -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
}
}
}

View File

@ -83,6 +83,7 @@ namespace Jackett.Server
builder.RegisterType<ServerService>().As<IServerService>().SingleInstance();
builder.RegisterType<ProtectionService>().As<IProtectionService>().SingleInstance();
builder.RegisterType<ServiceConfigService>().As<IServiceConfigService>().SingleInstance();
builder.RegisterType<FilePermissionService>().As<IFilePermissionService>().SingleInstance();
IContainer container = builder.Build();
Helper.ApplicationContainer = container;

View File

@ -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);
}