Files
josh engebretson e61c8ec367 Horde: Adding plugin info to server info response
#rnx

[CL 34848273 by josh engebretson in ue5-main branch]
2024-07-16 14:12:12 -04:00

143 lines
4.3 KiB
C#

// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using EpicGames.Core;
using EpicGames.Horde;
using EpicGames.Horde.Server;
using HordeServer.Plugins;
using HordeServer.Utilities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using MongoDB.Driver;
namespace HordeServer.Server
{
/// <summary>
/// Controller managing account status
/// </summary>
[ApiController]
[Authorize]
[CppApi]
[Route("[controller]")]
public class ServerController : HordeControllerBase
{
readonly IAgentVersionProvider? _agentVersionProvider;
readonly IPluginCollection _pluginCollection;
readonly IOptionsSnapshot<GlobalConfig> _globalConfig;
/// <summary>
/// Constructor
/// </summary>
public ServerController(IEnumerable<IAgentVersionProvider> agentVersionProviders, IPluginCollection pluginCollection, IOptionsSnapshot<GlobalConfig> globalConfig)
{
_agentVersionProvider = agentVersionProviders.FirstOrDefault();
_pluginCollection = pluginCollection;
_globalConfig = globalConfig;
}
/// <summary>
/// Get server version
/// </summary>
[HttpGet]
[AllowAnonymous]
[Route("/api/v1/server/version")]
public ActionResult GetVersion()
{
FileVersionInfo fileVersionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
return Ok(fileVersionInfo.ProductVersion);
}
/// <summary>
/// Get server information
/// </summary>
[HttpGet]
[AllowAnonymous]
[Route("/api/v1/server/info")]
[ProducesResponseType(typeof(GetServerInfoResponse), 200)]
public async Task<ActionResult<GetServerInfoResponse>> GetServerInfoAsync()
{
GetServerInfoResponse response = new GetServerInfoResponse();
response.ApiVersion = HordeApiVersion.Latest;
FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location);
response.ServerVersion = versionInfo.ProductVersion ?? String.Empty;
if (_agentVersionProvider != null)
{
response.AgentVersion = await _agentVersionProvider.GetAsync(HttpContext.RequestAborted);
}
response.Plugins = _pluginCollection.LoadedPlugins.ConvertAll(plugin => {
FileVersionInfo pluginVersion = FileVersionInfo.GetVersionInfo(plugin.Assembly.Location);
return new ServerPluginInfoResponse(plugin.Metadata.Name.ToString(), plugin.Metadata.Description, true, pluginVersion.ProductVersion ?? String.Empty);
}).ToArray();
return response;
}
/// <summary>
/// Gets connection information
/// </summary>
[HttpGet]
[AllowAnonymous]
[Route("/api/v1/server/connection")]
public ActionResult<GetConnectionResponse> GetConnection()
{
GetConnectionResponse response = new GetConnectionResponse();
response.Ip = HttpContext.Connection.RemoteIpAddress?.ToString();
response.Port = HttpContext.Connection.RemotePort;
return response;
}
/// <summary>
/// Gets ports used by the server
/// </summary>
[HttpGet]
[AllowAnonymous]
[Route("/api/v1/server/ports")]
public ActionResult<GetPortsResponse> GetPorts()
{
ServerSettings serverSettings = _globalConfig.Value.ServerSettings;
GetPortsResponse response = new GetPortsResponse();
response.Http = serverSettings.HttpPort;
response.Https = serverSettings.HttpsPort;
response.UnencryptedHttp2 = serverSettings.Http2Port;
return response;
}
/// <summary>
/// Returns settings for automating auth against this server
/// </summary>
[HttpGet]
[AllowAnonymous]
[Route("/api/v1/server/auth")]
public ActionResult<GetAuthConfigResponse> GetAuthConfig()
{
ServerSettings settings = _globalConfig.Value.ServerSettings;
GetAuthConfigResponse response = new GetAuthConfigResponse();
response.Method = settings.AuthMethod;
response.ProfileName = settings.OidcProfileName;
if (settings.AuthMethod == AuthMethod.Horde)
{
response.ServerUrl = new Uri(_globalConfig.Value.ServerSettings.ServerUrl, "api/v1/oauth2").ToString();
response.ClientId = "default";
}
else
{
response.ServerUrl = settings.OidcAuthority;
response.ClientId = settings.OidcClientId;
}
response.LocalRedirectUrls = settings.OidcLocalRedirectUrls;
return response;
}
}
}