From 1035d00fe4f251267293280bc2c01507f1b93419 Mon Sep 17 00:00:00 2001 From: Muse Date: Wed, 21 Oct 2026 18:43:55 +0000 Subject: [PATCH] =?UTF-8?q?=E7=B2=BE=E7=AE=80=E7=89=88P9(4b):=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=9C=AC=E5=9C=B0=E6=A0=B8=E5=BF=83=E6=95=B4=E6=9D=A1?= =?UTF-8?q?=E8=B7=AF=E5=BE=84(=E8=BF=9B=E7=A8=8B=E7=AE=A1=E7=90=86/buildXr?= =?UTF-8?q?ayConfig=E6=9C=AC=E5=9C=B0=E5=88=86=E6=94=AF/local-only?= =?UTF-8?q?=E6=B3=A8=E5=85=A5/=E6=9C=AC=E5=9C=B0=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=B8=8E=E4=BB=BB=E5=8A=A1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - service/xray.go 1741->573行: 只剩 agent 配置构建(GetXrayConfigForAgent/buildAgentXrayConfig=模板+节点入站+egress+转发编译); 删进程生命周期/状态机/RestartXray/StopXray/SetToNeedRestart/GetXrayTraffic/GetOnlineUsers/balancer/TestRoute 与 injectPanelEgress/injectNodeEgresses/injectMtproto/injectAmneziawg/mergeSubscriptionOutbounds - controller: 43处 SetToNeedRestart 与各 RestartXray 调用清除; 删 balancerStatus/balancerOverride/routeTest/getXrayResult 路由与handler(纯本地核心操作); 前端删 RouteTester 页签与组件 - server service: GetConfigJson 改模板直读; 状态Xray块恒 stopped/空版本; Stop/RestartXrayService 改 no-op(DB导入/恢复流程保留形状) - setting service: PanelEgressProxyURL/NodeEgressProxyURL 恒直连(桥在本地核心内,已不存在); NodeService.withOutboundBridge 恒直连回退 - runtime: Local 改为全 no-op 桩(DB即真源); NewManager() 去 LocalDeps(APIPort/SetNeedRestart) - job: 删 XrayTrafficJob/CheckXrayRunningJob/CheckClientIpJob 三文件(共享声明 EventBus/IPWithTimestamp/clientStatsSnapshotMaxClients 迁 shared.go); web.go 不再调度 MtprotoJob/AmneziaWGJob, 删 OnCrash 接线与 stop() 的 sidecar StopAll - MTProto/AmneziaWG 下线: AddInbound/UpdateInbound 对两协议直接拒绝(存量行保留可删); TG bot 的 restart 命令与在线查询按无本地核心收口 - 测试: GetXrayConfig 系列移植到 agent 构建(finalmask/clients/wireguard/scale); 删退役行为测试(lifecycle/restart/mtproto本地应用/client-ip job/inject系列); 共享测试helper迁 mtproto_test_helpers_test.go 与 job/integration_helpers_test.go - 既有红(非本轮引入,已在 f6d6520 复现): TestGetXrayConfig_EnabledClientsStillEmitted、TestRouteRegistryContract(P6删 endpoints.ts 遗留) --- .../src/pages/xray/routing/RouteTester.tsx | 165 --- .../src/pages/xray/routing/RoutingTab.tsx | 7 - internal/web/controller/client.go | 16 - internal/web/controller/inbound.go | 10 - internal/web/controller/node.go | 10 - internal/web/controller/setting.go | 10 - internal/web/controller/xray_setting.go | 94 +- .../job/check_client_ip_frozen_ban_test.go | 68 - internal/web/job/check_client_ip_job.go | 789 ----------- .../check_client_ip_job_integration_test.go | 470 ------- internal/web/job/check_client_ip_job_test.go | 340 ----- .../web/job/check_client_ip_scale_test.go | 229 ---- internal/web/job/check_xray_running_job.go | 40 - internal/web/job/integration_helpers_test.go | 53 + internal/web/job/ip_limit_allowlist_test.go | 70 - internal/web/job/limit_ip_disconnect_test.go | 60 - internal/web/job/node_traffic_sync_job.go | 8 - internal/web/job/outbound_subscription_job.go | 1 - .../web/job/periodic_traffic_reset_job.go | 1 - internal/web/job/shared.go | 20 + internal/web/job/warp_ip_job.go | 1 - internal/web/job/xray_traffic_job.go | 206 --- .../job/xray_traffic_job_broadcast_test.go | 59 - internal/web/runtime/local.go | 318 +---- internal/web/runtime/manager.go | 4 +- .../web/runtime/manager_convergence_test.go | 6 +- internal/web/service/inbound.go | 18 + .../service/inbound_finalmask_reality_test.go | 15 +- .../web/service/inbound_mtproto_apply_test.go | 99 -- .../service/inbound_mtproto_client_test.go | 67 - .../service/inbound_mtproto_txfail_test.go | 72 - internal/web/service/inbound_node.go | 83 +- internal/web/service/mtproto_fake_test.go | 116 -- .../web/service/mtproto_test_helpers_test.go | 37 + internal/web/service/node.go | 103 +- .../web/service/node_bulk_dispatch_test.go | 2 +- internal/web/service/node_origin_guid_test.go | 166 --- internal/web/service/outbound_subscription.go | 5 +- internal/web/service/reset_writer_test.go | 2 +- internal/web/service/server.go | 51 +- internal/web/service/setting.go | 39 +- internal/web/service/tgbot/tgbot_client.go | 9 +- internal/web/service/tgbot/tgbot_report.go | 13 +- internal/web/service/tgbot/tgbot_router.go | 18 +- .../web/service/traffic_runtime_apply_test.go | 4 +- internal/web/service/xray.go | 1208 +---------------- .../web/service/xray_config_clients_test.go | 25 +- .../web/service/xray_config_inject_test.go | 880 +----------- .../web/service/xray_config_scale_test.go | 15 +- internal/web/service/xray_lifecycle_test.go | 68 - internal/web/service/xray_restart_test.go | 40 - internal/web/service/xray_setting.go | 4 +- .../web/service/xray_wireguard_config_test.go | 23 +- internal/web/web.go | 36 +- 54 files changed, 310 insertions(+), 5963 deletions(-) delete mode 100644 frontend/src/pages/xray/routing/RouteTester.tsx delete mode 100644 internal/web/job/check_client_ip_frozen_ban_test.go delete mode 100644 internal/web/job/check_client_ip_job.go delete mode 100644 internal/web/job/check_client_ip_job_integration_test.go delete mode 100644 internal/web/job/check_client_ip_job_test.go delete mode 100644 internal/web/job/check_client_ip_scale_test.go delete mode 100644 internal/web/job/check_xray_running_job.go create mode 100644 internal/web/job/integration_helpers_test.go delete mode 100644 internal/web/job/ip_limit_allowlist_test.go delete mode 100644 internal/web/job/limit_ip_disconnect_test.go create mode 100644 internal/web/job/shared.go delete mode 100644 internal/web/job/xray_traffic_job.go delete mode 100644 internal/web/job/xray_traffic_job_broadcast_test.go delete mode 100644 internal/web/service/inbound_mtproto_apply_test.go delete mode 100644 internal/web/service/inbound_mtproto_client_test.go delete mode 100644 internal/web/service/inbound_mtproto_txfail_test.go delete mode 100644 internal/web/service/mtproto_fake_test.go create mode 100644 internal/web/service/mtproto_test_helpers_test.go delete mode 100644 internal/web/service/xray_lifecycle_test.go delete mode 100644 internal/web/service/xray_restart_test.go diff --git a/frontend/src/pages/xray/routing/RouteTester.tsx b/frontend/src/pages/xray/routing/RouteTester.tsx deleted file mode 100644 index 703ce50..0000000 --- a/frontend/src/pages/xray/routing/RouteTester.tsx +++ /dev/null @@ -1,165 +0,0 @@ -import { useMemo, useState } from 'react'; -import { useTranslation } from 'react-i18next'; -import { Alert, Button, Col, Input, InputNumber, Row, Select, Space, Tag } from 'antd'; -import { AimOutlined } from '@ant-design/icons'; - -import { HttpUtil } from '@/utils'; -import { useInboundOptions } from '@/api/queries/useInboundOptions'; -import { buildRemarkByTag, formatInboundTag } from './helpers'; - -interface RouteTesterProps { - inboundTags: string[]; - isMobile: boolean; -} - -// Mirror of the /xray/routeTest response (RoutingService.TestRoute). -interface RouteTestResult { - matched: boolean; - outboundTag: string; - groupTags?: string[]; -} - -const PROTOCOL_OPTIONS = ['http', 'tls', 'quic', 'bittorrent'].map((p) => ({ label: p, value: p })); - -export default function RouteTester({ inboundTags, isMobile }: RouteTesterProps) { - const { t } = useTranslation(); - const { data: inboundOptions } = useInboundOptions(); - const remarkByTag = useMemo(() => buildRemarkByTag(inboundOptions || []), [inboundOptions]); - const [dest, setDest] = useState(''); - const [port, setPort] = useState(443); - const [network, setNetwork] = useState('tcp'); - const [inboundTag, setInboundTag] = useState(undefined); - const [protocol, setProtocol] = useState(undefined); - const [testing, setTesting] = useState(false); - const [result, setResult] = useState(null); - - async function run() { - const value = dest.trim(); - if (!value) return; - // Domains never contain ':' and a pure dotted-quad is an IPv4 address; - // everything else is treated as a domain. - const isIp = /^(\d{1,3}\.){3}\d{1,3}$/.test(value) || value.includes(':'); - setTesting(true); - setResult(null); - try { - const msg = await HttpUtil.post('/panel/api/xray/routeTest', { - domain: isIp ? '' : value, - ip: isIp ? value : '', - port: port ?? 0, - network, - inboundTag: inboundTag || '', - protocol: protocol || '', - }); - if (msg?.success && msg.obj && typeof msg.obj === 'object') { - setResult(msg.obj as RouteTestResult); - } - } finally { - setTesting(false); - } - } - - const fieldSpan = isMobile ? 24 : undefined; - - return ( - - - - - setDest(e.target.value)} - onPressEnter={run} - allowClear - /> - - - setPort(v)} - /> - - - ({ label: formatInboundTag(tag, remarkByTag), value: tag }))} - /> - - -