Skip to content

Commit d7c9cd1

Browse files
committed
feat: Synchronously update the firewall when modifying connection information
1 parent d103813 commit d7c9cd1

File tree

11 files changed

+151
-22
lines changed

11 files changed

+151
-22
lines changed

core/app/service/setting.go

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"net"
1010
"os"
1111
"path"
12+
"regexp"
1213
"strconv"
1314
"strings"
1415
"time"
@@ -21,6 +22,8 @@ import (
2122
"github.com/1Panel-dev/1Panel/core/utils/cmd"
2223
"github.com/1Panel-dev/1Panel/core/utils/common"
2324
"github.com/1Panel-dev/1Panel/core/utils/encrypt"
25+
"github.com/1Panel-dev/1Panel/core/utils/firewall"
26+
"github.com/1Panel-dev/1Panel/core/utils/xpack"
2427
"github.com/gin-gonic/gin"
2528
)
2629

@@ -75,15 +78,20 @@ func (u *SettingService) GetSettingInfo() (*dto.SettingInfo, error) {
7578
}
7679

7780
func (u *SettingService) Update(key, value string) error {
81+
oldVal, err := settingRepo.Get(repo.WithByKey(key))
82+
if err != nil {
83+
return err
84+
}
85+
if oldVal.Value == value {
86+
return nil
87+
}
7888
switch key {
7989
case "AppStoreLastModified":
8090
exist, _ := settingRepo.Get(repo.WithByKey("AppStoreLastModified"))
8191
if exist.ID == 0 {
8292
_ = settingRepo.Create("AppStoreLastModified", value)
8393
return nil
8494
}
85-
case "MasterAddr":
86-
global.CONF.System.MasterAddr = value
8795
}
8896

8997
if err := settingRepo.Update(key, value); err != nil {
@@ -105,7 +113,12 @@ func (u *SettingService) Update(key, value string) error {
105113
}
106114
case "UserName", "Password":
107115
_ = global.SESSION.Clean()
108-
116+
case "MasterAddr":
117+
go func() {
118+
if err := xpack.UpdateMasterAddr(value); err != nil {
119+
global.LOG.Errorf("update master addr failed, err: %v", err)
120+
}
121+
}()
109122
}
110123

111124
return nil
@@ -174,16 +187,40 @@ func (u *SettingService) UpdatePort(port uint) error {
174187
if common.ScanPort(int(port)) {
175188
return buserr.WithDetail(constant.ErrPortInUsed, port, nil)
176189
}
177-
// TODO 修改防火墙端口
190+
oldPort, err := settingRepo.Get(repo.WithByKey("Port"))
191+
if err != nil {
192+
return err
193+
}
194+
if oldPort.Value == fmt.Sprintf("%v", port) {
195+
return nil
196+
}
197+
if err := firewall.UpdatePort(oldPort.Value, fmt.Sprintf("%v", port)); err != nil {
198+
return err
199+
}
178200

179201
if err := settingRepo.Update("ServerPort", strconv.Itoa(int(port))); err != nil {
180202
return err
181203
}
182204
go func() {
183205
time.Sleep(1 * time.Second)
184-
_, err := cmd.Exec("systemctl restart 1panel.service")
206+
defer func() {
207+
if _, err := cmd.Exec("systemctl restart 1panel.service"); err != nil {
208+
global.LOG.Errorf("restart system port failed, err: %v", err)
209+
}
210+
}()
211+
masterAddr, err := settingRepo.Get(repo.WithByKey("MasterAddr"))
185212
if err != nil {
186-
global.LOG.Errorf("restart system port failed, err: %v", err)
213+
global.LOG.Errorf("load master addr from db failed, err: %v", err)
214+
return
215+
}
216+
if len(masterAddr.Value) != 0 {
217+
oldMasterPort := loadPort(masterAddr.Value)
218+
if len(oldMasterPort) != 0 {
219+
if err := xpack.UpdateMasterAddr(strings.ReplaceAll(masterAddr.Value, oldMasterPort, fmt.Sprintf("%v", port))); err != nil {
220+
global.LOG.Errorf("update master addr from db failed, err: %v", err)
221+
return
222+
}
223+
}
187224
}
188225
}()
189226
return nil
@@ -250,7 +287,31 @@ func (u *SettingService) UpdateSSL(c *gin.Context, req dto.SSLUpdate) error {
250287
if err := settingRepo.Update("SSL", req.SSL); err != nil {
251288
return err
252289
}
253-
return u.UpdateSystemSSL()
290+
291+
if err := u.UpdateSystemSSL(); err != nil {
292+
return err
293+
}
294+
295+
go func() {
296+
oldSSL, _ := settingRepo.Get(repo.WithByKey("SSL"))
297+
if oldSSL.Value != req.SSL {
298+
masterAddr, err := settingRepo.Get(repo.WithByKey("MasterAddr"))
299+
if err != nil {
300+
global.LOG.Errorf("load master addr from db failed, err: %v", err)
301+
return
302+
}
303+
addrItem := masterAddr.Value
304+
if req.SSL == constant.StatusDisable {
305+
addrItem = strings.ReplaceAll(addrItem, "https://", "http://")
306+
} else {
307+
addrItem = strings.ReplaceAll(addrItem, "http://", "https://")
308+
}
309+
if err := xpack.UpdateMasterAddr(addrItem); err != nil {
310+
global.LOG.Errorf("update master addr from db failed, err: %v", err)
311+
}
312+
}
313+
}()
314+
return nil
254315
}
255316

256317
func (u *SettingService) LoadFromCert() (*dto.SSLInfo, error) {
@@ -452,3 +513,17 @@ func checkCertValid() error {
452513

453514
return nil
454515
}
516+
517+
func loadPort(address string) string {
518+
re := regexp.MustCompile(`(?:(?:\[([0-9a-fA-F:]+)\])|([^:/\s]+))(?::(\d+))?$`)
519+
matches := re.FindStringSubmatch(address)
520+
if len(matches) <= 0 {
521+
return ""
522+
}
523+
var port string
524+
port = matches[3]
525+
if len(port) != 0 {
526+
return port
527+
}
528+
return ""
529+
}

core/configs/system.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ type System struct {
55
Ipv6 string `mapstructure:"ipv6"`
66
BindAddress string `mapstructure:"bindAddress"`
77
SSL string `mapstructure:"ssl"`
8-
MasterAddr string `mapstructure:"masterAddr"`
98
DbCoreFile string `mapstructure:"db_core_file"`
109
EncryptKey string `mapstructure:"encrypt_key"`
1110
BaseDir string `mapstructure:"base_dir"`

core/constant/errs.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,5 @@ var (
7676
ErrFreeNodeLimit = "ErrFreeNodeLimit"
7777
ErrNodeBound = "ErrNodeBound"
7878
ErrNodeBind = "ErrNodeBind"
79+
ConnInfoNotMatch = "ConnInfoNotMatch"
7980
)

core/constant/status.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const (
88
StatusWaiting = "Waiting"
99
StatusPacking = "Packing"
1010
StatusSending = "Sending"
11+
StatusChecking = "Checking"
1112
StatusStarting = "Starting"
1213
StatusHealthy = "Healthy"
1314
StatusUnhealthy = "Unhealthy"

core/i18n/lang/en.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ RestartAfterUpgrade: "Start Service After Upgrade"
8282
#add node
8383
TaskAddNode: "Add Node"
8484
GenerateSSLInfo: "Generate Node SSL Information"
85+
ConnInfoNotMatch: "Connection information does not match";
8586
MakeAgentPackage: "Generate Node Installation Package"
8687
SendAgent: "Distribute Node Installation Package"
8788
StartService: "Start Service"

core/i18n/lang/zh-Hant.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ RestartAfterUpgrade: "升級後啟動服務"
8282
#node create
8383
TaskAddNode: "添加節點"
8484
GenerateSSLInfo: "生成節點 SSL 信息"
85+
ConnInfoNotMatch: "連接信息不匹配";
8586
MakeAgentPackage: "生成節點安裝包"
8687
SendAgent: "下發節點安裝包"
8788
StartService: "啟動服務"

core/i18n/lang/zh.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ RestartAfterUpgrade: "升级后启动服务"
8484
#add node
8585
TaskAddNode: "添加节点"
8686
GenerateSSLInfo: "生成节点 SSL 信息"
87+
ConnInfoNotMatch: "连接信息不匹配"
8788
MakeAgentPackage: "生成节点安装包"
8889
SendAgent: "下发节点安装包"
8990
StartService: "启动服务"

core/init/hook/hook.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@ import (
1414

1515
func Init() {
1616
settingRepo := repo.NewISettingRepo()
17-
masterSetting, err := settingRepo.Get(repo.WithByKey("MasterAddr"))
18-
if err != nil {
19-
global.LOG.Errorf("load master addr from setting failed, err: %v", err)
20-
}
21-
global.CONF.System.MasterAddr = masterSetting.Value
2217
portSetting, err := settingRepo.Get(repo.WithByKey("ServerPort"))
2318
if err != nil {
2419
global.LOG.Errorf("load service port from setting failed, err: %v", err)

core/utils/cmd/cmd.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bytes"
55
"fmt"
66
"os/exec"
7+
"strings"
78
"time"
89

910
"github.com/1Panel-dev/1Panel/core/buserr"
@@ -22,6 +23,14 @@ func SudoHandleCmd() string {
2223
return ""
2324
}
2425

26+
func Which(name string) bool {
27+
stdout, err := Execf("which %s", name)
28+
if err != nil || (len(strings.ReplaceAll(stdout, "\n", "")) == 0) {
29+
return false
30+
}
31+
return true
32+
}
33+
2534
func Execf(cmdStr string, a ...interface{}) (string, error) {
2635
cmd := exec.Command("bash", "-c", fmt.Sprintf(cmdStr, a...))
2736
var stdout, stderr bytes.Buffer

core/utils/firewall/firewall.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package firewall
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/1Panel-dev/1Panel/core/utils/cmd"
7+
)
8+
9+
func UpdatePort(oldPort, newPort string) error {
10+
firewalld := cmd.Which("firewalld")
11+
if firewalld {
12+
status, _ := cmd.Exec("LANGUAGE=en_US:en firewall-cmd --state")
13+
isRunning := status == "running\n"
14+
if isRunning {
15+
return firewallUpdatePort(oldPort, newPort)
16+
}
17+
}
18+
19+
ufw := cmd.Which("ufw")
20+
if !ufw {
21+
return nil
22+
}
23+
status, _ := cmd.Exec("LANGUAGE=en_US:en ufw status | grep Status")
24+
isRuning := status == "Status: active\n"
25+
if isRuning {
26+
return ufwUpdatePort(oldPort, newPort)
27+
}
28+
return nil
29+
}
30+
31+
func firewallUpdatePort(oldPort, newPort string) error {
32+
stdout, err := cmd.Execf("firewall-cmd --zone=public --add-port=%s/tcp --permanent", newPort)
33+
if err != nil {
34+
return fmt.Errorf("add (port: %s/tcp) failed, err: %s", newPort, stdout)
35+
}
36+
37+
_, _ = cmd.Execf("firewall-cmd --zone=public --remove-port=%s/tcp --permanent", oldPort)
38+
_, _ = cmd.Exec("firewall-cmd --reload")
39+
return nil
40+
}
41+
42+
func ufwUpdatePort(oldPort, newPort string) error {
43+
stdout, err := cmd.Execf("ufw allow %s", newPort)
44+
if err != nil {
45+
return fmt.Errorf("add (port: %s/tcp) failed, err: %s", newPort, stdout)
46+
}
47+
48+
_, _ = cmd.Execf("ufw delete allow %s", oldPort)
49+
return nil
50+
}

0 commit comments

Comments
 (0)