using System.Diagnostics;
using System.Management;
using System.Runtime.InteropServices;
using JNPF.Common.Model.Machine;
using JNPF.DependencyInjection;
namespace JNPF.Common.Security;
///
/// 获取服务器信息.
///
[SuppressSniffer]
public static class MachineHelper
{
#region Linux
///
/// 系统信息.
///
///
public static SystemInfoModel GetSystemInfo_Linux()
{
try
{
var systemInfo = new SystemInfoModel();
var process = new Process
{
StartInfo = new ProcessStartInfo("ifconfig")
{
RedirectStandardOutput = true,
UseShellExecute = false
}
};
process.Start();
var hddInfo = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Dispose();
process.Close();
var lines = hddInfo.Split('\n');
foreach (var item in lines)
{
if (item.Contains("inet"))
{
var li = item.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
systemInfo.ip = li[1];
break;
}
}
TimeSpan P_TimeSpan = DateTime.Now.Subtract(DateTime.Now);
systemInfo.os = RuntimeInformation.OSDescription;
systemInfo.day = FormatTime((long)(DateTimeOffset.Now - Process.GetCurrentProcess().StartTime).TotalMilliseconds);
return systemInfo;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
///
/// CPU信息
///
///
public static CpuInfoModel GetCpuInfo_Linux()
{
var cpuInfo = new CpuInfoModel();
cpuInfo.core = Environment.ProcessorCount + "个物理核心";
cpuInfo.logic = Environment.ProcessorCount + "个逻辑CPU";
cpuInfo.package = Environment.ProcessorCount + "个物理CPU";
cpuInfo.coreNumber = Environment.ProcessorCount;
var cpuInfoList = (File.ReadAllText(@"/proc/cpuinfo")).Split(' ').Where(o => o != string.Empty).ToList();
cpuInfo.name = string.Format("{0} {1} {2}", cpuInfoList[7], cpuInfoList[8], cpuInfoList[9]);
var psi = new ProcessStartInfo("top", " -b -n 1") { RedirectStandardOutput = true };
var proc = Process.Start(psi);
if (proc == null)
{
return cpuInfo;
}
else
{
using (var sr = proc.StandardOutput)
{
var index = 0;
while (!sr.EndOfStream)
{
if (index == 2)
{
GetCpuUsed(sr.ReadLine(), cpuInfo);
break;
}
sr.ReadLine();
index++;
}
if (!proc.HasExited)
{
proc.Kill();
}
}
}
return cpuInfo;
}
///
/// 硬盘信息.
///
///
public static DiskInfoModel GetDiskInfo_Linux()
{
var output = new DiskInfoModel();
var process = new Process
{
StartInfo = new ProcessStartInfo("df", "-h /")
{
RedirectStandardOutput = true,
UseShellExecute = false
}
};
process.Start();
var hddInfo = process.StandardOutput.ReadToEnd();
process.WaitForExit();
process.Dispose();
var lines = hddInfo.Split('\n');
foreach (var item in lines)
{
if (item.Contains("/dev/sda4") || item.Contains("/dev/mapper/cl-root") || item.Contains("/dev/mapper/centos-root"))
{
var li = item.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < li.Length; i++)
{
if (li[i].Contains("%"))
{
output = new DiskInfoModel()
{
total = li[i - 3],
used = li[i - 2],
available = li[i - 1],
usageRate = li[i].Replace("%", string.Empty)
};
break;
}
}
}
}
return output;
}
///
/// 内存信息.
///
///
public static MemoryInfoModel GetMemoryInfo_Linux()
{
var output = new MemoryInfoModel();
const string CPU_FILE_PATH = "/proc/meminfo";
var mem_file_info = File.ReadAllText(CPU_FILE_PATH);
var lines = mem_file_info.Split(new[] { '\n' });
int count = 0;
foreach (var item in lines)
{
if (item.StartsWith("MemTotal:"))
{
count++;
var tt = item.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
output.total = tt[1].Trim();
}
else if (item.StartsWith("MemAvailable:"))
{
count++;
var tt = item.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
output.available = tt[1].Trim();
}
if (count >= 2) break;
}
long total = long.Parse(output.total.Replace(" kB", string.Empty));
long available = long.Parse(output.available.Replace(" kB", string.Empty));
long used = total - available;
decimal usageRate = (decimal)used / (decimal)total;
output.usageRate = (Math.Round(usageRate, 2, MidpointRounding.AwayFromZero) * 100).ToString();
output.used = used.ToString() + " kB";
return output;
}
///
/// 获取cpu使用率.
///
/// %Cpu(s): 3.2 us, 0.0 sy, 0.0 ni, 96.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st.
///
private static void GetCpuUsed(string cpuInfo, CpuInfoModel cpuOutput)
{
try
{
var str = cpuInfo.Replace("%Cpu(s):", string.Empty).Trim();
var list = str.Split(",").ToList();
var dic = new Dictionary();
foreach (var item in list)
{
var key = item.Substring(item.Length - 2, 2);
dic[key] = item.Replace(key, string.Empty);
}
cpuOutput.used = dic["us"];
cpuOutput.idle = dic["id"];
}
catch (Exception)
{
}
}
#endregion
#region Windows
///
/// 系统信息.
///
///
public static SystemInfoModel GetSystemInfo_Windows()
{
try
{
var systemInfo = new SystemInfoModel();
ManagementClass MC = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection MOC = MC.GetInstances();
foreach (ManagementObject MO in MOC)
{
if ((bool)MO["IPEnabled"] == true)
{
string[] IPAddresses = (string[])MO["IPAddress"]; //获取本地的IP地址
if (IPAddresses.Length > 0)
systemInfo.ip = IPAddresses[0];
}
}
systemInfo.day = FormatTime((long)(DateTimeOffset.Now - Process.GetCurrentProcess().StartTime).TotalMilliseconds);
return systemInfo;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
///
/// CPU信息
///
///
public static CpuInfoModel GetCpuInfo_Windows()
{
var cpuInfo = new CpuInfoModel();
ManagementObjectSearcher mos = new ManagementObjectSearcher("Select * from Win32_Processor");
foreach (ManagementObject mo in mos.Get())
{
cpuInfo.name = mo["Name"].ToString();
cpuInfo.coreNumber = int.Parse(mo["NumberOfCores"].ToString());
cpuInfo.core = mo["NumberOfCores"].ToString() + "个物理核心";
}
foreach (var item in new ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
cpuInfo.package = item["NumberOfProcessors"].ToString() + "个物理CPU";
cpuInfo.logic = item["NumberOfLogicalProcessors"].ToString() + "个逻辑CPU";
}
PerformanceCounter oPerformanceCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
cpuInfo.used = Math.Round((decimal)oPerformanceCounter.NextValue(), 2, MidpointRounding.AwayFromZero).ToString();
cpuInfo.idle = (100 - Convert.ToDouble(oPerformanceCounter.NextValue().ToString())).ToString() + "%";
return cpuInfo;
}
///
/// 硬盘信息.
///
///
public static DiskInfoModel GetDiskInfo_Windows()
{
var output = new DiskInfoModel();
long total = 0L;
long available = 0L;
foreach (var item in new ManagementObjectSearcher("Select * from win32_logicaldisk").Get())
{
available += Convert.ToInt64(item["FreeSpace"]);
total += Convert.ToInt64(item["Size"]);
}
long used = total - available;
decimal usageRate = (decimal)used / (decimal)total;
output.total = (total / (1024 * 1024 * 1024)).ToString() + "G";
output.available = (available / (1024 * 1024 * 1024)).ToString() + "G";
output.used = (used / (1024 * 1024 * 1024)).ToString() + "G";
output.usageRate = Math.Round(usageRate, 2, MidpointRounding.AwayFromZero).ToString();
return output;
}
///
/// 内存信息.
///
///
public static MemoryInfoModel GetMemoryInfo_Windows()
{
var output = new MemoryInfoModel();
#region 旧代码
long bcs = 1024 * 1024 * 1024;
long total = 0;
long available = 0;
long used = 0;
double usageRate = 0.00;
ManagementClass mc = new ManagementClass("Win32_ComputerSystem");
ManagementObjectCollection moc = mc.GetInstances();
foreach (ManagementObject mo in moc)
{
total = Convert.ToInt64(mo["TotalPhysicalMemory"]);
}
foreach (var item in new ManagementObjectSearcher("Select * from Win32_OperatingSystem").Get())
{
available = Convert.ToInt64(item["FreePhysicalMemory"]);
}
used = total - available;
usageRate = used / total;
output.total = (total / bcs).ToString() + "G";
output.available = (available / bcs).ToString() + "G";
output.used = (used / bcs).ToString() + "G";
output.usageRate = Math.Round((decimal)usageRate, 2, MidpointRounding.AwayFromZero).ToString();
#endregion
return output;
}
///
/// 毫秒转天时分秒.
///
///
///
private static string FormatTime(long ms)
{
int ss = 1000;
int mi = ss * 60;
int hh = mi * 60;
int dd = hh * 24;
long day = ms / dd;
long hour = (ms - day * dd) / hh;
long minute = (ms - day * dd - hour * hh) / mi;
long second = (ms - day * dd - hour * hh - minute * mi) / ss;
string sDay = day < 10 ? "0" + day : string.Empty + day; // 天
string sHour = hour < 10 ? "0" + hour : string.Empty + hour; // 小时
string sMinute = minute < 10 ? "0" + minute : string.Empty + minute; // 分钟
string sSecond = second < 10 ? "0" + second : string.Empty + second; // 秒
return string.Format("{0} 天 {1} 小时 {2} 分 {3} 秒", sDay, sHour, sMinute, sSecond);
}
#endregion
}