mirror of
https://github.com/Kareadita/Kavita.git
synced 2025-07-09 03:04:19 -04:00
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:
parent
57a6c769bc
commit
be5b5d9251
@ -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(','))
|
||||||
{
|
{
|
||||||
|
@ -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>
|
||||||
|
@ -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; });
|
||||||
}
|
}
|
||||||
|
@ -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),
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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"]
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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": [
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user