diff --git a/src/Tgstation.Server.Host/Components/PosixByondInstaller.cs b/src/Tgstation.Server.Host/Components/PosixByondInstaller.cs new file mode 100644 index 0000000000..2a3e5cd44d --- /dev/null +++ b/src/Tgstation.Server.Host/Components/PosixByondInstaller.cs @@ -0,0 +1,93 @@ +using Microsoft.Extensions.Logging; +using System; +using System.Globalization; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using Tgstation.Server.Host.IO; + +namespace Tgstation.Server.Host.Components +{ + /// + /// for Posix systems + /// + sealed class PosixByondInstaller : IByondInstaller + { + /// + /// The URL format string for getting BYOND linux version {0}.{1} zipfile + /// + const string ByondRevisionsURL = "https://secure.byond.com/download/build/{0}/{0}.{1}_byond_linux.zip"; + /// + /// Path to the BYOND cache + /// + const string ByondCachePath = "~/.byond"; //TODO: Verify this is correct!!!!! + + /// + public string DreamDaemonName => "DreamDaemon"; + + /// + public string DreamMakerName => "DreamMaker"; + + /// + /// The for the + /// + readonly IIOManager ioManager; + + /// + /// The for the + /// + readonly ILogger logger; + + /// + /// Construct a + /// + /// The value of + /// The value of + public PosixByondInstaller(IIOManager ioManager, ILogger logger) + { + this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager)); + this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + /// + public async Task CleanCache(CancellationToken cancellationToken) + { + try + { + await ioManager.DeleteDirectory(ByondCachePath, cancellationToken).ConfigureAwait(false); + } + catch (Exception e) + { + logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e); + } + } + + /// + public async Task DownloadVersion(Version version, CancellationToken cancellationToken) + { + var ourVersion = version; + //lummox is annoying and doesn't like to post linux versions if nothing changed in DreamDaemon/DM + //if this for's exit condition ever triggers, i get to say I told you so + Exception lastException = null; + for (var I = 0; I < 5 && ourVersion.Minor >= 1; ++I, ourVersion = new Version(ourVersion.Major, ourVersion.Minor)) + { + try + { + var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURL, ourVersion.Major, ourVersion.Minor); + + return await ioManager.DownloadFile(new Uri(url), cancellationToken).ConfigureAwait(false); + } + catch (WebException e) + { + if (!(e.Status == WebExceptionStatus.ProtocolError && e.Response is HttpWebResponse response && response.StatusCode == HttpStatusCode.NotFound)) + throw; + lastException = e; + } + } + throw lastException; + } + + /// + public Task InstallByond(string path, Version version, CancellationToken cancellationToken) => Task.CompletedTask; + } +} diff --git a/src/Tgstation.Server.Host/Components/WindowsByondInstaller.cs b/src/Tgstation.Server.Host/Components/WindowsByondInstaller.cs index 1a5274eae4..6b102ace09 100644 --- a/src/Tgstation.Server.Host/Components/WindowsByondInstaller.cs +++ b/src/Tgstation.Server.Host/Components/WindowsByondInstaller.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.Extensions.Logging; +using System; using System.Diagnostics; using System.Globalization; using System.Text; @@ -41,6 +42,11 @@ namespace Tgstation.Server.Host.Components /// readonly IIOManager ioManager; + /// + /// The for the + /// + readonly ILogger logger; + /// /// If DirectX was installed /// @@ -50,20 +56,32 @@ namespace Tgstation.Server.Host.Components /// Construct a /// /// The value of - public WindowsByondInstaller(IIOManager ioManager) + /// The value of + public WindowsByondInstaller(IIOManager ioManager, ILogger logger) { this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager)); + this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); installedDirectX = false; } /// - public Task CleanCache(CancellationToken cancellationToken) => ioManager.DeleteDirectory(ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "byond/cache"), cancellationToken); + public async Task CleanCache(CancellationToken cancellationToken) + { + try + { + await ioManager.DeleteDirectory(ioManager.ConcatPath(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "byond/cache"), cancellationToken).ConfigureAwait(false); + } + catch (Exception e) + { + logger.LogWarning("Error deleting BYOND cache! Exception: {0}", e); + } + } /// public Task DownloadVersion(Version version, CancellationToken cancellationToken) { - var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURL, version.Major, version.Major); + var url = String.Format(CultureInfo.InvariantCulture, ByondRevisionsURL, version.Major, version.Minor); return ioManager.DownloadFile(new Uri(url), cancellationToken); } diff --git a/src/Tgstation.Server.Host/Core/Application.cs b/src/Tgstation.Server.Host/Core/Application.cs index 35cde358b6..aee2ab7feb 100644 --- a/src/Tgstation.Server.Host/Core/Application.cs +++ b/src/Tgstation.Server.Host/Core/Application.cs @@ -160,6 +160,7 @@ namespace Tgstation.Server.Host.Core { services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); } services.AddSingleton();