diff --git a/src/Sonarr.Api.V5/System/SystemController.cs b/src/Sonarr.Api.V5/System/SystemController.cs new file mode 100644 index 000000000..26e525f19 --- /dev/null +++ b/src/Sonarr.Api.V5/System/SystemController.cs @@ -0,0 +1,126 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.Routing.Internal; +using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Common.Extensions; +using NzbDrone.Core.Configuration; +using NzbDrone.Core.Datastore; +using NzbDrone.Core.Lifecycle; +using Sonarr.Http; +using Sonarr.Http.Validation; + +namespace Sonarr.Api.V5.System; + +[V5ApiController] +public class SystemController : Controller +{ + private readonly IAppFolderInfo _appFolderInfo; + private readonly IRuntimeInfo _runtimeInfo; + private readonly IPlatformInfo _platformInfo; + private readonly IOsInfo _osInfo; + private readonly IConfigFileProvider _configFileProvider; + private readonly IMainDatabase _database; + private readonly ILifecycleService _lifecycleService; + private readonly IDeploymentInfoProvider _deploymentInfoProvider; + private readonly EndpointDataSource _endpointData; + private readonly DfaGraphWriter _graphWriter; + private readonly DuplicateEndpointDetector _detector; + + public SystemController(IAppFolderInfo appFolderInfo, + IRuntimeInfo runtimeInfo, + IPlatformInfo platformInfo, + IOsInfo osInfo, + IConfigFileProvider configFileProvider, + IMainDatabase database, + ILifecycleService lifecycleService, + IDeploymentInfoProvider deploymentInfoProvider, + EndpointDataSource endpoints, + DfaGraphWriter graphWriter, + DuplicateEndpointDetector detector) + { + _appFolderInfo = appFolderInfo; + _runtimeInfo = runtimeInfo; + _platformInfo = platformInfo; + _osInfo = osInfo; + _configFileProvider = configFileProvider; + _database = database; + _lifecycleService = lifecycleService; + _deploymentInfoProvider = deploymentInfoProvider; + _endpointData = endpoints; + _graphWriter = graphWriter; + _detector = detector; + } + + [HttpGet("status")] + [Produces("application/json")] + public SystemResource GetStatus() + { + return new SystemResource + { + AppName = BuildInfo.AppName, + InstanceName = _configFileProvider.InstanceName, + Version = BuildInfo.Version.ToString(), + BuildTime = BuildInfo.BuildDateTime, + IsDebug = BuildInfo.IsDebug, + IsProduction = RuntimeInfo.IsProduction, + IsAdmin = _runtimeInfo.IsAdmin, + IsUserInteractive = RuntimeInfo.IsUserInteractive, + StartupPath = _appFolderInfo.StartUpFolder, + AppData = _appFolderInfo.GetAppDataPath(), + OsName = _osInfo.Name, + OsVersion = _osInfo.Version, + IsNetCore = true, + IsLinux = OsInfo.IsLinux, + IsOsx = OsInfo.IsOsx, + IsWindows = OsInfo.IsWindows, + IsDocker = _osInfo.IsDocker, + Mode = _runtimeInfo.Mode, + Branch = _configFileProvider.Branch, + Authentication = _configFileProvider.AuthenticationMethod, + DatabaseType = _database.DatabaseType, + DatabaseVersion = _database.Version, + MigrationVersion = _database.Migration, + UrlBase = _configFileProvider.UrlBase, + RuntimeVersion = _platformInfo.Version, + RuntimeName = PlatformInfo.PlatformName, + StartTime = _runtimeInfo.StartTime, + PackageVersion = _deploymentInfoProvider.PackageVersion, + PackageAuthor = _deploymentInfoProvider.PackageAuthor, + PackageUpdateMechanism = _deploymentInfoProvider.PackageUpdateMechanism, + PackageUpdateMechanismMessage = _deploymentInfoProvider.PackageUpdateMechanismMessage + }; + } + + [HttpGet("routes")] + [Produces("application/json")] + public IActionResult GetRoutes() + { + using (var sw = new StringWriter()) + { + _graphWriter.Write(_endpointData, sw); + var graph = sw.ToString(); + return Content(graph, "text/plain"); + } + } + + [HttpGet("routes/duplicate")] + [Produces("application/json")] + public object DuplicateRoutes() + { + return _detector.GetDuplicateEndpoints(_endpointData); + } + + [HttpPost("shutdown")] + public object Shutdown() + { + Task.Factory.StartNew(() => _lifecycleService.Shutdown()); + return new { ShuttingDown = true }; + } + + [HttpPost("restart")] + public object Restart() + { + Task.Factory.StartNew(() => _lifecycleService.Restart()); + return new { Restarting = true }; + } +} diff --git a/src/Sonarr.Api.V5/System/SystemResource.cs b/src/Sonarr.Api.V5/System/SystemResource.cs new file mode 100644 index 000000000..39753ca88 --- /dev/null +++ b/src/Sonarr.Api.V5/System/SystemResource.cs @@ -0,0 +1,41 @@ +using NzbDrone.Common.EnvironmentInfo; +using NzbDrone.Core.Authentication; +using NzbDrone.Core.Datastore; +using NzbDrone.Core.Update; + +namespace Sonarr.Api.V5.System; + +public class SystemResource +{ + public required string AppName { get; set; } + public required string InstanceName { get; set; } + public required string Version { get; set; } + public DateTime BuildTime { get; set; } + public bool IsDebug { get; set; } + public bool IsProduction { get; set; } + public bool IsAdmin { get; set; } + public bool IsUserInteractive { get; set; } + public required string StartupPath { get; set; } + public required string AppData { get; set; } + public required string OsName { get; set; } + public required string OsVersion { get; set; } + public bool IsNetCore { get; set; } + public bool IsLinux { get; set; } + public bool IsOsx { get; set; } + public bool IsWindows { get; set; } + public bool IsDocker { get; set; } + public RuntimeMode Mode { get; set; } + public required string Branch { get; set; } + public AuthenticationType Authentication { get; set; } + public int MigrationVersion { get; set; } + public required string UrlBase { get; set; } + public required Version RuntimeVersion { get; set; } + public required string RuntimeName { get; set; } + public DateTime StartTime { get; set; } + public required string PackageVersion { get; set; } + public required string PackageAuthor { get; set; } + public UpdateMechanism PackageUpdateMechanism { get; set; } + public required string PackageUpdateMechanismMessage { get; set; } + public required Version DatabaseVersion { get; set; } + public DatabaseType DatabaseType { get; set; } +}