BaseController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace App\Http\Controllers\Api\WebApi;
  3. use App\Components\Helpers;
  4. use App\Models\Node;
  5. use App\Models\NodeHeartBeat;
  6. use App\Models\NodeOnlineIp;
  7. use App\Models\NodeOnlineLog;
  8. use App\Models\RuleLog;
  9. use App\Models\User;
  10. use App\Models\UserDataFlowLog;
  11. use Arr;
  12. use Illuminate\Http\JsonResponse;
  13. use Illuminate\Http\Request;
  14. use Response;
  15. class BaseController
  16. {
  17. // 上报节点心跳信息
  18. public function setNodeStatus(Request $request, $id): JsonResponse
  19. {
  20. $cpu = (int) $request->input('cpu') / 100;
  21. $mem = (int) $request->input('mem') / 100;
  22. $disk = (int) $request->input('disk') / 100;
  23. if (is_null($request->input('uptime'))) {
  24. return $this->returnData('上报节点心跳信息失败,请检查字段');
  25. }
  26. $obj = new NodeHeartBeat();
  27. $obj->node_id = $id;
  28. $obj->uptime = (int) $request->input('uptime');
  29. //$obj->load = $request->input('load');
  30. $obj->load = implode(' ', [$cpu, $mem, $disk]);
  31. $obj->log_time = time();
  32. $obj->save();
  33. if (! $obj->id) {
  34. return $this->returnData('生成节点心跳信息失败');
  35. }
  36. return $this->returnData('上报节点心跳信息成功', 'success', 200);
  37. }
  38. // 返回数据
  39. public function returnData($message, $status = 'fail', $code = 400, $data = [], $addition = []): JsonResponse
  40. {
  41. $etag = Helpers::abortIfNotModified($data);
  42. $data = [
  43. 'status' => $status,
  44. 'code' => $code,
  45. 'data' => $data,
  46. 'message' => $message,
  47. ];
  48. if ($addition) {
  49. $data = array_merge($data, $addition);
  50. }
  51. return Response::json($data)->header('ETAG', $etag);
  52. }
  53. // 上报节点在线人数
  54. public function setNodeOnline(Request $request, $id): JsonResponse
  55. {
  56. $inputArray = $request->all();
  57. $onlineCount = 0;
  58. foreach ($inputArray as $input) {
  59. if (! Arr::has($input, ['ip', 'uid'])) {
  60. return $this->returnData('上报节点在线用户IP信息失败,请检查字段');
  61. }
  62. $obj = new NodeOnlineIp();
  63. $obj->node_id = $id;
  64. $obj->user_id = $input['uid'];
  65. $obj->ip = $input['ip'];
  66. $obj->port = User::find($input['uid'])->port;
  67. $obj->created_at = time();
  68. $obj->save();
  69. if (! $obj->id) {
  70. return $this->returnData('生成节点在线用户IP信息失败');
  71. }
  72. $onlineCount++;
  73. }
  74. $obj = new NodeOnlineLog();
  75. $obj->node_id = $id;
  76. $obj->online_user = $onlineCount;
  77. $obj->log_time = time();
  78. $obj->save();
  79. if ($obj->id) {
  80. return $this->returnData('上报节点在线情况成功', 'success', 200);
  81. }
  82. return $this->returnData('生成节点在线情况失败');
  83. }
  84. // 上报用户流量日志
  85. public function setUserTraffic(Request $request, $id): JsonResponse
  86. {
  87. foreach ($request->all() as $input) {
  88. if (! Arr::exists($input, 'uid')) {
  89. return $this->returnData('上报用户流量日志失败,请检查字段');
  90. }
  91. $rate = Node::find($id)->traffic_rate;
  92. $log = new UserDataFlowLog();
  93. $log->user_id = (int) $input['uid'];
  94. $log->u = (int) $input['upload'] * $rate;
  95. $log->d = (int) $input['download'] * $rate;
  96. $log->node_id = $id;
  97. $log->rate = $rate;
  98. $log->traffic = flowAutoShow($log->u + $log->d);
  99. $log->log_time = time();
  100. $log->save();
  101. if (! $log->id) {
  102. return $this->returnData('生成用户流量日志失败');
  103. }
  104. $user = User::find($log->user_id);
  105. if ($user) {
  106. $user->u += $log->u;
  107. $user->d += $log->d;
  108. $user->t = time();
  109. $user->save();
  110. }
  111. }
  112. return $this->returnData('上报用户流量日志成功', 'success', 200);
  113. }
  114. // 获取节点的审计规则
  115. public function getNodeRule(Node $node): JsonResponse
  116. {
  117. $data = [];
  118. //节点未设置任何审计规则
  119. if ($node->rule_group_id) {
  120. $ruleGroup = $node->ruleGroup;
  121. foreach ($ruleGroup->rules as $rule) {
  122. $data[] = [
  123. 'id' => $rule->id,
  124. 'type' => $rule->type_api_label,
  125. 'pattern' => $rule->pattern,
  126. ];
  127. }
  128. return $this->returnData('获取节点审计规则成功', 'success', 200, ['mode' => $ruleGroup->type ? 'reject' : 'allow', 'rules' => $data]);
  129. }
  130. //放行
  131. return $this->returnData('获取节点审计规则成功', 'success', 200, ['mode' => 'all', 'rules' => $data]);
  132. }
  133. // 上报用户触发的审计规则记录
  134. public function addRuleLog(Request $request, $id): JsonResponse
  135. {
  136. if ($request->has(['uid', 'rule_id', 'reason'])) {
  137. $obj = new RuleLog();
  138. $obj->user_id = $request->input('uid');
  139. $obj->node_id = $id;
  140. $obj->rule_id = $request->input('rule_id');
  141. $obj->reason = $request->input('reason');
  142. if ($obj->save()) {
  143. return $this->returnData('上报用户触发审计规则日志成功', 'success', 200);
  144. }
  145. }
  146. return $this->returnData('上报用户触发审计规则日志失败');
  147. }
  148. }