| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- <?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
- {
- public static $details = [
- 'field' => [
- '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 = '<button type="button" class="btn btn-red" id="delete-node"
- onclick="deleteNode(' . $node->id . ')">删除</button><button type="button" class="btn btn-orange" id="copy-node"
- onclick="copyNode(' . $node->id . ')">复制</button>
- <a class="btn btn-blue" href="/admin/node/' . $node->id . '/edit">编辑</a>';
- $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,
- ]);
- }
- }
|