Changed IsDocker check (#1998)

* Refactored IsDocker to be completely static and changed to use an environment variable instead.

* Removed file from another branch
This commit is contained in:
Joe Milazzo 2023-05-15 17:57:57 -05:00 committed by GitHub
parent 57a6c769bc
commit be5b5d9251
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 20 additions and 77 deletions

View File

@ -15,6 +15,7 @@ using API.Services.Tasks.Scanner;
using AutoMapper; using AutoMapper;
using Flurl.Http; using Flurl.Http;
using Kavita.Common; using Kavita.Common;
using Kavita.Common.EnvironmentInfo;
using Kavita.Common.Extensions; using Kavita.Common.Extensions;
using Kavita.Common.Helpers; using Kavita.Common.Helpers;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
@ -183,6 +184,7 @@ public class SettingsController : BaseApiController
if (setting.Key == ServerSettingKey.Port && updateSettingsDto.Port + string.Empty != setting.Value) if (setting.Key == ServerSettingKey.Port && updateSettingsDto.Port + string.Empty != setting.Value)
{ {
if (OsInfo.IsDocker) break;
setting.Value = updateSettingsDto.Port + string.Empty; setting.Value = updateSettingsDto.Port + string.Empty;
// Port is managed in appSetting.json // Port is managed in appSetting.json
Configuration.Port = updateSettingsDto.Port; Configuration.Port = updateSettingsDto.Port;
@ -191,6 +193,7 @@ public class SettingsController : BaseApiController
if (setting.Key == ServerSettingKey.IpAddresses && updateSettingsDto.IpAddresses != setting.Value) if (setting.Key == ServerSettingKey.IpAddresses && updateSettingsDto.IpAddresses != setting.Value)
{ {
if (OsInfo.IsDocker) break;
// Validate IP addresses // Validate IP addresses
foreach (var ipAddress in updateSettingsDto.IpAddresses.Split(',')) foreach (var ipAddress in updateSettingsDto.IpAddresses.Split(','))
{ {

View File

@ -5,6 +5,7 @@ namespace API.DTOs.Settings;
public class ServerSettingDto public class ServerSettingDto
{ {
public string CacheDirectory { get; set; } = default!; public string CacheDirectory { get; set; } = default!;
public string TaskScan { get; set; } = default!; public string TaskScan { get; set; } = default!;
/// <summary> /// <summary>

View File

@ -174,7 +174,7 @@ public class Program
webBuilder.UseKestrel((opts) => webBuilder.UseKestrel((opts) =>
{ {
var ipAddresses = Configuration.IpAddresses; var ipAddresses = Configuration.IpAddresses;
if (new OsInfo().IsDocker || string.IsNullOrEmpty(ipAddresses) || ipAddresses.Equals(Configuration.DefaultIpAddresses)) if (OsInfo.IsDocker || string.IsNullOrEmpty(ipAddresses) || ipAddresses.Equals(Configuration.DefaultIpAddresses))
{ {
opts.ListenAnyIP(HttpPort, options => { options.Protocols = HttpProtocols.Http1AndHttp2; }); opts.ListenAnyIP(HttpPort, options => { options.Protocols = HttpProtocols.Http1AndHttp2; });
} }

View File

@ -119,7 +119,7 @@ public class StatsService : IStatsService
Os = RuntimeInformation.OSDescription, Os = RuntimeInformation.OSDescription,
KavitaVersion = serverSettings.InstallVersion, KavitaVersion = serverSettings.InstallVersion,
DotnetVersion = Environment.Version.ToString(), DotnetVersion = Environment.Version.ToString(),
IsDocker = new OsInfo().IsDocker, IsDocker = OsInfo.IsDocker,
NumOfCores = Math.Max(Environment.ProcessorCount, 1), NumOfCores = Math.Max(Environment.ProcessorCount, 1),
UsersWithEmulateComicBook = await _context.AppUserPreferences.CountAsync(p => p.EmulateBook), UsersWithEmulateComicBook = await _context.AppUserPreferences.CountAsync(p => p.EmulateBook),
TotalReadingHours = await _statisticService.TimeSpentReadingForUsersAsync(ArraySegment<int>.Empty, ArraySegment<int>.Empty), TotalReadingHours = await _statisticService.TimeSpentReadingForUsersAsync(ArraySegment<int>.Empty, ArraySegment<int>.Empty),

View File

@ -100,7 +100,7 @@ public class VersionUpdaterService : IVersionUpdaterService
UpdateBody = _markdown.Transform(update.Body.Trim()), UpdateBody = _markdown.Transform(update.Body.Trim()),
UpdateTitle = update.Name, UpdateTitle = update.Name,
UpdateUrl = update.Html_Url, UpdateUrl = update.Html_Url,
IsDocker = new OsInfo(Array.Empty<IOsVersionAdapter>()).IsDocker, IsDocker = OsInfo.IsDocker,
PublishDate = update.Published_At PublishDate = update.Published_At
}; };
} }

View File

@ -415,7 +415,9 @@ public class Startup
} }
catch (Exception ex) catch (Exception ex)
{ {
if ((ex.Message.Contains("Permission denied") || ex.Message.Contains("UnauthorizedAccessException")) && baseUrl.Equals(Configuration.DefaultBaseUrl) && new OsInfo().IsDocker) if ((ex.Message.Contains("Permission denied")
|| ex.Message.Contains("UnauthorizedAccessException"))
&& baseUrl.Equals(Configuration.DefaultBaseUrl) && OsInfo.IsDocker)
{ {
// Swallow the exception as the install is non-root and Docker // Swallow the exception as the install is non-root and Docker
return; return;

View File

@ -32,5 +32,7 @@ WORKDIR /kavita
HEALTHCHECK --interval=30s --timeout=15s --start-period=30s --retries=3 CMD curl --fail http://localhost:5000/api/health || exit 1 HEALTHCHECK --interval=30s --timeout=15s --start-period=30s --retries=3 CMD curl --fail http://localhost:5000/api/health || exit 1
ENV DOTNET_RUNNING_IN_CONTAINER=true
ENTRYPOINT [ "/bin/bash" ] ENTRYPOINT [ "/bin/bash" ]
CMD ["/entrypoint.sh"] CMD ["/entrypoint.sh"]

View File

@ -113,7 +113,7 @@ public static class Configuration
private static void SetPort(string filePath, int port) private static void SetPort(string filePath, int port)
{ {
if (new OsInfo(Array.Empty<IOsVersionAdapter>()).IsDocker) if (OsInfo.IsDocker)
{ {
return; return;
} }
@ -135,7 +135,7 @@ public static class Configuration
private static int GetPort(string filePath) private static int GetPort(string filePath)
{ {
const int defaultPort = 5000; const int defaultPort = 5000;
if (new OsInfo(Array.Empty<IOsVersionAdapter>()).IsDocker) if (OsInfo.IsDocker)
{ {
return defaultPort; return defaultPort;
} }
@ -165,7 +165,7 @@ public static class Configuration
private static void SetIpAddresses(string filePath, string ipAddresses) private static void SetIpAddresses(string filePath, string ipAddresses)
{ {
if (new OsInfo(Array.Empty<IOsVersionAdapter>()).IsDocker) if (OsInfo.IsDocker)
{ {
return; return;
} }
@ -186,7 +186,7 @@ public static class Configuration
private static string GetIpAddresses(string filePath) private static string GetIpAddresses(string filePath)
{ {
if (new OsInfo(Array.Empty<IOsVersionAdapter>()).IsDocker) if (OsInfo.IsDocker)
{ {
return string.Empty; return string.Empty;
} }
@ -276,7 +276,7 @@ public static class Configuration
#region XFrameOrigins #region XFrameOrigins
private static string GetXFrameOptions(string filePath) private static string GetXFrameOptions(string filePath)
{ {
if (new OsInfo(Array.Empty<IOsVersionAdapter>()).IsDocker) if (OsInfo.IsDocker)
{ {
return DefaultBaseUrl; return DefaultBaseUrl;
} }

View File

@ -6,21 +6,14 @@ using System.Linq;
namespace Kavita.Common.EnvironmentInfo; namespace Kavita.Common.EnvironmentInfo;
public class OsInfo : IOsInfo public static class OsInfo
{ {
public static Os Os { get; } public static Os Os { get; }
public static bool IsNotWindows => !IsWindows; public static bool IsNotWindows => !IsWindows;
public static bool IsLinux => Os is Os.Linux or Os.LinuxMusl or Os.Bsd; public static bool IsLinux => Os is Os.Linux or Os.LinuxMusl or Os.Bsd;
public static bool IsOsx => Os == Os.Osx; public static bool IsOsx => Os == Os.Osx;
public static bool IsWindows => Os == Os.Windows; public static bool IsWindows => Os == Os.Windows;
public static bool IsDocker => Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER") == "true";
// this needs to not be static so we can mock it
public bool IsDocker { get; private set; }
public string Version { get; }
public string Name { get; }
public string FullName { get; }
static OsInfo() static OsInfo()
{ {
@ -43,56 +36,6 @@ public class OsInfo : IOsInfo
} }
} }
public OsInfo(IEnumerable<IOsVersionAdapter> versionAdapters)
{
OsVersionModel osInfo = null;
foreach (var osVersionAdapter in versionAdapters.Where(c => c.Enabled))
{
try
{
osInfo = osVersionAdapter.Read();
}
catch (Exception e)
{
Console.WriteLine("Couldn't get OS Version info: " + e.Message);
}
if (osInfo != null)
{
break;
}
}
if (osInfo != null)
{
Name = osInfo.Name;
Version = osInfo.Version;
FullName = osInfo.FullName;
}
else
{
Name = Os.ToString();
FullName = Name;
}
if (IsLinux && File.Exists("/proc/1/cgroup") && File.ReadAllText("/proc/1/cgroup").Contains("/docker/"))
{
IsDocker = true;
}
}
public OsInfo()
{
Name = Os.ToString();
FullName = Name;
if (IsLinux && File.Exists("/proc/1/cgroup") && File.ReadAllText("/proc/1/cgroup").Contains("/docker/"))
{
IsDocker = true;
}
}
private static Os GetPosixFlavour() private static Os GetPosixFlavour()
{ {
var output = RunAndCapture("uname", "-s"); var output = RunAndCapture("uname", "-s");
@ -139,14 +82,6 @@ public class OsInfo : IOsInfo
} }
} }
public interface IOsInfo
{
string Version { get; }
string Name { get; }
string FullName { get; }
bool IsDocker { get; }
}
public enum Os public enum Os
{ {

View File

@ -7,7 +7,7 @@
"name": "GPL-3.0", "name": "GPL-3.0",
"url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE" "url": "https://github.com/Kareadita/Kavita/blob/develop/LICENSE"
}, },
"version": "0.7.2.8" "version": "0.7.2.10"
}, },
"servers": [ "servers": [
{ {