🏗️ refactor proxy handling to replace stcpModel with visitorsModel and enhance configuration structure in ServerService

This commit is contained in:
刘嘉伟 2025-02-26 14:56:10 +08:00
parent f77605a73d
commit f0d8c20f4d
7 changed files with 85 additions and 69 deletions

View File

@ -200,7 +200,7 @@
// httpUser: m.httpUser || "",
// httpPassword: m.httpPassword || "",
// // 以下为stcp参数
// stcpModel: "visited",
// visitorsModel: "visitorsProvider",
// serverName: "",
// secretKey: m?.secretKey || "",
// bindAddr: "",
@ -234,7 +234,7 @@
// httpUser: m.httpUser || "",
// httpPassword: m.httpPassword || "",
// // 以下为stcp参数
// stcpModel: "visitors",
// visitorsModel: "visitors",
// serverName: m?.serverName,
// secretKey: m?.secretKey || "",
// bindAddr: m?.bindAddr,

View File

@ -58,7 +58,7 @@
// }
// [[${
// (m.type === "stcp" || m.type === "xtcp" || m.type === "sudp") &&
// m.stcpModel === "visitors"
// m.visitorsModel === "visitors"
// ? "visitors"
// : "proxies"
// }]]
@ -105,12 +105,12 @@
//
// break;
// case "xtcp":
// if (m.stcpModel === "visitors") {
// if (m.visitorsModel === "visitors") {
// toml += `keepTunnelOpen = ${m.keepTunnelOpen}\n`;
// }
// case "stcp":
// case "sudp":
// if (m.stcpModel === "visitors") {
// if (m.visitorsModel === "visitors") {
// // 访问者
// toml += `serverName = "${m.serverName}"
// bindAddr = "${m.bindAddr}"
@ -119,7 +119,7 @@
// toml += `fallbackTo = "${m.fallbackTo}"
// fallbackTimeoutMs = ${m.fallbackTimeoutMs || 500}\n`;
// }
// } else if (m.stcpModel === "visited") {
// } else if (m.visitorsModel === "visitorsProvider") {
// // 被访问者
// toml += `localIP = "${m.localIp}"
// localPort = ${m.localPort}\n`;
@ -274,12 +274,12 @@
// }
// break;
// case "xtcp":
// if (m.stcpModel === "visitors") {
// if (m.visitorsModel === "visitors") {
// ini += `keep_tunnel_open = ${m.keepTunnelOpen}\n`;
// }
// case "stcp":
// case "sudp":
// if (m.stcpModel === "visitors") {
// if (m.visitorsModel === "visitors") {
// // 访问者
// ini += `
// role = visitor
@ -291,7 +291,7 @@
// fallback_to = ${m.fallbackTo}
// fallback_timeout_ms = ${m.fallbackTimeoutMs || 500}\n`;
// }
// } else if (m.stcpModel === "visited") {
// } else if (m.visitorsModel === "visitorsProvider") {
// // 被访问者
// ini += `
// local_ip = "${m.localIp}"

View File

@ -5,6 +5,8 @@ class GlobalConstant {
public static TOML_EXT = ".toml";
public static GZ_EXT = ".gz";
public static TAR_GZ_EXT = ".tar.gz";
public static LOCAL_IP = "127.0.0.1";
public static FRPC_LOGIN_FAIL_EXIT = false;
public static FRP_ARCH_VERSION_MAPPING = {
win32_x64: ["window", "amd64"],

View File

@ -56,50 +56,64 @@ class ServerService extends BaseService<OpenSourceFrpcDesktopServer> {
const proxies = await this._proxyDao.findAll();
const enabledProxies = proxies
.filter(f => f.status === 1)
.filter(f => f.visitorsModel !== "visitors")
.map(proxy => {
if (proxy.type === "tcp") {
const {
_id,
status,
basicAuth,
bindAddr,
subdomain,
httpUser,
httpPassword,
fallbackTo,
fallbackTimeoutMs,
https2http,
https2httpCaFile,
https2httpKeyFile,
stcpModel,
customDomains,
locations,
hostHeaderRewrite,
keepTunnelOpen,
secretKey,
serverName,
...frpProxyConfig
} = proxy;
frpProxyConfig.localPort = parseInt(frpProxyConfig.localPort);
frpProxyConfig.remotePort = parseInt(frpProxyConfig.remotePort);
return frpProxyConfig;
} else {
if (proxy.type === "tcp" || proxy.type === "udp") {
return {
name: proxy.name,
type: proxy.type,
localIP: proxy.localIP,
localPort: parseInt(proxy.localPort),
remotePort: parseInt(proxy.remotePort)
};
} else if (proxy.type === "http" || proxy.type === "https") {
const { _id, status, ...frpProxyConfig } = proxy;
return frpProxyConfig;
} else if (
proxy.type === "stcp" ||
proxy.type === "xtcp" ||
proxy.type === "sudp"
) {
return {
name: proxy.name,
type: proxy.type,
localIP: proxy.localIP,
localPort: parseInt(proxy.localPort),
secretKey: proxy.secretKey
};
}
});
const enableVisitors = proxies
.filter(f => f.status === 1)
.filter(f => f.visitorsModel === "visitors")
.map(proxy => {
return {
name: proxy.name,
type: proxy.type,
// serverUser: proxy.serverUser,
serverName: proxy.serverName,
secretKey: proxy.secretKey,
bindAddr: proxy.bindAddr,
bindPort: proxy.bindPort,
// keepTunnelOpen: proxy.keepTunnelOpen
// maxRetriesAnHour: proxy.maxRetriesAnHour,
// minRetryInterval: proxy.minRetryInterval,
};
});
const { frpcVersion, _id, system, ...commonConfig } = server;
const frpcConfig = { ...commonConfig };
frpcConfig.log.to = PathUtils.getFrpcLogFilePath();
frpcConfig.loginFailExit = false;
frpcConfig.webServer.addr = "127.0.0.1";
const toml = TOML.stringify({ ...frpcConfig, proxies: enabledProxies });
frpcConfig.loginFailExit = GlobalConstant.FRPC_LOGIN_FAIL_EXIT;
frpcConfig.webServer.addr = GlobalConstant.LOCAL_IP;
const toml = TOML.stringify({
...frpcConfig,
proxies: enabledProxies,
visitors: enableVisitors
});
fs.writeFileSync(
outputPath, // 配置文件目录
toml, // 配置文件内容
{ flag: "w" }
);
fs.writeFileSync(outputPath, toml, { flag: "w" });
}
async importTomlConfig() {

View File

@ -56,7 +56,7 @@ const defaultForm: FrpcProxy = {
localPort: "8080",
remotePort: "8080",
customDomains: [""],
stcpModel: "visitors",
visitorsModel: "visitors",
serverName: "",
secretKey: "",
bindAddr: "",
@ -84,14 +84,14 @@ const editForm = ref<FrpcProxy>(_.cloneDeep(defaultForm));
*/
const proxyTypes = ref(["http", "https", "tcp", "udp", "stcp", "xtcp", "sudp"]);
const stcpModels = ref([
const visitorsModels = ref([
{
label: "访问者",
value: "visitors"
},
{
label: "被访问者",
value: "visited"
value: "visitorsProvider"
}
]);
@ -132,7 +132,7 @@ const editFormRules = reactive<FormRules>({
trigger: "blur"
}
],
stcpModel: [{ required: true, message: "请选择stcp模式", trigger: "blur" }],
visitorsModel: [{ required: true, message: "请选择stcp模式", trigger: "blur" }],
secretKey: [
{ required: true, message: "请输入stcp共享密钥", trigger: "blur" }
],
@ -188,12 +188,12 @@ const isXtcp = computed(() => {
return editForm.value.type === "xtcp";
});
const isStcpVisited = computed(() => {
const isStcpvisitorsProvider = computed(() => {
return (
(editForm.value.type === "stcp" ||
editForm.value.type === "sudp" ||
editForm.value.type === "xtcp") &&
editForm.value.stcpModel === "visited"
editForm.value.visitorsModel === "visitorsProvider"
);
});
@ -202,7 +202,7 @@ const isStcpVisitors = computed(() => {
(editForm.value.type === "stcp" ||
editForm.value.type === "sudp" ||
editForm.value.type === "xtcp") &&
editForm.value.stcpModel === "visitors"
editForm.value.visitorsModel === "visitors"
);
});
@ -382,13 +382,13 @@ const allowCopyAccessAddress = (proxy: FrpcProxy) => {
) {
return false;
}
if (proxy.type === "stcp" && proxy.stcpModel === "visited") {
if (proxy.type === "stcp" && proxy.visitorsModel === "visitorsProvider") {
return false;
}
if (proxy.type === "xtcp" && proxy.stcpModel === "visited") {
if (proxy.type === "xtcp" && proxy.visitorsModel === "visitorsProvider") {
return false;
}
if (proxy.type === "sudp" && proxy.stcpModel === "visited") {
if (proxy.type === "sudp" && proxy.visitorsModel === "visitorsProvider") {
return false;
}
return true;
@ -401,10 +401,10 @@ const handleCopyAccessAddress = (proxy: FrpcProxy) => {
) {
return;
}
if (proxy.type === "stcp" && proxy.stcpModel === "visited") {
if (proxy.type === "stcp" && proxy.visitorsModel === "visitorsProvider") {
return;
}
if (proxy.type === "xtcp" && proxy.stcpModel === "visited") {
if (proxy.type === "xtcp" && proxy.visitorsModel === "visitorsProvider") {
return;
}
let accessAddressStr = "";
@ -637,7 +637,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' ||
proxy.type === 'xtcp' ||
proxy.type === 'sudp') &&
proxy.stcpModel === 'visitors'
proxy.visitorsModel === 'visitors'
"
size="small"
>
@ -649,7 +649,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' ||
proxy.type === 'xtcp' ||
proxy.type === 'sudp') &&
proxy.stcpModel === 'visited'
proxy.visitorsModel === 'visitorsProvider'
"
>被访问者
</el-tag>
@ -722,7 +722,7 @@ onUnmounted(() => {
(proxy.type !== 'stcp' &&
proxy.type !== 'xtcp' &&
proxy.type !== 'sudp') ||
proxy.stcpModel !== 'visitors'
proxy.visitorsModel !== 'visitors'
"
>
<p class="text-[#ADADAD] font-bold">内网地址</p>
@ -739,7 +739,7 @@ onUnmounted(() => {
(proxy.type !== 'stcp' &&
proxy.type !== 'xtcp' &&
proxy.type !== 'sudp') ||
proxy.stcpModel !== 'visitors'
proxy.visitorsModel !== 'visitors'
"
>
<p class="text-[#ADADAD] font-bold">内网端口</p>
@ -752,7 +752,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' ||
proxy.type === 'xtcp' ||
proxy.type === 'sudp') &&
proxy.stcpModel === 'visitors'
proxy.visitorsModel === 'visitors'
"
>
<p class="text-[#ADADAD] font-bold">访问者名称</p>
@ -765,7 +765,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' ||
proxy.type === 'xtcp' ||
proxy.type === 'sudp') &&
proxy.stcpModel === 'visitors'
proxy.visitorsModel === 'visitors'
"
>
<p class="text-[#ADADAD] font-bold">绑定地址</p>
@ -778,7 +778,7 @@ onUnmounted(() => {
(proxy.type === 'stcp' ||
proxy.type === 'xtcp' ||
proxy.type === 'sudp') &&
proxy.stcpModel === 'visitors'
proxy.visitorsModel === 'visitors'
"
>
<p class="text-[#ADADAD] font-bold">绑定端口</p>
@ -834,10 +834,10 @@ onUnmounted(() => {
</el-col>
<template v-if="isStcp || isSudp || isXtcp">
<el-col :span="12">
<el-form-item :label="`${editForm.type}模式:`" prop="stcpModel">
<el-radio-group v-model="editForm.stcpModel">
<el-form-item :label="`${editForm.type}模式:`" prop="visitorsModel">
<el-radio-group v-model="editForm.visitorsModel">
<el-radio
v-for="p in stcpModels"
v-for="p in visitorsModels"
:key="p.value"
:label="p.label"
:value="p.value"
@ -902,7 +902,7 @@ onUnmounted(() => {
</el-button>
</el-form-item>
</el-col>
<template v-if="!(isStcp || isXtcp || isSudp) || isStcpVisited">
<template v-if="!(isStcp || isXtcp || isSudp) || isStcpvisitorsProvider">
<el-col :span="12">
<el-form-item label="内网地址:" prop="localIP">
<el-autocomplete

2
types/frp.d.ts vendored
View File

@ -63,7 +63,7 @@ interface FrpcProxyConfig {
customDomains: string[];
locations: string[];
hostHeaderRewrite: string;
stcpModel: string;
visitorsModel: string;
serverName: string;
secretKey: string;
bindAddr: string;

2
types/global.d.ts vendored
View File

@ -21,7 +21,7 @@ declare global {
localPort: any;
remotePort: string;
customDomains: string[];
stcpModel: string;
visitorsModel: string;
serverName: string;
secretKey: string;
bindAddr: string;