aboutsummaryrefslogtreecommitdiff
path: root/Emby.Server.Implementations/Updates/InstallationManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Server.Implementations/Updates/InstallationManager.cs')
-rw-r--r--Emby.Server.Implementations/Updates/InstallationManager.cs131
1 files changed, 46 insertions, 85 deletions
diff --git a/Emby.Server.Implementations/Updates/InstallationManager.cs b/Emby.Server.Implementations/Updates/InstallationManager.cs
index 51acfee88..435bcfd04 100644
--- a/Emby.Server.Implementations/Updates/InstallationManager.cs
+++ b/Emby.Server.Implementations/Updates/InstallationManager.cs
@@ -19,6 +19,7 @@ using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Updates;
+using MediaBrowser.Controller.Configuration;
namespace Emby.Server.Implementations.Updates
{
@@ -111,7 +112,7 @@ namespace Emby.Server.Implementations.Updates
private readonly IHttpClient _httpClient;
private readonly IJsonSerializer _jsonSerializer;
private readonly ISecurityManager _securityManager;
- private readonly IConfigurationManager _config;
+ private readonly IServerConfigurationManager _config;
private readonly IFileSystem _fileSystem;
/// <summary>
@@ -125,7 +126,7 @@ namespace Emby.Server.Implementations.Updates
// netframework or netcore
private readonly string _packageRuntime;
- public InstallationManager(ILogger logger, IApplicationHost appHost, IApplicationPaths appPaths, IHttpClient httpClient, IJsonSerializer jsonSerializer, ISecurityManager securityManager, IConfigurationManager config, IFileSystem fileSystem, ICryptoProvider cryptographyProvider, string packageRuntime)
+ public InstallationManager(ILogger logger, IApplicationHost appHost, IApplicationPaths appPaths, IHttpClient httpClient, IJsonSerializer jsonSerializer, ISecurityManager securityManager, IServerConfigurationManager config, IFileSystem fileSystem, ICryptoProvider cryptographyProvider, string packageRuntime)
{
if (logger == null)
{
@@ -189,7 +190,7 @@ namespace Emby.Server.Implementations.Updates
{
cancellationToken.ThrowIfCancellationRequested();
- var packages = _jsonSerializer.DeserializeFromStream<PackageInfo[]>(json);
+ var packages = await _jsonSerializer.DeserializeFromStreamAsync<PackageInfo[]>(json).ConfigureAwait(false);
return FilterPackages(packages, packageType, applicationVersion);
}
@@ -203,8 +204,6 @@ namespace Emby.Server.Implementations.Updates
}
}
- private DateTime _lastPackageUpdateTime;
-
/// <summary>
/// Gets all available packages.
/// </summary>
@@ -212,77 +211,21 @@ namespace Emby.Server.Implementations.Updates
/// <returns>Task{List{PackageInfo}}.</returns>
public async Task<List<PackageInfo>> GetAvailablePackagesWithoutRegistrationInfo(CancellationToken cancellationToken)
{
- _logger.Info("Opening {0}", PackageCachePath);
- try
- {
- using (var stream = _fileSystem.OpenRead(PackageCachePath))
- {
- var packages = _jsonSerializer.DeserializeFromStream<PackageInfo[]>(stream);
-
- if (DateTime.UtcNow - _lastPackageUpdateTime > GetCacheLength())
- {
- UpdateCachedPackages(CancellationToken.None, false);
- }
-
- return FilterPackages(packages);
- }
- }
- catch (Exception)
- {
-
- }
-
- _lastPackageUpdateTime = DateTime.MinValue;
- await UpdateCachedPackages(cancellationToken, true).ConfigureAwait(false);
- using (var stream = _fileSystem.OpenRead(PackageCachePath))
- {
- return FilterPackages(_jsonSerializer.DeserializeFromStream<PackageInfo[]>(stream));
- }
- }
-
- private string PackageCachePath
- {
- get { return Path.Combine(_appPaths.CachePath, "serverpackages.json"); }
- }
-
- private readonly SemaphoreSlim _updateSemaphore = new SemaphoreSlim(1, 1);
- private async Task UpdateCachedPackages(CancellationToken cancellationToken, bool throwErrors)
- {
- await _updateSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
-
- try
+ using (var response = await _httpClient.SendAsync(new HttpRequestOptions
{
- if (DateTime.UtcNow - _lastPackageUpdateTime < GetCacheLength())
- {
- return;
- }
-
- var tempFile = await _httpClient.GetTempFile(new HttpRequestOptions
- {
- Url = "https://www.mb3admin.com/admin/service/EmbyPackages.json",
- CancellationToken = cancellationToken,
- Progress = new SimpleProgress<Double>()
-
- }).ConfigureAwait(false);
-
- _fileSystem.CreateDirectory(_fileSystem.GetDirectoryName(PackageCachePath));
+ Url = "https://www.mb3admin.com/admin/service/EmbyPackages.json",
+ CancellationToken = cancellationToken,
+ Progress = new SimpleProgress<Double>(),
+ CacheLength = GetCacheLength(),
+ CacheMode = CacheMode.Unconditional
- _fileSystem.CopyFile(tempFile, PackageCachePath, true);
- _lastPackageUpdateTime = DateTime.UtcNow;
- }
- catch (Exception ex)
+ }, "GET").ConfigureAwait(false))
{
- _logger.ErrorException("Error updating package cache", ex);
-
- if (throwErrors)
+ using (var stream = response.Content)
{
- throw;
+ return FilterPackages(await _jsonSerializer.DeserializeFromStreamAsync<PackageInfo[]>(stream).ConfigureAwait(false));
}
}
- finally
- {
- _updateSemaphore.Release();
- }
}
private PackageVersionClass GetSystemUpdateLevel()
@@ -304,12 +247,12 @@ namespace Emby.Server.Implementations.Updates
var versions = new List<PackageVersionInfo>();
foreach (var version in package.versions)
{
- if (string.IsNullOrWhiteSpace(version.sourceUrl))
+ if (string.IsNullOrEmpty(version.sourceUrl))
{
continue;
}
- if (string.IsNullOrWhiteSpace(version.runtimes) || version.runtimes.IndexOf(_packageRuntime, StringComparison.OrdinalIgnoreCase) == -1)
+ if (string.IsNullOrEmpty(version.runtimes) || version.runtimes.IndexOf(_packageRuntime, StringComparison.OrdinalIgnoreCase) == -1)
{
continue;
}
@@ -339,7 +282,7 @@ namespace Emby.Server.Implementations.Updates
var returnList = new List<PackageInfo>();
- var filterOnPackageType = !string.IsNullOrWhiteSpace(packageType);
+ var filterOnPackageType = !string.IsNullOrEmpty(packageType);
foreach (var p in packagesList)
{
@@ -465,7 +408,7 @@ namespace Emby.Server.Implementations.Updates
return latestPluginInfo != null && GetPackageVersion(latestPluginInfo) > p.Version ? latestPluginInfo : null;
}).Where(i => i != null)
- .Where(p => !string.IsNullOrWhiteSpace(p.sourceUrl) && !CompletedInstallations.Any(i => string.Equals(i.AssemblyGuid, p.guid, StringComparison.OrdinalIgnoreCase)));
+ .Where(p => !string.IsNullOrEmpty(p.sourceUrl) && !CompletedInstallations.Any(i => string.Equals(i.AssemblyGuid, p.guid, StringComparison.OrdinalIgnoreCase)));
}
/// <summary>
@@ -491,7 +434,7 @@ namespace Emby.Server.Implementations.Updates
var installationInfo = new InstallationInfo
{
- Id = Guid.NewGuid().ToString("N"),
+ Id = Guid.NewGuid(),
Name = package.name,
AssemblyGuid = package.guid,
UpdateClass = package.classification,
@@ -575,7 +518,6 @@ namespace Emby.Server.Implementations.Updates
finally
{
// Dispose the progress object and remove the installation from the in-progress list
- innerProgress.Dispose();
tuple.Item2.Dispose();
}
}
@@ -590,16 +532,23 @@ namespace Emby.Server.Implementations.Updates
/// <returns>Task.</returns>
private async Task InstallPackageInternal(PackageVersionInfo package, bool isPlugin, IProgress<double> progress, CancellationToken cancellationToken)
{
- // Do the install
- await PerformPackageInstallation(progress, package, cancellationToken).ConfigureAwait(false);
+ IPlugin plugin = null;
- // Do plugin-specific processing
if (isPlugin)
{
// Set last update time if we were installed before
- var plugin = _applicationHost.Plugins.FirstOrDefault(p => string.Equals(p.Id.ToString(), package.guid, StringComparison.OrdinalIgnoreCase))
- ?? _applicationHost.Plugins.FirstOrDefault(p => p.Name.Equals(package.name, StringComparison.OrdinalIgnoreCase));
+ plugin = _applicationHost.Plugins.FirstOrDefault(p => string.Equals(p.Id.ToString(), package.guid, StringComparison.OrdinalIgnoreCase))
+ ?? _applicationHost.Plugins.FirstOrDefault(p => p.Name.Equals(package.name, StringComparison.OrdinalIgnoreCase));
+ }
+
+ string targetPath = plugin == null ? null : plugin.AssemblyFilePath;
+
+ // Do the install
+ await PerformPackageInstallation(progress, targetPath, package, cancellationToken).ConfigureAwait(false);
+ // Do plugin-specific processing
+ if (isPlugin)
+ {
if (plugin != null)
{
OnPluginUpdated(plugin, package);
@@ -611,13 +560,17 @@ namespace Emby.Server.Implementations.Updates
}
}
- private async Task PerformPackageInstallation(IProgress<double> progress, PackageVersionInfo package, CancellationToken cancellationToken)
+ private async Task PerformPackageInstallation(IProgress<double> progress, string target, PackageVersionInfo package, CancellationToken cancellationToken)
{
// Target based on if it is an archive or single assembly
// zip archives are assumed to contain directory structures relative to our ProgramDataPath
var extension = Path.GetExtension(package.targetFilename);
var isArchive = string.Equals(extension, ".zip", StringComparison.OrdinalIgnoreCase) || string.Equals(extension, ".rar", StringComparison.OrdinalIgnoreCase) || string.Equals(extension, ".7z", StringComparison.OrdinalIgnoreCase);
- var target = Path.Combine(isArchive ? _appPaths.TempUpdatePath : _appPaths.PluginsPath, package.targetFilename);
+
+ if (target == null)
+ {
+ target = Path.Combine(isArchive ? _appPaths.TempUpdatePath : _appPaths.PluginsPath, package.targetFilename);
+ }
// Download to temporary file so that, if interrupted, it won't destroy the existing installation
var tempFile = await _httpClient.GetTempFile(new HttpRequestOptions
@@ -632,7 +585,7 @@ namespace Emby.Server.Implementations.Updates
// Validate with a checksum
var packageChecksum = string.IsNullOrWhiteSpace(package.checksum) ? Guid.Empty : new Guid(package.checksum);
- if (packageChecksum != Guid.Empty) // support for legacy uploads for now
+ if (!packageChecksum.Equals(Guid.Empty)) // support for legacy uploads for now
{
using (var stream = _fileSystem.OpenRead(tempFile))
{
@@ -700,6 +653,15 @@ namespace Emby.Server.Implementations.Updates
_fileSystem.DeleteFile(path);
+ var list = _config.Configuration.UninstalledPlugins.ToList();
+ var filename = Path.GetFileName(path);
+ if (!list.Contains(filename, StringComparer.OrdinalIgnoreCase))
+ {
+ list.Add(filename);
+ _config.Configuration.UninstalledPlugins = list.ToArray();
+ _config.SaveConfiguration();
+ }
+
OnPluginUninstalled(plugin);
_applicationHost.NotifyPendingRestart();
@@ -728,7 +690,6 @@ namespace Emby.Server.Implementations.Updates
public void Dispose()
{
Dispose(true);
- GC.SuppressFinalize(this);
}
}
}