oqtane.framework/Oqtane.Server/Controllers/SystemController.cs
2025-01-29 12:39:47 -05:00

137 lines
5.9 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using System.Collections.Generic;
using Oqtane.Shared;
using System;
using Microsoft.AspNetCore.Hosting;
using Oqtane.Infrastructure;
using Microsoft.AspNetCore.Http.Features;
using System.IO;
namespace Oqtane.Controllers
{
[Route(ControllerRoutes.ApiRoute)]
public class SystemController : Controller
{
private readonly IWebHostEnvironment _environment;
private readonly IConfigManager _configManager;
public SystemController(IWebHostEnvironment environment, IConfigManager configManager)
{
_environment = environment;
_configManager = configManager;
}
// GET: api/<controller>?type=x
[HttpGet]
[Authorize(Roles = RoleNames.Host)]
public Dictionary<string, object> Get(string type)
{
Dictionary<string, object> systeminfo = new Dictionary<string, object>();
switch (type.ToLower())
{
case "environment":
systeminfo.Add("CLRVersion", Environment.Version.ToString());
systeminfo.Add("OSVersion", Environment.OSVersion.ToString());
systeminfo.Add("Process", (Environment.Is64BitProcess) ? "64 Bit" : "32 Bit");
systeminfo.Add("MachineName", Environment.MachineName);
systeminfo.Add("WorkingSet", Environment.WorkingSet.ToString());
systeminfo.Add("TickCount", Environment.TickCount64.ToString());
systeminfo.Add("ContentRootPath", _environment.ContentRootPath);
systeminfo.Add("WebRootPath", _environment.WebRootPath);
systeminfo.Add("Environment", _environment.EnvironmentName);
systeminfo.Add("ServerTime", DateTime.UtcNow.ToString());
var feature = HttpContext.Features.Get<IHttpConnectionFeature>();
systeminfo.Add("IPAddress", feature?.LocalIpAddress?.ToString());
break;
case "configuration":
systeminfo.Add("InstallationId", _configManager.GetInstallationId());
systeminfo.Add("RenderMode", _configManager.GetSetting("RenderMode", RenderModes.Interactive));
systeminfo.Add("Runtime", _configManager.GetSetting("Runtime", Runtimes.Server));
systeminfo.Add("DetailedErrors", _configManager.GetSetting("DetailedErrors", "false"));
systeminfo.Add("Logging:LogLevel:Default", _configManager.GetSetting("Logging:LogLevel:Default", "Information"));
systeminfo.Add("Logging:LogLevel:Notify", _configManager.GetSetting("Logging:LogLevel:Notify", "Error"));
systeminfo.Add("UseSwagger", _configManager.GetSetting("UseSwagger", "true"));
systeminfo.Add("CacheControl", _configManager.GetSetting("CacheControl", ""));
systeminfo.Add("PackageRegistryUrl", _configManager.GetSetting("PackageRegistryUrl", Constants.PackageRegistryUrl));
systeminfo.Add("PackageRegistryEmail", _configManager.GetSetting("PackageRegistryEmail", ""));
break;
case "log":
string log = "";
string path = Path.Combine(_environment.ContentRootPath, "Content", "Log", "error.log");
if (System.IO.File.Exists(path))
{
log = System.IO.File.ReadAllText(path);
}
systeminfo.Add("Log", log);
break;
case "connectionstrings":
foreach (var kvp in _configManager.GetSettings(SettingKeys.ConnectionStringsSection))
{
systeminfo.Add(kvp.Key, kvp.Value);
}
break;
}
return systeminfo;
}
// GET: api/<controller>
[HttpGet("{key}/{value}")]
[Authorize(Roles = RoleNames.Host)]
public object Get(string key, object value)
{
return _configManager.GetSetting(key, value);
}
// POST: api/<controller>
[HttpPost]
[Authorize(Roles = RoleNames.Host)]
public void Post([FromBody] Dictionary<string, object> settings)
{
foreach(KeyValuePair<string, object> kvp in settings)
{
UpdateSetting(kvp.Key, kvp.Value);
}
}
// GET: api/<controller>/icons
[HttpGet("icons")]
public Dictionary<string, string> Get()
{
var icons = new Dictionary<string, string>();
// use reflection to get list of icons from Icons class
Type iconsType = typeof(Icons);
System.Reflection.FieldInfo[] fields = iconsType.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.GetField);
foreach (System.Reflection.FieldInfo field in fields)
{
if (field.FieldType == typeof(string))
{
icons.Add((string)field.GetValue(null), field.Name); // ie. ("oi oi-home", "Home")
}
}
return icons;
}
private void UpdateSetting(string key, object value)
{
switch (key.ToLower())
{
case "clearlog":
string path = Path.Combine(_environment.ContentRootPath, "Content", "Log", "error.log");
if (System.IO.File.Exists(path))
{
System.IO.File.Delete(path);
}
break;
default:
_configManager.AddOrUpdateSetting(key, value, false);
break;
}
}
}
}