NodeController.php 11 KB

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