[ 'op' => '操作', 'id' => '节点ID', 'name' => '名称', 'server' => '地址', 'sort' => '类型', 'traffic_rate' => '倍率', 'node_class' => '等级', 'node_group' => '组别', 'node_bandwidth_limit' => '流量限制', 'node_bandwidth' => '已用流量', 'bandwidthlimit_resetday' => '重置日', ], ]; public static $update_field = [ 'name', 'server', 'mu_only', 'traffic_rate', 'info', 'node_group', 'node_speedlimit', 'status', 'sort', 'node_ip', 'node_class', 'node_bandwidth_limit', 'bandwidthlimit_resetday', ]; /** * 后台节点页面 * * @param array $args */ public function index(Request $request, Response $response, array $args): ResponseInterface { return $response->write( $this->view() ->assign('details', self::$details) ->display('admin/node/index.tpl') ); } /** * 后台创建节点页面 * * @param array $args */ public function create(Request $request, Response $response, array $args): ResponseInterface { return $response->write( $this->view() ->assign('update_field', self::$update_field) ->display('admin/node/create.tpl') ); } /** * 后台添加节点 * * @param array $args */ public function add(Request $request, Response $response, array $args): ResponseInterface { $node = new Node(); $node->name = $request->getParam('name'); $node->server = trim($request->getParam('server')); $node->mu_only = $request->getParam('mu_only'); $node->traffic_rate = $request->getParam('traffic_rate'); $node->info = $request->getParam('info'); $node->type = ($request->getParam('type') === 'true') ? 1 : 0; $node->node_group = $request->getParam('node_group'); $node->node_speedlimit = $request->getParam('node_speedlimit'); $node->status = $request->getParam('status'); $node->sort = $request->getParam('sort'); if ($request->getParam('custom_config') !== null) { $node->custom_config = $request->getParam('custom_config'); } else { $node->custom_config = '{}'; } $req_node_ip = trim($request->getParam('node_ip')); $success = true; $server_list = explode(';', $node->server); if (Tools::isIPv4($req_node_ip)) { $success = $node->changeNodeIp($req_node_ip); } else { $success = $node->changeNodeIp($server_list[0]); } if (! $success) { return $response->withJson([ 'ret' => 0, 'msg' => '获取节点IP失败,请检查您输入的节点地址是否正确!', ]); } $node->node_class = $request->getParam('node_class'); $node->node_bandwidth_limit = $request->getParam('node_bandwidth_limit') * 1024 * 1024 * 1024; $node->bandwidthlimit_resetday = $request->getParam('bandwidthlimit_resetday'); $node->password = Tools::genRandomChar(32); $node->load = ''; $node->uptime = 0; $node->save(); if ($_ENV['cloudflare_enable'] === true) { $domain_name = explode('.' . $_ENV['cloudflare_name'], $node->server); CloudflareDriver::updateRecord($domain_name[0], $node->node_ip); } if (Setting::obtain('telegram_add_node')) { try { Telegram::send( str_replace( '%node_name%', $request->getParam('name'), Setting::obtain('telegram_add_node_text') ) ); } catch (Exception $e) { return $response->withJson([ 'ret' => 1, 'msg' => '节点添加成功,但Telegram通知失败', 'node_id' => $node->id, ]); } } return $response->withJson([ 'ret' => 1, 'msg' => '节点添加成功', 'node_id' => $node->id, ]); } /** * 后台编辑指定节点页面 * * @param array $args */ public function edit(Request $request, Response $response, array $args): ResponseInterface { $id = $args['id']; $node = Node::find($id); return $response->write( $this->view() ->assign('node', $node) ->assign('update_field', self::$update_field) ->display('admin/node/edit.tpl') ); } /** * 后台更新指定节点内容 * * @param array $args */ public function update(Request $request, Response $response, array $args): ResponseInterface { $id = $args['id']; $node = Node::find($id); $node->name = $request->getParam('name'); $node->node_group = $request->getParam('group'); $node->server = trim($request->getParam('server')); $node->mu_only = $request->getParam('mu_only'); $node->traffic_rate = $request->getParam('rate'); $node->info = $request->getParam('info'); $node->node_speedlimit = $request->getParam('node_speedlimit'); $node->type = ($request->getParam('type') === 'true') ? 1 : 0; $node->sort = $request->getParam('sort'); if ($request->getParam('custom_config') !== null) { $node->custom_config = $request->getParam('custom_config'); } else { $node->custom_config = '{}'; } $req_node_ip = trim($request->getParam('node_ip')); $success = true; $server_list = explode(';', $node->server); if (Tools::isIPv4($req_node_ip)) { $success = $node->changeNodeIp($req_node_ip); } else { $success = $node->changeNodeIp($server_list[0]); } if (! $success) { return $response->withJson([ 'ret' => 0, 'msg' => '更新节点IP失败,请检查您输入的节点地址是否正确!', ]); } $node->status = $request->getParam('status'); $node->node_class = $request->getParam('class'); $node->node_bandwidth_limit = $request->getParam('node_bandwidth_limit') * 1024 * 1024 * 1024; $node->bandwidthlimit_resetday = $request->getParam('bandwidthlimit_resetday'); $node->save(); if (Setting::obtain('telegram_update_node')) { try { Telegram::send( str_replace( '%node_name%', $request->getParam('name'), Setting::obtain('telegram_update_node_text') ) ); } catch (Exception $e) { return $response->withJson([ 'ret' => 1, 'msg' => '修改成功,但Telegram通知失败', ]); } } return $response->withJson([ 'ret' => 1, 'msg' => '修改成功', ]); } /** * @param array $args */ public function resetNodePassword(Request $request, Response $response, array $args) { $id = $args['id']; $node = Node::find($id); $password = Tools::genRandomChar(32); $node->password = $password; $node->save(); return $response->withJson([ 'ret' => 1, 'msg' => '重置通讯密钥成功', ]); } /** * 后台删除指定节点 * * @param array $args */ public function delete(Request $request, Response $response, array $args): ResponseInterface { $id = $request->getParam('id'); $node = Node::find($id); if (! $node->delete()) { return $response->withJson([ 'ret' => 0, 'msg' => '删除失败', ]); } if (Setting::obtain('telegram_delete_node')) { try { Telegram::send( str_replace( '%node_name%', $node->name, Setting::obtain('telegram_delete_node_text') ) ); } catch (Exception $e) { return $response->withJson([ 'ret' => 1, 'msg' => '删除成功,但Telegram通知失败', ]); } } return $response->withJson([ 'ret' => 1, 'msg' => '删除成功', ]); } public function copy($request, $response, $args) { try { $old_node_id = $request->getParam('id'); $old_node = Node::find($old_node_id); $new_node = new Node(); // https://laravel.com/docs/9.x/eloquent#replicating-models $new_node = $old_node->replicate([ 'node_bandwidth', 'bandwidthlimit_resetday', ]); $new_node->name .= ' (副本)'; $new_node->node_bandwidth = 0; $new_node->bandwidthlimit_resetday = date('d'); $new_node->save(); } catch (\Exception $e) { return $response->withJson([ 'ret' => 0, 'msg' => $e->getMessage(), ]); } return $response->withJson([ 'ret' => 1, 'msg' => '复制成功', ]); } /** * 后台节点页面 AJAX * * @param array $args */ public function ajax(Request $request, Response $response, array $args): ResponseInterface { $nodes = Node::orderBy('id', 'desc')->get(); foreach ($nodes as $node) { $node->op = ' 编辑'; $node->type = $node->type(); $node->sort = $node->sort(); $node->outaddress = $node->getOutAddress(); $node->node_bandwidth = Tools::flowToGB($node->node_bandwidth); $node->node_bandwidth_limit = Tools::flowToGB($node->node_bandwidth_limit); $node->node_heartbeat = $node->nodeHeartbeat(); $node->mu_only = $node->muOnly(); } return $response->withJson([ 'nodes' => $nodes, ]); } }