mirror of
https://github.com/TeaOSLab/EdgeAdmin.git
synced 2025-11-07 23:30:26 +08:00
TCP、TLS、UDP支持端口范围
This commit is contained in:
@@ -5,6 +5,7 @@ import (
|
|||||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||||
"github.com/iwind/TeaGo/actions"
|
"github.com/iwind/TeaGo/actions"
|
||||||
"github.com/iwind/TeaGo/maps"
|
"github.com/iwind/TeaGo/maps"
|
||||||
|
"github.com/iwind/TeaGo/types"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@@ -18,9 +19,10 @@ func (this *AddPortPopupAction) Init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *AddPortPopupAction) RunGet(params struct {
|
func (this *AddPortPopupAction) RunGet(params struct {
|
||||||
ServerType string
|
ServerType string
|
||||||
Protocol string
|
Protocol string
|
||||||
From string
|
From string
|
||||||
|
SupportRange bool
|
||||||
}) {
|
}) {
|
||||||
this.Data["from"] = params.From
|
this.Data["from"] = params.From
|
||||||
|
|
||||||
@@ -36,10 +38,14 @@ func (this *AddPortPopupAction) RunGet(params struct {
|
|||||||
}
|
}
|
||||||
this.Data["protocols"] = protocols
|
this.Data["protocols"] = protocols
|
||||||
|
|
||||||
|
this.Data["supportRange"] = params.SupportRange
|
||||||
|
|
||||||
this.Show()
|
this.Show()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *AddPortPopupAction) RunPost(params struct {
|
func (this *AddPortPopupAction) RunPost(params struct {
|
||||||
|
SupportRange bool
|
||||||
|
|
||||||
Protocol string
|
Protocol string
|
||||||
Address string
|
Address string
|
||||||
|
|
||||||
@@ -50,26 +56,69 @@ func (this *AddPortPopupAction) RunPost(params struct {
|
|||||||
"protocol": params.Protocol,
|
"protocol": params.Protocol,
|
||||||
"host": "",
|
"host": "",
|
||||||
"portRange": "",
|
"portRange": "",
|
||||||
|
"minPort": 0,
|
||||||
|
"maxPort": 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO 判断端口不能小于1
|
var portRegexp = regexp.MustCompile(`^\d+$`)
|
||||||
// TODO 判断端口号不能大于65535
|
if portRegexp.MatchString(params.Address) { // 单个端口
|
||||||
|
addr["portRange"] = this.checkPort(params.Address)
|
||||||
digitRegexp := regexp.MustCompile(`^\d+$`)
|
} else if params.SupportRange && regexp.MustCompile(`^\d+\s*-\s*\d+$`).MatchString(params.Address) { // Port1-Port2
|
||||||
if digitRegexp.MatchString(params.Address) {
|
addr["portRange"], addr["minPort"], addr["maxPort"] = this.checkPortRange(params.Address)
|
||||||
addr["portRange"] = params.Address
|
} else if strings.Contains(params.Address, ":") { // IP:Port
|
||||||
} else if strings.Contains(params.Address, ":") {
|
|
||||||
index := strings.LastIndex(params.Address, ":")
|
index := strings.LastIndex(params.Address, ":")
|
||||||
addr["host"] = strings.TrimSpace(params.Address[:index])
|
addr["host"] = strings.TrimSpace(params.Address[:index])
|
||||||
port := strings.TrimSpace(params.Address[index+1:])
|
port := strings.TrimSpace(params.Address[index+1:])
|
||||||
if !digitRegexp.MatchString(port) {
|
if portRegexp.MatchString(port) {
|
||||||
this.Fail("端口只能是一个数字")
|
addr["portRange"] = this.checkPort(port)
|
||||||
|
} else if params.SupportRange && regexp.MustCompile(`^\d+\s*-\s*\d+$`).MatchString(port) { // Port1-Port2
|
||||||
|
addr["portRange"], addr["minPort"], addr["maxPort"] = this.checkPortRange(port)
|
||||||
|
} else {
|
||||||
|
this.FailField("address", "请输入正确的端口或者网络地址")
|
||||||
}
|
}
|
||||||
addr["portRange"] = port
|
|
||||||
} else {
|
} else {
|
||||||
this.Fail("请输入正确的端口或者网络地址")
|
this.FailField("address", "请输入正确的端口或者网络地址")
|
||||||
}
|
}
|
||||||
|
|
||||||
this.Data["address"] = addr
|
this.Data["address"] = addr
|
||||||
this.Success()
|
this.Success()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *AddPortPopupAction) checkPort(port string) (portRange string) {
|
||||||
|
var intPort = types.Int(port)
|
||||||
|
if intPort < 1 {
|
||||||
|
this.FailField("address", "端口号不能小于1")
|
||||||
|
}
|
||||||
|
if intPort > 65535 {
|
||||||
|
this.FailField("address", "端口号不能大于65535")
|
||||||
|
}
|
||||||
|
return port
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *AddPortPopupAction) checkPortRange(port string) (portRange string, minPort int, maxPort int) {
|
||||||
|
var pieces = strings.Split(port, "-")
|
||||||
|
var piece1 = strings.TrimSpace(pieces[0])
|
||||||
|
var piece2 = strings.TrimSpace(pieces[1])
|
||||||
|
var port1 = types.Int(piece1)
|
||||||
|
var port2 = types.Int(piece2)
|
||||||
|
|
||||||
|
if port1 < 1 {
|
||||||
|
this.FailField("address", "端口号不能小于1")
|
||||||
|
}
|
||||||
|
if port1 > 65535 {
|
||||||
|
this.FailField("address", "端口号不能大于65535")
|
||||||
|
}
|
||||||
|
|
||||||
|
if port2 < 1 {
|
||||||
|
this.FailField("address", "端口号不能小于1")
|
||||||
|
}
|
||||||
|
if port2 > 65535 {
|
||||||
|
this.FailField("address", "端口号不能大于65535")
|
||||||
|
}
|
||||||
|
|
||||||
|
if port1 > port2 {
|
||||||
|
port1, port2 = port2, port1
|
||||||
|
}
|
||||||
|
|
||||||
|
return types.String(port1) + "-" + types.String(port2), port1, port2
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
Vue.component("network-addresses-box", {
|
Vue.component("network-addresses-box", {
|
||||||
props: ["v-server-type", "v-addresses", "v-protocol", "v-name", "v-from"],
|
props: ["v-server-type", "v-addresses", "v-protocol", "v-name", "v-from", "v-support-range"],
|
||||||
data: function () {
|
data: function () {
|
||||||
let addresses = this.vAddresses
|
let addresses = this.vAddresses
|
||||||
if (addresses == null) {
|
if (addresses == null) {
|
||||||
@@ -24,7 +24,8 @@ Vue.component("network-addresses-box", {
|
|||||||
addresses: addresses,
|
addresses: addresses,
|
||||||
protocol: protocol,
|
protocol: protocol,
|
||||||
name: name,
|
name: name,
|
||||||
from: from
|
from: from,
|
||||||
|
supportRange: this.vSupportRange
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
@@ -41,10 +42,16 @@ Vue.component("network-addresses-box", {
|
|||||||
addAddr: function () {
|
addAddr: function () {
|
||||||
let that = this
|
let that = this
|
||||||
window.UPDATING_ADDR = null
|
window.UPDATING_ADDR = null
|
||||||
teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType + "&protocol=" + this.protocol + "&from=" + this.from, {
|
teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType + "&protocol=" + this.protocol + "&from=" + this.from + "&supportRange=" + (this.supportRange ? 1 : 0), {
|
||||||
height: "16em",
|
height: "18em",
|
||||||
callback: function (resp) {
|
callback: function (resp) {
|
||||||
var addr = resp.data.address
|
var addr = resp.data.address
|
||||||
|
if (that.addresses.$find(function (k, v) {
|
||||||
|
return addr.host == v.host && addr.portRange == v.portRange && addr.protocol == v.protocol
|
||||||
|
}) != null) {
|
||||||
|
teaweb.warn("要添加的网络地址已经存在")
|
||||||
|
return
|
||||||
|
}
|
||||||
that.addresses.push(addr)
|
that.addresses.push(addr)
|
||||||
if (["https", "https4", "https6"].$contains(addr.protocol)) {
|
if (["https", "https4", "https6"].$contains(addr.protocol)) {
|
||||||
this.tlsProtocolName = "HTTPS"
|
this.tlsProtocolName = "HTTPS"
|
||||||
@@ -66,8 +73,8 @@ Vue.component("network-addresses-box", {
|
|||||||
updateAddr: function (index, addr) {
|
updateAddr: function (index, addr) {
|
||||||
let that = this
|
let that = this
|
||||||
window.UPDATING_ADDR = addr
|
window.UPDATING_ADDR = addr
|
||||||
teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType + "&protocol=" + this.protocol + "&from=" + this.from, {
|
teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType + "&protocol=" + this.protocol + "&from=" + this.from + "&supportRange=" + (this.supportRange ? 1 : 0), {
|
||||||
height: "16em",
|
height: "18em",
|
||||||
callback: function (resp) {
|
callback: function (resp) {
|
||||||
var addr = resp.data.address
|
var addr = resp.data.address
|
||||||
Vue.set(that.addresses, index, addr)
|
Vue.set(that.addresses, index, addr)
|
||||||
@@ -91,7 +98,7 @@ Vue.component("network-addresses-box", {
|
|||||||
<input type="hidden" :name="name" :value="JSON.stringify(addresses)"/>
|
<input type="hidden" :name="name" :value="JSON.stringify(addresses)"/>
|
||||||
<div v-if="addresses.length > 0">
|
<div v-if="addresses.length > 0">
|
||||||
<div class="ui label small basic" v-for="(addr, index) in addresses">
|
<div class="ui label small basic" v-for="(addr, index) in addresses">
|
||||||
{{addr.protocol}}://<span v-if="addr.host.length > 0">{{addr.host.quoteIP()}}</span><span v-if="addr.host.length == 0">*</span>:{{addr.portRange}}
|
{{addr.protocol}}://<span v-if="addr.host.length > 0">{{addr.host.quoteIP()}}</span><span v-if="addr.host.length == 0">*</span>:<span v-if="addr.portRange.indexOf('-')<0">{{addr.portRange}}</span><span v-else style="font-style: italic">{{addr.portRange}}</span>
|
||||||
<a href="" @click.prevent="updateAddr(index, addr)" title="修改"><i class="icon pencil small"></i></a>
|
<a href="" @click.prevent="updateAddr(index, addr)" title="修改"><i class="icon pencil small"></i></a>
|
||||||
<a href="" @click.prevent="removeAddr(index)" title="删除"><i class="icon remove"></i></a> </div>
|
<a href="" @click.prevent="removeAddr(index)" title="删除"><i class="icon remove"></i></a> </div>
|
||||||
<div class="ui divider"></div>
|
<div class="ui divider"></div>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
<h3 v-if="!isUpdating">添加端口绑定</h3>
|
<h3 v-if="!isUpdating">添加端口绑定</h3>
|
||||||
<h3 v-if="isUpdating">修改端口绑定</h3>
|
<h3 v-if="isUpdating">修改端口绑定</h3>
|
||||||
<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
|
<form method="post" class="ui form" data-tea-action="$" data-tea-success="success">
|
||||||
|
<input type="hidden" name="supportRange" :value="supportRange ? 1 : 0"/>
|
||||||
<table class="ui table definition selectable">
|
<table class="ui table definition selectable">
|
||||||
<tr>
|
<tr>
|
||||||
<td>网络协议</td>
|
<td>网络协议</td>
|
||||||
@@ -16,7 +17,7 @@
|
|||||||
<td class="title">端口 *</td>
|
<td class="title">端口 *</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="text" name="address" ref="focus" v-model="address"/>
|
<input type="text" name="address" ref="focus" v-model="address"/>
|
||||||
<p class="comment">可以是一个数字端口(通常不超过65535),也可以是"地址:端口"的方式。
|
<p class="comment">可以是一个数字端口(通常不超过65535),也可以是"地址:端口"的方式。<span v-if="supportRange">支持端口范围,形式为<code-label>port1-port2</code-label>。</span>
|
||||||
<span v-if="from.length == 0 && protocol == 'http'">HTTP常用端口为<a href="" title="点击添加" @click.prevent="addPort('80')">80</a>。</span>
|
<span v-if="from.length == 0 && protocol == 'http'">HTTP常用端口为<a href="" title="点击添加" @click.prevent="addPort('80')">80</a>。</span>
|
||||||
<span v-if="from.length == 0 && protocol == 'https'">HTTPS常用端口为<a href="" title="点击添加" @click.prevent="addPort('443')">443</a>。</span>
|
<span v-if="from.length == 0 && protocol == 'https'">HTTPS常用端口为<a href="" title="点击添加" @click.prevent="addPort('443')">443</a>。</span>
|
||||||
</p>
|
</p>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td class="title">绑定端口 *</td>
|
<td class="title">绑定端口 *</td>
|
||||||
<td>
|
<td>
|
||||||
<network-addresses-box :v-server-type="serverType" :v-addresses="tcpConfig.listen" :v-protocol="'tcp'"></network-addresses-box>
|
<network-addresses-box :v-server-type="serverType" :v-addresses="tcpConfig.listen" :v-protocol="'tcp'" :v-support-range="true"></network-addresses-box>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td class="title">绑定端口 *</td>
|
<td class="title">绑定端口 *</td>
|
||||||
<td>
|
<td>
|
||||||
<network-addresses-box :v-server-type="serverType" :v-addresses="tlsConfig.listen" :v-protocol="'tls'"></network-addresses-box>
|
<network-addresses-box :v-server-type="serverType" :v-addresses="tlsConfig.listen" :v-protocol="'tls'" :v-support-range="true"></network-addresses-box>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<td class="title">绑定端口 *</td>
|
<td class="title">绑定端口 *</td>
|
||||||
<td>
|
<td>
|
||||||
<network-addresses-box :v-server-type="serverType" :v-addresses="udpConfig.listen" :v-protocol="'udp'"></network-addresses-box>
|
<network-addresses-box :v-server-type="serverType" :v-addresses="udpConfig.listen" :v-protocol="'udp'" :v-support-range="true"></network-addresses-box>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
|||||||
Reference in New Issue
Block a user