AnalyseFileController.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. using Azure.Storage.Blobs;
  2. using Azure.Storage.Blobs.Models;
  3. using Microsoft.AspNetCore.Hosting;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.AspNetCore.Mvc;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Text.Json;
  12. using System.Text.RegularExpressions;
  13. using System.Threading.Tasks;
  14. using TEAMModelBI.Tool;
  15. using TEAMModelBI.Tool.CosmosBank;
  16. using TEAMModelOS.SDK.Context.BI;
  17. using TEAMModelOS.SDK.Context.Constant;
  18. using TEAMModelOS.SDK.DI;
  19. using TEAMModelOS.SDK.Extension;
  20. using TEAMModelOS.SDK.Models.Cosmos.BI;
  21. namespace TEAMModelBI.Controllers.BIBlob
  22. {
  23. [Route("analyse")]
  24. [ApiController]
  25. public class AnalyseFileController : ControllerBase
  26. {
  27. private readonly IWebHostEnvironment _environment; //读取文件流
  28. private readonly AzureStorageFactory _azureStorage;
  29. public AnalyseFileController(IWebHostEnvironment environment, AzureStorageFactory azureStorage)
  30. {
  31. _environment = environment;
  32. _azureStorage = azureStorage;
  33. }
  34. /// <summary>
  35. /// 查询一天的分析防火墙分析 已对接
  36. /// </summary>
  37. /// <param name="jsonElement"></param>
  38. /// <returns></returns>
  39. [ProducesDefaultResponseType]
  40. [HttpPost("get-dayapi")]
  41. public async Task<IActionResult> GetDayApi(JsonElement jsonElement)
  42. {
  43. jsonElement.TryGetProperty("dateTime", out JsonElement dateTime);
  44. jsonElement.TryGetProperty("site", out JsonElement site);
  45. DateTimeOffset dtOff = DateTimeOffset.UtcNow;
  46. var blobCilent = _azureStorage.GetBlobContainerClient(containerName: "0-public");
  47. if ($"{site}".Equals(BIConst.Global))
  48. blobCilent = _azureStorage.GetBlobContainerClient(containerName: "0-public", BIConst.Global);
  49. if (!string.IsNullOrEmpty($"{dateTime}"))
  50. dtOff = TimeHelper.GetDateTime(dateTime.GetInt64());
  51. string day = dtOff.ToString("yyyyMMdd");
  52. Dictionary<string, RecCnt> days = new();
  53. await foreach (BlobItem blobItem in blobCilent.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"visitCnt/{day}"))
  54. {
  55. BlobClient tempClient = blobCilent.GetBlobClient(blobItem.Name);
  56. if (await tempClient.ExistsAsync())
  57. {
  58. using (var meomoryStream = new MemoryStream())
  59. {
  60. var response = blobCilent.GetBlobClient($"{blobItem.Name}").DownloadTo(meomoryStream);
  61. //var response = await blob.GetBlobClient($"{blobItem.Name}").DownloadToAsync(meomoryStream);
  62. RecCnt recCnt = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToString().ToObject<RecCnt>();
  63. string name = stringSuffix.MidStrEx(blobItem.Name, "/", ".");
  64. days.Add(name, recCnt);
  65. }
  66. }
  67. }
  68. return Ok(new { state = RespondCode.Ok, days = days.ToList() });
  69. }
  70. /// <summary>
  71. /// 查询七天的数据
  72. /// </summary>
  73. /// <param name="jsonElement"></param>
  74. /// <returns></returns>
  75. [ProducesDefaultResponseType]
  76. [HttpPost("get-sevendayapi")]
  77. public async Task<IActionResult> GetSevenDayApi(JsonElement jsonElement)
  78. {
  79. jsonElement.TryGetProperty("site", out JsonElement site);
  80. var blobCilent = _azureStorage.GetBlobContainerClient(containerName: "0-public");
  81. if ($"{site}".Equals(BIConst.Global))
  82. blobCilent = _azureStorage.GetBlobContainerClient(containerName: "0-public", BIConst.Global);
  83. List<RecApiCnt> savenDayApis = new();
  84. List<string> day7 = TimeHelper.GetNearDay(DateTimeOffset.UtcNow, 7);
  85. foreach (var item in day7)
  86. {
  87. await foreach (BlobItem blobItem in blobCilent.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"visitCnt/{item}"))
  88. {
  89. BlobClient tempClient = blobCilent.GetBlobClient(blobItem.Name);
  90. if (await tempClient.ExistsAsync())
  91. {
  92. using (var meomoryStream = new MemoryStream())
  93. {
  94. var response = blobCilent.GetBlobClient($"{blobItem.Name}").DownloadTo(meomoryStream);
  95. //var response = await blob.GetBlobClient($"{blobItem.Name}").DownloadToAsync(meomoryStream);
  96. RecCnt recCnt = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToString().ToObject<RecCnt>();
  97. savenDayApis.AddRange(recCnt.apiCnt);
  98. }
  99. }
  100. }
  101. }
  102. return Ok(new { state = RespondCode.Ok, savenDayApis });
  103. }
  104. /// <summary>
  105. /// 查询三十天的数据
  106. /// </summary>
  107. /// <param name="jsonElement"></param>
  108. /// <returns></returns>
  109. [ProducesDefaultResponseType]
  110. [HttpPost("get-thirtydayapi")]
  111. public async Task<IActionResult> GetThirtyDayApi(JsonElement jsonElement)
  112. {
  113. jsonElement.TryGetProperty("site", out JsonElement site);
  114. var blobCilent = _azureStorage.GetBlobContainerClient(containerName: "0-public");
  115. if ($"{site}".Equals(BIConst.Global))
  116. blobCilent = _azureStorage.GetBlobContainerClient(containerName: "0-public", BIConst.Global);
  117. List<RecApiCnt> thirtyDayApi = new();
  118. List<string> day30 = TimeHelper.GetNearDay(DateTimeOffset.UtcNow, 30);
  119. foreach (var item in day30)
  120. {
  121. await foreach (BlobItem blobItem in blobCilent.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"visitCnt/{item}"))
  122. {
  123. BlobClient tempClient = blobCilent.GetBlobClient(blobItem.Name);
  124. if (await tempClient.ExistsAsync())
  125. {
  126. using (var meomoryStream = new MemoryStream())
  127. {
  128. var response = blobCilent.GetBlobClient($"{blobItem.Name}").DownloadTo(meomoryStream);
  129. //var response = await blob.GetBlobClient($"{blobItem.Name}").DownloadToAsync(meomoryStream);
  130. RecCnt recCnt = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToString().ToObject<RecCnt>();
  131. thirtyDayApi.AddRange(recCnt.apiCnt);
  132. }
  133. }
  134. }
  135. }
  136. return Ok(new { state = RespondCode.Ok, thirtyDayApi });
  137. }
  138. /// <summary>
  139. /// 本地Json
  140. /// </summary>
  141. /// <param name="jsonElement"></param>
  142. /// <returns></returns>
  143. [ProducesDefaultResponseType]
  144. [HttpPost("get-visitjson")]
  145. public async Task<IActionResult> GetVisitJson(JsonElement jsonElement)
  146. {
  147. jsonElement.TryGetProperty("path", out JsonElement _path);
  148. jsonElement.TryGetProperty("time", out JsonElement _time);
  149. var path = $"{_environment.ContentRootPath}/JsonFile/TempFile/PT1H.json";
  150. StreamReader streamReader = new StreamReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.UTF8);
  151. List<object> objs = new();
  152. StringBuilder visits = new StringBuilder("[");
  153. string text;
  154. while ((text = streamReader.ReadLine()) != null)
  155. {
  156. if (streamReader.EndOfStream)
  157. visits.Append($"{text.ToString()}");
  158. else
  159. visits.Append($"{text.ToString()},");
  160. }
  161. visits.Append("]");
  162. streamReader.Close();
  163. string input = visits.ToString();
  164. List<AGInfo> aGInfos = input.ToObject<List<AGInfo>>();
  165. DateTimeOffset dtime = DateTimeOffset.UtcNow;
  166. string cHour = dtime.ToString("yyyyMMddHH");
  167. string cDay = dtime.ToString("yyyyMMdd");
  168. if (aGInfos.Count > 0)
  169. {
  170. cHour = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMddHH")).First();
  171. cDay = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMdd")).First();
  172. }
  173. RecCnt saveCnts = new();
  174. //var ipGroup = aGInfos.GroupBy(g => g.properties.clientIp).ToDictionary(k => k.Key, k => k.Count()).ToList();
  175. List<RecAppGWInfo> recInfo = aGInfos.Select(s => new RecAppGWInfo { hour = cHour, ip = s.properties.clientIp, api = s.properties.requestUri.Split("?").ToList().Count() > 1 ? s.properties.requestUri.Split("?").ToList()[0] : s.properties.requestUri, hostName = s.properties.hostname }).ToList();
  176. List<RecApiCnt> apiCnt = recInfo.GroupBy(a => a.api).Select(g => new RecApiCnt { api = g.Key, count = g.Count(), hour = cHour, hostName = g.Select(h => h.hostName).Distinct().ToList(), ip = g.Select(i => i.ip).Distinct().ToList() }).ToList();
  177. saveCnts.apiCnt= apiCnt;
  178. List<RecIpCnt> ipCnt = recInfo.GroupBy(a => a.ip).Select(g => new RecIpCnt { ip = g.Key, count = g.Count(), hour = cHour, hostName = g.Select(h => h.hostName).Distinct().ToList(), api = g.Select(i => i.api).Distinct().ToList() }).ToList();
  179. saveCnts.ipCnt = ipCnt;
  180. ////保存存至Blob文件
  181. var url = await _azureStorage.GetBlobContainerClient("0-public").UploadFileByContainer(saveCnts.ToJsonString(), $"visitCnt/{cDay}", $"{cHour}.json");
  182. var blob = _azureStorage.GetBlobContainerClient($"0-public");
  183. List<RecCnt> recCnts = new();
  184. await foreach (BlobItem blobItem in blob.GetBlobsAsync(BlobTraits.None, BlobStates.None, $"visitCnt/{cDay}"))
  185. {
  186. BlobClient blobClient = blob.GetBlobClient(blobItem.Name);
  187. if (await blobClient.ExistsAsync())
  188. {
  189. using (var meomoryStream = new MemoryStream())
  190. {
  191. var response = blob.GetBlobClient($"{blobItem.Name}").DownloadTo(meomoryStream);
  192. //var response = await blob.GetBlobClient($"{blobItem.Name}").DownloadToAsync(meomoryStream);
  193. RecCnt recCnt = Encoding.UTF8.GetString(meomoryStream.ToArray()).ToString().ToObject<RecCnt>();
  194. recCnts.Add(recCnt);
  195. }
  196. }
  197. }
  198. return Ok(new { state = 200, recCnts, apiCon = apiCnt.Count(), apiSum = apiCnt.Select(ap => ap.count).Sum(), ipCount = ipCnt.Count, ipSum = ipCnt.Select(ip => ip.count).Sum(), ipCnt, apiCnt }); ;
  199. }
  200. /// <summary>
  201. /// 日志访问秘钥
  202. /// </summary>
  203. /// <param name="jsonElement"></param>
  204. /// <returns></returns>
  205. [ProducesDefaultResponseType]
  206. [HttpPost("get-loginfos")]
  207. public async Task<IActionResult> GetOSLog(JsonElement jsonElement)
  208. {
  209. jsonElement.TryGetProperty("site", out JsonElement site);
  210. var blobClient = _azureStorage.GetBlobContainerClient($"insights-logs-applicationgatewayfirewalllog",name:BIConst.LogChina);
  211. if ($"{site}".Equals(BIConst.Global))
  212. {
  213. blobClient = _azureStorage.GetBlobContainerClient($"insights-logs-applicationgatewayfirewalllog", name: BIConst.LogGlobal);
  214. }
  215. //List<ReadContent> contents = new();
  216. List<RecCnt> recCnts = new();
  217. List<string> urls = new();
  218. //地址: y={year}/m={month}/d={day}/h={hour}/m=00/PT1H.json
  219. string logName = "resourceId=/SUBSCRIPTIONS/73B7F9EF-D8B7-4444-9E8D-D80B43BF3CD4/RESOURCEGROUPS/TEAMMODELCHENGDU/PROVIDERS/MICROSOFT.NETWORK/APPLICATIONGATEWAYS/OSFIREWARE";
  220. await foreach (BlobItem blobItem in blobClient.GetBlobsAsync(BlobTraits.None, BlobStates.None, logName))
  221. {
  222. StringBuilder visits = new("[");
  223. BlobClient tempBlobClient = blobClient.GetBlobClient(blobItem.Name);
  224. BlobDownloadInfo download = tempBlobClient.Download();
  225. var content = download.Content;
  226. string text;
  227. using (var streamReader = new StreamReader(content))
  228. {
  229. while ((text = streamReader.ReadLine()) != null)
  230. {
  231. if (streamReader.EndOfStream)
  232. visits.Append($"{text.ToString()}");
  233. else
  234. visits.Append($"{text.ToString()},");
  235. }
  236. visits.Append("]");
  237. streamReader.Close();
  238. }
  239. string input = visits.ToString();
  240. List<AGInfo> aGInfos = input.ToObject<List<AGInfo>>();
  241. DateTimeOffset dtime = DateTimeOffset.UtcNow;
  242. string cHour = dtime.ToString("yyyyMMddHH");
  243. string cDay = dtime.ToString("yyyyMMdd");
  244. if (aGInfos.Count > 0)
  245. {
  246. cHour = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMddHH")).First();
  247. cDay = aGInfos.Select(s => DateTimeOffset.Parse(s.time).ToString("yyyyMMdd")).First();
  248. }
  249. RecCnt saveCnts = new();
  250. List<RecAppGWInfo> recInfo = aGInfos.Select(s => new RecAppGWInfo { hour = cHour, ip = s.properties.clientIp, api = s.properties.requestUri.Split("?").ToList().Count() > 1 ? s.properties.requestUri.Split("?").ToList()[0] : s.properties.requestUri, hostName = s.properties.hostname }).ToList();
  251. List<RecApiCnt> apiCnt = recInfo.GroupBy(a => a.api).Select(g => new RecApiCnt { api = g.Key, count = g.Count(), hour = cHour, hostName = g.Select(h => h.hostName).Distinct().ToList(), ip = g.Select(i => i.ip).Distinct().ToList() }).ToList();
  252. saveCnts.apiCnt = apiCnt;
  253. List<RecIpCnt> ipCnt = recInfo.GroupBy(a => a.ip).Select(g => new RecIpCnt { ip = g.Key, count = g.Count(), hour = cHour, hostName = g.Select(h => h.hostName).Distinct().ToList(), api = g.Select(i => i.api).Distinct().ToList() }).ToList();
  254. saveCnts.ipCnt = ipCnt;
  255. recCnts.Add(saveCnts);
  256. ////保存存至Blob文件
  257. var url = await _azureStorage.GetBlobContainerClient("0-public").UploadFileByContainer(saveCnts.ToJsonString(), $"visitCnt/{cDay}", $"{cHour}.json");
  258. urls.Add(url);
  259. }
  260. return Ok(new { state = 200, recCnts, urls });
  261. }
  262. }
  263. }