NodeController.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. <?php
  2. namespace App\Controllers\Admin;
  3. use App\Models\Node;
  4. use App\Utils\Radius;
  5. use App\Utils\Telegram;
  6. use App\Utils\Tools;
  7. use App\Controllers\AdminController;
  8. use Ozdemir\Datatables\Datatables;
  9. use App\Utils\DatatablesHelper;
  10. class NodeController extends AdminController
  11. {
  12. public function index($request, $response, $args)
  13. {
  14. $table_config['total_column'] = Array("op" => "操作", "id" => "ID", "name" => "节点名称",
  15. "type" => "显示与隐藏", "sort" => "类型",
  16. "server" => "节点地址", "node_ip" => "节点IP",
  17. "info" => "节点信息",
  18. "status" => "状态", "traffic_rate" => "流量比率", "node_group" => "节点群组",
  19. "node_class" => "节点等级", "node_speedlimit" => "节点限速/Mbps",
  20. "node_bandwidth" => "已走流量/GB", "node_bandwidth_limit" => "流量限制/GB",
  21. "bandwidthlimit_resetday" => "流量重置日", "node_heartbeat" => "上一次活跃时间",
  22. "custom_method" => "自定义加密", "custom_rss" => "自定义协议以及混淆",
  23. "mu_only" => "只启用单端口多用户");
  24. $table_config['default_show_column'] = Array("op", "id", "name", "sort");
  25. $table_config['ajax_url'] = 'node/ajax';
  26. return $this->view()->assign('table_config', $table_config)->display('admin/node/index.tpl');
  27. }
  28. public function create($request, $response, $args)
  29. {
  30. return $this->view()->display('admin/node/create.tpl');
  31. }
  32. public function add($request, $response, $args)
  33. {
  34. $node = new Node();
  35. $node->name = $request->getParam('name');
  36. $node->server = $request->getParam('server');
  37. $node->method = $request->getParam('method');
  38. $node->custom_method = $request->getParam('custom_method');
  39. $node->custom_rss = $request->getParam('custom_rss');
  40. $node->mu_only = $request->getParam('mu_only');
  41. $node->traffic_rate = $request->getParam('rate');
  42. $node->info = $request->getParam('info');
  43. $node->type = $request->getParam('type');
  44. $node->node_group = $request->getParam('group');
  45. $node->node_speedlimit = $request->getParam('node_speedlimit');
  46. $node->status = $request->getParam('status');
  47. $node->sort = $request->getParam('sort');
  48. if ($node->sort == 0 || $node->sort == 1 || $node->sort == 10) {
  49. if ($request->getParam('node_ip') != '') {
  50. $node->node_ip = $request->getParam('node_ip');
  51. } else {
  52. $node->node_ip = gethostbyname($request->getParam('server'));
  53. }
  54. } else {
  55. $node->node_ip="";
  56. }
  57. if ($node->sort==1) {
  58. Radius::AddNas($node->node_ip, $request->getParam('server'));
  59. }
  60. $node->node_class=$request->getParam('class');
  61. $node->node_bandwidth_limit=$request->getParam('node_bandwidth_limit')*1024*1024*1024;
  62. $node->bandwidthlimit_resetday=$request->getParam('bandwidthlimit_resetday');
  63. if (!$node->save()) {
  64. $rs['ret'] = 0;
  65. $rs['msg'] = "添加失败";
  66. return $response->getBody()->write(json_encode($rs));
  67. }
  68. Telegram::Send("新节点添加~".$request->getParam('name'));
  69. $rs['ret'] = 1;
  70. $rs['msg'] = "节点添加成功";
  71. return $response->getBody()->write(json_encode($rs));
  72. }
  73. public function edit($request, $response, $args)
  74. {
  75. $id = $args['id'];
  76. $node = Node::find($id);
  77. if ($node == null) {
  78. }
  79. return $this->view()->assign('node', $node)->display('admin/node/edit.tpl');
  80. }
  81. public function update($request, $response, $args)
  82. {
  83. $id = $args['id'];
  84. $node = Node::find($id);
  85. $node->name = $request->getParam('name');
  86. $node->node_group = $request->getParam('group');
  87. $node->server = $request->getParam('server');
  88. $node->method = $request->getParam('method');
  89. $node->custom_method = $request->getParam('custom_method');
  90. $node->custom_rss = $request->getParam('custom_rss');
  91. $node->mu_only = $request->getParam('mu_only');
  92. $node->traffic_rate = $request->getParam('rate');
  93. $node->info = $request->getParam('info');
  94. $node->node_speedlimit = $request->getParam('node_speedlimit');
  95. $node->type = $request->getParam('type');
  96. $node->sort = $request->getParam('sort');
  97. if ($node->sort == 0 || $node->sort == 1 || $node->sort == 10) {
  98. if ($request->getParam('node_ip') != '') {
  99. $node->node_ip = $request->getParam('node_ip');
  100. } else {
  101. if ($node->isNodeOnline()) {
  102. if (!$node->changeNodeIp($request->getParam('server'))) {
  103. $rs['ret'] = 0;
  104. $rs['msg'] = "更新节点IP失败,请检查您输入的节点地址是否正确!";
  105. return $response->getBody()->write(json_encode($rs));
  106. }
  107. }
  108. }
  109. } else {
  110. $node->node_ip="";
  111. }
  112. if ($node->sort == 0 || $node->sort == 10) {
  113. Tools::updateRelayRuleIp($node);
  114. }
  115. if ($node->sort==1) {
  116. $SS_Node=Node::where('sort', '=', 0)->where('server', '=', $request->getParam('server'))->first();
  117. if ($SS_Node!=null) {
  118. if (time()-$SS_Node->node_heartbeat<300||$SS_Node->node_heartbeat==0) {
  119. Radius::AddNas(gethostbyname($request->getParam('server')), $request->getParam('server'));
  120. }
  121. } else {
  122. Radius::AddNas(gethostbyname($request->getParam('server')), $request->getParam('server'));
  123. }
  124. }
  125. $node->status = $request->getParam('status');
  126. $node->node_class=$request->getParam('class');
  127. $node->node_bandwidth_limit=$request->getParam('node_bandwidth_limit')*1024*1024*1024;
  128. $node->bandwidthlimit_resetday=$request->getParam('bandwidthlimit_resetday');
  129. if (!$node->save()) {
  130. $rs['ret'] = 0;
  131. $rs['msg'] = "修改失败";
  132. return $response->getBody()->write(json_encode($rs));
  133. }
  134. Telegram::Send("节点信息被修改~".$request->getParam('name'));
  135. $rs['ret'] = 1;
  136. $rs['msg'] = "修改成功";
  137. return $response->getBody()->write(json_encode($rs));
  138. }
  139. public function delete($request, $response, $args)
  140. {
  141. $id = $request->getParam('id');
  142. $node = Node::find($id);
  143. if ($node->sort==1) {
  144. Radius::DelNas($node->node_ip);
  145. }
  146. $name = $node->name;
  147. if (!$node->delete()) {
  148. $rs['ret'] = 0;
  149. $rs['msg'] = "删除失败";
  150. return $response->getBody()->write(json_encode($rs));
  151. }
  152. Telegram::Send("节点被删除~".$name);
  153. $rs['ret'] = 1;
  154. $rs['msg'] = "删除成功";
  155. return $response->getBody()->write(json_encode($rs));
  156. }
  157. public function ajax($request, $response, $args)
  158. {
  159. $datatables = new Datatables(new DatatablesHelper());
  160. $total_column = Array("op" => "操作", "id" => "ID", "name" => "节点名称",
  161. "type" => "显示与隐藏", "sort" => "类型",
  162. "server" => "节点地址", "node_ip" => "节点IP",
  163. "info" => "节点信息",
  164. "status" => "状态", "traffic_rate" => "流量比率", "node_group" => "节点群组",
  165. "node_class" => "节点等级", "node_speedlimit" => "节点限速/Mbps",
  166. "node_bandwidth" => "已走流量/GB", "node_bandwidth_limit" => "流量限制/GB",
  167. "bandwidthlimit_resetday" => "流量重置日", "node_heartbeat" => "上一次活跃时间",
  168. "custom_method" => "自定义加密", "custom_rss" => "自定义协议以及混淆",
  169. "mu_only" => "只启用单端口多用户");
  170. $key_str = '';
  171. foreach($total_column as $single_key => $single_value) {
  172. if($single_key == 'op') {
  173. $key_str .= 'id as op';
  174. continue;
  175. }
  176. $key_str .= ','.$single_key;
  177. }
  178. $datatables->query('Select '.$key_str.' from ss_node');
  179. $datatables->edit('op', function ($data) {
  180. return '<a class="btn btn-brand" '.($data['sort'] == 999 ? 'disabled' : 'href="/admin/node/'.$data['id'].'/edit"').'>编辑</a>
  181. <a class="btn btn-brand-accent" '.($data['sort'] == 999 ? 'disabled' : 'id="delete" value="'.$data['id'].'" href="javascript:void(0);" onClick="delete_modal_show(\''.$data['id'].'\')"').'>删除</a>';
  182. });
  183. $datatables->edit('node_bandwidth', function ($data) {
  184. return Tools::flowToGB($data['node_bandwidth']);
  185. });
  186. $datatables->edit('node_bandwidth_limit', function ($data) {
  187. return Tools::flowToGB($data['node_bandwidth_limit']);
  188. });
  189. $datatables->edit('sort', function ($data) {
  190. $sort = '';
  191. switch($data['sort']) {
  192. case 0:
  193. $sort = 'Shadowsocks';
  194. break;
  195. case 1:
  196. $sort = 'VPN/Radius基础';
  197. break;
  198. case 2:
  199. $sort = 'SSH';
  200. break;
  201. case 3:
  202. $sort = 'PAC';
  203. break;
  204. case 4:
  205. $sort = 'APN文件外链';
  206. break;
  207. case 5:
  208. $sort = 'Anyconnect';
  209. break;
  210. case 6:
  211. $sort = 'APN';
  212. break;
  213. case 7:
  214. $sort = 'PAC PLUS(Socks 代理生成 PAC文件)';
  215. break;
  216. case 8:
  217. $sort = 'PAC PLUS PLUS(HTTPS 代理生成 PAC文件)';
  218. break;
  219. case 9:
  220. $sort = 'Shadowsocks - 单端口多用户';
  221. break;
  222. case 10:
  223. $sort = 'Shadowsocks - 中转';
  224. break;
  225. default:
  226. $sort = '系统保留';
  227. }
  228. return $sort;
  229. });
  230. $datatables->edit('type', function ($data) {
  231. return $data['type'] == 1 ? '显示' : '隐藏';
  232. });
  233. $datatables->edit('custom_method', function ($data) {
  234. return $data['custom_method'] == 1 ? '启用' : '关闭';
  235. });
  236. $datatables->edit('custom_rss', function ($data) {
  237. return $data['custom_rss'] == 1 ? '启用' : '关闭';
  238. });
  239. $datatables->edit('mu_only', function ($data) {
  240. return $data['mu_only'] == 1 ? '启用' : '关闭';
  241. });
  242. $datatables->edit('node_heartbeat', function ($data) {
  243. return date('Y-m-d H:i:s', $data['node_heartbeat']);
  244. });
  245. $datatables->edit('DT_RowId', function ($data) {
  246. return 'row_1_'.$data['id'];
  247. });
  248. $body = $response->getBody();
  249. $body->write($datatables->generate());
  250. }
  251. }