V1Controller.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. <?php
  2. namespace App\Http\Controllers\Api\V2Ray;
  3. use App\Components\Helpers;
  4. use App\Http\Controllers\Controller;
  5. use App\Models\NodeCertificate;
  6. use App\Models\Rule;
  7. use App\Models\RuleGroup;
  8. use App\Models\RuleGroupNode;
  9. use App\Models\RuleLog;
  10. use App\Models\SsNode;
  11. use App\Models\SsNodeInfo;
  12. use App\Models\SsNodeIp;
  13. use App\Models\SsNodeOnlineLog;
  14. use App\Models\User;
  15. use App\Models\UserTrafficLog;
  16. use Illuminate\Http\Request;
  17. use Response;
  18. class V1Controller extends Controller {
  19. // 获取节点信息
  20. public function getNodeInfo($id) {
  21. $node = SsNode::query()->whereId($id)->first();
  22. $nodeTls = NodeCertificate::query()->whereId($node->server)->first();
  23. return Response::json([
  24. 'status' => 'success',
  25. 'code' => 200,
  26. 'data' => [
  27. 'id' => $node->id,
  28. 'is_udp' => $node->is_udp,
  29. 'client_limit' => $node->client_limit,
  30. 'push_port' => $node->push_port,
  31. 'secret' => $node->auth->secret,
  32. 'key' => $nodeTls? $nodeTls->key : '',
  33. 'pem' => $nodeTls? $nodeTls->pem : '',
  34. 'v2_license' => Helpers::systemConfig()['v2ray_license'],
  35. 'v2_alter_id' => $node->v2_alter_id,
  36. 'v2_port' => $node->v2_port,
  37. 'v2_method' => $node->v2_method,
  38. 'v2_net' => $node->v2_net,
  39. 'v2_type' => $node->v2_type,
  40. 'v2_host' => $node->v2_host,
  41. 'v2_path' => $node->v2_path,
  42. 'v2_tls' => $node->v2_tls,
  43. 'v2_tls_provider' => $node->v2_tls_provider,
  44. ],
  45. 'message' => '获取节点信息成功'
  46. ]);
  47. }
  48. // 上报节点心跳信息
  49. public function setNodeStatus(Request $request, $id) {
  50. $cpu = intval($request->input('cpu')) / 100;
  51. $mem = intval($request->input('mem')) / 100;
  52. $disk = intval($request->input('disk')) / 100;
  53. if(is_null($request->input('uptime'))){
  54. return Response::json([
  55. 'status' => 'fail',
  56. 'code' => 400,
  57. 'data' => '',
  58. 'message' => '上报节点心跳信息失败,请检查字段'
  59. ]);
  60. }
  61. $obj = new SsNodeInfo();
  62. $obj->node_id = $id;
  63. $obj->uptime = intval($request->input('uptime'));
  64. //$obj->load = $request->input('load');
  65. $obj->load = implode(' ', [$cpu, $mem, $disk]);
  66. $obj->log_time = time();
  67. $obj->save();
  68. if($obj->id){
  69. return Response::json([
  70. 'status' => 'success',
  71. 'code' => 200,
  72. 'data' => '',
  73. 'message' => '上报节点心跳信息成功'
  74. ]);
  75. }
  76. return Response::json([
  77. 'status' => 'fail',
  78. 'code' => 400,
  79. 'data' => '',
  80. 'message' => '上报节点心跳信息失败,请检查字段'
  81. ]);
  82. }
  83. // 上报节点在线人数
  84. public function setNodeOnline(Request $request, $id) {
  85. $inputArray = $request->all();
  86. $onlineCount = 0;
  87. foreach($inputArray as $input){
  88. if(!array_key_exists('ip', $input) || !array_key_exists('uid', $input)){
  89. return Response::json([
  90. 'status' => 'fail',
  91. 'code' => 400,
  92. 'data' => '',
  93. 'message' => '上报节点在线情况失败,请检查字段'
  94. ]);
  95. }elseif(!isset($input['ip']) || !isset($input['uid'])){
  96. return Response::json([
  97. 'status' => 'fail',
  98. 'code' => 400,
  99. 'data' => '',
  100. 'message' => '上报节点在线情况失败,请检查字段'
  101. ]);
  102. }
  103. $obj = new SsNodeIp();
  104. $obj->node_id = $id;
  105. $obj->user_id = $input['uid'];
  106. $obj->ip = $input['ip'];
  107. $obj->port = User::find($input['uid'])->port;
  108. $obj->created_at = time();
  109. $obj->save();
  110. if(!$obj->id){
  111. return Response::json([
  112. 'status' => 'fail',
  113. 'code' => 400,
  114. 'data' => '',
  115. 'message' => '上报节点在线情况失败,请检查字段'
  116. ]);
  117. }
  118. $onlineCount++;
  119. }
  120. $obj = new SsNodeOnlineLog();
  121. $obj->node_id = $id;
  122. $obj->online_user = $onlineCount;
  123. $obj->log_time = time();
  124. $obj->save();
  125. if($obj->id){
  126. return Response::json([
  127. 'status' => 'success',
  128. 'code' => 200,
  129. 'data' => '',
  130. 'message' => '上报节点在线情况成功'
  131. ]);
  132. }
  133. return Response::json([
  134. 'status' => 'fail',
  135. 'code' => 400,
  136. 'data' => '',
  137. 'message' => '上报节点在线情况失败,请检查字段'
  138. ]);
  139. }
  140. // 获取节点可用的用户列表
  141. public function getUserList(Request $request, $id) {
  142. $node = SsNode::query()->whereId($id)->first();
  143. $users = User::query()->where('status', '<>', -1)->whereEnable(1)->where('level', '>=', $node->level)->get();
  144. $data = [];
  145. foreach($users as $user){
  146. $new = [
  147. "uid" => $user->id,
  148. "vmess_uid" => $user->vmess_id,
  149. "speed_limit" => $user->speed_limit
  150. ];
  151. array_push($data, $new);
  152. }
  153. if($data){
  154. return Response::json([
  155. 'status' => 'success',
  156. 'code' => 200,
  157. 'data' => $data,
  158. 'message' => '获取用户列表成功',
  159. 'updateTime' => time()
  160. ]);
  161. }
  162. return Response::json([
  163. 'status' => 'fail',
  164. 'code' => 400,
  165. 'data' => '',
  166. 'message' => '获取用户列表失败'
  167. ]);
  168. }
  169. // 上报用户流量日志
  170. public function setUserTraffic(Request $request, $id) {
  171. $inputArray = $request->all();
  172. foreach($inputArray as $input){
  173. if(!array_key_exists('uid', $input)){
  174. return Response::json([
  175. 'status' => 'fail',
  176. 'code' => 400,
  177. 'data' => '',
  178. 'message' => '上报用户流量日志失败,请检查字段'
  179. ]);
  180. }
  181. $rate = SsNode::find($id)->traffic_rate;
  182. $obj = new UserTrafficLog();
  183. $obj->user_id = intval($input['uid']);
  184. $obj->u = intval($input['upload']) * $rate;
  185. $obj->d = intval($input['download']) * $rate;
  186. $obj->node_id = $id;
  187. $obj->rate = $rate;
  188. $obj->traffic = flowAutoShow($obj->u + $obj->d);
  189. $obj->log_time = time();
  190. $obj->save();
  191. if(!$obj->id){
  192. return Response::json([
  193. 'status' => 'fail',
  194. 'code' => 400,
  195. 'data' => '',
  196. 'message' => '上报用户流量日志失败,请检查字段'
  197. ]);
  198. }
  199. }
  200. return Response::json([
  201. 'status' => 'success',
  202. 'code' => 200,
  203. 'data' => '',
  204. 'message' => '上报用户流量日志成功'
  205. ]);
  206. }
  207. // 获取节点的审计规则
  208. public function getNodeRule($id) {
  209. $nodeRule = RuleGroupNode::whereNodeId($id)->first();
  210. $data = [];
  211. //节点未设置任何审计规则
  212. if($nodeRule){
  213. $ruleGroup = RuleGroup::query()->whereId($nodeRule->rule_group_id)->first();
  214. if($ruleGroup){
  215. $rules = explode(',', $ruleGroup->rules);
  216. foreach($rules as $ruleId){
  217. $rule = Rule::query()->whereId($ruleId)->first();
  218. if($rule){
  219. $new = [
  220. 'id' => $rule->id,
  221. 'type' => $rule->type_api_label,
  222. 'pattern' => $rule->pattern
  223. ];
  224. array_push($data, $new);
  225. }
  226. }
  227. return Response::json([
  228. 'status' => 'success',
  229. 'code' => 200,
  230. 'data' => [
  231. 'mode' => $ruleGroup->type? 'reject' : 'allow',
  232. 'rules' => $data
  233. ],
  234. 'message' => '获取节点审计规则成功'
  235. ]);
  236. }
  237. }
  238. return Response::json([
  239. //放行
  240. 'status' => 'success',
  241. 'code' => 200,
  242. 'data' => [
  243. 'mode' => 'all',
  244. 'rules' => $data
  245. ],
  246. 'message' => '获取节点审计规则成功'
  247. ]);
  248. }
  249. // todo: test required
  250. // 上报用户触发的审计规则记录
  251. public function addRuleLog(Request $request, $id) {
  252. if($request->has(['uid', 'rule_id', 'reason'])){
  253. $obj = new RuleLog();
  254. $obj->user_id = $request->input(['uid']);
  255. $obj->node_id = $id;
  256. $obj->rule_id = $request->input(['rule_id']);
  257. $obj->reason = $request->input(['reason']);
  258. $obj->save();
  259. if($obj->id){
  260. return Response::json([
  261. 'status' => 'success',
  262. 'code' => 200,
  263. 'data' => '',
  264. 'message' => '上报用户触发审计规则记录成功'
  265. ]);
  266. }
  267. }
  268. return Response::json([
  269. 'status' => 'fail',
  270. 'code' => 400,
  271. 'data' => '',
  272. 'message' => '上报用户触发审计规则记录失败'
  273. ]);
  274. }
  275. // 上报节点伪装域名证书信息
  276. public function addCertificate(Request $request, $id) {
  277. if($request->has(['key', 'pem'])){
  278. $node = SsNode::find($id);
  279. $obj = new NodeCertificate();
  280. $obj->domain = $node->server;
  281. $obj->key = $request->input(['key']);
  282. $obj->pem = $request->input(['pem']);
  283. $obj->save();
  284. if($obj->id){
  285. return Response::json([
  286. 'status' => 'success',
  287. 'code' => 200,
  288. 'data' => '',
  289. 'message' => '上报节点伪装域名证书成功'
  290. ]);
  291. }
  292. }
  293. return Response::json([
  294. 'status' => 'fail',
  295. 'code' => 400,
  296. 'data' => '',
  297. 'message' => '上报节点伪装域名证书失败,请检查字段'
  298. ]);
  299. }
  300. }