aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Api/System
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Api/System')
-rw-r--r--MediaBrowser.Api/System/ActivityLogService.cs44
-rw-r--r--MediaBrowser.Api/System/SystemInfoWebSocketListener.cs49
-rw-r--r--MediaBrowser.Api/System/SystemService.cs178
3 files changed, 271 insertions, 0 deletions
diff --git a/MediaBrowser.Api/System/ActivityLogService.cs b/MediaBrowser.Api/System/ActivityLogService.cs
new file mode 100644
index 000000000..0ccc28c6f
--- /dev/null
+++ b/MediaBrowser.Api/System/ActivityLogService.cs
@@ -0,0 +1,44 @@
+using MediaBrowser.Controller.Activity;
+using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.Activity;
+using MediaBrowser.Model.Querying;
+using ServiceStack;
+
+namespace MediaBrowser.Api.System
+{
+ [Route("/System/ActivityLog/Entries", "GET", Summary = "Gets activity log entries")]
+ public class GetActivityLogs : IReturn<QueryResult<ActivityLogEntry>>
+ {
+ /// <summary>
+ /// Skips over a given number of items within the results. Use for paging.
+ /// </summary>
+ /// <value>The start index.</value>
+ [ApiMember(Name = "StartIndex", Description = "Optional. The record index to start at. All items with a lower index will be dropped from the results.", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
+ public int? StartIndex { get; set; }
+
+ /// <summary>
+ /// The maximum number of items to return
+ /// </summary>
+ /// <value>The limit.</value>
+ [ApiMember(Name = "Limit", Description = "Optional. The maximum number of records to return", IsRequired = false, DataType = "int", ParameterType = "query", Verb = "GET")]
+ public int? Limit { get; set; }
+ }
+
+ [Authenticated]
+ public class ActivityLogService : BaseApiService
+ {
+ private readonly IActivityManager _activityManager;
+
+ public ActivityLogService(IActivityManager activityManager)
+ {
+ _activityManager = activityManager;
+ }
+
+ public object Get(GetActivityLogs request)
+ {
+ var result = _activityManager.GetActivityLogEntries(request.StartIndex, request.Limit);
+
+ return ToOptimizedResult(result);
+ }
+ }
+}
diff --git a/MediaBrowser.Api/System/SystemInfoWebSocketListener.cs b/MediaBrowser.Api/System/SystemInfoWebSocketListener.cs
new file mode 100644
index 000000000..c20cef3b3
--- /dev/null
+++ b/MediaBrowser.Api/System/SystemInfoWebSocketListener.cs
@@ -0,0 +1,49 @@
+using MediaBrowser.Common.Net;
+using MediaBrowser.Controller;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.Model.System;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Api.System
+{
+ /// <summary>
+ /// Class SystemInfoWebSocketListener
+ /// </summary>
+ public class SystemInfoWebSocketListener : BasePeriodicWebSocketListener<SystemInfo, WebSocketListenerState>
+ {
+ /// <summary>
+ /// Gets the name.
+ /// </summary>
+ /// <value>The name.</value>
+ protected override string Name
+ {
+ get { return "SystemInfo"; }
+ }
+
+ /// <summary>
+ /// The _kernel
+ /// </summary>
+ private readonly IServerApplicationHost _appHost;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="SystemInfoWebSocketListener" /> class.
+ /// </summary>
+ /// <param name="logger">The logger.</param>
+ /// <param name="appHost">The app host.</param>
+ public SystemInfoWebSocketListener(ILogger logger, IServerApplicationHost appHost)
+ : base(logger)
+ {
+ _appHost = appHost;
+ }
+
+ /// <summary>
+ /// Gets the data to send.
+ /// </summary>
+ /// <param name="state">The state.</param>
+ /// <returns>Task{SystemInfo}.</returns>
+ protected override Task<SystemInfo> GetDataToSend(WebSocketListenerState state)
+ {
+ return Task.FromResult(_appHost.GetSystemInfo());
+ }
+ }
+}
diff --git a/MediaBrowser.Api/System/SystemService.cs b/MediaBrowser.Api/System/SystemService.cs
new file mode 100644
index 000000000..3913275ee
--- /dev/null
+++ b/MediaBrowser.Api/System/SystemService.cs
@@ -0,0 +1,178 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller;
+using MediaBrowser.Controller.Net;
+using MediaBrowser.Model.System;
+using ServiceStack;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.Api.System
+{
+ /// <summary>
+ /// Class GetSystemInfo
+ /// </summary>
+ [Route("/System/Info", "GET", Summary = "Gets information about the server")]
+ [Authenticated]
+ public class GetSystemInfo : IReturn<SystemInfo>
+ {
+
+ }
+
+ [Route("/System/Info/Public", "GET", Summary = "Gets public information about the server")]
+ public class GetPublicSystemInfo : IReturn<PublicSystemInfo>
+ {
+
+ }
+
+ /// <summary>
+ /// Class RestartApplication
+ /// </summary>
+ [Route("/System/Restart", "POST", Summary = "Restarts the application, if needed")]
+ [Authenticated]
+ public class RestartApplication
+ {
+ }
+
+ [Route("/System/Shutdown", "POST", Summary = "Shuts down the application")]
+ [Authenticated]
+ public class ShutdownApplication
+ {
+ }
+
+ [Route("/System/Logs", "GET", Summary = "Gets a list of available server log files")]
+ [Authenticated]
+ public class GetServerLogs : IReturn<List<LogFile>>
+ {
+ }
+
+ [Route("/System/Logs/Log", "GET", Summary = "Gets a log file")]
+ 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; }
+ }
+
+ /// <summary>
+ /// Class SystemInfoService
+ /// </summary>
+ public class SystemService : BaseApiService
+ {
+ /// <summary>
+ /// The _app host
+ /// </summary>
+ private readonly IServerApplicationHost _appHost;
+ private readonly IApplicationPaths _appPaths;
+ private readonly IFileSystem _fileSystem;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="SystemService" /> class.
+ /// </summary>
+ /// <param name="appHost">The app host.</param>
+ /// <param name="appPaths">The application paths.</param>
+ /// <param name="fileSystem">The file system.</param>
+ /// <exception cref="ArgumentNullException">jsonSerializer</exception>
+ public SystemService(IServerApplicationHost appHost, IApplicationPaths appPaths, IFileSystem fileSystem)
+ {
+ _appHost = appHost;
+ _appPaths = appPaths;
+ _fileSystem = fileSystem;
+ }
+
+ public object Get(GetServerLogs request)
+ {
+ List<FileInfo> files;
+
+ try
+ {
+ files = new DirectoryInfo(_appPaths.LogDirectoryPath)
+ .EnumerateFiles("*", SearchOption.AllDirectories)
+ .Where(i => string.Equals(i.Extension, ".txt", global::System.StringComparison.OrdinalIgnoreCase))
+ .ToList();
+ }
+ catch (DirectoryNotFoundException)
+ {
+ files = new List<FileInfo>();
+ }
+
+ 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 = new DirectoryInfo(_appPaths.LogDirectoryPath)
+ .EnumerateFiles("*", SearchOption.AllDirectories)
+ .First(i => string.Equals(i.Name, request.Name, global::System.StringComparison.OrdinalIgnoreCase));
+
+ return ResultFactory.GetStaticFileResult(Request, file.FullName, FileShare.ReadWrite);
+ }
+
+ /// <summary>
+ /// Gets the specified request.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ /// <returns>System.Object.</returns>
+ 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
+ };
+
+ return ToOptimizedResult(publicInfo);
+ }
+
+ /// <summary>
+ /// Posts the specified request.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ public void Post(RestartApplication request)
+ {
+ Task.Run(async () =>
+ {
+ await Task.Delay(100).ConfigureAwait(false);
+ await _appHost.Restart().ConfigureAwait(false);
+ });
+ }
+
+ /// <summary>
+ /// Posts the specified request.
+ /// </summary>
+ /// <param name="request">The request.</param>
+ public void Post(ShutdownApplication request)
+ {
+ Task.Run(async () =>
+ {
+ await Task.Delay(100).ConfigureAwait(false);
+ await _appHost.Shutdown().ConfigureAwait(false);
+ });
+ }
+
+ }
+}