set route correctly in android (#172)
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import { addPluginListener } from '@tauri-apps/api/core';
|
import { addPluginListener } from '@tauri-apps/api/core';
|
||||||
import { prepare_vpn, start_vpn, stop_vpn } from 'tauri-plugin-vpnservice-api';
|
import { prepare_vpn, start_vpn, stop_vpn } from 'tauri-plugin-vpnservice-api';
|
||||||
|
import { Route } from '~/types/network';
|
||||||
|
|
||||||
const networkStore = useNetworkStore()
|
const networkStore = useNetworkStore()
|
||||||
|
|
||||||
@@ -7,12 +8,14 @@ interface vpnStatus {
|
|||||||
running: boolean
|
running: boolean
|
||||||
ipv4Addr: string | null | undefined
|
ipv4Addr: string | null | undefined
|
||||||
ipv4Cidr: number | null | undefined
|
ipv4Cidr: number | null | undefined
|
||||||
|
routes: string[]
|
||||||
}
|
}
|
||||||
|
|
||||||
var curVpnStatus: vpnStatus = {
|
var curVpnStatus: vpnStatus = {
|
||||||
running: false,
|
running: false,
|
||||||
ipv4Addr: undefined,
|
ipv4Addr: undefined,
|
||||||
ipv4Cidr: undefined,
|
ipv4Cidr: undefined,
|
||||||
|
routes: []
|
||||||
}
|
}
|
||||||
|
|
||||||
async function waitVpnStatus(target_status: boolean, timeout_sec: number) {
|
async function waitVpnStatus(target_status: boolean, timeout_sec: number) {
|
||||||
@@ -38,7 +41,7 @@ async function doStopVpn() {
|
|||||||
curVpnStatus.ipv4Addr = undefined
|
curVpnStatus.ipv4Addr = undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
async function doStartVpn(ipv4Addr: string, cidr: number) {
|
async function doStartVpn(ipv4Addr: string, cidr: number, routes: string[]) {
|
||||||
if (curVpnStatus.running) {
|
if (curVpnStatus.running) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -46,7 +49,7 @@ async function doStartVpn(ipv4Addr: string, cidr: number) {
|
|||||||
console.log('start vpn')
|
console.log('start vpn')
|
||||||
let start_ret = await start_vpn({
|
let start_ret = await start_vpn({
|
||||||
"ipv4Addr": ipv4Addr + '/' + cidr,
|
"ipv4Addr": ipv4Addr + '/' + cidr,
|
||||||
"routes": ["0.0.0.0/0"],
|
"routes": routes,
|
||||||
"disallowedApplications": ["com.kkrainbow.easytier"],
|
"disallowedApplications": ["com.kkrainbow.easytier"],
|
||||||
"mtu": 1300,
|
"mtu": 1300,
|
||||||
});
|
});
|
||||||
@@ -56,6 +59,7 @@ async function doStartVpn(ipv4Addr: string, cidr: number) {
|
|||||||
await waitVpnStatus(true, 3)
|
await waitVpnStatus(true, 3)
|
||||||
|
|
||||||
curVpnStatus.ipv4Addr = ipv4Addr
|
curVpnStatus.ipv4Addr = ipv4Addr
|
||||||
|
curVpnStatus.routes = routes
|
||||||
}
|
}
|
||||||
|
|
||||||
async function onVpnServiceStart(payload: any) {
|
async function onVpnServiceStart(payload: any) {
|
||||||
@@ -88,6 +92,25 @@ async function registerVpnServiceListener() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getRoutesForVpn(routes: Route[]): string[] {
|
||||||
|
if (!routes) {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
let ret = []
|
||||||
|
for (let r of routes) {
|
||||||
|
for (let cidr of r.proxy_cidrs) {
|
||||||
|
if (cidr.indexOf('/') === -1) {
|
||||||
|
cidr += '/32'
|
||||||
|
}
|
||||||
|
ret.push(cidr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sort and dedup
|
||||||
|
return Array.from(new Set(ret)).sort()
|
||||||
|
}
|
||||||
|
|
||||||
async function watchNetworkInstance() {
|
async function watchNetworkInstance() {
|
||||||
networkStore.$subscribe(async () => {
|
networkStore.$subscribe(async () => {
|
||||||
let insts = networkStore.networkInstanceIds
|
let insts = networkStore.networkInstanceIds
|
||||||
@@ -103,12 +126,20 @@ async function watchNetworkInstance() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const virtual_ip = curNetworkInfo?.node_info?.virtual_ipv4
|
const virtual_ip = curNetworkInfo?.node_info?.virtual_ipv4
|
||||||
if (virtual_ip !== curVpnStatus.ipv4Addr) {
|
if (!virtual_ip || !virtual_ip.length) {
|
||||||
|
await doStopVpn()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const routes = getRoutesForVpn(curNetworkInfo?.routes)
|
||||||
|
|
||||||
|
var ipChanged = virtual_ip !== curVpnStatus.ipv4Addr
|
||||||
|
var routesChanged = JSON.stringify(routes) !== JSON.stringify(curVpnStatus.routes)
|
||||||
|
|
||||||
|
if (ipChanged || routesChanged) {
|
||||||
console.log('virtual ip changed', JSON.stringify(curVpnStatus), virtual_ip)
|
console.log('virtual ip changed', JSON.stringify(curVpnStatus), virtual_ip)
|
||||||
await doStopVpn()
|
await doStopVpn()
|
||||||
if (virtual_ip.length > 0) {
|
await doStartVpn(virtual_ip, 24, routes)
|
||||||
await doStartVpn(virtual_ip, 24)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user