aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/ApplicationHost.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/ApplicationHost.cs')
-rw-r--r--Emby.Server.Implementations/ApplicationHost.cs123
1 files changed, 104 insertions, 19 deletions
diff --git a/Emby.Server.Implementations/ApplicationHost.cs b/Emby.Server.Implementations/ApplicationHost.cs
index fc1b2eda8..41ca2a102 100644
--- a/Emby.Server.Implementations/ApplicationHost.cs
+++ b/Emby.Server.Implementations/ApplicationHost.cs
@@ -173,11 +173,17 @@ namespace Emby.Server.Implementations
/// <value>The logger.</value>
protected ILogger Logger { get; set; }
+ private IPlugin[] _plugins;
+
/// <summary>
/// Gets the plugins.
/// </summary>
/// <value>The plugins.</value>
- public IPlugin[] Plugins { get; protected set; }
+ public IPlugin[] Plugins
+ {
+ get => _plugins;
+ protected set => _plugins = value;
+ }
/// <summary>
/// Gets or sets the logger factory.
@@ -200,7 +206,7 @@ namespace Emby.Server.Implementations
/// <summary>
/// The disposable parts
/// </summary>
- protected readonly List<IDisposable> _disposableParts = new List<IDisposable>();
+ private readonly List<IDisposable> _disposableParts = new List<IDisposable>();
/// <summary>
/// Gets the configuration manager.
@@ -216,8 +222,9 @@ namespace Emby.Server.Implementations
{
#if BETA
return PackageVersionClass.Beta;
-#endif
+#else
return PackageVersionClass.Release;
+#endif
}
}
@@ -340,7 +347,6 @@ namespace Emby.Server.Implementations
protected IProcessFactory ProcessFactory { get; private set; }
- protected ICryptoProvider CryptographyProvider = new CryptographyProvider();
protected readonly IXmlSerializer XmlSerializer;
protected ISocketFactory SocketFactory { get; private set; }
@@ -369,9 +375,6 @@ namespace Emby.Server.Implementations
{
_configuration = configuration;
- // hack alert, until common can target .net core
- BaseExtensions.CryptographyProvider = CryptographyProvider;
-
XmlSerializer = new MyXmlSerializer(fileSystem, loggerFactory);
NetworkManager = networkManager;
@@ -735,13 +738,12 @@ namespace Emby.Server.Implementations
ApplicationHost.StreamHelper = new StreamHelper();
serviceCollection.AddSingleton(StreamHelper);
- serviceCollection.AddSingleton(CryptographyProvider);
+ serviceCollection.AddSingleton(typeof(ICryptoProvider), typeof(CryptographyProvider));
SocketFactory = new SocketFactory();
serviceCollection.AddSingleton(SocketFactory);
- InstallationManager = new InstallationManager(LoggerFactory, this, ApplicationPaths, HttpClient, JsonSerializer, ServerConfigurationManager, FileSystemManager, CryptographyProvider, ZipClient, PackageRuntime);
- serviceCollection.AddSingleton(InstallationManager);
+ serviceCollection.AddSingleton(typeof(IInstallationManager), typeof(InstallationManager));
ZipClient = new ZipClient();
serviceCollection.AddSingleton(ZipClient);
@@ -908,8 +910,6 @@ namespace Emby.Server.Implementations
_serviceProvider = serviceCollection.BuildServiceProvider();
}
- public virtual string PackageRuntime => "netcore";
-
public static void LogEnvironmentInfo(ILogger logger, IApplicationPaths appPaths)
{
// Distinct these to prevent users from reporting problems that aren't actually problems
@@ -1044,11 +1044,47 @@ namespace Emby.Server.Implementations
AuthenticatedAttribute.AuthService = AuthService;
}
+ private async void PluginInstalled(object sender, GenericEventArgs<PackageVersionInfo> args)
+ {
+ string dir = Path.Combine(ApplicationPaths.PluginsPath, Path.GetFileNameWithoutExtension(args.Argument.targetFilename));
+ var types = Directory.EnumerateFiles(dir, "*.dll", SearchOption.TopDirectoryOnly)
+ .Select(x => Assembly.LoadFrom(x))
+ .SelectMany(x => x.ExportedTypes)
+ .Where(x => x.IsClass && !x.IsAbstract && !x.IsInterface && !x.IsGenericType)
+ .ToList();
+
+ types.AddRange(types);
+
+ var plugins = types.Where(x => x.IsAssignableFrom(typeof(IPlugin)))
+ .Select(CreateInstanceSafe)
+ .Where(x => x != null)
+ .Cast<IPlugin>()
+ .Select(LoadPlugin)
+ .Where(x => x != null)
+ .ToArray();
+
+ int oldLen = _plugins.Length;
+ Array.Resize<IPlugin>(ref _plugins, _plugins.Length + plugins.Length);
+ plugins.CopyTo(_plugins, oldLen);
+
+ var entries = types.Where(x => x.IsAssignableFrom(typeof(IServerEntryPoint)))
+ .Select(CreateInstanceSafe)
+ .Where(x => x != null)
+ .Cast<IServerEntryPoint>()
+ .ToList();
+
+ await Task.WhenAll(StartEntryPoints(entries, true));
+ await Task.WhenAll(StartEntryPoints(entries, false));
+ }
+
/// <summary>
/// Finds the parts.
/// </summary>
protected void FindParts()
{
+ InstallationManager = _serviceProvider.GetService<IInstallationManager>();
+ InstallationManager.PluginInstalled += PluginInstalled;
+
if (!ServerConfigurationManager.Configuration.IsPortAuthorized)
{
ServerConfigurationManager.Configuration.IsPortAuthorized = true;
@@ -1372,7 +1408,17 @@ namespace Emby.Server.Implementations
public async Task<SystemInfo> GetSystemInfo(CancellationToken cancellationToken)
{
var localAddress = await GetLocalApiUrl(cancellationToken).ConfigureAwait(false);
- var wanAddress = await GetWanApiUrl(cancellationToken).ConfigureAwait(false);
+
+ string wanAddress;
+
+ if (string.IsNullOrEmpty(ServerConfigurationManager.Configuration.WanDdns))
+ {
+ wanAddress = await GetWanApiUrlFromExternal(cancellationToken).ConfigureAwait(false);
+ }
+ else
+ {
+ wanAddress = GetWanApiUrl(ServerConfigurationManager.Configuration.WanDdns);
+ }
return new SystemInfo
{
@@ -1421,8 +1467,18 @@ namespace Emby.Server.Implementations
public async Task<PublicSystemInfo> GetPublicSystemInfo(CancellationToken cancellationToken)
{
- var localAddress = await GetLocalApiUrl(cancellationToken).ConfigureAwait(false);
- var wanAddress = await GetWanApiUrl(cancellationToken).ConfigureAwait(false);
+ var localAddress = await GetLocalApiUrl(cancellationToken).ConfigureAwait(false);
+
+ string wanAddress;
+
+ if (string.IsNullOrEmpty(ServerConfigurationManager.Configuration.WanDdns))
+ {
+ wanAddress = await GetWanApiUrlFromExternal(cancellationToken).ConfigureAwait(false);
+ }
+ else
+ {
+ wanAddress = GetWanApiUrl(ServerConfigurationManager.Configuration.WanDdns);
+ }
return new PublicSystemInfo
{
Version = ApplicationVersion,
@@ -1460,7 +1516,7 @@ namespace Emby.Server.Implementations
return null;
}
- public async Task<string> GetWanApiUrl(CancellationToken cancellationToken)
+ public async Task<string> GetWanApiUrlFromExternal(CancellationToken cancellationToken)
{
const string Url = "http://ipv4.icanhazip.com";
try
@@ -1476,7 +1532,7 @@ namespace Emby.Server.Implementations
CancellationToken = cancellationToken
}).ConfigureAwait(false))
{
- return GetLocalApiUrl(response.ReadToEnd().Trim());
+ return GetWanApiUrl(response.ReadToEnd().Trim());
}
}
catch (Exception ex)
@@ -1498,11 +1554,40 @@ namespace Emby.Server.Implementations
public string GetLocalApiUrl(string host)
{
+ if (EnableHttps)
+ {
+ return string.Format("https://{0}:{1}",
+ host,
+ HttpsPort.ToString(CultureInfo.InvariantCulture));
+ }
return string.Format("http://{0}:{1}",
- host,
- HttpPort.ToString(CultureInfo.InvariantCulture));
+ host,
+ HttpPort.ToString(CultureInfo.InvariantCulture));
}
+ public string GetWanApiUrl(IpAddressInfo ipAddress)
+ {
+ if (ipAddress.AddressFamily == IpAddressFamily.InterNetworkV6)
+ {
+ return GetWanApiUrl("[" + ipAddress.Address + "]");
+ }
+
+ return GetWanApiUrl(ipAddress.Address);
+ }
+
+ public string GetWanApiUrl(string host)
+ {
+ if (EnableHttps)
+ {
+ return string.Format("https://{0}:{1}",
+ host,
+ ServerConfigurationManager.Configuration.PublicHttpsPort.ToString(CultureInfo.InvariantCulture));
+ }
+ return string.Format("http://{0}:{1}",
+ host,
+ ServerConfigurationManager.Configuration.PublicPort.ToString(CultureInfo.InvariantCulture));
+ }
+
public Task<List<IpAddressInfo>> GetLocalIpAddresses(CancellationToken cancellationToken)
{
return GetLocalIpAddressesInternal(true, 0, cancellationToken);