ServerUtil.cs 6.6 KB

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