BaseController.php 4.9 KB

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