ServerUtil.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. using Furion;
  2. using Furion.RemoteRequest.Extensions;
  3. using SqlSugar;
  4. using System;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace Admin.NET.Core
  11. {
  12. /// <summary>
  13. /// 服务器信息
  14. /// </summary>
  15. public class ServerUtil
  16. {
  17. /// <summary>
  18. /// 服务器基本配置
  19. /// </summary>
  20. /// <returns></returns>
  21. public static dynamic GetServerBaseInfo()
  22. {
  23. var furionAssembly = typeof(Furion.App).Assembly.GetName();
  24. var sqlSugarAssembly = typeof(ISqlSugarClient).Assembly.GetName();
  25. return new
  26. {
  27. HostName = Environment.MachineName, // HostName
  28. SystemOs = RuntimeInformation.OSDescription, // 系统名称
  29. OsArchitecture = Environment.OSVersion.Platform.ToString() + " " + RuntimeInformation.OSArchitecture.ToString(), // 系统架构
  30. ProcessorCount = Environment.ProcessorCount.ToString() + " 核", // CPU核心数
  31. FrameworkDescription = RuntimeInformation.FrameworkDescription + " / " +
  32. furionAssembly.Name.ToString() + " " + furionAssembly.Version.ToString() + " / " +
  33. sqlSugarAssembly.Name.ToString() + " " + sqlSugarAssembly.Version.ToString(), // .NET、Furion、SqlSugar
  34. };
  35. }
  36. /// <summary>
  37. /// 服务器使用资源
  38. /// </summary>
  39. /// <returns></returns>
  40. public static dynamic GetServerUseInfo()
  41. {
  42. var ramInfo = GetRamInfo();
  43. return new
  44. {
  45. TotalRam = Math.Ceiling(ramInfo.Total / 1024).ToString() + " GB", // 总内存
  46. RamRate = Math.Ceiling(100 * ramInfo.Used / ramInfo.Total) + " %", // 内存使用率
  47. CpuRate = Math.Ceiling(double.Parse(GetCpuRate())) + " %", // Cpu使用率
  48. RunTime = GetRunTime()
  49. };
  50. }
  51. /// <summary>
  52. /// 服务器网络信息
  53. /// </summary>
  54. /// <returns></returns>
  55. public static async Task<dynamic> GetServerNetWorkInfo()
  56. {
  57. return new
  58. {
  59. WanIp = await GetWanIpFromPCOnline(), // 外网IP
  60. LocalIp = App.HttpContext?.Connection?.LocalIpAddress.ToString(),
  61. SendAndReceived = "", //"上行" + Math.Round(networkInfo.SendLength / 1024.0 / 1024 / 1024, 2) + "GB 下行" + Math.Round(networkInfo.ReceivedLength / 1024.0 / 1024 / 1024, 2) + "GB", // 上下行流量统计
  62. NetworkSpeed = "" //"上行" + Send / 1024 + "kb/s 下行" + Received / 1024 + "kb/s" // 网络速度
  63. };
  64. }
  65. /// <summary>
  66. /// 内存信息
  67. /// </summary>
  68. /// <returns></returns>
  69. private static dynamic GetRamInfo()
  70. {
  71. if (IsUnix())
  72. {
  73. var output = ShellUtil.Bash("free -m");
  74. var lines = output.Split("\n");
  75. var memory = lines[1].Split(" ", StringSplitOptions.RemoveEmptyEntries);
  76. return new
  77. {
  78. Total = double.Parse(memory[1]),
  79. Used = double.Parse(memory[2]),
  80. Free = double.Parse(memory[3])
  81. };
  82. }
  83. else
  84. {
  85. var output = ShellUtil.Cmd("wmic", "OS get FreePhysicalMemory,TotalVisibleMemorySize /Value");
  86. var lines = output.Trim().Split("\n");
  87. var freeMemoryParts = lines[0].Split("=", StringSplitOptions.RemoveEmptyEntries);
  88. var totalMemoryParts = lines[1].Split("=", StringSplitOptions.RemoveEmptyEntries);
  89. var total = Math.Round(double.Parse(totalMemoryParts[1]) / 1024, 2);
  90. var free = Math.Round(double.Parse(freeMemoryParts[1]) / 1024, 2);
  91. return new
  92. {
  93. Total = total,
  94. Free = free,
  95. Used = total - free
  96. };
  97. }
  98. }
  99. /// <summary>
  100. /// CPU信息
  101. /// </summary>
  102. /// <returns></returns>
  103. private static string GetCpuRate()
  104. {
  105. string cpuRate;
  106. if (IsUnix())
  107. {
  108. var output = ShellUtil.Bash("top -b -n1 | grep \"Cpu(s)\" | awk '{print $2 + $4}'");
  109. cpuRate = output.Trim();
  110. }
  111. else
  112. {
  113. var output = ShellUtil.Cmd("wmic", "cpu get LoadPercentage");
  114. cpuRate = output.Replace("LoadPercentage", string.Empty).Trim();
  115. }
  116. return cpuRate;
  117. }
  118. /// <summary>
  119. /// 系统运行时间
  120. /// </summary>
  121. /// <returns></returns>
  122. private static string GetRunTime()
  123. {
  124. return FormatTime((long)(DateTimeOffset.Now - Process.GetCurrentProcess().StartTime).TotalMilliseconds);
  125. //return DateTimeUtil.FormatTime(Environment.TickCount);
  126. }
  127. /// <summary>
  128. /// 是否Linux
  129. /// </summary>
  130. /// <returns></returns>
  131. private static bool IsUnix()
  132. {
  133. return RuntimeInformation.IsOSPlatform(OSPlatform.OSX) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
  134. }
  135. /// <summary>
  136. /// 毫秒转天时分秒
  137. /// </summary>
  138. /// <param name="ms"></param>
  139. /// <returns></returns>
  140. private static string FormatTime(long ms)
  141. {
  142. int ss = 1000;
  143. int mi = ss * 60;
  144. int hh = mi * 60;
  145. int dd = hh * 24;
  146. long day = ms / dd;
  147. long hour = (ms - day * dd) / hh;
  148. long minute = (ms - day * dd - hour * hh) / mi;
  149. long second = (ms - day * dd - hour * hh - minute * mi) / ss;
  150. //long milliSecond = ms - day * dd - hour * hh - minute * mi - second * ss;
  151. string sDay = day < 10 ? "0" + day : "" + day; //天
  152. string sHour = hour < 10 ? "0" + hour : "" + hour;//小时
  153. string sMinute = minute < 10 ? "0" + minute : "" + minute;//分钟
  154. string sSecond = second < 10 ? "0" + second : "" + second;//秒
  155. //string sMilliSecond = milliSecond < 10 ? "0" + milliSecond : "" + milliSecond;//毫秒
  156. //sMilliSecond = milliSecond < 100 ? "0" + sMilliSecond : "" + sMilliSecond;
  157. return string.Format("{0} 天 {1} 小时 {2} 分 {3} 秒", sDay, sHour, sMinute, sSecond);
  158. }
  159. /// <summary>
  160. /// 获取外网IP和位置
  161. /// </summary>
  162. /// <returns></returns>
  163. private static async Task<string> GetWanIpFromPCOnline()
  164. {
  165. Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
  166. var url = "http://whois.pconline.com.cn/ipJson.jsp";
  167. var stream = await url.GetAsStreamAsync();
  168. var streamReader = new StreamReader(stream, Encoding.GetEncoding("GBK"));
  169. var html = streamReader.ReadToEnd();
  170. var tmp = html[(html.IndexOf("({") + 2)..].Split(",");
  171. var ipAddr = tmp[0].Split(":")[1] + "【" + tmp[7].Split(":")[1] + "】";
  172. return ipAddr.Replace("\"", "");
  173. }
  174. }
  175. }