diff options
Diffstat (limited to 'Emby.Server.Implementations/Updates/InstallationManager.cs')
| -rw-r--r-- | Emby.Server.Implementations/Updates/InstallationManager.cs | 131 |
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); } } } |
