Added BYOND instalation and started work on Repo management and updates.

This commit is contained in:
Karolis2011
2019-08-19 20:48:20 +03:00
parent 9d08ad0cbe
commit 8e520b5185
8 changed files with 150 additions and 10 deletions

View File

@@ -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>

View 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;
}
}
}

View 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"])));
}
}
}

View File

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

View File

@@ -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.");
}
} }
} }

View File

@@ -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()}"
};
}
} }
} }
} }

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

View File

@@ -15,7 +15,8 @@
"Version": { "Version": {
"Major": 512, "Major": 512,
"Minor": 1467 "Minor": 1467
} },
"Dir": "BYOND"
}, },
"WorkDir": "work" "WorkDir": "work"
} }