|
@@ -2,96 +2,86 @@
|
|
|
|
|
|
namespace App\Http\Controllers\Api\WebApi;
|
|
|
|
|
|
-use App\Components\Helpers;
|
|
|
use App\Models\Node;
|
|
|
-use App\Models\NodeHeartBeat;
|
|
|
-use App\Models\NodeOnlineIp;
|
|
|
-use App\Models\NodeOnlineLog;
|
|
|
-use App\Models\RuleLog;
|
|
|
-use App\Models\User;
|
|
|
-use App\Models\UserDataFlowLog;
|
|
|
-use Arr;
|
|
|
use Illuminate\Http\JsonResponse;
|
|
|
use Illuminate\Http\Request;
|
|
|
use Response;
|
|
|
+use Validator;
|
|
|
|
|
|
class BaseController
|
|
|
{
|
|
|
// 上报节点心跳信息
|
|
|
- public function setNodeStatus(Request $request, $id): JsonResponse
|
|
|
+ public function setNodeStatus(Request $request, Node $node): JsonResponse
|
|
|
{
|
|
|
- $cpu = (int) $request->input('cpu') / 100;
|
|
|
- $mem = (int) $request->input('mem') / 100;
|
|
|
- $disk = (int) $request->input('disk') / 100;
|
|
|
+ $validator = Validator::make($request->all(), ['cpu' => 'required', 'mem' => 'required', 'disk' => 'required', 'uptime' => 'required|numeric']);
|
|
|
|
|
|
- if (is_null($request->input('uptime'))) {
|
|
|
+ if ($validator->fails()) {
|
|
|
return $this->returnData('上报节点心跳信息失败,请检查字段');
|
|
|
}
|
|
|
|
|
|
- $obj = new NodeHeartBeat();
|
|
|
- $obj->node_id = $id;
|
|
|
- $obj->uptime = (int) $request->input('uptime');
|
|
|
- //$obj->load = $request->input('load');
|
|
|
- $obj->load = implode(' ', [$cpu, $mem, $disk]);
|
|
|
- $obj->log_time = time();
|
|
|
- $obj->save();
|
|
|
+ $data = array_map('intval', $validator->validated());
|
|
|
|
|
|
- if (! $obj->id) {
|
|
|
- return $this->returnData('生成节点心跳信息失败');
|
|
|
+ if ($node->heartBeats()->create([
|
|
|
+ 'uptime' => $data['uptime'],
|
|
|
+ 'load' => implode(' ', [$data['cpu'] / 100, $data['mem'] / 100, $data['disk'] / 100]),
|
|
|
+ 'log_time' => time(),
|
|
|
+ ])) {
|
|
|
+ return $this->returnData('上报节点心跳信息成功', 'success', 200);
|
|
|
}
|
|
|
|
|
|
- return $this->returnData('上报节点心跳信息成功', 'success', 200);
|
|
|
+ return $this->returnData('生成节点心跳信息失败');
|
|
|
}
|
|
|
|
|
|
// 返回数据
|
|
|
- public function returnData($message, $status = 'fail', $code = 400, $data = [], $addition = []): JsonResponse
|
|
|
+ public function returnData(string $message, string $status = 'fail', int $code = 400, array $data = [], array $addition = null): JsonResponse
|
|
|
{
|
|
|
- $etag = Helpers::abortIfNotModified($data);
|
|
|
- $data = [
|
|
|
- 'status' => $status,
|
|
|
- 'code' => $code,
|
|
|
- 'data' => $data,
|
|
|
- 'message' => $message,
|
|
|
- ];
|
|
|
-
|
|
|
- if ($addition) {
|
|
|
+ $etag = self::abortIfNotModified($data);
|
|
|
+ $data = ['status' => $status, 'code' => $code, 'data' => $data, 'message' => $message];
|
|
|
+
|
|
|
+ if (isset($addition)) {
|
|
|
$data = array_merge($data, $addition);
|
|
|
}
|
|
|
|
|
|
- return Response::json($data)->header('ETAG', $etag);
|
|
|
+ return Response::json($data)->header('ETAG', $etag)->setStatusCode($code);
|
|
|
}
|
|
|
|
|
|
- // 上报节点在线人数
|
|
|
- public function setNodeOnline(Request $request, $id): JsonResponse
|
|
|
+ // 检查数据是否有变动
|
|
|
+ private static function abortIfNotModified($data): string
|
|
|
{
|
|
|
- $inputArray = $request->all();
|
|
|
- $onlineCount = 0;
|
|
|
- foreach ($inputArray as $input) {
|
|
|
- if (! Arr::has($input, ['ip', 'uid'])) {
|
|
|
- return $this->returnData('上报节点在线用户IP信息失败,请检查字段');
|
|
|
- }
|
|
|
+ $req = request();
|
|
|
+ // Only for "GET" method
|
|
|
+ if (! $req->isMethod('GET')) {
|
|
|
+ return '';
|
|
|
+ }
|
|
|
|
|
|
- $obj = new NodeOnlineIp();
|
|
|
- $obj->node_id = $id;
|
|
|
- $obj->user_id = $input['uid'];
|
|
|
- $obj->ip = $input['ip'];
|
|
|
- $obj->port = User::find($input['uid'])->port;
|
|
|
- $obj->created_at = time();
|
|
|
- $obj->save();
|
|
|
+ $etag = sha1(json_encode($data));
|
|
|
+ if ($etag === $req->header('IF-NONE-MATCH')) {
|
|
|
+ abort(304);
|
|
|
+ }
|
|
|
|
|
|
- if (! $obj->id) {
|
|
|
- return $this->returnData('生成节点在线用户IP信息失败');
|
|
|
- }
|
|
|
+ return $etag;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 上报节点在线IP
|
|
|
+ public function setNodeOnline(Request $request, Node $node): JsonResponse
|
|
|
+ {
|
|
|
+ $validator = Validator::make($request->all(), ['*.uid' => 'required|numeric|exists:user,id', '*.ip' => 'required|string']);
|
|
|
+
|
|
|
+ if ($validator->fails()) {
|
|
|
+ return $this->returnData('上报节点在线用户IP信息失败,请检查字段');
|
|
|
+ }
|
|
|
+
|
|
|
+ $onlineCount = 0;
|
|
|
+ foreach ($validator->validated() as $input) { // 处理节点在线IP数据
|
|
|
+ $formattedData[] = ['user_id' => $input['uid'], 'ip' => $input['ip'], 'created_at' => time()];
|
|
|
$onlineCount++;
|
|
|
}
|
|
|
|
|
|
- $obj = new NodeOnlineLog();
|
|
|
- $obj->node_id = $id;
|
|
|
- $obj->online_user = $onlineCount;
|
|
|
- $obj->log_time = time();
|
|
|
- $obj->save();
|
|
|
+ if (isset($formattedData) && ! $node->onlineIps()->createMany($formattedData)) { // 生成节点在线IP数据
|
|
|
+ return $this->returnData('生成节点在线用户IP信息失败');
|
|
|
+ }
|
|
|
|
|
|
- if ($obj->id) {
|
|
|
+ if ($node->onlineLogs()->create(['online_user' => $onlineCount, 'log_time' => time()])) { // 生成节点在线人数数据
|
|
|
return $this->returnData('上报节点在线情况成功', 'success', 200);
|
|
|
}
|
|
|
|
|
@@ -99,47 +89,39 @@ class BaseController
|
|
|
}
|
|
|
|
|
|
// 上报用户流量日志
|
|
|
- public function setUserTraffic(Request $request, $id): JsonResponse
|
|
|
+ public function setUserTraffic(Request $request, Node $node): JsonResponse
|
|
|
{
|
|
|
- foreach ($request->all() as $input) {
|
|
|
- if (! Arr::exists($input, 'uid')) {
|
|
|
- return $this->returnData('上报用户流量日志失败,请检查字段');
|
|
|
- }
|
|
|
+ $validator = Validator::make($request->all(), ['*.uid' => 'required|numeric|exists:user,id', '*.upload' => 'required|numeric', '*.download' => 'required|numeric']);
|
|
|
|
|
|
- $rate = Node::find($id)->traffic_rate;
|
|
|
+ if ($validator->fails()) {
|
|
|
+ return $this->returnData('上报用户流量日志失败,请检查字段');
|
|
|
+ }
|
|
|
|
|
|
- $log = new UserDataFlowLog();
|
|
|
- $log->user_id = (int) $input['uid'];
|
|
|
- $log->u = (int) $input['upload'] * $rate;
|
|
|
- $log->d = (int) $input['download'] * $rate;
|
|
|
- $log->node_id = $id;
|
|
|
- $log->rate = $rate;
|
|
|
- $log->traffic = flowAutoShow($log->u + $log->d);
|
|
|
- $log->log_time = time();
|
|
|
- $log->save();
|
|
|
+ foreach ($validator->validated() as $input) { // 处理用户流量数据
|
|
|
+ $rate = $node->traffic_rate;
|
|
|
+ $u = $input['upload'] * $rate;
|
|
|
+ $d = $input['download'] * $rate;
|
|
|
|
|
|
- if (! $log->id) {
|
|
|
- return $this->returnData('生成用户流量日志失败');
|
|
|
- }
|
|
|
- $user = User::find($log->user_id);
|
|
|
- if ($user) {
|
|
|
- $user->u += $log->u;
|
|
|
- $user->d += $log->d;
|
|
|
- $user->t = time();
|
|
|
- $user->save();
|
|
|
+ $formattedData[] = ['user_id' => $input['uid'], 'u' => $u, 'd' => $d, 'rate' => $rate, 'traffic' => flowAutoShow($u + $d), 'log_time' => time()];
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isset($formattedData) && $logs = $node->userDataFlowLogs()->createMany($formattedData)) { // 生成用户流量数据
|
|
|
+ foreach ($logs as $log) { // 更新用户流量数据
|
|
|
+ $user = $log->user;
|
|
|
+ $user->update(['u' => $user->u + $log->u, 'd' => $user->d + $log->d, 't' => time()]);
|
|
|
}
|
|
|
+
|
|
|
+ return $this->returnData('上报用户流量日志成功', 'success', 200);
|
|
|
}
|
|
|
|
|
|
- return $this->returnData('上报用户流量日志成功', 'success', 200);
|
|
|
+ return $this->returnData('生成用户流量日志失败');
|
|
|
}
|
|
|
|
|
|
// 获取节点的审计规则
|
|
|
public function getNodeRule(Node $node): JsonResponse
|
|
|
{
|
|
|
- $data = [];
|
|
|
- //节点未设置任何审计规则
|
|
|
- if ($node->rule_group_id) {
|
|
|
- $ruleGroup = $node->ruleGroup;
|
|
|
+ // 节点未设置任何审计规则
|
|
|
+ if ($ruleGroup = $node->ruleGroup) {
|
|
|
foreach ($ruleGroup->rules as $rule) {
|
|
|
$data[] = [
|
|
|
'id' => $rule->id,
|
|
@@ -148,26 +130,24 @@ class BaseController
|
|
|
];
|
|
|
}
|
|
|
|
|
|
- return $this->returnData('获取节点审计规则成功', 'success', 200, ['mode' => $ruleGroup->type ? 'reject' : 'allow', 'rules' => $data]);
|
|
|
+ return $this->returnData('获取节点审计规则成功', 'success', 200, ['mode' => $ruleGroup->type ? 'reject' : 'allow', 'rules' => $data ?? []]);
|
|
|
}
|
|
|
|
|
|
- //放行
|
|
|
- return $this->returnData('获取节点审计规则成功', 'success', 200, ['mode' => 'all', 'rules' => $data]);
|
|
|
+ // 放行
|
|
|
+ return $this->returnData('获取节点审计规则成功', 'success', 200, ['mode' => 'all', 'rules' => $data ?? []]);
|
|
|
}
|
|
|
|
|
|
- // 上报用户触发的审计规则记录
|
|
|
- public function addRuleLog(Request $request, $id): JsonResponse
|
|
|
+ // 上报用户触发审计规则记录
|
|
|
+ public function addRuleLog(Request $request, Node $node): JsonResponse
|
|
|
{
|
|
|
- if ($request->has(['uid', 'rule_id', 'reason'])) {
|
|
|
- $obj = new RuleLog();
|
|
|
- $obj->user_id = $request->input('uid');
|
|
|
- $obj->node_id = $id;
|
|
|
- $obj->rule_id = $request->input('rule_id');
|
|
|
- $obj->reason = $request->input('reason');
|
|
|
-
|
|
|
- if ($obj->save()) {
|
|
|
- return $this->returnData('上报用户触发审计规则日志成功', 'success', 200);
|
|
|
- }
|
|
|
+ $validator = Validator::make($request->all(), ['uid' => 'required|numeric|exists:user,id', 'rule_id' => 'required|numeric|exists:rule,id', 'reason' => 'required']);
|
|
|
+
|
|
|
+ if ($validator->fails()) {
|
|
|
+ return $this->returnData('上报用户触发审计规则日志失败,请检查字段');
|
|
|
+ }
|
|
|
+ $data = $validator->validated();
|
|
|
+ if ($node->ruleLogs()->create(['user_id' => $data['uid'], 'rule_id' => $data['rule_id'], 'reason' => $data['reason']])) {
|
|
|
+ return $this->returnData('上报用户触发审计规则日志成功', 'success', 200);
|
|
|
}
|
|
|
|
|
|
return $this->returnData('上报用户触发审计规则日志失败');
|