diff options
| author | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-27 11:57:14 -0500 |
|---|---|---|
| committer | LukePulverenti <luke.pulverenti@gmail.com> | 2013-02-27 11:57:14 -0500 |
| commit | 6d5d291762c050e0f5598f45b837e45f270d600f (patch) | |
| tree | bb6d6fe204d7e9c8b6a9502b2604202cc7849c92 /MediaBrowser.Common.Implementations | |
| parent | ca7ee684730fe0d99a6160659c679c36a1646c88 (diff) | |
| parent | 1d51ede06056a54099616d0f52fdf8150c510e50 (diff) | |
Merge branch 'master' of https://github.com/MediaBrowser/MediaBrowser
Conflicts:
MediaBrowser.Common.Implementations/BaseApplicationHost.cs
MediaBrowser.ServerApplication/ApplicationHost.cs
Diffstat (limited to 'MediaBrowser.Common.Implementations')
3 files changed, 117 insertions, 3 deletions
diff --git a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs index 65d170382..811f3e92a 100644 --- a/MediaBrowser.Common.Implementations/BaseApplicationHost.cs +++ b/MediaBrowser.Common.Implementations/BaseApplicationHost.cs @@ -1,3 +1,4 @@ +<<<<<<< HEAD using MediaBrowser.Common.IO; using MediaBrowser.Common.Implementations.HttpServer; using MediaBrowser.Common.Implementations.Udp; @@ -6,6 +7,11 @@ using MediaBrowser.Common.Kernel; using MediaBrowser.Common.Net; using MediaBrowser.Common.ScheduledTasks; using MediaBrowser.Model.IO; +======= +using MediaBrowser.Common.Implementations.Updates; +using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Updates; +>>>>>>> c9f48fe0d0d5cf4aec62df1d1e97f629967aff6f using MediaBrowser.Model.Logging; using MediaBrowser.Model.MediaInfo; using MediaBrowser.Model.Serialization; @@ -45,6 +51,11 @@ namespace MediaBrowser.Common.Implementations protected readonly Container Container = new Container(); /// <summary> + /// The package manager + /// </summary> + protected readonly IPackageManager PackageManager = new PackageManager(); + + /// <summary> /// Gets assemblies that failed to load /// </summary> public List<string> FailedAssemblies { get; protected set; } diff --git a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj index 70d92edb5..a8dfe33cf 100644 --- a/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj +++ b/MediaBrowser.Common.Implementations/MediaBrowser.Common.Implementations.csproj @@ -129,6 +129,7 @@ <Compile Include="ServerManager\ServerManager.cs" /> <Compile Include="ServerManager\WebSocketConnection.cs" /> <Compile Include="Udp\UdpServer.cs" /> + <Compile Include="Updates\PackageManager.cs" /> <Compile Include="WebSocket\AlchemyServer.cs" /> <Compile Include="WebSocket\AlchemyWebSocket.cs" /> </ItemGroup> @@ -163,9 +164,7 @@ <Content Include="swagger-ui\swagger-ui.js" /> <Content Include="swagger-ui\swagger-ui.min.js" /> </ItemGroup> - <ItemGroup> - <Folder Include="Updates\" /> - </ItemGroup> + <ItemGroup /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(SolutionDir)\.nuget\nuget.targets" /> <PropertyGroup> diff --git a/MediaBrowser.Common.Implementations/Updates/PackageManager.cs b/MediaBrowser.Common.Implementations/Updates/PackageManager.cs new file mode 100644 index 000000000..a9335dce0 --- /dev/null +++ b/MediaBrowser.Common.Implementations/Updates/PackageManager.cs @@ -0,0 +1,104 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Threading; +using System.Threading.Tasks; +using MediaBrowser.Common.Kernel; +using MediaBrowser.Common.Net; +using MediaBrowser.Common.Security; +using MediaBrowser.Common.Updates; +using MediaBrowser.Model.IO; +using MediaBrowser.Model.Logging; +using MediaBrowser.Model.Serialization; +using MediaBrowser.Model.Updates; + +namespace MediaBrowser.Common.Implementations.Updates +{ + public class PackageManager : IPackageManager + { + public async Task<IEnumerable<PackageInfo>> GetAvailablePackages(IHttpClient client, + INetworkManager networkManager, + ISecurityManager securityManager, + ResourcePool resourcePool, + IJsonSerializer serializer, + CancellationToken cancellationToken) + { + var data = new Dictionary<string, string> { { "key", securityManager.SupporterKey }, { "mac", networkManager.GetMacAddress() } }; + + using (var json = await client.Post(Constants.Constants.MBAdminUrl + "service/package/retrieveall", data, resourcePool.Mb, cancellationToken).ConfigureAwait(false)) + { + cancellationToken.ThrowIfCancellationRequested(); + + var packages = serializer.DeserializeFromStream<List<PackageInfo>>(json).ToList(); + foreach (var package in packages) + { + package.versions = package.versions.Where(v => !string.IsNullOrWhiteSpace(v.sourceUrl)) + .OrderByDescending(v => v.version).ToList(); + } + + return packages; + } + + } + + public async Task InstallPackage(IHttpClient client, ILogger logger, ResourcePool resourcePool, IProgress<double> progress, IZipClient zipClient, IApplicationPaths appPaths, 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 isArchive = string.Equals(Path.GetExtension(package.sourceUrl), ".zip", StringComparison.OrdinalIgnoreCase); + var target = isArchive ? appPaths.ProgramDataPath : Path.Combine(appPaths.PluginsPath, package.targetFilename); + + // Download to temporary file so that, if interrupted, it won't destroy the existing installation + var tempFile = await client.GetTempFile(package.sourceUrl, resourcePool.Mb, cancellationToken, progress).ConfigureAwait(false); + + cancellationToken.ThrowIfCancellationRequested(); + + // Validate with a checksum + if (package.checksum != Guid.Empty) // support for legacy uploads for now + { + using (var crypto = new MD5CryptoServiceProvider()) + using (var stream = new BufferedStream(File.OpenRead(tempFile), 100000)) + { + var check = Guid.Parse(BitConverter.ToString(crypto.ComputeHash(stream)).Replace("-", String.Empty)); + if (check != package.checksum) + { + throw new ApplicationException(string.Format("Download validation failed for {0}. Probably corrupted during transfer.", package.name)); + } + } + } + + cancellationToken.ThrowIfCancellationRequested(); + + // Success - move it to the real target based on type + if (isArchive) + { + try + { + zipClient.ExtractAll(tempFile, target, true); + } + catch (IOException e) + { + logger.ErrorException("Error attempting to extract archive from {0} to {1}", e, tempFile, target); + throw; + } + + } + else + { + try + { + File.Copy(tempFile, target, true); + File.Delete(tempFile); + } + catch (IOException e) + { + logger.ErrorException("Error attempting to move file from {0} to {1}", e, tempFile, target); + throw; + } + } + + } + } +} |
