diff --git a/app/Http/Controllers/Api/V2Ray/V1Controller.php b/app/Http/Controllers/Api/V2Ray/V1Controller.php deleted file mode 100644 index eef0aac7..00000000 --- a/app/Http/Controllers/Api/V2Ray/V1Controller.php +++ /dev/null @@ -1,333 +0,0 @@ -whereId($id)->first(); - $nodeTls = NodeCertificate::query()->whereId($node->server)->first(); - return Response::json([ - 'status' => 'success', - 'code' => 200, - 'data' => [ - 'id' => $node->id, - 'is_udp' => $node->is_udp, - 'client_limit' => $node->client_limit, - 'push_port' => $node->push_port, - 'secret' => $node->auth->secret, - 'key' => $nodeTls? $nodeTls->key : '', - 'pem' => $nodeTls? $nodeTls->pem : '', - 'v2_license' => Helpers::systemConfig()['v2ray_license'], - 'v2_alter_id' => $node->v2_alter_id, - 'v2_port' => $node->v2_port, - 'v2_method' => $node->v2_method, - 'v2_net' => $node->v2_net, - 'v2_type' => $node->v2_type, - 'v2_host' => $node->v2_host, - 'v2_path' => $node->v2_path, - 'v2_tls' => $node->v2_tls, - 'v2_tls_provider' => $node->tls_provider, - ], - 'message' => '获取节点信息成功' - ]); - } - - // 上报节点心跳信息 - public function setNodeStatus(Request $request, $id) { - $cpu = intval($request->input('cpu')) / 100; - $mem = intval($request->input('mem')) / 100; - $disk = intval($request->input('disk')) / 100; - - if(is_null($request->input('uptime'))){ - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报节点心跳信息失败,请检查字段' - ]); - } - - $obj = new SsNodeInfo(); - $obj->node_id = $id; - $obj->uptime = intval($request->input('uptime')); - //$obj->load = $request->input('load'); - $obj->load = implode(' ', [$cpu, $mem, $disk]); - $obj->log_time = time(); - $obj->save(); - - if($obj->id){ - return Response::json([ - 'status' => 'success', - 'code' => 200, - 'data' => '', - 'message' => '上报节点心跳信息成功' - ]); - } - - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报节点心跳信息失败,请检查字段' - ]); - } - - // 上报节点在线人数 - public function setNodeOnline(Request $request, $id) { - $inputArray = $request->all(); - $onlineCount = 0; - foreach($inputArray as $input){ - if(!array_key_exists('ip', $input) || !array_key_exists('uid', $input)){ - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报节点在线情况失败,请检查字段' - ]); - }elseif(!isset($input['ip']) || !isset($input['uid'])){ - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报节点在线情况失败,请检查字段' - ]); - } - - $obj = new SsNodeIp(); - $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(); - - if(!$obj->id){ - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报节点在线情况失败,请检查字段' - ]); - } - $onlineCount++; - } - - $obj = new SsNodeOnlineLog(); - $obj->node_id = $id; - $obj->online_user = $onlineCount; - $obj->log_time = time(); - $obj->save(); - - if($obj->id){ - return Response::json([ - 'status' => 'success', - 'code' => 200, - 'data' => '', - 'message' => '上报节点在线情况成功' - ]); - } - - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报节点在线情况失败,请检查字段' - ]); - } - - // 获取节点可用的用户列表 - public function getUserList(Request $request, $id) { - $node = SsNode::query()->whereId($id)->first(); - $users = User::query()->where('status', '<>', -1)->whereEnable(1)->where('level', '>=', $node->level)->get(); - $data = []; - foreach($users as $user){ - $new = [ - "uid" => $user->id, - "vmess_uid" => $user->vmess_id, - "speed_limit" => $user->speed_limit - ]; - array_push($data, $new); - } - - if($data){ - return Response::json([ - 'status' => 'success', - 'code' => 200, - 'data' => $data, - 'message' => '获取用户列表成功', - 'updateTime' => time() - ]); - } - - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '获取用户列表失败' - ]); - } - - // 上报用户流量日志 - public function setUserTraffic(Request $request, $id) { - $inputArray = $request->all(); - - foreach($inputArray as $input){ - if(!array_key_exists('uid', $input)){ - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报用户流量日志失败,请检查字段' - ]); - } - - $rate = SsNode::find($id)->traffic_rate; - - $obj = new UserTrafficLog(); - $obj->user_id = intval($input['uid']); - $obj->u = intval($input['upload']) * $rate; - $obj->d = intval($input['download']) * $rate; - $obj->node_id = $id; - $obj->rate = $rate; - $obj->traffic = flowAutoShow($obj->u + $obj->d); - $obj->log_time = time(); - $obj->save(); - - if(!$obj->id){ - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报用户流量日志失败,请检查字段' - ]); - } - } - - return Response::json([ - 'status' => 'success', - 'code' => 200, - 'data' => '', - 'message' => '上报用户流量日志成功' - ]); - } - - // 获取节点的审计规则 - public function getNodeRule($id) { - $nodeRule = RuleGroupNode::whereNodeId($id)->first(); - $data = []; - //节点未设置任何审计规则 - if($nodeRule){ - $ruleGroup = RuleGroup::query()->whereId($nodeRule->rule_group_id)->first(); - if($ruleGroup){ - $rules = explode(',', $ruleGroup->rules); - foreach($rules as $ruleId){ - $rule = Rule::query()->whereId($ruleId)->first(); - if($rule){ - $new = [ - 'id' => $rule->id, - 'type' => $rule->type_api_label, - 'pattern' => $rule->pattern - ]; - array_push($data, $new); - } - } - - return Response::json([ - 'status' => 'success', - 'code' => 200, - 'data' => [ - 'mode' => $ruleGroup->type? 'reject' : 'allow', - 'rules' => $data - ], - 'message' => '获取节点审计规则成功' - ]); - - } - } - - return Response::json([ - //放行 - 'status' => 'success', - 'code' => 200, - 'data' => [ - 'mode' => 'all', - 'rules' => $data - ], - 'message' => '获取节点审计规则成功' - ]); - } - - // todo: test required - // 上报用户触发的审计规则记录 - public function addRuleLog(Request $request, $id) { - 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']); - $obj->save(); - - if($obj->id){ - return Response::json([ - 'status' => 'success', - 'code' => 200, - 'data' => '', - 'message' => '上报用户触发审计规则记录成功' - ]); - } - } - - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报用户触发审计规则记录失败' - ]); - - } - - // 上报节点伪装域名证书信息 - public function addCertificate(Request $request, $id) { - if($request->has(['key', 'pem'])){ - $node = SsNode::find($id); - $obj = new NodeCertificate(); - $obj->domain = $node->server; - $obj->key = $request->input(['key']); - $obj->pem = $request->input(['pem']); - $obj->save(); - - if($obj->id){ - return Response::json([ - 'status' => 'success', - 'code' => 200, - 'data' => '', - 'message' => '上报节点伪装域名证书成功' - ]); - } - } - return Response::json([ - 'status' => 'fail', - 'code' => 400, - 'data' => '', - 'message' => '上报节点伪装域名证书失败,请检查字段' - ]); - } -} diff --git a/app/Http/Controllers/Api/WebApi/BaseController.php b/app/Http/Controllers/Api/WebApi/BaseController.php new file mode 100644 index 00000000..a0077bee --- /dev/null +++ b/app/Http/Controllers/Api/WebApi/BaseController.php @@ -0,0 +1,175 @@ +input('cpu')) / 100; + $mem = intval($request->input('mem')) / 100; + $disk = intval($request->input('disk')) / 100; + + if(is_null($request->input('uptime'))){ + return $this->returnData('上报节点心跳信息失败,请检查字段'); + } + + $obj = new SsNodeInfo(); + $obj->node_id = $id; + $obj->uptime = intval($request->input('uptime')); + //$obj->load = $request->input('load'); + $obj->load = implode(' ', [$cpu, $mem, $disk]); + $obj->log_time = time(); + $obj->save(); + + if($obj->id){ + return $this->returnData('上报节点心跳信息成功', 'success', 200); + } + + return $this->returnData('上报节点心跳信息失败,请检查字段'); + } + + // 返回数据 + public function returnData($message, $status = 'fail', $code = 400, $data = '', $addition = false) { + $data = [ + 'status' => $status, + 'code' => $code, + 'data' => $data, + 'message' => $message, + ]; + + if($addition){ + $data = array_merge($data, $addition); + } + + return Response::json($data); + } + + // 上报节点在线人数 + public function setNodeOnline(Request $request, $id) { + $inputArray = $request->all(); + $onlineCount = 0; + foreach($inputArray as $input){ + if(!array_key_exists('ip', $input) || !array_key_exists('uid', $input)){ + return $this->returnData('上报节点在线情况失败,请检查字段'); + }elseif(!isset($input['ip']) || !isset($input['uid'])){ + return $this->returnData('上报节点在线情况失败,请检查字段'); + } + + $obj = new SsNodeIp(); + $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(); + + if(!$obj->id){ + return $this->returnData('上报节点在线情况失败,请检查字段'); + } + $onlineCount++; + } + + $obj = new SsNodeOnlineLog(); + $obj->node_id = $id; + $obj->online_user = $onlineCount; + $obj->log_time = time(); + $obj->save(); + + if($obj->id){ + return $this->returnData('上报节点在线情况成功', 'success', 200); + } + + return $this->returnData('上报节点在线情况失败,请检查字段'); + } + + // 上报用户流量日志 + public function setUserTraffic(Request $request, $id) { + $inputArray = $request->all(); + + foreach($inputArray as $input){ + if(!array_key_exists('uid', $input)){ + return $this->returnData('上报用户流量日志失败,请检查字段'); + } + + $rate = SsNode::find($id)->traffic_rate; + + $obj = new UserTrafficLog(); + $obj->user_id = intval($input['uid']); + $obj->u = intval($input['upload']) * $rate; + $obj->d = intval($input['download']) * $rate; + $obj->node_id = $id; + $obj->rate = $rate; + $obj->traffic = flowAutoShow($obj->u + $obj->d); + $obj->log_time = time(); + $obj->save(); + + if(!$obj->id){ + return $this->returnData('上报用户流量日志失败,请检查字段'); + } + } + + return $this->returnData('上报用户流量日志成功', 'success', 200); + } + + + // 获取节点的审计规则 + public function getNodeRule($id) { + $nodeRule = RuleGroupNode::whereNodeId($id)->first(); + $data = []; + //节点未设置任何审计规则 + if($nodeRule){ + $ruleGroup = RuleGroup::query()->whereId($nodeRule->rule_group_id)->first(); + if($ruleGroup){ + $rules = explode(',', $ruleGroup->rules); + foreach($rules as $ruleId){ + $rule = Rule::query()->whereId($ruleId)->first(); + if($rule){ + $new = [ + 'id' => $rule->id, + 'type' => $rule->type_api_label, + 'pattern' => $rule->pattern + ]; + array_push($data, $new); + } + } + + return $this->returnData('获取节点审计规则成功', 'success', 200, + ['mode' => $ruleGroup->type? 'reject' : 'allow', 'rules' => $data]); + } + } + + //放行 + return $this->returnData('获取节点审计规则成功', 'success', 200, ['mode' => 'all', 'rules' => $data]); + } + + // 上报用户触发的审计规则记录 + public function addRuleLog(Request $request, $id) { + 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'); + $obj->save(); + + if($obj->id){ + return $this->returnData('上报用户触发审计规则记录成功', 'success', 200); + } + } + + return $this->returnData('上报用户触发审计规则记录失败'); + } +} diff --git a/app/Http/Controllers/Api/WebApi/TrojanController.php b/app/Http/Controllers/Api/WebApi/TrojanController.php new file mode 100644 index 00000000..e7fa0a3c --- /dev/null +++ b/app/Http/Controllers/Api/WebApi/TrojanController.php @@ -0,0 +1,48 @@ +whereId($id)->first(); + + return $this->returnData('获取节点信息成功', 'success', 200, [ + 'id' => $node->id, + 'is_udp' => $node->is_udp? true : false, + 'speed_limit' => $node->speed_limit, + 'client_limit' => $node->client_limit, + 'push_port' => $node->push_port, + 'trojan_port' => $node->port, + 'secret' => $node->auth->secret, + 'license' => Helpers::systemConfig()['trojan_license'], + ]); + } + + // 获取节点可用的用户列表 + public function getUserList(Request $request, $id) { + $node = SsNode::query()->whereId($id)->first(); + $users = User::query()->where('status', '<>', -1)->whereEnable(1)->where('level', '>=', $node->level)->get(); + $data = []; + + foreach($users as $user){ + $new = [ + 'uid' => $user->id, + 'password' => str_replace('-', '', $user->vmess_id), + 'speed_limit' => $user->speed_limit + ]; + array_push($data, $new); + } + + if($data){ + return $this->returnData('获取用户列表成功', 'success', 200, $data, ['updateTime' => time()]); + } + + return $this->returnData('获取用户列表失败'); + } +} diff --git a/app/Http/Controllers/Api/WebApi/V2RayController.php b/app/Http/Controllers/Api/WebApi/V2RayController.php new file mode 100644 index 00000000..682957f0 --- /dev/null +++ b/app/Http/Controllers/Api/WebApi/V2RayController.php @@ -0,0 +1,78 @@ +whereId($id)->first(); + $nodeTls = NodeCertificate::query()->whereId($node->server)->first(); + + return $this->returnData('获取节点信息成功', 'success', 200, [ + 'id' => $node->id, + 'is_udp' => $node->is_udp? true : false, + 'speed_limit' => $node->speed_limit, + 'client_limit' => $node->client_limit, + 'push_port' => $node->push_port, + 'secret' => $node->auth->secret, + 'key' => $nodeTls? $nodeTls->key : '', + 'pem' => $nodeTls? $nodeTls->pem : '', + 'v2_license' => Helpers::systemConfig()['v2ray_license'], + 'v2_alter_id' => $node->v2_alter_id, + 'v2_port' => $node->v2_port, + 'v2_method' => $node->v2_method, + 'v2_net' => $node->v2_net, + 'v2_type' => $node->v2_type, + 'v2_host' => $node->v2_host, + 'v2_path' => $node->v2_path, + 'v2_tls' => $node->v2_tls? true : false, + 'v2_tls_provider' => $node->tls_provider, + ]); + } + + // 获取节点可用的用户列表 + public function getUserList(Request $request, $id) { + $node = SsNode::query()->whereId($id)->first(); + $users = User::query()->where('status', '<>', -1)->whereEnable(1)->where('level', '>=', $node->level)->get(); + $data = []; + + foreach($users as $user){ + $new = [ + 'uid' => $user->id, + 'vmess_uid' => $user->vmess_id, + 'speed_limit' => $user->speed_limit + ]; + array_push($data, $new); + } + + if($data){ + return $this->returnData('获取用户列表成功', 'success', 200, $data, ['updateTime' => time()]); + } + + return $this->returnData('获取用户列表失败'); + } + + // 上报节点伪装域名证书信息 + public function addCertificate(Request $request, $id) { + if($request->has(['key', 'pem'])){ + $node = SsNode::find($id); + $obj = new NodeCertificate(); + $obj->domain = $node->server; + $obj->key = $request->input('key'); + $obj->pem = $request->input('pem'); + $obj->save(); + + if($obj->id){ + return $this->returnData('上报节点伪装域名证书成功', 'success', 200); + } + } + + return $this->returnData('上报节点伪装域名证书失败,请检查字段'); + } +} diff --git a/app/Http/Controllers/Api/WebApi/VNetController.php b/app/Http/Controllers/Api/WebApi/VNetController.php new file mode 100644 index 00000000..8a7b8844 --- /dev/null +++ b/app/Http/Controllers/Api/WebApi/VNetController.php @@ -0,0 +1,57 @@ +whereId($id)->first(); + + return $this->returnData('获取节点信息成功', 'success', 200, [ + 'id' => $node->id, + 'method' => $node->method, + 'protocol' => $node->protocol, + 'obfs' => $node->obfs, + 'obfs_param' => $node->obfs_param, + 'is_udp' => $node->is_udp, + 'speed_limit' => $node->speed_limit, + 'client_limit' => $node->client_limit, + 'single' => $node->single, + 'port' => $node->port, + 'passwd' => $node->passwd, + 'push_port' => $node->push_port, + ]); + } + + // 获取节点可用的用户列表 + public function getUserList(Request $request, $id) { + $node = SsNode::query()->whereId($id)->first(); + $users = User::query()->where('status', '<>', -1)->whereEnable(1)->where('level', '>=', $node->level)->get(); + $data = []; + + foreach($users as $user){ + $new = [ + 'uid' => $user->id, + 'port' => $user->port, + 'passwd' => $user->passwd, + 'method' => $user->method, + 'protocol' => $user->protocol, + 'obfs' => $user->obfs, + 'obfs_param' => $node->obfs_param, + 'speed_limit' => $user->speed_limit, + 'enable' => $user->enable + ]; + array_push($data, $new); + } + + if($data){ + return $this->returnData('获取用户列表成功', 'success', 200, $data, ['updateTime' => time()]); + } + + return $this->returnData('获取用户列表失败'); + } +} diff --git a/resources/views/admin/node/nodeInfo.blade.php b/resources/views/admin/node/nodeInfo.blade.php index 81b61b8e..db3df5c1 100644 --- a/resources/views/admin/node/nodeInfo.blade.php +++ b/resources/views/admin/node/nodeInfo.blade.php @@ -291,7 +291,7 @@
- +
不同后端配置不同: VNET-V2RayV2Ray-Poseidon @@ -380,7 +380,7 @@