77 "github.com/VaalaCat/frp-panel/pb"
88 "github.com/VaalaCat/frp-panel/services/app"
99 "github.com/samber/lo"
10+ "github.com/sirupsen/logrus"
1011)
1112
1213func UpdateWireGuard (ctx * app.Context , req * pb.UpdateWireGuardRequest ) (* pb.UpdateWireGuardResponse , error ) {
@@ -38,19 +39,15 @@ func AddPeer(ctx *app.Context, wgSvc app.WireGuard, req *pb.UpdateWireGuardReque
3839
3940 log .Debugf ("add peer, peer_config: %+v" , req .GetWireguardConfig ().GetPeers ())
4041
41- for _ , peer := range req .GetWireguardConfig ().GetPeers () {
42- err := wgSvc .AddPeer (& defs.WireGuardPeerConfig {WireGuardPeerConfig : peer })
43- if err != nil {
44- log .WithError (err ).Errorf ("add peer failed" )
45- continue
46- }
47- }
48-
49- if err := wgSvc .UpdateAdjs (req .GetWireguardConfig ().GetAdjs ()); err != nil {
50- log .WithError (err ).Errorf ("update adjs failed, adjs: %+v" , req .GetWireguardConfig ().GetAdjs ())
42+ // 主链路:先更新 adjs(保证后续 wg 内部的预连接/清理逻辑使用最新拓扑)
43+ if err := updateAdjsFirst (log , wgSvc , req ); err != nil {
5144 return nil , err
5245 }
5346
47+ applyPeerOps (log , req .GetWireguardConfig ().GetPeers (), "add peer" , func (peer * pb.WireGuardPeerConfig ) error {
48+ return wgSvc .AddPeer (& defs.WireGuardPeerConfig {WireGuardPeerConfig : peer })
49+ })
50+
5451 log .Infof ("add peer done" )
5552
5653 return & pb.UpdateWireGuardResponse {Status : & pb.Status {Code : pb .RespCode_RESP_CODE_SUCCESS , Message : "success" }}, nil
@@ -61,19 +58,15 @@ func RemovePeer(ctx *app.Context, wgSvc app.WireGuard, req *pb.UpdateWireGuardRe
6158
6259 log .Debugf ("remove peer, peer_config: %+v" , req .GetWireguardConfig ().GetPeers ())
6360
64- for _ , peer := range req .GetWireguardConfig ().GetPeers () {
65- err := wgSvc .RemovePeer (peer .GetPublicKey ())
66- if err != nil {
67- log .WithError (err ).Errorf ("remove peer failed" )
68- continue
69- }
70- }
71-
72- if err := wgSvc .UpdateAdjs (req .GetWireguardConfig ().GetAdjs ()); err != nil {
73- log .WithError (err ).Errorf ("update adjs failed, adjs: %+v" , req .GetWireguardConfig ().GetAdjs ())
61+ // 主链路:先更新 adjs(保证后续 wg 内部的预连接/清理逻辑使用最新拓扑)
62+ if err := updateAdjsFirst (log , wgSvc , req ); err != nil {
7463 return nil , err
7564 }
7665
66+ applyPeerOps (log , req .GetWireguardConfig ().GetPeers (), "remove peer routes" , func (peer * pb.WireGuardPeerConfig ) error {
67+ return wgSvc .RemovePeer (peer .GetPublicKey ())
68+ })
69+
7770 log .Infof ("remove peer done" )
7871
7972 return & pb.UpdateWireGuardResponse {Status : & pb.Status {Code : pb .RespCode_RESP_CODE_SUCCESS , Message : "success" }}, nil
@@ -84,19 +77,15 @@ func UpdatePeer(ctx *app.Context, wgSvc app.WireGuard, req *pb.UpdateWireGuardRe
8477
8578 log .Debugf ("update peer, peer_config: %+v" , req .GetWireguardConfig ().GetPeers ())
8679
87- for _ , peer := range req .GetWireguardConfig ().GetPeers () {
88- err := wgSvc .UpdatePeer (& defs.WireGuardPeerConfig {WireGuardPeerConfig : peer })
89- if err != nil {
90- log .WithError (err ).Errorf ("update peer failed" )
91- continue
92- }
93- }
94-
95- if err := wgSvc .UpdateAdjs (req .GetWireguardConfig ().GetAdjs ()); err != nil {
96- log .WithError (err ).Errorf ("update adjs failed, adjs: %+v" , req .GetWireguardConfig ().GetAdjs ())
80+ // 主链路:先更新 adjs(保证后续 wg 内部的预连接/清理逻辑使用最新拓扑)
81+ if err := updateAdjsFirst (log , wgSvc , req ); err != nil {
9782 return nil , err
9883 }
9984
85+ applyPeerOps (log , req .GetWireguardConfig ().GetPeers (), "update peer" , func (peer * pb.WireGuardPeerConfig ) error {
86+ return wgSvc .UpdatePeer (& defs.WireGuardPeerConfig {WireGuardPeerConfig : peer })
87+ })
88+
10089 log .Infof ("update peer done" )
10190
10291 return & pb.UpdateWireGuardResponse {Status : & pb.Status {Code : pb .RespCode_RESP_CODE_SUCCESS , Message : "success" }}, nil
@@ -107,6 +96,11 @@ func PatchPeers(ctx *app.Context, wgSvc app.WireGuard, req *pb.UpdateWireGuardRe
10796
10897 log .Debugf ("patch peers, peer_config: %+v" , req .GetWireguardConfig ().GetPeers ())
10998
99+ // 主链路:先更新 adjs(保证后续 wg 内部的预连接/清理逻辑使用最新拓扑)
100+ if err := updateAdjsFirst (log , wgSvc , req ); err != nil {
101+ return nil , err
102+ }
103+
110104 wgCfg := & defs.WireGuardConfig {WireGuardConfig : req .GetWireguardConfig ()}
111105
112106 diffResp , err := wgSvc .PatchPeers (wgCfg .GetParsedPeers ())
@@ -115,14 +109,32 @@ func PatchPeers(ctx *app.Context, wgSvc app.WireGuard, req *pb.UpdateWireGuardRe
115109 return nil , err
116110 }
117111
118- if err = wgSvc .UpdateAdjs (req .GetWireguardConfig ().GetAdjs ()); err != nil {
119- log .WithError (err ).Errorf ("update adjs failed, adjs: %+v" , req .GetWireguardConfig ().GetAdjs ())
120- return nil , err
121- }
122-
123112 log .Debugf ("patch peers done, add_peers: %+v, remove_peers: %+v" ,
124113 lo .Map (diffResp .AddPeers , func (item * defs.WireGuardPeerConfig , _ int ) string { return item .GetClientId () }),
125114 lo .Map (diffResp .RemovePeers , func (item * defs.WireGuardPeerConfig , _ int ) string { return item .GetClientId () }))
126115
127116 return & pb.UpdateWireGuardResponse {Status : & pb.Status {Code : pb .RespCode_RESP_CODE_SUCCESS , Message : "success" }}, nil
128117}
118+
119+ func updateAdjsFirst (log * logrus.Entry , wgSvc app.WireGuard , req * pb.UpdateWireGuardRequest ) error {
120+ if req == nil || req .GetWireguardConfig () == nil {
121+ return nil
122+ }
123+ if err := wgSvc .UpdateAdjs (req .GetWireguardConfig ().GetAdjs ()); err != nil {
124+ log .WithError (err ).Errorf ("update adjs failed, adjs: %+v" , req .GetWireguardConfig ().GetAdjs ())
125+ return err
126+ }
127+ return nil
128+ }
129+
130+ func applyPeerOps (log * logrus.Entry , peers []* pb.WireGuardPeerConfig , op string , fn func (peer * pb.WireGuardPeerConfig ) error ) {
131+ for _ , peer := range peers {
132+ if peer == nil {
133+ continue
134+ }
135+ if err := fn (peer ); err != nil {
136+ log .WithError (err ).Errorf ("%s failed" , op )
137+ continue
138+ }
139+ }
140+ }
0 commit comments