SystemController.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. using Common;
  2. using Masuit.MyBlogs.Core.Extensions.Hangfire;
  3. using Masuit.MyBlogs.Core.Hubs;
  4. using Masuit.MyBlogs.Core.Infrastructure.Services.Interface;
  5. using Masuit.MyBlogs.Core.Models.Entity;
  6. using Masuit.MyBlogs.Core.Models.Enum;
  7. using Masuit.Tools;
  8. using Masuit.Tools.Hardware;
  9. using Masuit.Tools.Logging;
  10. using Masuit.Tools.Models;
  11. using Masuit.Tools.Systems;
  12. using Microsoft.AspNetCore.Authorization;
  13. using Microsoft.AspNetCore.Mvc;
  14. using Newtonsoft.Json;
  15. using System;
  16. using System.Collections.Concurrent;
  17. using System.Collections.Generic;
  18. using System.IO;
  19. using System.Linq;
  20. using System.Text;
  21. namespace Masuit.MyBlogs.Core.Controllers
  22. {
  23. /// <summary>
  24. /// 系统设置
  25. /// </summary>
  26. public class SystemController : AdminController
  27. {
  28. /// <summary>
  29. /// 系统设置
  30. /// </summary>
  31. public ISystemSettingService SystemSettingService { get; set; }
  32. /// <summary>
  33. /// 系统设置
  34. /// </summary>
  35. /// <param name="userInfoService"></param>
  36. /// <param name="systemSettingService"></param>
  37. public SystemController(IUserInfoService userInfoService, ISystemSettingService systemSettingService)
  38. {
  39. UserInfoService = userInfoService;
  40. SystemSettingService = systemSettingService;
  41. }
  42. /// <summary>
  43. /// 获取硬件基本信息
  44. /// </summary>
  45. /// <returns></returns>
  46. public ActionResult GetBaseInfo()
  47. {
  48. List<CpuInfo> cpuInfo = SystemInfo.GetCpuInfo();
  49. RamInfo ramInfo = SystemInfo.GetRamInfo();
  50. string osVersion = SystemInfo.GetOsVersion();
  51. var total = new StringBuilder();
  52. var free = new StringBuilder();
  53. var usage = new StringBuilder();
  54. SystemInfo.DiskTotalSpace().ForEach(kv =>
  55. {
  56. total.Append(kv.Key + kv.Value + " | ");
  57. });
  58. SystemInfo.DiskFree().ForEach(kv => free.Append(kv.Key + kv.Value + " | "));
  59. SystemInfo.DiskUsage().ForEach(kv => usage.Append(kv.Key + kv.Value.ToString("P") + " | "));
  60. IList<string> mac = SystemInfo.GetMacAddress();
  61. IList<string> ips = SystemInfo.GetIPAddress();
  62. var span = DateTime.Now - CommonHelper.StartupTime;
  63. var boot = DateTime.Now - SystemInfo.BootTime();
  64. return Json(new
  65. {
  66. runningTime = $"{span.Days}天{span.Hours}小时{span.Minutes}分钟",
  67. bootTime = $"{boot.Days}天{boot.Hours}小时{boot.Minutes}分钟",
  68. cpuInfo,
  69. ramInfo,
  70. osVersion,
  71. diskInfo = new
  72. {
  73. total = total.ToString(),
  74. free = free.ToString(),
  75. usage = usage.ToString()
  76. },
  77. netInfo = new
  78. {
  79. mac,
  80. ips
  81. }
  82. });
  83. }
  84. /// <summary>
  85. /// 获取历史性能计数器
  86. /// </summary>
  87. /// <returns></returns>
  88. public ActionResult GetHistoryList()
  89. {
  90. return Json(new
  91. {
  92. cpu = MyHub.PerformanceCounter.Select(c => new[]
  93. {
  94. c.Time,
  95. c.CpuLoad
  96. }),
  97. mem = MyHub.PerformanceCounter.Select(c => new[]
  98. {
  99. c.Time,
  100. c.MemoryUsage
  101. }),
  102. temp = MyHub.PerformanceCounter.Select(c => new[]
  103. {
  104. c.Time,
  105. c.Temperature
  106. }),
  107. read = MyHub.PerformanceCounter.Select(c => new[]
  108. {
  109. c.Time,
  110. c.DiskRead
  111. }),
  112. write = MyHub.PerformanceCounter.Select(c => new[]
  113. {
  114. c.Time,
  115. c.DiskWrite
  116. }),
  117. down = MyHub.PerformanceCounter.Select(c => new[]
  118. {
  119. c.Time,
  120. c.Download
  121. }),
  122. up = MyHub.PerformanceCounter.Select(c => new[]
  123. {
  124. c.Time,
  125. c.Upload
  126. }),
  127. });
  128. }
  129. /// <summary>
  130. /// 获取设置信息
  131. /// </summary>
  132. /// <returns></returns>
  133. public ActionResult GetSettings()
  134. {
  135. var list = SystemSettingService.GetAll().Select(s => new
  136. {
  137. s.Name,
  138. s.Value
  139. }).ToList();
  140. return ResultData(list);
  141. }
  142. /// <summary>
  143. /// 获取设置项
  144. /// </summary>
  145. /// <param name="name"></param>
  146. /// <returns></returns>
  147. [AllowAnonymous]
  148. public ActionResult GetSetting(string name)
  149. {
  150. var entity = SystemSettingService.GetFirstEntity(s => s.Name.Equals(name));
  151. return ResultData(entity);
  152. }
  153. /// <summary>
  154. /// 保存设置
  155. /// </summary>
  156. /// <param name="sets"></param>
  157. /// <returns></returns>
  158. public ActionResult Save(string sets)
  159. {
  160. SystemSetting[] settings = JsonConvert.DeserializeObject<List<SystemSetting>>(sets).ToArray();
  161. ConcurrentDictionary<string, HashSet<string>> dic = new ConcurrentDictionary<string, HashSet<string>>();
  162. settings.FirstOrDefault(s => s.Name.Equals("DenyArea"))?.Value.Split(',', ',').ForEach(area =>
  163. {
  164. if (CommonHelper.DenyAreaIP.TryGetValue(area, out var hs))
  165. {
  166. dic[area] = hs;
  167. }
  168. else
  169. {
  170. dic[area] = new HashSet<string>();
  171. }
  172. });
  173. CommonHelper.DenyAreaIP = dic;
  174. System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "denyareaip.txt"), CommonHelper.DenyAreaIP.ToJsonString(), Encoding.UTF8);
  175. foreach (var set in settings)
  176. {
  177. var entry = SystemSettingService.GetFirstEntity(s => s.Name.Equals(set.Name));
  178. if (entry is null)
  179. {
  180. SystemSettingService.AddEntity(set);
  181. }
  182. else
  183. {
  184. entry.Value = set.Value;
  185. SystemSettingService.UpdateEntity(entry);
  186. }
  187. }
  188. var b = SystemSettingService.SaveChanges() > 0;
  189. CommonHelper.SystemSettings = SystemSettingService.GetAll().ToDictionary(s => s.Name, s => s.Value); //同步设置
  190. return ResultData(null, b, b ? "设置保存成功!" : "设置保存失败!");
  191. }
  192. /// <summary>
  193. /// 获取状态
  194. /// </summary>
  195. /// <returns></returns>
  196. public ActionResult GetStatus()
  197. {
  198. Array array = Enum.GetValues(typeof(Status));
  199. var list = new List<object>();
  200. foreach (Enum e in array)
  201. {
  202. list.Add(new
  203. {
  204. e,
  205. name = e.GetDisplay()
  206. });
  207. }
  208. return ResultData(list);
  209. }
  210. /// <summary>
  211. /// 邮件测试
  212. /// </summary>
  213. /// <param name="smtp"></param>
  214. /// <param name="user"></param>
  215. /// <param name="pwd"></param>
  216. /// <param name="port"></param>
  217. /// <param name="to"></param>
  218. /// <returns></returns>
  219. public ActionResult MailTest(string smtp, string user, string pwd, int port, string to)
  220. {
  221. try
  222. {
  223. new Email()
  224. {
  225. EnableSsl = true,
  226. Body = "发送成功,网站邮件配置正确!",
  227. SmtpServer = smtp,
  228. Username = user,
  229. Password = pwd,
  230. SmtpPort = port,
  231. Subject = "网站测试邮件",
  232. Tos = to
  233. }.Send();
  234. return ResultData(null, true, "测试邮件发送成功,网站邮件配置正确!");
  235. }
  236. catch (Exception e)
  237. {
  238. return ResultData(null, false, "邮件配置测试失败!错误信息:\r\n" + e.Message + "\r\n\r\n详细堆栈跟踪:\r\n" + e.StackTrace);
  239. }
  240. }
  241. /// <summary>
  242. /// 路径测试
  243. /// </summary>
  244. /// <param name="path"></param>
  245. /// <returns></returns>
  246. public ActionResult PathTest(string path)
  247. {
  248. if (!(path.EndsWith("/") || path.EndsWith("\\")))
  249. {
  250. return ResultData(null, false, "路径不存在");
  251. }
  252. if (path.Equals("/") || path.Equals("\\"))
  253. {
  254. return ResultData(null, true, "根路径正确");
  255. }
  256. try
  257. {
  258. bool b = Directory.Exists(path);
  259. return ResultData(null, b, b ? "根路径正确" : "路径不存在");
  260. }
  261. catch (Exception e)
  262. {
  263. LogManager.Error(GetType(), e);
  264. return ResultData(null, false, "路径格式不正确!错误信息:\r\n" + e.Message + "\r\n\r\n详细堆栈跟踪:\r\n" + e.StackTrace);
  265. }
  266. }
  267. /// <summary>
  268. /// 清空性能计数器缓存
  269. /// </summary>
  270. /// <returns></returns>
  271. public ActionResult ClearPerfCounter()
  272. {
  273. MyHub.PerformanceCounter.Clear();
  274. return Ok();
  275. }
  276. #region 网站防火墙
  277. /// <summary>
  278. /// 获取全局IP黑名单
  279. /// </summary>
  280. /// <returns></returns>
  281. public ActionResult IpBlackList()
  282. {
  283. return ResultData(CommonHelper.DenyIP);
  284. }
  285. /// <summary>
  286. /// 获取地区IP黑名单
  287. /// </summary>
  288. /// <returns></returns>
  289. public ActionResult AreaIPBlackList()
  290. {
  291. return ResultData(CommonHelper.DenyAreaIP);
  292. }
  293. /// <summary>
  294. /// 获取IP地址段黑名单
  295. /// </summary>
  296. /// <returns></returns>
  297. public ActionResult GetIPRangeBlackList()
  298. {
  299. return ResultData(System.IO.File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "DenyIPRange.txt")));
  300. }
  301. /// <summary>
  302. /// 设置IP地址段黑名单
  303. /// </summary>
  304. /// <returns></returns>
  305. public ActionResult SetIPRangeBlackList(string content)
  306. {
  307. System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "DenyIPRange.txt"), content, Encoding.UTF8);
  308. CommonHelper.DenyIPRange.Clear();
  309. var lines = System.IO.File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "DenyIPRange.txt")).Where(s => s.Split(' ').Length > 2);
  310. foreach (var line in lines)
  311. {
  312. try
  313. {
  314. var strs = line.Split(' ');
  315. CommonHelper.DenyIPRange[strs[0]] = strs[1];
  316. }
  317. catch (IndexOutOfRangeException)
  318. {
  319. }
  320. }
  321. return ResultData(null);
  322. }
  323. /// <summary>
  324. /// 全局IP白名单
  325. /// </summary>
  326. /// <returns></returns>
  327. public ActionResult IpWhiteList()
  328. {
  329. return ResultData(System.IO.File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "whitelist.txt")));
  330. }
  331. /// <summary>
  332. /// 设置IP黑名单
  333. /// </summary>
  334. /// <param name="content"></param>
  335. /// <returns></returns>
  336. public ActionResult SetIpBlackList(string content)
  337. {
  338. CommonHelper.DenyIP = content;
  339. System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "denyip.txt"), CommonHelper.DenyIP, Encoding.UTF8);
  340. return ResultData(null);
  341. }
  342. /// <summary>
  343. /// 设置IP白名单
  344. /// </summary>
  345. /// <param name="content"></param>
  346. /// <returns></returns>
  347. public ActionResult SetIpWhiteList(string content)
  348. {
  349. System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "whitelist.txt"), content, Encoding.UTF8);
  350. CommonHelper.IPWhiteList.Add(content);
  351. return ResultData(null);
  352. }
  353. /// <summary>
  354. /// 获取拦截日志
  355. /// </summary>
  356. /// <returns></returns>
  357. public ActionResult InterceptLog()
  358. {
  359. var list = RedisHelper.LRange<IpIntercepter>("intercept", 0, -1);
  360. return ResultData(new
  361. {
  362. interceptCount = RedisHelper.Get("interceptCount"),
  363. list
  364. });
  365. }
  366. /// <summary>
  367. /// 清除拦截日志
  368. /// </summary>
  369. /// <returns></returns>
  370. public ActionResult ClearInterceptLog()
  371. {
  372. bool b = RedisHelper.Del("intercept") > 0;
  373. return ResultData(null, b, b ? "拦截日志清除成功!" : "拦截日志清除失败!");
  374. }
  375. /// <summary>
  376. /// 将IP添加到白名单
  377. /// </summary>
  378. /// <param name="ip"></param>
  379. /// <returns></returns>
  380. public ActionResult AddToWhiteList(string ip)
  381. {
  382. if (ip.MatchInetAddress())
  383. {
  384. string ips = System.IO.File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "whitelist.txt"));
  385. List<string> list = ips.Split(',').Where(s => !string.IsNullOrEmpty(s)).ToList();
  386. list.Add(ip);
  387. System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "whitelist.txt"), string.Join(",", list.Distinct()), Encoding.UTF8);
  388. CommonHelper.IPWhiteList = list;
  389. foreach (var kv in CommonHelper.DenyAreaIP)
  390. {
  391. foreach (string item in list)
  392. {
  393. CommonHelper.DenyAreaIP[kv.Key].Remove(item);
  394. }
  395. }
  396. System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "denyareaip.txt"), CommonHelper.DenyAreaIP.ToJsonString(), Encoding.UTF8);
  397. return ResultData(null);
  398. }
  399. return ResultData(null, false);
  400. }
  401. /// <summary>
  402. /// 将IP添加到黑名单
  403. /// </summary>
  404. /// <param name="ip"></param>
  405. /// <returns></returns>
  406. public ActionResult AddToBlackList(string ip)
  407. {
  408. if (ip.MatchInetAddress())
  409. {
  410. CommonHelper.DenyIP += "," + ip;
  411. System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "denyip.txt"), CommonHelper.DenyIP, Encoding.UTF8);
  412. CommonHelper.IPWhiteList.Remove(ip);
  413. System.IO.File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data", "whitelist.txt"), string.Join(",", CommonHelper.IPWhiteList.Distinct()), Encoding.UTF8);
  414. return ResultData(null);
  415. }
  416. return ResultData(null, false);
  417. }
  418. #endregion
  419. }
  420. }