From f4094e03b85993b574b29cb329c8e10583e7a235 Mon Sep 17 00:00:00 2001 From: ssongliu <73214554+ssongliu@users.noreply.github.com> Date: Thu, 21 Sep 2023 18:02:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=98=B2=E7=81=AB=E5=A2=99=E8=8C=83?= =?UTF-8?q?=E5=9B=B4=E7=AB=AF=E5=8F=A3=E8=A7=84=E5=88=99=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=8D=A0=E7=94=A8=E8=AF=A6=E6=83=85=20(#2369)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Refs #729 ![image](https://github.com/1Panel-dev/1Panel/assets/73214554/0818e6b8-af81-4368-a7f9-5a55363b5c11) --- backend/app/service/firewall.go | 78 +++++++++++++------ backend/utils/firewall/client/info.go | 2 +- frontend/src/styles/common.scss | 5 ++ .../src/views/host/firewall/port/index.vue | 44 ++++++++--- 4 files changed, 95 insertions(+), 34 deletions(-) diff --git a/backend/app/service/firewall.go b/backend/app/service/firewall.go index 51c4bcead..e271e5807 100644 --- a/backend/app/service/firewall.go +++ b/backend/app/service/firewall.go @@ -46,9 +46,6 @@ func (u *FirewallService) LoadBaseInfo() (dto.FirewallBaseInfo, error) { baseInfo.Name = "-" client, err := firewall.NewFirewallClient() if err != nil { - if err.Error() == "no such type" { - return baseInfo, nil - } return baseInfo, err } baseInfo.Name = client.Name() @@ -111,14 +108,19 @@ func (u *FirewallService) SearchWithPage(req dto.RuleSearch) (int64, interface{} } } + if req.Type == "port" { + apps := u.loadPortByApp() + for i := 0; i < len(datas); i++ { + datas[i].UsedStatus = checkPortUsed(datas[i].Port, datas[i].Protocol, apps) + } + } var datasFilterStatus []fireClient.FireInfo if len(req.Status) != 0 { for _, data := range datas { - portItem, _ := strconv.Atoi(data.Port) - if req.Status == "free" && !common.ScanPortWithProto(portItem, data.Protocol) { + if req.Status == "free" && len(data.UsedStatus) == 0 { datasFilterStatus = append(datasFilterStatus, data) } - if req.Status == "used" && common.ScanPortWithProto(portItem, data.Protocol) { + if req.Status == "used" && len(data.UsedStatus) != 0 { datasFilterStatus = append(datasFilterStatus, data) } } @@ -167,23 +169,6 @@ func (u *FirewallService) SearchWithPage(req dto.RuleSearch) (int64, interface{} } } - if req.Type == "port" { - apps := u.loadPortByApp() - for i := 0; i < len(backDatas); i++ { - port, _ := strconv.Atoi(backDatas[i].Port) - backDatas[i].IsUsed = common.ScanPort(port) - if backDatas[i].Protocol == "udp" { - backDatas[i].IsUsed = common.ScanUDPPort(port) - continue - } - for _, app := range apps { - if app.HttpPort == backDatas[i].Port || app.HttpsPort == backDatas[i].Port { - backDatas[i].APPName = app.AppName - break - } - } - } - } go u.cleanUnUsedData(client) return int64(total), backDatas, nil @@ -626,3 +611,50 @@ func listIpRules(strategy string) ([]string, error) { } return rules, nil } + +func checkPortUsed(ports, proto string, apps []portOfApp) string { + if strings.Contains(ports, "-") { + port1, err := strconv.Atoi(strings.Split(ports, "-")[0]) + if err != nil { + global.LOG.Errorf(" convert string %s to int failed, err: %v", strings.Split(ports, "-")[0], err) + return "" + } + port2, err := strconv.Atoi(strings.Split(ports, "-")[1]) + if err != nil { + global.LOG.Errorf(" convert string %s to int failed, err: %v", strings.Split(ports, "-")[1], err) + return "" + } + + var usedPorts []string + for i := port1; i <= port2; i++ { + portItem := fmt.Sprintf("%v", i) + isUsedByApp := false + for _, app := range apps { + if app.HttpPort == portItem || app.HttpsPort == portItem { + isUsedByApp = true + usedPorts = append(usedPorts, fmt.Sprintf("%s (%s)", portItem, app.AppName)) + break + } + } + if !isUsedByApp && common.ScanPortWithProto(i, proto) { + usedPorts = append(usedPorts, fmt.Sprintf("%v", i)) + } + } + return strings.Join(usedPorts, ",") + } + + for _, app := range apps { + if app.HttpPort == ports || app.HttpsPort == ports { + return fmt.Sprintf("%s (%s)", ports, app.AppName) + } + } + port, err := strconv.Atoi(ports) + if err != nil { + global.LOG.Errorf(" convert string %v to int failed, err: %v", port, err) + return "" + } + if common.ScanPortWithProto(port, proto) { + return ports + } + return "" +} diff --git a/backend/utils/firewall/client/info.go b/backend/utils/firewall/client/info.go index 86cc86e5a..ca87647aa 100644 --- a/backend/utils/firewall/client/info.go +++ b/backend/utils/firewall/client/info.go @@ -8,7 +8,7 @@ type FireInfo struct { Strategy string `json:"strategy"` // accept drop APPName string `json:"appName"` - IsUsed bool `json:"isUsed"` + UsedStatus string `json:"usedStatus"` Description string `json:"description"` } diff --git a/frontend/src/styles/common.scss b/frontend/src/styles/common.scss index f451a995c..a56d120f9 100644 --- a/frontend/src/styles/common.scss +++ b/frontend/src/styles/common.scss @@ -371,4 +371,9 @@ html { background: none; border: none; } +} + +.limit-height-popover { + max-height: 300px; + overflow: auto; } \ No newline at end of file diff --git a/frontend/src/views/host/firewall/port/index.vue b/frontend/src/views/host/firewall/port/index.vue index f142e4913..8bb5d6bf9 100644 --- a/frontend/src/views/host/firewall/port/index.vue +++ b/frontend/src/views/host/firewall/port/index.vue @@ -83,18 +83,31 @@ :data="data" > - - + + @@ -220,6 +233,9 @@ const search = async () => { .then((res) => { loading.value = false; data.value = res.data.items || []; + for (const item of data.value) { + item.usedPorts = item.usedStatus ? item.usedStatus.split(',') : []; + } paginationConfig.total = res.data.total; }) .catch(() => { @@ -361,3 +377,11 @@ onMounted(() => { } }); + +