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();