LukePulverenti 12 years ago
commit 56a7fd6f23

@ -43,12 +43,12 @@ namespace MediaBrowser.Common.Implementations.Updates
} }
public async Task InstallPackage(IHttpClient client, ILogger logger, ResourcePool resourcePool, IProgress<double> progress, IZipClient zipClient, IApplicationPaths appPaths, PackageVersionInfo package, CancellationToken cancellationToken) public async Task InstallPackage(IHttpClient client, ILogger logger, ResourcePool resourcePool, IProgress<double> progress, IApplicationPaths appPaths, PackageVersionInfo package, CancellationToken cancellationToken)
{ {
// Target based on if it is an archive or single assembly // Target based on if it is an archive or single assembly
// zip archives are assumed to contain directory structures relative to our ProgramDataPath // zip archives are assumed to contain directory structures relative to our ProgramDataPath
var isArchive = string.Equals(Path.GetExtension(package.targetFilename), ".zip", StringComparison.OrdinalIgnoreCase); var isArchive = string.Equals(Path.GetExtension(package.targetFilename), ".zip", StringComparison.OrdinalIgnoreCase);
var target = isArchive ? appPaths.TempUpdatePath : Path.Combine(appPaths.PluginsPath, package.targetFilename); var 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 // 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); var tempFile = await client.GetTempFile(package.sourceUrl, resourcePool.Mb, cancellationToken, progress).ConfigureAwait(false);
@ -71,32 +71,16 @@ namespace MediaBrowser.Common.Implementations.Updates
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
// Success - move it to the real target based on type // Success - move it to the real target
if (isArchive) try
{ {
try File.Copy(tempFile, target, true);
{ File.Delete(tempFile);
zipClient.ExtractAll(tempFile, target, true);
}
catch (IOException e)
{
logger.ErrorException("Error attempting to extract archive from {0} to {1}", e, tempFile, target);
throw;
}
} }
else catch (IOException e)
{ {
try logger.ErrorException("Error attempting to move file from {0} to {1}", e, tempFile, target);
{ throw;
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;
}
} }
} }

@ -40,7 +40,6 @@ namespace MediaBrowser.Common.Updates
/// <param name="logger"></param> /// <param name="logger"></param>
/// <param name="resourcePool"></param> /// <param name="resourcePool"></param>
/// <param name="progress"></param> /// <param name="progress"></param>
/// <param name="zipClient"></param>
/// <param name="appPaths"></param> /// <param name="appPaths"></param>
/// <param name="package">The package.</param> /// <param name="package">The package.</param>
/// <param name="cancellationToken">The cancellation token.</param> /// <param name="cancellationToken">The cancellation token.</param>
@ -49,7 +48,6 @@ namespace MediaBrowser.Common.Updates
ILogger logger, ILogger logger,
ResourcePool resourcePool, ResourcePool resourcePool,
IProgress<double> progress, IProgress<double> progress,
IZipClient zipClient,
IApplicationPaths appPaths, IApplicationPaths appPaths,
PackageVersionInfo package, PackageVersionInfo package,
CancellationToken cancellationToken); CancellationToken cancellationToken);

@ -93,12 +93,6 @@ namespace MediaBrowser.Controller.Updates
} }
#endregion #endregion
/// <summary>
/// Gets or sets the zip client.
/// </summary>
/// <value>The zip client.</value>
private IZipClient ZipClient { get; set; }
/// <summary> /// <summary>
/// The _logger /// The _logger
/// </summary> /// </summary>
@ -137,20 +131,15 @@ namespace MediaBrowser.Controller.Updates
/// </summary> /// </summary>
/// <param name="kernel">The kernel.</param> /// <param name="kernel">The kernel.</param>
/// <param name="httpClient">The HTTP client.</param> /// <param name="httpClient">The HTTP client.</param>
/// <param name="zipClient">The zip client.</param>
/// <param name="networkManager">The network manager.</param> /// <param name="networkManager">The network manager.</param>
/// <param name="packageManager">The package manager.</param> /// <param name="packageManager">The package manager.</param>
/// <param name="jsonSerializer">The json serializer.</param> /// <param name="jsonSerializer">The json serializer.</param>
/// <param name="logger">The logger.</param> /// <param name="logger">The logger.</param>
/// <param name="appHost">The app host.</param> /// <param name="appHost">The app host.</param>
/// <exception cref="System.ArgumentNullException">zipClient</exception> /// <exception cref="System.ArgumentNullException">zipClient</exception>
public InstallationManager(Kernel kernel, IHttpClient httpClient, IZipClient zipClient, INetworkManager networkManager, IPackageManager packageManager, IJsonSerializer jsonSerializer, ILogger logger, IApplicationHost appHost) public InstallationManager(Kernel kernel, IHttpClient httpClient, INetworkManager networkManager, IPackageManager packageManager, IJsonSerializer jsonSerializer, ILogger logger, IApplicationHost appHost)
: base(kernel) : base(kernel)
{ {
if (zipClient == null)
{
throw new ArgumentNullException("zipClient");
}
if (networkManager == null) if (networkManager == null)
{ {
throw new ArgumentNullException("networkManager"); throw new ArgumentNullException("networkManager");
@ -180,7 +169,6 @@ namespace MediaBrowser.Controller.Updates
_networkManager = networkManager; _networkManager = networkManager;
_packageManager = packageManager; _packageManager = packageManager;
_logger = logger; _logger = logger;
ZipClient = zipClient;
} }
/// <summary> /// <summary>
@ -430,7 +418,7 @@ namespace MediaBrowser.Controller.Updates
private async Task InstallPackageInternal(PackageVersionInfo package, IProgress<double> progress, CancellationToken cancellationToken) private async Task InstallPackageInternal(PackageVersionInfo package, IProgress<double> progress, CancellationToken cancellationToken)
{ {
// Do the install // Do the install
await _packageManager.InstallPackage(HttpClient, _logger, Kernel.ResourcePools, progress, ZipClient, Kernel.ApplicationPaths, package, cancellationToken).ConfigureAwait(false); await _packageManager.InstallPackage(HttpClient, _logger, Kernel.ResourcePools, progress, Kernel.ApplicationPaths, package, cancellationToken).ConfigureAwait(false);
// Do plugin-specific processing // Do plugin-specific processing
if (!(Path.GetExtension(package.targetFilename) ?? "").Equals(".zip", StringComparison.OrdinalIgnoreCase)) if (!(Path.GetExtension(package.targetFilename) ?? "").Equals(".zip", StringComparison.OrdinalIgnoreCase))

@ -3,14 +3,56 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Code="clr-namespace:MediaBrowser.Installer.Code" x:Class="MediaBrowser.Installer.MainWindow" xmlns:Code="clr-namespace:MediaBrowser.Installer.Code" x:Class="MediaBrowser.Installer.MainWindow"
Title="Install Media Browser Server" Height="383.481" Width="663.057" ResizeMode="NoResize" WindowStyle="None"> Title="Install Media Browser Server" Height="383.481" Width="663.057" ResizeMode="NoResize" WindowStyle="None">
<Border BorderBrush="DarkGray" BorderThickness="2"> <Border BorderBrush="DarkGray" BorderThickness="2" Margin="0,0,0,0">
<Grid Margin="0,0,0,2"> <Grid Margin="-2,0,0,0">
<Image x:Name="imgLogo" HorizontalAlignment="Center" Height="172" Margin="10,10,57,0" VerticalAlignment="Top" Width="590" Source="Code/Images/mb3logo800.png" Opacity="0.5"/> <Image x:Name="imgLogo" HorizontalAlignment="Center" Height="172" Margin="10,10,57,0" VerticalAlignment="Top" Width="590" Source="Code/Images/mb3logo800.png" Opacity="0.5"/>
<ProgressBar x:Name="prgProgress" HorizontalAlignment="Left" Height="11" Margin="52,320,0,0" VerticalAlignment="Top" Width="460"/> <Grid HorizontalAlignment="Left" Height="153" Margin="0,173,0,0" VerticalAlignment="Top" Width="662" Background="Gray">
<Code:DownloadAnimation x:Name="dlAnimation" HorizontalAlignment="Left" Margin="26,97,0,0" VerticalAlignment="Top" Height="196" Width="574" RenderTransformOrigin="0.5,0.5"/> <TextBlock x:Name="lblStatus" HorizontalAlignment="Left" Margin="12,14,0,18" Width="637" FontSize="36" Foreground="#FFE6D7D7" Text="Status" TextWrapping="WrapWithOverflow"/>
<Button x:Name="btnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="547,309,0,0" VerticalAlignment="Top" Width="79" FontSize="14" Click="btnCancel_Click"/> <Rectangle Fill="#FF49494B" HorizontalAlignment="Left" Height="13" Stroke="Black" VerticalAlignment="Bottom" Width="662"/>
<Label x:Name="lblStatus" Content="Status" HorizontalAlignment="Left" Margin="52,264,0,0" VerticalAlignment="Top" Width="574" FontSize="14" FontWeight="Bold"/> <Rectangle x:Name="rectProgress" Fill="#FF0A0ABF" HorizontalAlignment="Left" Height="13" Stroke="Black" VerticalAlignment="Bottom" Width="0"/>
</Grid>
<Button x:Name="btnCancel" Content="Cancel" HorizontalAlignment="Left" Margin="552,336,0,0" Width="97" FontSize="14" Click="btnCancel_Click" Height="31" VerticalAlignment="Top"/>
</Grid> </Grid>
</Border> </Border>
<Window.Resources>
<!--Metro Button-->
<Style TargetType="{x:Type Button}" BasedOn="{x:Null}">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="#222222"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="Padding" Value="10,5,10,5"/>
<Setter Property="BorderBrush" Value="#222222"/>
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<!-- We use Grid as a root because it is easy to add more elements to customize the button -->
<Grid x:Name="Grid">
<Border x:Name="Border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"/>
<!-- Content Presenter is where the text content etc is placed by the control -->
<!-- The bindings are useful so that the control can be parameterized without editing the template -->
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/>
</Grid>
<!--Each state sets a brush on the Border in the template -->
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="true">
<Setter Property="Background" Value="#222222" TargetName="Border"/>
<Setter Property="BorderBrush" Value="#222222" TargetName="Border"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="16"/>
</Trigger>
<Trigger Property="IsEnabled" Value="true"/>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="BorderBrush" Value="#7f222222" TargetName="Border"/>
<Setter Property="Foreground" Value="#7f222222"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
</Window> </Window>

@ -24,6 +24,7 @@ namespace MediaBrowser.Installer
protected string RootSuffix = "-Server"; protected string RootSuffix = "-Server";
protected string TargetExe = "MediaBrowser.ServerApplication.exe"; protected string TargetExe = "MediaBrowser.ServerApplication.exe";
protected string FriendlyName = "Media Browser Server"; protected string FriendlyName = "Media Browser Server";
protected string Archive = null;
protected string RootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser-Server"); protected string RootPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MediaBrowser-Server");
protected bool SystemClosing = false; protected bool SystemClosing = false;
@ -36,7 +37,7 @@ namespace MediaBrowser.Installer
{ {
GetArgs(); GetArgs();
InitializeComponent(); InitializeComponent();
DoInstall(); DoInstall(Archive);
} }
private void btnCancel_Click(object sender, RoutedEventArgs e) private void btnCancel_Click(object sender, RoutedEventArgs e)
@ -77,6 +78,8 @@ namespace MediaBrowser.Installer
{ {
var product = ConfigurationManager.AppSettings["product"] ?? "server"; var product = ConfigurationManager.AppSettings["product"] ?? "server";
PackageClass = (PackageVersionClass) Enum.Parse(typeof (PackageVersionClass), ConfigurationManager.AppSettings["class"] ?? "Release"); PackageClass = (PackageVersionClass) Enum.Parse(typeof (PackageVersionClass), ConfigurationManager.AppSettings["class"] ?? "Release");
var cmdArgs = Environment.GetCommandLineArgs();
Archive = cmdArgs.Length > 1 ? cmdArgs[1] : null;
switch (product.ToLower()) switch (product.ToLower())
{ {
@ -103,12 +106,9 @@ namespace MediaBrowser.Installer
/// Execute the install process /// Execute the install process
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
protected async Task DoInstall() protected async Task DoInstall(string archive)
{ {
lblStatus.Content = string.Format("Downloading {0}...", FriendlyName); lblStatus.Text = string.Format("Downloading {0}...", FriendlyName);
dlAnimation.StartAnimation();
prgProgress.Value = 0;
prgProgress.Visibility = Visibility.Visible;
// Determine Package version // Determine Package version
var version = await GetPackageVersion(); var version = await GetPackageVersion();
@ -116,7 +116,7 @@ namespace MediaBrowser.Installer
// Now try and shut down the server if that is what we are installing and it is running // Now try and shut down the server if that is what we are installing and it is running
if (PackageName == "MBServer" && Process.GetProcessesByName("mediabrowser.serverapplication").Length != 0) if (PackageName == "MBServer" && Process.GetProcessesByName("mediabrowser.serverapplication").Length != 0)
{ {
lblStatus.Content = "Shutting Down Media Browser Server..."; lblStatus.Text = "Shutting Down Media Browser Server...";
using (var client = new WebClient()) using (var client = new WebClient())
{ {
try try
@ -139,7 +139,7 @@ namespace MediaBrowser.Installer
var processes = Process.GetProcessesByName("mediabrowser.ui"); var processes = Process.GetProcessesByName("mediabrowser.ui");
if (processes.Length > 0) if (processes.Length > 0)
{ {
lblStatus.Content = "Shutting Down Media Browser Theater..."; lblStatus.Text = "Shutting Down Media Browser Theater...";
try try
{ {
processes[0].Kill(); processes[0].Kill();
@ -153,25 +153,24 @@ namespace MediaBrowser.Installer
} }
} }
// Download // Download if we don't already have it
string archive = null; if (archive == null)
lblStatus.Content = string.Format("Downloading {0} (version {1})...", FriendlyName, version.versionStr);
try
{
archive = await DownloadPackage(version);
}
catch (Exception e)
{ {
SystemClose("Error Downloading Package - " + e.GetType().FullName + "\n\n" + e.Message); lblStatus.Text = string.Format("Downloading {0} (version {1})...", FriendlyName, version.versionStr);
try
{
archive = await DownloadPackage(version);
}
catch (Exception e)
{
SystemClose("Error Downloading Package - " + e.GetType().FullName + "\n\n" + e.Message);
}
} }
dlAnimation.StopAnimation();
prgProgress.Visibility = btnCancel.Visibility = Visibility.Hidden;
if (archive == null) return; //we canceled or had an error that was already reported if (archive == null) return; //we canceled or had an error that was already reported
// Extract // Extract
lblStatus.Content = "Extracting Package..."; lblStatus.Text = "Extracting Package...";
try try
{ {
ExtractPackage(archive); ExtractPackage(archive);
@ -267,7 +266,7 @@ namespace MediaBrowser.Installer
void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{ {
prgProgress.Value = e.ProgressPercentage; rectProgress.Width = (this.Width * e.ProgressPercentage)/100f;
} }
/// <summary> /// <summary>
@ -277,7 +276,12 @@ namespace MediaBrowser.Installer
/// <param name="archive"></param> /// <param name="archive"></param>
protected void ExtractPackage(string archive) protected void ExtractPackage(string archive)
{ {
using (var fileStream = System.IO.File.OpenRead(archive)) // Delete old content of system
var systemDir = Path.Combine(RootPath, "system");
if (Directory.Exists(systemDir)) Directory.Delete(systemDir, true);
// And extract
using (var fileStream = File.OpenRead(archive))
{ {
using (var zipFile = ZipFile.Read(fileStream)) using (var zipFile = ZipFile.Read(fileStream))
{ {

@ -29,7 +29,7 @@
<PublisherName>Media Browser Team</PublisherName> <PublisherName>Media Browser Team</PublisherName>
<SuiteName>Media Browser</SuiteName> <SuiteName>Media Browser</SuiteName>
<OpenBrowserOnPublish>false</OpenBrowserOnPublish> <OpenBrowserOnPublish>false</OpenBrowserOnPublish>
<ApplicationRevision>28</ApplicationRevision> <ApplicationRevision>32</ApplicationRevision>
<ApplicationVersion>0.1.1.%2a</ApplicationVersion> <ApplicationVersion>0.1.1.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust> <UseApplicationTrust>false</UseApplicationTrust>
<PublishWizardCompleted>true</PublishWizardCompleted> <PublishWizardCompleted>true</PublishWizardCompleted>

@ -196,7 +196,7 @@ namespace MediaBrowser.ServerApplication
public Task UpdateApplication(PackageVersionInfo package, CancellationToken cancellationToken, IProgress<double> progress) public Task UpdateApplication(PackageVersionInfo package, CancellationToken cancellationToken, IProgress<double> progress)
{ {
var pkgManager = Resolve<IPackageManager>(); var pkgManager = Resolve<IPackageManager>();
return pkgManager.InstallPackage(Resolve<IHttpClient>(), Resolve<ILogger>(), Kernel.ResourcePools, progress, Resolve<IZipClient>(), Kernel.ApplicationPaths, package, cancellationToken); return pkgManager.InstallPackage(Resolve<IHttpClient>(), Resolve<ILogger>(), Kernel.ResourcePools, progress, Kernel.ApplicationPaths, package, cancellationToken);
} }
/// <summary> /// <summary>

Loading…
Cancel
Save