MapApiServce.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using EVCB_OCPP.WSServer.Service.WsService;
  2. using Microsoft.AspNetCore.Builder;
  3. using Microsoft.AspNetCore.Http;
  4. using Microsoft.AspNetCore.Mvc;
  5. using NLog;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace EVCB_OCPP.WSServer.Service;
  12. public static class MapApiServceExtention
  13. {
  14. public static void MapApiServce(this WebApplication webApplication)
  15. {
  16. var pass = webApplication.Configuration["apipass"];
  17. var helpFunc = () =>
  18. {
  19. string sshaString = "";
  20. if (File.Exists("ssha"))
  21. {
  22. sshaString = File.ReadAllText("ssha");
  23. }
  24. return string.Join("\r\n", new[] {
  25. $"Git commit:{sshaString}",
  26. "Command help!!",
  27. "lcn : List Customer Name",
  28. "gc : GC Collect",
  29. "lc : List Clients",
  30. "silent : silent",
  31. "show : show log"
  32. });
  33. };
  34. webApplication.MapGet("/", helpFunc);
  35. webApplication.MapGet("/help", helpFunc);
  36. webApplication.MapPost("/stop", (ProtalServer server) =>
  37. {
  38. server.Stop();
  39. return "Command stop";
  40. }).AddAuthFilter(pass);
  41. webApplication.MapPost("/gc", () =>
  42. {
  43. GC.Collect();
  44. return "Command GC";
  45. }).AddAuthFilter(pass);
  46. webApplication.MapPost("/lc", (ProtalServer server) =>
  47. {
  48. List<string> toReturn = new List<string>() { "Command List Clients" };
  49. Dictionary<string, WsClientData> clientDic = server.GetClientDic();
  50. var list = clientDic.Select(c => c.Value).ToList();
  51. int i = 1;
  52. foreach (var c in list)
  53. {
  54. toReturn.Add(i + ":" + c.ChargeBoxId + " " + c.SessionID);
  55. i++;
  56. }
  57. return string.Join("\r\n", toReturn);
  58. }).AddAuthFilter(pass);
  59. webApplication.MapPost("/lcn", (ProtalServer server) =>
  60. {
  61. List<string> toReturn = new List<string> { "Command List Customer Name" };
  62. Dictionary<string, WsClientData> clientDic = server.GetClientDic();
  63. var lcn = clientDic.Select(c => c.Value.CustomerName).Distinct().ToList();
  64. int iLcn = 1;
  65. foreach (var c in lcn)
  66. {
  67. toReturn.Add(iLcn + ":" + c + ":" + clientDic.Where(z => z.Value.CustomerName == c).Count().ToString());
  68. iLcn++;
  69. }
  70. return string.Join("\r\n", toReturn);
  71. }).AddAuthFilter(pass);
  72. webApplication.MapPost("/silent", () =>
  73. {
  74. foreach (var rule in LogManager.Configuration.LoggingRules)
  75. {
  76. if (rule.RuleName != "ConsoleLog")
  77. {
  78. continue;
  79. }
  80. var isTargetRule = rule.Targets.Any(x => x.Name.ToLower() == "console");
  81. if (isTargetRule)
  82. {
  83. rule.SetLoggingLevels(NLog.LogLevel.Warn, NLog.LogLevel.Off);
  84. }
  85. }
  86. return "Command silent";
  87. }).AddAuthFilter(pass);
  88. webApplication.MapPost("/show", () =>
  89. {
  90. foreach (var rule in LogManager.Configuration.LoggingRules)
  91. {
  92. if (rule.RuleName != "ConsoleLog")
  93. {
  94. continue;
  95. }
  96. var isTargetRule = rule.Targets.Any(x => x.Name.ToLower() == "console");
  97. if (isTargetRule)
  98. {
  99. rule.SetLoggingLevels(NLog.LogLevel.Trace, NLog.LogLevel.Off);
  100. }
  101. }
  102. return "Command show";
  103. }).AddAuthFilter(pass);
  104. webApplication.MapGet("/threads", () =>
  105. {
  106. ThreadPool.GetMaxThreads(out var maxWorkerThread, out var maxCompletionPortThreads);
  107. ThreadPool.GetAvailableThreads(out var avaliableWorkerThread, out var avaliableCompletionPortThreads);
  108. return $"WorkerThread:{avaliableWorkerThread}/{maxWorkerThread} CompletionPortThreads{avaliableCompletionPortThreads}/{maxCompletionPortThreads}";
  109. }).AddAuthFilter(pass);
  110. webApplication.MapPost("/threads", (int min, int max) =>
  111. {
  112. ThreadPool.GetMaxThreads(out var maxWorkerThread, out var maxCompletionPortThreads);
  113. ThreadPool.GetAvailableThreads(out var avaliableWorkerThread, out var avaliableCompletionPortThreads);
  114. ThreadPool.SetMinThreads(min, 0);
  115. ThreadPool.SetMaxThreads(max, maxCompletionPortThreads);
  116. return $"WorkerThread:{avaliableWorkerThread}/{maxWorkerThread} CompletionPortThreads{avaliableCompletionPortThreads}/{maxCompletionPortThreads}";
  117. }).AddAuthFilter(pass);
  118. webApplication.MapGet("/blcn", (ProtalServer server) =>
  119. {
  120. int cnt = server.GetBootLockCnt();
  121. return $"boot lock cnt: {cnt}";
  122. });
  123. webApplication.MapGet("/lpcn", (ProtalServer server) =>
  124. {
  125. Dictionary<string, WsClientData> clientDic = server.GetClientDic();
  126. var acceptedCnt = clientDic.Values.Count(x => x.BootStatus == BootStatus.Accepted);
  127. var pendingCnt = clientDic.Values.Count(x => x.BootStatus == BootStatus.Pending);
  128. var initializingCnt = clientDic.Values.Count(x => x.BootStatus == BootStatus.Initializing);
  129. var startupCnt = clientDic.Values.Count(x => x.BootStatus == BootStatus.Startup);
  130. return $"IsCheckIn cnt: {startupCnt}/{initializingCnt}/{pendingCnt}/{acceptedCnt}";
  131. });
  132. }
  133. public static void AddAuthFilter(this RouteHandlerBuilder routeHandlerBuilder, string pass)
  134. {
  135. routeHandlerBuilder.AddEndpointFilter(async (context, next) =>
  136. {
  137. string key = context.HttpContext.Request.Headers["key"];
  138. if (!string.IsNullOrEmpty(pass) &&
  139. key != pass)
  140. {
  141. return Results.BadRequest();
  142. }
  143. return await next(context);
  144. });
  145. }
  146. }