Added BYOND instalation and started work on Repo management and updates.
This commit is contained in:
@@ -6,7 +6,9 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Emet.FileSystems" Version="0.0.1-alpha1" />
|
||||||
<PackageReference Include="Grpc" Version="1.22.0" />
|
<PackageReference Include="Grpc" Version="1.22.0" />
|
||||||
|
<PackageReference Include="LibGit2Sharp" Version="0.26.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.2.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.2.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.2.0" />
|
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.2.0" />
|
||||||
@@ -29,7 +31,6 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="Attributes\" />
|
<Folder Include="Attributes\" />
|
||||||
<Folder Include="Extensions\" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
17
ASS.Server/Extensions/ArrayExtension.cs
Normal file
17
ASS.Server/Extensions/ArrayExtension.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace ASS.Server.Extensions
|
||||||
|
{
|
||||||
|
public static class ArrayExtension
|
||||||
|
{
|
||||||
|
public static T[] PreAppend<T>(this T[] array, params T[] toAppend)
|
||||||
|
{
|
||||||
|
var n = new T[toAppend.Length + array.Length];
|
||||||
|
toAppend.CopyTo(n, 0);
|
||||||
|
array.CopyTo(n, toAppend.Length);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
26
ASS.Server/Helpers/FileSystemHelper.cs
Normal file
26
ASS.Server/Helpers/FileSystemHelper.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
using ASS.Server.Extensions;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace ASS.Server.Helpers
|
||||||
|
{
|
||||||
|
public static class FileSystemHelper
|
||||||
|
{
|
||||||
|
public static string GetPath(IConfiguration globalConfig, params string[] paths)
|
||||||
|
{
|
||||||
|
if(Path.IsPathRooted(paths[0]))
|
||||||
|
return Path.GetFullPath(Path.Combine(paths));
|
||||||
|
return Path.GetFullPath(Path.Combine(paths.PreAppend(globalConfig["WorkDir"])));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetPath(IConfiguration globalConfig, string[] extraPaths, params string[] paths)
|
||||||
|
{
|
||||||
|
if (Path.IsPathRooted(paths[0]))
|
||||||
|
return Path.GetFullPath(Path.Combine(extraPaths.PreAppend(paths)));
|
||||||
|
return Path.GetFullPath(Path.Combine(extraPaths.PreAppend(paths).PreAppend(globalConfig["WorkDir"])));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -50,6 +50,7 @@ namespace ASS.Server
|
|||||||
})
|
})
|
||||||
.AddSingleton(sp => new GrpcService(sp))
|
.AddSingleton(sp => new GrpcService(sp))
|
||||||
.AddSingleton<InstanceService>()
|
.AddSingleton<InstanceService>()
|
||||||
|
.AddSingleton<ByondService>()
|
||||||
.AddSingleton<HttpClient>();
|
.AddSingleton<HttpClient>();
|
||||||
;
|
;
|
||||||
return services.BuildServiceProvider();
|
return services.BuildServiceProvider();
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
using ASS.API;
|
using ASS.API;
|
||||||
|
using ASS.Server.Helpers;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
@@ -8,6 +9,9 @@ using System.Text.RegularExpressions;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using System.IO.Compression;
|
||||||
|
using System.IO;
|
||||||
|
using Google.Protobuf;
|
||||||
|
|
||||||
namespace ASS.Server.Services
|
namespace ASS.Server.Services
|
||||||
{
|
{
|
||||||
@@ -18,18 +22,16 @@ namespace ASS.Server.Services
|
|||||||
|
|
||||||
HttpClient httpclient;
|
HttpClient httpclient;
|
||||||
IConfiguration config;
|
IConfiguration config;
|
||||||
|
IConfiguration globalConfig;
|
||||||
|
|
||||||
public ByondService(HttpClient _httpClient, IConfiguration configuration)
|
public ByondService(HttpClient _httpClient, IConfiguration configuration)
|
||||||
{
|
{
|
||||||
httpclient = _httpClient;
|
httpclient = _httpClient;
|
||||||
|
globalConfig = configuration;
|
||||||
config = configuration.GetSection("BYOND");
|
config = configuration.GetSection("BYOND");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GetDownloadUrl(string version)
|
|
||||||
{
|
|
||||||
var split = version.Split(".");
|
|
||||||
return GetDownloadUrl(split[0], split[1]);
|
|
||||||
}
|
|
||||||
public static string GetDownloadUrl(int major, int minor) => GetDownloadUrl(major.ToString(), minor.ToString());
|
public static string GetDownloadUrl(int major, int minor) => GetDownloadUrl(major.ToString(), minor.ToString());
|
||||||
public static string GetDownloadUrl(ByondVersion version) => GetDownloadUrl(version.Major, version.Minor);
|
public static string GetDownloadUrl(ByondVersion version) => GetDownloadUrl(version.Major, version.Minor);
|
||||||
public static string GetDownloadUrl(string major, string minor)
|
public static string GetDownloadUrl(string major, string minor)
|
||||||
@@ -41,13 +43,56 @@ namespace ASS.Server.Services
|
|||||||
throw new Exception("Unsupported OS");
|
throw new Exception("Unsupported OS");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static string getByondVersionDirectoryName(ByondVersion version) => $"{version.Major}.{version.Minor}";
|
||||||
|
public string GetByondDirectoryPath(ByondVersion version, params string[] extraPaths) => FileSystemHelper.GetPath(globalConfig, extraPaths, config["Dir"], getByondVersionDirectoryName(version));
|
||||||
|
public string GetByondDirectoryPath(params string[] extraPaths) => FileSystemHelper.GetPath(globalConfig, extraPaths, config["Dir"], "live");
|
||||||
|
|
||||||
public async Task<IEnumerable<ByondVersion>> GetVersions()
|
public async Task<IEnumerable<ByondVersion>> GetVersions()
|
||||||
{
|
{
|
||||||
var response = await httpclient.SendAsync(new HttpRequestMessage(HttpMethod.Get, BYOND_LATEST_URL));
|
var response = await httpclient.SendAsync(new HttpRequestMessage(HttpMethod.Get, BYOND_LATEST_URL));
|
||||||
var content = await response.Content.ReadAsStringAsync();
|
var content = await response.Content.ReadAsStringAsync();
|
||||||
|
response.Dispose();
|
||||||
var regex = new Regex("\\\"([\\d]+)\\.([\\d]+)_byond.zip\\\"");
|
var regex = new Regex("\\\"([\\d]+)\\.([\\d]+)_byond.zip\\\"");
|
||||||
var matches = regex.Matches(content);
|
var matches = regex.Matches(content);
|
||||||
return matches.Select(m => new ByondVersion() { Major = int.Parse(m.Captures[0].Value), Minor = int.Parse(m.Captures[0].Value) });
|
return matches.Select(m => new ByondVersion() { Major = int.Parse(m.Captures[0].Value), Minor = int.Parse(m.Captures[0].Value) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task DownloadByond(ByondVersion version)
|
||||||
|
{
|
||||||
|
using (var response = await httpclient.SendAsync(new HttpRequestMessage(HttpMethod.Get, GetDownloadUrl(version))))
|
||||||
|
using (var stream = await response.Content.ReadAsStreamAsync())
|
||||||
|
using (var archive = new ZipArchive(stream, ZipArchiveMode.Read))
|
||||||
|
archive.ExtractToDirectory(GetByondDirectoryPath(version), true);
|
||||||
|
using (var versionData = File.Create(GetByondDirectoryPath(version, "version.dat")))
|
||||||
|
version.WriteTo(versionData);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ByondVersion getVersion() => getVersion(GetByondDirectoryPath());
|
||||||
|
private ByondVersion getVersion(string path)
|
||||||
|
{
|
||||||
|
var filePath = Path.Combine(path, "version.dat");
|
||||||
|
if (!File.Exists(filePath))
|
||||||
|
return null;
|
||||||
|
ByondVersion version;
|
||||||
|
using (var versionData = File.OpenRead(filePath))
|
||||||
|
version = ByondVersion.Parser.ParseFrom(versionData);
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task SwitchToVersion(ByondVersion version)
|
||||||
|
{
|
||||||
|
if (version.Equals(getVersion()))
|
||||||
|
return;
|
||||||
|
if (!Directory.Exists(GetByondDirectoryPath(version)))
|
||||||
|
await DownloadByond(version);
|
||||||
|
if (!getVersion(GetByondDirectoryPath(version)).Equals(version))
|
||||||
|
throw new Exception($"Byond version '{version.Major}.{version.Minor}' data mismatches folder name or ByondVersion data. Please manually remove this version.");
|
||||||
|
if (Directory.Exists(GetByondDirectoryPath()))
|
||||||
|
Directory.Delete(GetByondDirectoryPath());
|
||||||
|
Emet.FileSystems.FileSystem.CreateSymbolicLink(getByondVersionDirectoryName(version), GetByondDirectoryPath());
|
||||||
|
if (!version.Equals(getVersion()))
|
||||||
|
throw new Exception($"Byond version switch failed.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,17 +4,37 @@ using System.Text;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using ASS.API;
|
using ASS.API;
|
||||||
using Grpc.Core;
|
using Grpc.Core;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace ASS.Server.Services
|
namespace ASS.Server.Services
|
||||||
{
|
{
|
||||||
class InstanceService : Instance.InstanceBase
|
class InstanceService : Instance.InstanceBase
|
||||||
{
|
{
|
||||||
|
IServiceProvider serviceProvider;
|
||||||
|
public InstanceService(IServiceProvider sp) : base()
|
||||||
|
{
|
||||||
|
serviceProvider = sp;
|
||||||
|
}
|
||||||
|
|
||||||
public async override Task<InstanceStatus> GetStatus(EmptyRequest request, ServerCallContext context)
|
public async override Task<InstanceStatus> GetStatus(EmptyRequest request, ServerCallContext context)
|
||||||
{
|
{
|
||||||
return new InstanceStatus
|
switch (request.Auth.Token)
|
||||||
{
|
{
|
||||||
Message = $"YOU:{request.Auth.Token}:WE:{DateTime.Now.ToString()}"
|
case "IB":
|
||||||
};
|
var version = new ByondVersion() { Major = 512, Minor = 1469 };
|
||||||
|
var byond = serviceProvider.GetRequiredService<ByondService>();
|
||||||
|
await byond.SwitchToVersion(version);
|
||||||
|
return new InstanceStatus
|
||||||
|
{
|
||||||
|
Message = $"Installed {version}"
|
||||||
|
};
|
||||||
|
default:
|
||||||
|
return new InstanceStatus
|
||||||
|
{
|
||||||
|
Message = $"YOU:{request.Auth.Token}:WE:{DateTime.Now.ToString()}"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
29
ASS.Server/Services/UpdateService.cs
Normal file
29
ASS.Server/Services/UpdateService.cs
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
using ASS.Server.Helpers;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace ASS.Server.Services
|
||||||
|
{
|
||||||
|
|
||||||
|
class UpdateService
|
||||||
|
{
|
||||||
|
|
||||||
|
IConfiguration config;
|
||||||
|
|
||||||
|
|
||||||
|
public UpdateService(IConfiguration configuration)
|
||||||
|
{
|
||||||
|
config = configuration;
|
||||||
|
//Emet.FileSystems.FileSystem.ReadLink(GetLiveDirectory());
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetRpositoryDirectory(params string[] extraPaths) => FileSystemHelper.GetPath(config, extraPaths, "Repo");
|
||||||
|
public string GetOverrideDirectory(params string[] extraPaths) => FileSystemHelper.GetPath(config, extraPaths, "Override");
|
||||||
|
public string GetLiveDirectory(params string[] extraPaths) => FileSystemHelper.GetPath(config, extraPaths, "Live");
|
||||||
|
public string GetRealLiveDirectory(params string[] extraPaths) => throw new NotImplementedException();
|
||||||
|
public string GetStagingDirectory(params string[] extraPaths) => throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
@@ -15,7 +15,8 @@
|
|||||||
"Version": {
|
"Version": {
|
||||||
"Major": 512,
|
"Major": 512,
|
||||||
"Minor": 1467
|
"Minor": 1467
|
||||||
}
|
},
|
||||||
|
"Dir": "BYOND"
|
||||||
},
|
},
|
||||||
"WorkDir": "work"
|
"WorkDir": "work"
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user