using MediaBrowser.Common.Configuration; using MediaBrowser.Common.IO; using MediaBrowser.Common.Net; using MediaBrowser.Common.Security; using MediaBrowser.Controller; using MediaBrowser.Controller.Net; using MediaBrowser.Model.Entities; using MediaBrowser.Model.System; using ServiceStack; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using CommonIO; namespace MediaBrowser.Api.System { /// /// Class GetSystemInfo /// [Route("/System/Info", "GET", Summary = "Gets information about the server")] [Authenticated(EscapeParentalControl = true)] public class GetSystemInfo : IReturn { } [Route("/System/Info/Public", "GET", Summary = "Gets public information about the server")] public class GetPublicSystemInfo : IReturn { } [Route("/System/Ping", "POST")] public class PingSystem : IReturnVoid { } /// /// Class RestartApplication /// [Route("/System/Restart", "POST", Summary = "Restarts the application, if needed")] [Authenticated(Roles = "Admin")] public class RestartApplication { } /// /// This is currently not authenticated because the uninstaller needs to be able to shutdown the server. /// [Route("/System/Shutdown", "POST", Summary = "Shuts down the application")] public class ShutdownApplication { // TODO: This is not currently authenticated due to uninstaller // Improve later } [Route("/System/Logs", "GET", Summary = "Gets a list of available server log files")] [Authenticated(Roles = "Admin")] public class GetServerLogs : IReturn> { } [Route("/System/Endpoint", "GET", Summary = "Gets information about the request endpoint")] [Authenticated] public class GetEndpointInfo : IReturn { public string Endpoint { get; set; } } [Route("/System/Logs/Log", "GET", Summary = "Gets a log file")] [Authenticated(Roles = "Admin")] public class GetLogFile { [ApiMember(Name = "Name", Description = "The log file name.", IsRequired = true, DataType = "string", ParameterType = "query", Verb = "GET", AllowMultiple = true)] public string Name { get; set; } } [Route("/System/SupporterInfo", "GET")] [Authenticated] public class GetSupporterInfo : IReturn { } /// /// Class SystemInfoService /// public class SystemService : BaseApiService { /// /// The _app host /// private readonly IServerApplicationHost _appHost; private readonly IApplicationPaths _appPaths; private readonly IFileSystem _fileSystem; private readonly INetworkManager _network; private readonly ISecurityManager _security; /// /// Initializes a new instance of the class. /// /// The app host. /// The application paths. /// The file system. /// jsonSerializer public SystemService(IServerApplicationHost appHost, IApplicationPaths appPaths, IFileSystem fileSystem, INetworkManager network, ISecurityManager security) { _appHost = appHost; _appPaths = appPaths; _fileSystem = fileSystem; _network = network; _security = security; } public async Task Get(GetSupporterInfo request) { var result = await _security.GetSupporterInfo().ConfigureAwait(false); return ToOptimizedResult(result); } public object Post(PingSystem request) { return _appHost.Name; } public object Get(GetServerLogs request) { List files; try { files = _fileSystem.GetFiles(_appPaths.LogDirectoryPath) .Where(i => string.Equals(i.Extension, ".txt", StringComparison.OrdinalIgnoreCase)) .ToList(); } catch (DirectoryNotFoundException) { files = new List(); } var result = files.Select(i => new LogFile { DateCreated = _fileSystem.GetCreationTimeUtc(i), DateModified = _fileSystem.GetLastWriteTimeUtc(i), Name = i.Name, Size = i.Length }).OrderByDescending(i => i.DateModified) .ThenByDescending(i => i.DateCreated) .ThenBy(i => i.Name) .ToList(); return ToOptimizedResult(result); } public object Get(GetLogFile request) { var file = _fileSystem.GetFiles(_appPaths.LogDirectoryPath) .First(i => string.Equals(i.Name, request.Name, StringComparison.OrdinalIgnoreCase)); return ResultFactory.GetStaticFileResult(Request, file.FullName, FileShare.ReadWrite); } /// /// Gets the specified request. /// /// The request. /// System.Object. public object Get(GetSystemInfo request) { var result = _appHost.GetSystemInfo(); return ToOptimizedResult(result); } public object Get(GetPublicSystemInfo request) { var result = _appHost.GetSystemInfo(); var publicInfo = new PublicSystemInfo { Id = result.Id, ServerName = result.ServerName, Version = result.Version, LocalAddress = result.LocalAddress, WanAddress = result.WanAddress, OperatingSystem = result.OperatingSystem }; return ToOptimizedResult(publicInfo); } /// /// Posts the specified request. /// /// The request. public void Post(RestartApplication request) { Task.Run(async () => { await Task.Delay(100).ConfigureAwait(false); await _appHost.Restart().ConfigureAwait(false); }); } /// /// Posts the specified request. /// /// The request. public void Post(ShutdownApplication request) { Task.Run(async () => { await Task.Delay(100).ConfigureAwait(false); await _appHost.Shutdown().ConfigureAwait(false); }); } public object Get(GetEndpointInfo request) { return ToOptimizedResult(new EndpointInfo { IsLocal = Request.IsLocal, IsInNetwork = _network.IsInLocalNetwork(request.Endpoint ?? Request.RemoteIp) }); } } public class EndpointInfo { public bool IsLocal { get; set; } public bool IsInNetwork { get; set; } } }