AnalyseFileController.cs 15 KB

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