| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- <?php
- declare(strict_types=1);
- namespace App\Controllers\Admin;
- use App\Controllers\BaseController;
- use App\Models\Node;
- use App\Models\Setting;
- use App\Utils\CloudflareDriver;
- use App\Utils\Telegram;
- use App\Utils\Tools;
- use Exception;
- use Psr\Http\Message\ResponseInterface;
- use Slim\Http\Request;
- use Slim\Http\Response;
- final class NodeController extends BaseController
- {
- /**
- * 后台节点页面
- *
- * @param array $args
- */
- public function index(Request $request, Response $response, array $args): ResponseInterface
- {
- $table_config = [];
- $table_config['total_column'] = [
- 'op' => '操作',
- 'id' => 'ID',
- 'name' => '节点名称',
- 'type' => '显示与隐藏',
- 'sort' => '类型',
- 'server' => '节点地址',
- 'outaddress' => '出口地址',
- 'node_ip' => '节点IP',
- 'info' => '节点信息',
- 'status' => '状态',
- 'traffic_rate' => '流量比率',
- 'node_group' => '节点群组',
- 'node_class' => '节点等级',
- 'node_speedlimit' => '节点限速/Mbps',
- 'node_bandwidth' => '已走流量/GB',
- 'node_bandwidth_limit' => '流量限制/GB',
- 'bandwidthlimit_resetday' => '流量重置日',
- 'node_heartbeat' => '上一次活跃时间',
- 'mu_only' => '只启用单端口多用户',
- ];
- $table_config['default_show_column'] = ['op', 'id', 'name', 'sort'];
- $table_config['ajax_url'] = 'node/ajax';
- return $response->write(
- $this->view()
- ->assign('table_config', $table_config)
- ->display('admin/node/index.tpl')
- );
- }
- /**
- * 后台创建节点页面
- *
- * @param array $args
- */
- public function create(Request $request, Response $response, array $args): ResponseInterface
- {
- return $response->write(
- $this->view()
- ->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('rate');
- $node->info = $request->getParam('info');
- $node->type = $request->getParam('type');
- $node->node_group = $request->getParam('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('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->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)
- ->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');
- $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' => '删除成功',
- ]);
- }
- /**
- * 后台节点页面 AJAX
- *
- * @param array $args
- */
- public function ajax(Request $request, Response $response, array $args): ResponseInterface
- {
- $query = Node::getTableDataFromAdmin(
- $request,
- static function (&$order_field): void {
- if (\in_array($order_field, ['op'])) {
- $order_field = 'id';
- }
- if (\in_array($order_field, ['outaddress'])) {
- $order_field = 'server';
- }
- }
- );
- $data = [];
- foreach ($query['datas'] as $value) {
- /** @var Node $value */
- $tempdata = [
- 'op' => <<<EOF
- <a class="btn btn-brand" href="/admin/node/{$value->id}/edit">编辑</a>
- <a class="btn btn-brand-accent" id="delete" value="{$value->id}" href="javascript:void(0);" onClick="delete_modal_show('{$value->id}')">删除</a>
- EOF,
- 'id' => $value->id,
- 'name' => $value->name,
- 'type' => $value->type(),
- 'sort' => $value->sort(),
- 'server' => $value->server,
- 'outaddress' => $value->getOutAddress(),
- 'node_ip' => $value->node_ip,
- 'info' => $value->info,
- 'status' => $value->status,
- 'traffic_rate' => $value->traffic_rate,
- 'node_group' => $value->node_group,
- 'node_class' => $value->node_class,
- 'node_speedlimit' => $value->node_speedlimit,
- 'node_bandwidth' => Tools::flowToGB($value->node_bandwidth),
- 'node_bandwidth_limit' => Tools::flowToGB($value->node_bandwidth_limit),
- 'bandwidthlimit_resetday' => $value->bandwidthlimit_resetday,
- 'node_heartbeat' => $value->nodeHeartbeat(),
- 'mu_only' => $value->muOnly(),
- ];
- $data[] = $tempdata;
- }
- return $response->withJson([
- 'draw' => $request->getParam('draw'),
- 'recordsTotal' => Node::count(),
- 'recordsFiltered' => $query['count'],
- 'data' => $data,
- ]);
- }
- }
|