irc-netcore-api/IRaCIS.Core.Application/Service/Common/SystemMonitor.cs

147 lines
4.8 KiB
C#

using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Infrastructure;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
namespace IRaCIS.Core.Application.Service.Common
{
[ApiExplorerSettings(GroupName = "Common")]
public class SystemMonitor(IStringLocalizer _localizer, IWebHostEnvironment _hostEnvironment) : BaseService
{
public void GetDiskInfo()
{
// Get all drives
var drives = DriveInfo.GetDrives();
// Loop through each drive and get info
foreach (var drive in drives)
{
if (drive.IsReady && drive.DriveType == DriveType.Fixed)
{
long totalSize = drive.TotalSize;
long availableSpace = drive.AvailableFreeSpace;
long usedSpace = totalSize - availableSpace;
double usedSpacePercent = (double)usedSpace / totalSize * 100;
Console.WriteLine($"Drive {drive.Name}: Total size = {totalSize / (1024 * 1024)} MB, Available space = {availableSpace / (1024 * 1024)} MB, Used space = {usedSpace / (1024 * 1024)} MB ({usedSpacePercent:F2}%)");
}
}
}
public string GetBestStoreDisk()
{
var json = File.ReadAllText("appsettings.json");
JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load });
int switchingRatio = 80;
try
{
switchingRatio = (int)jsonObject["IRaCISImageStore"]["SwitchingRatio"];
}
catch (Exception e)
{
//---解析Json文件配置出现问题
throw new BusinessValidationFailedException(_localizer["SysMon_JsonConfig"] + e.Message);
}
//默认存储的路径
var defaultStoreRootFolder = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment);
DriveInfo defaultDrive = new DriveInfo(Path.GetPathRoot(defaultStoreRootFolder));
var drives = DriveInfo.GetDrives().Where(t => !t.Name.Contains("C") && !t.Name.Contains("c"))
.Where(d => d.DriveType == DriveType.Fixed && d.IsReady)
//剩余空间最多的
.OrderByDescending(d => d.AvailableFreeSpace)
//存储空间相同,则按照按照总空间从大到小排序
.ThenByDescending(d => d.TotalSize - d.TotalFreeSpace);
var bestDrive = drives.FirstOrDefault();
var bestStoreRootFolder = string.Empty;
//仅仅只有C 盘
if (bestDrive == null || ((double)(defaultDrive.TotalSize - defaultDrive.TotalFreeSpace) / defaultDrive.TotalSize) * 100 < switchingRatio)
{
bestStoreRootFolder = defaultStoreRootFolder;
}
else
{
bestStoreRootFolder = Path.Combine(bestDrive?.RootDirectory.FullName, _hostEnvironment.EnvironmentName);
}
////找到最优驱动器
//DriveInfo drive = new DriveInfo(Path.GetPathRoot(bestStoreRootFolder));
////最优盘符使用率超过百分之80
//if (((double)(drive.TotalSize - drive.TotalFreeSpace) / drive.TotalSize) * 100 > switchingRatio)
//{
//}
if (!Directory.Exists(bestStoreRootFolder))
{
Directory.CreateDirectory(bestStoreRootFolder);
}
return bestStoreRootFolder;
}
public class GeneralRule
{
public string Endpoint { get; set; }
public string Period { get; set; }
public int Limit { get; set; }
}
public void UpdateAppSettings(string key, string newValue)
{
List<GeneralRule> generalRules = new List<GeneralRule>()
{
new GeneralRule() { Endpoint = "*", Period = "1s", Limit = 3 },
new GeneralRule() { Endpoint = "*", Period = "15m", Limit = 100 },
new GeneralRule() { Endpoint = "*", Period = "12h", Limit = 1000 },
new GeneralRule() { Endpoint = "*", Period = "7d", Limit = 10000 }
};
// 读取 Json 文件
string jsonFilePath = "appsettings.json";
var json = File.ReadAllText("appsettings.json");
JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load });
// 操作UpdateConfig对象
jsonObject["UpdateConfig"][key] = newValue;
jsonObject["UpdateConfig"]["testArray"] = JArray.FromObject(generalRules);
// 将更改保存回 Json 文件
File.WriteAllText(jsonFilePath, jsonObject.ToString());
}
}
}