Files
s-ui/frontend/src/components/protocols/Tun.vue
T
admin8800 3eb70ee9ed add
2026-05-10 06:41:44 +00:00

101 lines
3.6 KiB
Vue

<template>
<v-card subtitle="Tun">
<v-row>
<v-col cols="12" sm="8">
<v-text-field v-model="addrs" :label="$t('types.tun.addr') + ' ' + $t('commaSeparated')" placeholder="172.18.0.1/30" hide-details></v-text-field>
</v-col>
</v-row>
<v-row>
<v-col cols="12" sm="6" md="4">
<v-text-field v-model="data.interface_name" :label="$t('types.tun.ifName')" placeholder="tun0" hide-details clearable @click:clear="delete data.interface_name"></v-text-field>
</v-col>
<v-col cols="12" sm="6" md="4">
<v-text-field type="number" v-model.number="data.mtu" label="MTU" hide-details></v-text-field>
</v-col>
</v-row>
<v-row>
<v-col cols="12" sm="6" md="4">
<v-text-field
type="number"
v-model.number="udpTimeout"
label="UDP timeout"
min="1"
:suffix="$t('date.m')"
hide-details>
</v-text-field>
</v-col>
<v-col cols="12" sm="6" md="4">
<v-select
v-model="data.stack"
label="Stack"
:items="['system','gvisor','mixed']"
hide-details
></v-select>
</v-col>
<v-col cols="12" sm="6" md="4">
<v-switch v-model="data.endpoint_independent_nat" color="primary" label="Independent NAT" hide-details></v-switch>
</v-col>
</v-row>
<v-row>
<v-col cols="12" sm="6" md="4">
<v-switch v-model="autoRoute" color="primary" label="Auto Route" hide-details></v-switch>
</v-col>
<v-col cols="12" sm="6" md="4" v-if="autoRoute">
<v-switch v-model="data.auto_redirect" color="primary" label="Auto Redirect" hide-details></v-switch>
</v-col>
<v-col cols="12" sm="6" md="4" v-if="autoRoute">
<v-switch v-model="data.strict_route" color="primary" label="Strict Route" hide-details></v-switch>
</v-col>
<v-col cols="12" sm="6" md="4" v-if="autoRoute && data.auto_redirect">
<v-switch v-model="data.exclude_mptcp" color="primary" :label="$t('types.tun.excludeMptcp')" hide-details></v-switch>
</v-col>
<v-col cols="12" sm="6" md="4" v-if="autoRoute && data.auto_redirect">
<v-text-field
type="number"
v-model.number="fallbackRuleIndex"
:label="$t('types.tun.fallbackRuleIndex')"
min="0"
hide-details>
</v-text-field>
</v-col>
</v-row>
</v-card>
</template>
<script lang="ts">
export default {
props: ['data'],
data() {
return {
menu: false
}
},
computed: {
addrs: {
get() { return this.$props.data.address?.join(',') },
set(v:string) { this.$props.data.address = v.length > 0 ? v.split(',') : undefined }
},
udpTimeout: {
get() { return this.$props.data.udp_timeout ? parseInt(this.$props.data.udp_timeout.replace('m','')) : 5 },
set(v:number) { this.$props.data.udp_timeout = v > 0 ? v + 'm' : '5m' }
},
autoRoute: {
get() { return this.$props.data.auto_route ?? false },
set(v:boolean) {
this.$props.data.auto_route = v
this.$props.data.auto_redirect = v ? false : undefined
this.$props.data.strict_route = v ? false : undefined
}
},
fallbackRuleIndex: {
get() { return this.$props.data.auto_redirect_iproute2_fallback_rule_index ?? 32768 },
set(v: number) {
const val = typeof v === 'number' && !isNaN(v) && v >= 0 ? v : undefined
this.$props.data.auto_redirect_iproute2_fallback_rule_index = val
}
}
}
}
</script>