Cleaned up diagnose system. Fixed smaller inconsistencies
This commit is contained in:
@@ -10,6 +10,7 @@ namespace Moonlight.ApiServer.Http.Controllers.Admin.Sys;
|
||||
|
||||
[ApiController]
|
||||
[Route("api/admin/system/diagnose")]
|
||||
[RequirePermission("admin.system.diagnose")]
|
||||
public class DiagnoseController : Controller
|
||||
{
|
||||
private readonly DiagnoseService DiagnoseService;
|
||||
@@ -20,20 +21,21 @@ public class DiagnoseController : Controller
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[RequirePermission("admin.system.diagnose")]
|
||||
public async Task<IActionResult> Diagnose([FromBody] string[]? requestedDiagnoseProviders = null)
|
||||
public async Task Diagnose([FromBody] GenerateDiagnoseRequest request)
|
||||
{
|
||||
var stream = new MemoryStream();
|
||||
var stream = await DiagnoseService.GenerateDiagnose(request.Providers);
|
||||
|
||||
await DiagnoseService.GenerateDiagnose(stream, requestedDiagnoseProviders);
|
||||
|
||||
return File(stream, "application/zip", "diagnose.zip");
|
||||
await Results.Stream(
|
||||
stream,
|
||||
contentType: "application/zip",
|
||||
fileDownloadName: "diagnose.zip"
|
||||
)
|
||||
.ExecuteAsync(HttpContext);
|
||||
}
|
||||
|
||||
[HttpGet("available")]
|
||||
[RequirePermission("admin.system.diagnose")]
|
||||
public async Task<DiagnoseProvideResponse[]> GetAvailable()
|
||||
[HttpGet("providers")]
|
||||
public async Task<DiagnoseProvideResponse[]> GetProviders()
|
||||
{
|
||||
return await DiagnoseService.GetAvailable();
|
||||
return await DiagnoseService.GetProviders();
|
||||
}
|
||||
}
|
||||
@@ -24,28 +24,34 @@ public class CoreConfigDiagnoseProvider : IDiagnoseProvider
|
||||
|
||||
public async Task ModifyZipArchive(ZipArchive archive)
|
||||
{
|
||||
|
||||
var json = JsonSerializer.Serialize(Config);
|
||||
var config = JsonSerializer.Deserialize<AppConfiguration>(json);
|
||||
var config = JsonSerializer.Deserialize<AppConfiguration>(json);
|
||||
|
||||
if (config == null)
|
||||
{
|
||||
await archive.AddText("core/config.txt","Could not fetch config.");
|
||||
|
||||
await archive.AddText("core/config.txt", "Could not fetch config.");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
config.Database.Password = CheckForNullOrEmpty(config.Database.Password);
|
||||
|
||||
|
||||
config.Authentication.OAuth2.ClientSecret = CheckForNullOrEmpty(config.Authentication.OAuth2.ClientSecret);
|
||||
|
||||
|
||||
config.Authentication.OAuth2.Secret = CheckForNullOrEmpty(config.Authentication.OAuth2.Secret);
|
||||
|
||||
config.Authentication.Secret = CheckForNullOrEmpty(config.Authentication.Secret);
|
||||
|
||||
|
||||
config.Authentication.OAuth2.ClientId = CheckForNullOrEmpty(config.Authentication.OAuth2.ClientId);
|
||||
|
||||
await archive.AddText("core/config.txt",
|
||||
JsonSerializer.Serialize(config, new JsonSerializerOptions() { WriteIndented = true }));
|
||||
await archive.AddText(
|
||||
"core/config.txt",
|
||||
JsonSerializer.Serialize(
|
||||
config,
|
||||
new JsonSerializerOptions()
|
||||
{
|
||||
WriteIndented = true
|
||||
}
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,4 @@
|
||||
using System.IO.Compression;
|
||||
using System.Text;
|
||||
using MoonCore.Helpers;
|
||||
using Moonlight.ApiServer.Extensions;
|
||||
using Moonlight.ApiServer.Interfaces;
|
||||
|
||||
@@ -10,15 +8,15 @@ public class LogsDiagnoseProvider : IDiagnoseProvider
|
||||
{
|
||||
public async Task ModifyZipArchive(ZipArchive archive)
|
||||
{
|
||||
var path = Path.Combine("storage", "logs", "latest.log");
|
||||
|
||||
var logs = await File.ReadAllTextAsync(PathBuilder.File("storage", "logs", "latest.log"));
|
||||
|
||||
if (string.IsNullOrEmpty(logs))
|
||||
{
|
||||
await archive.AddText("logs.txt", "Could not read the logs");
|
||||
return;
|
||||
}
|
||||
|
||||
await archive.AddText("logs.txt", logs);
|
||||
if (!File.Exists(path))
|
||||
{
|
||||
await archive.AddText("logs.txt", "Logs file latest.log has not been found");
|
||||
return;
|
||||
}
|
||||
|
||||
var logsContent = await File.ReadAllTextAsync(path);
|
||||
await archive.AddText("logs.txt", logsContent);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
using Moonlight.ApiServer.Interfaces;
|
||||
using System.IO.Compression;
|
||||
using MoonCore.Attributes;
|
||||
using MoonCore.Exceptions;
|
||||
using Moonlight.Shared.Http.Responses.Admin.Sys;
|
||||
|
||||
namespace Moonlight.ApiServer.Services;
|
||||
@@ -9,13 +10,18 @@ namespace Moonlight.ApiServer.Services;
|
||||
public class DiagnoseService
|
||||
{
|
||||
private readonly IEnumerable<IDiagnoseProvider> DiagnoseProviders;
|
||||
private readonly ILogger<DiagnoseService> Logger;
|
||||
|
||||
public DiagnoseService(IEnumerable<IDiagnoseProvider> diagnoseProviders)
|
||||
public DiagnoseService(
|
||||
IEnumerable<IDiagnoseProvider> diagnoseProviders,
|
||||
ILogger<DiagnoseService> logger
|
||||
)
|
||||
{
|
||||
DiagnoseProviders = diagnoseProviders;
|
||||
Logger = logger;
|
||||
}
|
||||
|
||||
public async Task<DiagnoseProvideResponse[]> GetAvailable()
|
||||
public Task<DiagnoseProvideResponse[]> GetProviders()
|
||||
{
|
||||
var availableProviders = new List<DiagnoseProvideResponse>();
|
||||
|
||||
@@ -26,55 +32,64 @@ public class DiagnoseService
|
||||
var type = diagnoseProvider.GetType().FullName;
|
||||
|
||||
// The type name is null if the type is a generic type, unlikely, but still could happen
|
||||
if (type != null)
|
||||
availableProviders.Add(new DiagnoseProvideResponse()
|
||||
{
|
||||
Name = name,
|
||||
Type = type
|
||||
});
|
||||
if (type == null)
|
||||
continue;
|
||||
|
||||
availableProviders.Add(new DiagnoseProvideResponse()
|
||||
{
|
||||
Name = name,
|
||||
Type = type
|
||||
});
|
||||
}
|
||||
|
||||
return availableProviders.ToArray();
|
||||
return Task.FromResult(
|
||||
availableProviders.ToArray()
|
||||
);
|
||||
}
|
||||
|
||||
public async Task GenerateDiagnose(Stream outputStream, string[]? requestedProviders)
|
||||
public async Task<MemoryStream> GenerateDiagnose(string[] requestedProviders)
|
||||
{
|
||||
IDiagnoseProvider[] providers;
|
||||
|
||||
if (requestedProviders != null && requestedProviders.Length > 0)
|
||||
|
||||
if (requestedProviders.Length == 0)
|
||||
providers = DiagnoseProviders.ToArray();
|
||||
else
|
||||
{
|
||||
var requesteDiagnoseProviders = new List<IDiagnoseProvider>();
|
||||
var foundProviders = new List<IDiagnoseProvider>();
|
||||
|
||||
foreach (var requestedProvider in requestedProviders)
|
||||
{
|
||||
var provider = DiagnoseProviders.FirstOrDefault(x => x.GetType().FullName == requestedProvider);
|
||||
|
||||
if (provider != null)
|
||||
requesteDiagnoseProviders.Add(provider);
|
||||
if (provider == null)
|
||||
continue;
|
||||
|
||||
foundProviders.Add(provider);
|
||||
}
|
||||
|
||||
providers = requesteDiagnoseProviders.ToArray();
|
||||
}
|
||||
else
|
||||
{
|
||||
providers = DiagnoseProviders.ToArray();
|
||||
providers = foundProviders.ToArray();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
using (var zip = new ZipArchive(outputStream, ZipArchiveMode.Create, leaveOpen: true))
|
||||
{
|
||||
foreach (var provider in providers)
|
||||
{
|
||||
await provider.ModifyZipArchive(zip);
|
||||
}
|
||||
}
|
||||
var outputStream = new MemoryStream();
|
||||
var zipArchive = new ZipArchive(outputStream, ZipArchiveMode.Create, leaveOpen: true);
|
||||
|
||||
outputStream.Seek(0, SeekOrigin.Begin);
|
||||
foreach (var provider in providers)
|
||||
{
|
||||
await provider.ModifyZipArchive(zipArchive);
|
||||
}
|
||||
|
||||
zipArchive.Dispose();
|
||||
|
||||
outputStream.Position = 0;
|
||||
return outputStream;
|
||||
}
|
||||
catch (Exception ex)
|
||||
catch (Exception e)
|
||||
{
|
||||
throw new Exception($"An unknown error occured while building the Diagnose: {ex.Message}");
|
||||
Logger.LogError("An unhandled error occured while generated the diagnose file: {e}", e);
|
||||
|
||||
throw new HttpApiException("An unhandled error occured while generating the diagnose file", 500);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user