CoreController.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <?php
  2. namespace App\Http\Controllers\Api\WebApi;
  3. use App\Helpers\ResponseEnum;
  4. use App\Helpers\WebApiResponse;
  5. use App\Models\Node;
  6. use App\Models\User;
  7. use Illuminate\Http\JsonResponse;
  8. use Illuminate\Http\Request;
  9. use Illuminate\Routing\Controller;
  10. use Validator;
  11. class CoreController extends Controller
  12. {
  13. use WebApiResponse;
  14. // 上报节点心跳信息
  15. public function setNodeStatus(Request $request, Node $node): JsonResponse
  16. {
  17. $validator = Validator::make($request->all(), ['cpu' => 'required', 'mem' => 'required', 'disk' => 'required', 'uptime' => 'required|numeric']);
  18. if ($validator->fails()) {
  19. return $this->failed(ResponseEnum::CLIENT_PARAMETER_ERROR, $validator->errors()->all());
  20. }
  21. $data = array_map('intval', $validator->validated());
  22. if ($node->heartbeats()->create([
  23. 'uptime' => $data['uptime'],
  24. 'load' => implode(' ', [$data['cpu'] / 100, $data['mem'] / 100, $data['disk'] / 100]),
  25. 'log_time' => time(),
  26. ])) {
  27. return $this->succeed();
  28. }
  29. return $this->failed([400201, '生成节点心跳信息失败']);
  30. }
  31. // 上报节点在线IP
  32. public function setNodeOnline(Request $request, Node $node): JsonResponse
  33. {
  34. $validator = Validator::make($request->all(), ['*.uid' => 'required|numeric|exists:user,id', '*.ip' => 'required|string']);
  35. if ($validator->fails()) {
  36. return $this->failed(ResponseEnum::CLIENT_PARAMETER_ERROR, $validator->errors()->all());
  37. }
  38. $onlineCount = 0;
  39. foreach ($validator->validated() as $input) { // 处理节点在线IP数据
  40. $formattedData[] = ['user_id' => $input['uid'], 'ip' => $input['ip'], 'port' => User::find($input['uid'])->port, 'created_at' => time()];
  41. $onlineCount++;
  42. }
  43. if (isset($formattedData) && ! $node->onlineIps()->createMany($formattedData)) { // 生成节点在线IP数据
  44. return $this->failed([400201, '生成节点在线用户IP信息失败']);
  45. }
  46. if ($node->onlineLogs()->create(['online_user' => $onlineCount, 'log_time' => time()])) { // 生成节点在线人数数据
  47. return $this->succeed();
  48. }
  49. return $this->failed([400201, '生成节点在线情况失败']);
  50. }
  51. // 上报用户流量日志
  52. public function setUserTraffic(Request $request, Node $node): JsonResponse
  53. {
  54. $validator = Validator::make($request->all(), ['*.uid' => 'required|numeric|exists:user,id', '*.upload' => 'required|numeric', '*.download' => 'required|numeric']);
  55. if ($validator->fails()) {
  56. return $this->failed(ResponseEnum::CLIENT_PARAMETER_ERROR, $validator->errors()->all());
  57. }
  58. foreach ($validator->validated() as $input) { // 处理用户流量数据
  59. $rate = $node->traffic_rate;
  60. $u = $input['upload'] * $rate;
  61. $d = $input['download'] * $rate;
  62. $formattedData[] = ['user_id' => $input['uid'], 'u' => $u, 'd' => $d, 'rate' => $rate, 'traffic' => flowAutoShow($u + $d), 'log_time' => time()];
  63. }
  64. if (isset($formattedData) && $logs = $node->userDataFlowLogs()->createMany($formattedData)) { // 生成用户流量数据
  65. foreach ($logs as $log) { // 更新用户流量数据
  66. $user = $log->user;
  67. $user->update(['u' => $user->u + $log->u, 'd' => $user->d + $log->d, 't' => time()]);
  68. }
  69. return $this->succeed();
  70. }
  71. return $this->failed([400201, '生成用户流量日志失败']);
  72. }
  73. // 获取节点的审计规则
  74. public function getNodeRule(Node $node): JsonResponse
  75. {
  76. // 节点未设置任何审计规则
  77. if ($ruleGroup = $node->ruleGroup) {
  78. foreach ($ruleGroup->rules as $rule) {
  79. $data[] = [
  80. 'id' => $rule->id,
  81. 'type' => $rule->type_api_label,
  82. 'pattern' => $rule->pattern,
  83. ];
  84. }
  85. return $this->succeed(['mode' => $ruleGroup->type ? 'reject' : 'allow', 'rules' => $data ?? []]);
  86. }
  87. // 放行
  88. return $this->succeed(['mode' => 'all', 'rules' => $data ?? []]);
  89. }
  90. // 上报用户触发审计规则记录
  91. public function addRuleLog(Request $request, Node $node): JsonResponse
  92. {
  93. $validator = Validator::make($request->all(), ['uid' => 'required|numeric|exists:user,id', 'rule_id' => 'required|numeric|exists:rule,id', 'reason' => 'required']);
  94. if ($validator->fails()) {
  95. return $this->failed(ResponseEnum::CLIENT_PARAMETER_ERROR, $validator->errors()->all());
  96. }
  97. $data = $validator->validated();
  98. if ($node->ruleLogs()->create(['user_id' => $data['uid'], 'rule_id' => $data['rule_id'], 'reason' => $data['reason']])) {
  99. return $this->succeed();
  100. }
  101. return $this->failed([400201, '上报用户触发审计规则日志失败']);
  102. }
  103. }