mirror of
https://github.com/snltty/linker.git
synced 2025-12-20 10:26:45 +08:00
小bug
This commit is contained in:
@@ -246,7 +246,6 @@ namespace linker.libs
|
||||
return ip | ~prefixIP;
|
||||
}
|
||||
|
||||
|
||||
public static IPAddress ToGatewayIP(IPAddress ip, byte prefixLength)
|
||||
{
|
||||
uint network = BinaryPrimitives.ReadUInt32BigEndian(NetworkIP2IP(ip, NetworkHelper.PrefixLength2Value(prefixLength)).GetAddressBytes());
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.181" ProductVersion="0.0.0.181" publishDir="/dist/" dstrip="false" local="false" ignored="false">
|
||||
<project ver="10" name="linker.tray.win" libEmbed="true" icon="..\linker\favicon.ico" ui="win" output="linker.tray.win.exe" CompanyName="snltty" FileDescription="linker.tray.win" LegalCopyright="Copyright (C) snltty 2024" ProductName="linker.tray.win" InternalName="linker.install.win" FileVersion="0.0.0.183" ProductVersion="0.0.0.183" publishDir="/dist/" dstrip="false" local="false" ignored="false">
|
||||
<file name="main.aardio" path="main.aardio" comment="main.aardio"/>
|
||||
<folder name="资源文件" path="res" embed="true" local="false" ignored="false">
|
||||
<file name="favicon.ico" path="res\favicon.ico" comment="res\favicon.ico"/>
|
||||
|
||||
BIN
linker.tray.win/dist/linker.tray.win.exe
vendored
BIN
linker.tray.win/dist/linker.tray.win.exe
vendored
Binary file not shown.
@@ -1 +1 @@
|
||||
.table-sort th[data-v-4b2df38c]{border-bottom:0}.dropdown[data-v-6638f97d]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-6638f97d]{vertical-align:middle}.dropdown .badge[data-v-6638f97d]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-ffd0d512]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-ffd0d512]{color:#d400ff}.self .el-icon[data-v-ffd0d512]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-5d52ca48]{text-align:left}.el-icon.loading[data-v-7edec26e],a.loading[data-v-7edec26e]{vertical-align:middle;font-weight:700;animation:loading-7edec26e 1s linear infinite}.el-switch.is-disabled[data-v-7edec26e]{opacity:1}.el-input[data-v-7edec26e]{width:8rem}.delay[data-v-7edec26e]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-7edec26e]{font-size:1.5rem}@keyframes loading-7edec26e{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.wrap[data-v-71a71fe4]{padding-right:1rem}.remark[data-v-71a71fe4]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wrap[data-v-4abaaeaf]{padding-right:1rem}.el-switch.is-disabled[data-v-34275839]{opacity:1}.upgrade-wrap[data-v-34275839]{border:1px solid #ddd;margin-bottom:2rem;padding:0 0 1rem 0}.el-switch.is-disabled[data-v-6ee2406c]{opacity:1}.el-icon.loading[data-v-c1ea089c],a.loading[data-v-c1ea089c]{vertical-align:middle;font-weight:700;animation:loading-c1ea089c 1s linear infinite}.el-switch.is-disabled[data-v-c1ea089c]{opacity:1}.el-input[data-v-c1ea089c]{width:8rem}.switch-btn[data-v-c1ea089c]{font-size:1.5rem}@keyframes loading-c1ea089c{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-022e3781]{opacity:1}.upgrade-wrap[data-v-022e3781]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem 0 1rem 0}.lan-item[data-v-022e3781]{margin-bottom:0}.el-switch.is-disabled[data-v-49e16cac]{opacity:1}.green[data-v-49e16cac]{font-weight:700}.el-switch.is-disabled[data-v-6ea047f9]{opacity:1}a[data-v-26b3f87e]{text-decoration:underline}a+a[data-v-26b3f87e]{margin-left:1rem}a.green[data-v-26b3f87e]{font-weight:700}.head[data-v-15b05a01]{padding-bottom:1rem}.green[data-v-15b05a01]{color:green;font-weight:700}.error[data-v-15b05a01]{font-weight:700}.error .el-icon[data-v-15b05a01]{vertical-align:text-bottom}.head[data-v-219c690c]{padding-bottom:1rem}.error[data-v-219c690c]{font-weight:700}.error .el-icon[data-v-219c690c]{vertical-align:text-bottom}.head[data-v-7891b902]{padding-bottom:1rem}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-3d1c480c]{padding:1rem}.home-list-wrap .page[data-v-3d1c480c]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-3d1c480c]{display:inline-block}
|
||||
.table-sort th[data-v-4b2df38c]{border-bottom:0}.dropdown[data-v-6638f97d]{border:1px solid #ddd;padding:.4rem;font-size:1.3rem;border-radius:.4rem;position:relative}.dropdown .el-icon[data-v-6638f97d]{vertical-align:middle}.dropdown .badge[data-v-6638f97d]{position:absolute;right:-1rem;top:-50%;border-radius:10px;background-color:#f1ae05;color:#fff;padding:.2rem .6rem;font-size:1.2rem}a[data-v-6653ef00]{color:#666;text-decoration:underline}a.green[data-v-6653ef00]{color:green;font-weight:700}a.download[data-v-6653ef00]{margin-left:.6rem}a.download .el-icon[data-v-6653ef00]{vertical-align:middle;font-weight:700;margin-left:.3rem}a.download .el-icon.loading[data-v-6653ef00]{animation:loading-6653ef00 1s linear infinite}a.download+a.download[data-v-6653ef00]{margin-left:.2rem}@keyframes loading-6653ef00{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}img.system[data-v-ffd0d512]{height:1.6rem;vertical-align:middle;margin-right:.4rem}.self[data-v-ffd0d512]{color:#d400ff}.self .el-icon[data-v-ffd0d512]{vertical-align:text-bottom}.ipaddress span[data-v-5db71b03]{vertical-align:middle}.el-input[data-v-5db71b03]{width:12rem;margin-right:.6rem}.el-col[data-v-5d52ca48]{text-align:left}.el-icon.loading[data-v-7edec26e],a.loading[data-v-7edec26e]{vertical-align:middle;font-weight:700;animation:loading-7edec26e 1s linear infinite}.el-switch.is-disabled[data-v-7edec26e]{opacity:1}.el-input[data-v-7edec26e]{width:8rem}.delay[data-v-7edec26e]{position:absolute;right:0;bottom:0;line-height:normal}.switch-btn[data-v-7edec26e]{font-size:1.5rem}@keyframes loading-7edec26e{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.wrap[data-v-71a71fe4]{padding-right:1rem}.remark[data-v-71a71fe4]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wrap[data-v-4abaaeaf]{padding-right:1rem}.el-switch.is-disabled[data-v-34275839]{opacity:1}.upgrade-wrap[data-v-34275839]{border:1px solid #ddd;margin-bottom:2rem;padding:0 0 1rem 0}.el-switch.is-disabled[data-v-4a28804a]{opacity:1}.calc span[data-v-4a28804a]{display:inline-block}.calc span.label[data-v-4a28804a]{width:6rem}.el-icon.loading[data-v-c1ea089c],a.loading[data-v-c1ea089c]{vertical-align:middle;font-weight:700;animation:loading-c1ea089c 1s linear infinite}.el-switch.is-disabled[data-v-c1ea089c]{opacity:1}.el-input[data-v-c1ea089c]{width:8rem}.switch-btn[data-v-c1ea089c]{font-size:1.5rem}@keyframes loading-c1ea089c{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.el-switch.is-disabled[data-v-022e3781]{opacity:1}.upgrade-wrap[data-v-022e3781]{border:1px solid #ddd;margin-bottom:2rem;padding:1rem 0 1rem 0}.lan-item[data-v-022e3781]{margin-bottom:0}.el-switch.is-disabled[data-v-49e16cac]{opacity:1}.green[data-v-49e16cac]{font-weight:700}.el-switch.is-disabled[data-v-6ea047f9]{opacity:1}a[data-v-26b3f87e]{text-decoration:underline}a+a[data-v-26b3f87e]{margin-left:1rem}a.green[data-v-26b3f87e]{font-weight:700}.head[data-v-15b05a01]{padding-bottom:1rem}.green[data-v-15b05a01]{color:green;font-weight:700}.error[data-v-15b05a01]{font-weight:700}.error .el-icon[data-v-15b05a01]{vertical-align:text-bottom}.head[data-v-7eb8e7cc]{padding-bottom:1rem}.error[data-v-7eb8e7cc]{font-weight:700}.error .el-icon[data-v-7eb8e7cc]{vertical-align:text-bottom}.head[data-v-7891b902]{padding-bottom:1rem}.table-sort.el-table th.el-table__cell.is-leaf{border-bottom:0}.table-sort.el-table .el-table__inner-wrapper:before{height:0}.home-list-wrap[data-v-3d1c480c]{padding:1rem}.home-list-wrap .page[data-v-3d1c480c]{padding-top:1rem}.home-list-wrap .page-wrap[data-v-3d1c480c]{display:inline-block}
|
||||
@@ -1 +1 @@
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>linker.web</title><script defer="defer" src="js/chunk-vendors.7b81ea90.js"></script><script defer="defer" src="js/app.1eab79d1.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.e2cbd3ed.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but linker.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>linker.web</title><script defer="defer" src="js/chunk-vendors.7b81ea90.js"></script><script defer="defer" src="js/app.8e82ca5d.js"></script><link href="css/chunk-vendors.d8267b33.css" rel="stylesheet"><link href="css/app.e2cbd3ed.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but linker.web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
|
||||
1
linker.tray.win/web/js/110.0106ebd8.js
Normal file
1
linker.tray.win/web/js/110.0106ebd8.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
linker.tray.win/web/js/245.a0641292.js
Normal file
1
linker.tray.win/web/js/245.a0641292.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
linker.tray.win/web/js/app.8e82ca5d.js
Normal file
1
linker.tray.win/web/js/app.8e82ca5d.js
Normal file
File diff suppressed because one or more lines are too long
@@ -30,6 +30,10 @@ export const subscribeForwardTest = (machineid) => {
|
||||
return sendWebsocketMsg('tuntapclient/SubscribeForwardTest', machineid);
|
||||
}
|
||||
|
||||
|
||||
export const calcNetwork = (data) => {
|
||||
return sendWebsocketMsg('tuntapclient/CalcNetwork', data);
|
||||
}
|
||||
export const getNetwork = () => {
|
||||
return sendWebsocketMsg('tuntapclient/GetNetwork');
|
||||
}
|
||||
|
||||
@@ -185,7 +185,10 @@ export default {
|
||||
row.Domain = row.Temp;
|
||||
}
|
||||
|
||||
addSForwardInfo({machineid:sforward.value.machineid,data:row}).then(() => {
|
||||
addSForwardInfo({machineid:sforward.value.machineid,data:row}).then((res) => {
|
||||
if(res == false){
|
||||
ElMessage.error('操作失败,可能存在相同值');
|
||||
}
|
||||
setTimeout(()=>{
|
||||
_getSForwardInfo();
|
||||
},100)
|
||||
|
||||
@@ -6,12 +6,22 @@
|
||||
<p>网络租期30天、IP租期7天</p>
|
||||
</el-form-item>
|
||||
<el-form-item label="网络和掩码" prop="IP">
|
||||
<el-input v-model="state.ruleForm.IP" style="width:14rem" />
|
||||
<el-input v-model="state.ruleForm.IP" style="width:14rem" @change="handlePrefixLengthChange" />
|
||||
<span>/</span>
|
||||
<el-input @change="handlePrefixLengthChange" v-model="state.ruleForm.PrefixLength" style="width:4rem" />
|
||||
<span style="width: 1rem;"></span>
|
||||
<el-button @click="handleClear">清除</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item label="" prop="IP1">
|
||||
<div class="calc">
|
||||
<p><span class="label">网络号</span><span class="value">{{ state.values.Network }}</span></p>
|
||||
<p><span class="label">网关</span><span class="value">{{ state.values.Gateway }}</span></p>
|
||||
<p><span class="label">开始IP</span><span class="value">{{ state.values.Start }}</span></p>
|
||||
<p><span class="label">结束IP</span><span class="value">{{ state.values.End }}</span></p>
|
||||
<p><span class="label">广播号</span><span class="value">{{ state.values.Broadcast }}</span></p>
|
||||
<p><span class="label">IP数量</span><span class="value">{{ state.values.Count }}</span></p>
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-form-item label="" prop="Btns" v-if="hasLease">
|
||||
<div>
|
||||
<el-button @click="state.show = false">取消</el-button>
|
||||
@@ -23,7 +33,7 @@
|
||||
</el-dialog>
|
||||
</template>
|
||||
<script>
|
||||
import {getNetwork,addNetwork } from '@/apis/tuntap';
|
||||
import {getNetwork,addNetwork,calcNetwork } from '@/apis/tuntap';
|
||||
import { injectGlobalData } from '@/provide';
|
||||
import { ElMessage } from 'element-plus';
|
||||
import { computed, onMounted, reactive, ref, watch } from 'vue';
|
||||
@@ -44,7 +54,8 @@ export default {
|
||||
IP:'0.0.0.0',
|
||||
PrefixLength:24
|
||||
},
|
||||
rules: {}
|
||||
rules: {},
|
||||
values:{}
|
||||
});
|
||||
watch(() => state.show, (val) => {
|
||||
if (!val) {
|
||||
@@ -54,10 +65,16 @@ export default {
|
||||
}
|
||||
});
|
||||
|
||||
const _calcNetwork = ()=>{
|
||||
calcNetwork(state.ruleForm).then((res)=>{
|
||||
state.values = res;
|
||||
});
|
||||
}
|
||||
const _getNetwork = ()=>{
|
||||
getNetwork().then((res)=>{
|
||||
state.ruleForm.IP = res.IP;
|
||||
state.ruleForm.PrefixLength = res.PrefixLength;
|
||||
_calcNetwork();
|
||||
});
|
||||
}
|
||||
const handlePrefixLengthChange = ()=>{
|
||||
@@ -66,6 +83,7 @@ export default {
|
||||
value = 24;
|
||||
}
|
||||
state.ruleForm.PrefixLength = value;
|
||||
_calcNetwork();
|
||||
}
|
||||
const handleSave = () => {
|
||||
addNetwork(state.ruleForm).then(()=>{
|
||||
@@ -98,4 +116,11 @@ export default {
|
||||
</script>
|
||||
<style lang="stylus" scoped>
|
||||
.el-switch.is-disabled{opacity :1;}
|
||||
.calc{
|
||||
span{
|
||||
display: inline-block;
|
||||
&.label{width:6rem;}
|
||||
}
|
||||
}
|
||||
|
||||
</style>
|
||||
@@ -68,7 +68,7 @@ namespace linker.plugins.relay.client
|
||||
await TaskRelay();
|
||||
}
|
||||
return true;
|
||||
}, () => lastTicksManager.DiffLessEqual(3000) ? 3000 : 30000);
|
||||
}, () => 3000);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -70,7 +70,6 @@ namespace linker.plugins.sforward
|
||||
return countDic;
|
||||
}
|
||||
|
||||
|
||||
public string GetSecretKey()
|
||||
{
|
||||
return fileConfig.Data.Client.SForward.SecretKey;
|
||||
@@ -256,14 +255,13 @@ namespace linker.plugins.sforward
|
||||
}
|
||||
|
||||
|
||||
bool testing = false;
|
||||
private readonly OperatingManager operatingManager = new OperatingManager();
|
||||
/// <summary>
|
||||
/// 测试本机服务
|
||||
/// </summary>
|
||||
public void TestLocal()
|
||||
{
|
||||
if (testing) return;
|
||||
testing = true;
|
||||
if (operatingManager.StartOperation() == false) return;
|
||||
|
||||
TimerHelper.Async(async () =>
|
||||
{
|
||||
@@ -285,7 +283,7 @@ namespace linker.plugins.sforward
|
||||
catch (Exception)
|
||||
{
|
||||
}
|
||||
testing = false;
|
||||
operatingManager.StopOperation();
|
||||
});
|
||||
|
||||
async Task<(IPEndPoint, string)> ConnectAsync(IPEndPoint ep)
|
||||
|
||||
@@ -11,6 +11,8 @@ using linker.plugins.messenger;
|
||||
using linker.plugins.tuntap.config;
|
||||
using linker.client.config;
|
||||
using linker.plugins.tuntap.lease;
|
||||
using System.Net;
|
||||
using linker.libs;
|
||||
|
||||
namespace linker.plugins.tuntap
|
||||
{
|
||||
@@ -170,6 +172,30 @@ namespace linker.plugins.tuntap
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 计算网络
|
||||
/// </summary>
|
||||
/// <param name="param"></param>
|
||||
/// <returns></returns>
|
||||
public NetworkInfo CalcNetwork(ApiControllerParamsInfo param)
|
||||
{
|
||||
NetworkParamInfo info = param.Content.DeJson<NetworkParamInfo>();
|
||||
|
||||
uint ip = NetworkHelper.IP2Value(info.IP);
|
||||
uint prefixValue = NetworkHelper.PrefixLength2Value(info.PrefixLength);
|
||||
uint network = NetworkHelper.NetworkValue2Value(ip, prefixValue);
|
||||
uint broadcast = NetworkHelper.BroadcastValue2Value(ip, prefixValue);
|
||||
return new NetworkInfo
|
||||
{
|
||||
Network = NetworkHelper.Value2IP(network),
|
||||
Broadcast = NetworkHelper.Value2IP(broadcast),
|
||||
Gateway = NetworkHelper.ToGatewayIP(ip, prefixValue),
|
||||
Start = NetworkHelper.Value2IP(network + 2),
|
||||
End = NetworkHelper.Value2IP(broadcast - 1),
|
||||
Count = (int)(broadcast - network - 2),
|
||||
};
|
||||
}
|
||||
/// <summary>
|
||||
/// 添加网络
|
||||
/// </summary>
|
||||
@@ -240,4 +266,19 @@ namespace linker.plugins.tuntap
|
||||
public ConcurrentDictionary<string, ITunnelConnection> List { get; set; }
|
||||
public ulong HashCode { get; set; }
|
||||
}
|
||||
|
||||
public sealed class NetworkParamInfo
|
||||
{
|
||||
public IPAddress IP { get; set; }
|
||||
public byte PrefixLength { get; set; }
|
||||
}
|
||||
public sealed class NetworkInfo
|
||||
{
|
||||
public IPAddress Network { get; set; }
|
||||
public IPAddress Gateway { get; set; }
|
||||
public IPAddress Start { get; set; }
|
||||
public IPAddress End { get; set; }
|
||||
public IPAddress Broadcast { get; set; }
|
||||
public int Count { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
v1.6.2
|
||||
2024-12-08 13:05:55
|
||||
2024-12-08 15:03:00
|
||||
1. 修复UI
|
||||
2. 修复服务端重启无法关闭内网穿透的问题
|
||||
3. 修复网络掩码计算错误
|
||||
Reference in New Issue
Block a user