mirror of
https://mirror.suhoan.cn/https://github.com/EasyTier/EasyTier.git
synced 2025-12-12 12:47:25 +08:00
fix vpn close when getting new subnet route (#179)
This commit is contained in:
@@ -39,6 +39,7 @@ async function doStopVpn() {
|
|||||||
await waitVpnStatus(false, 3)
|
await waitVpnStatus(false, 3)
|
||||||
|
|
||||||
curVpnStatus.ipv4Addr = undefined
|
curVpnStatus.ipv4Addr = undefined
|
||||||
|
curVpnStatus.routes = []
|
||||||
}
|
}
|
||||||
|
|
||||||
async function doStartVpn(ipv4Addr: string, cidr: number, routes: string[]) {
|
async function doStartVpn(ipv4Addr: string, cidr: number, routes: string[]) {
|
||||||
@@ -73,8 +74,6 @@ async function onVpnServiceStart(payload: any) {
|
|||||||
async function onVpnServiceStop(payload: any) {
|
async function onVpnServiceStop(payload: any) {
|
||||||
console.log('vpn service stop', JSON.stringify(payload))
|
console.log('vpn service stop', JSON.stringify(payload))
|
||||||
curVpnStatus.running = false
|
curVpnStatus.running = false
|
||||||
networkStore.clearNetworkInstances()
|
|
||||||
await retainNetworkInstance(networkStore.networkInstanceIds)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function registerVpnServiceListener() {
|
async function registerVpnServiceListener() {
|
||||||
@@ -111,8 +110,7 @@ function getRoutesForVpn(routes: Route[]): string[] {
|
|||||||
return Array.from(new Set(ret)).sort()
|
return Array.from(new Set(ret)).sort()
|
||||||
}
|
}
|
||||||
|
|
||||||
async function watchNetworkInstance() {
|
async function onNetworkInstanceChange() {
|
||||||
networkStore.$subscribe(async () => {
|
|
||||||
let insts = networkStore.networkInstanceIds
|
let insts = networkStore.networkInstanceIds
|
||||||
if (!insts) {
|
if (!insts) {
|
||||||
await doStopVpn()
|
await doStopVpn()
|
||||||
@@ -138,10 +136,38 @@ async function watchNetworkInstance() {
|
|||||||
|
|
||||||
if (ipChanged || routesChanged) {
|
if (ipChanged || routesChanged) {
|
||||||
console.log('virtual ip changed', JSON.stringify(curVpnStatus), virtual_ip)
|
console.log('virtual ip changed', JSON.stringify(curVpnStatus), virtual_ip)
|
||||||
|
try {
|
||||||
await doStopVpn()
|
await doStopVpn()
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
await doStartVpn(virtual_ip, 24, routes)
|
await doStartVpn(virtual_ip, 24, routes)
|
||||||
|
} catch (e) {
|
||||||
|
console.error("start vpn failed, clear all network insts.", e)
|
||||||
|
networkStore.clearNetworkInstances()
|
||||||
|
await retainNetworkInstance(networkStore.networkInstanceIds)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function watchNetworkInstance() {
|
||||||
|
var subscribe_running = false
|
||||||
|
networkStore.$subscribe(async () => {
|
||||||
|
if (subscribe_running) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
console.log('network instance change')
|
||||||
|
|
||||||
|
subscribe_running = true
|
||||||
|
try {
|
||||||
|
await onNetworkInstanceChange()
|
||||||
|
} catch (_) {
|
||||||
|
}
|
||||||
|
console.log('network instance change done')
|
||||||
|
subscribe_running = false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -57,22 +57,24 @@ class TauriVpnService : VpnService() {
|
|||||||
|
|
||||||
override fun onDestroy() {
|
override fun onDestroy() {
|
||||||
println("vpn on destroy")
|
println("vpn on destroy")
|
||||||
self = null
|
|
||||||
super.onDestroy()
|
super.onDestroy()
|
||||||
disconnect()
|
disconnect()
|
||||||
|
self = null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onRevoke() {
|
override fun onRevoke() {
|
||||||
println("vpn on revoke")
|
println("vpn on revoke")
|
||||||
self = null
|
|
||||||
super.onRevoke()
|
super.onRevoke()
|
||||||
disconnect()
|
disconnect()
|
||||||
|
self = null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun disconnect() {
|
private fun disconnect() {
|
||||||
|
if (self == this && this::vpnInterface.isInitialized) {
|
||||||
triggerCallback("vpn_service_stop", JSObject())
|
triggerCallback("vpn_service_stop", JSObject())
|
||||||
vpnInterface.close()
|
vpnInterface.close()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun createVpnInterface(args: Bundle?): ParcelFileDescriptor {
|
private fun createVpnInterface(args: Bundle?): ParcelFileDescriptor {
|
||||||
var builder = Builder()
|
var builder = Builder()
|
||||||
|
|||||||
Reference in New Issue
Block a user