WIP
This commit is contained in:
@@ -1,12 +1,34 @@
|
||||
package peer
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"log"
|
||||
"net/netip"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||||
)
|
||||
|
||||
// devRetry calls fn up to 6 times with exponential backoff, retrying on EBUSY
|
||||
// (transient netlink contention during WireGuard handshake/rekey). Fatal on any other error.
|
||||
func devRetry(vpnIP netip.Addr, op string, fn func() error) {
|
||||
const attempts = 6
|
||||
timeout := 10 * time.Millisecond
|
||||
for i := range attempts {
|
||||
err := fn()
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
if errors.Is(err, syscall.EBUSY) && i < attempts-1 {
|
||||
time.Sleep(timeout)
|
||||
timeout *= 2
|
||||
continue
|
||||
}
|
||||
log.Fatalf("%s %v: %v", op, vpnIP, err)
|
||||
}
|
||||
}
|
||||
|
||||
func (a *App) devPeers() []wgtypes.Peer {
|
||||
peers, err := a.dev.Peers()
|
||||
if err != nil {
|
||||
@@ -16,37 +38,25 @@ func (a *App) devPeers() []wgtypes.Peer {
|
||||
}
|
||||
|
||||
func (a *App) devAddPeer(p *Peer) {
|
||||
if err := a.dev.AddPeer(p.PubKey()); err != nil {
|
||||
log.Fatalf("Failed to add peer %v: %v", p.VPNIP, err)
|
||||
}
|
||||
devRetry(p.VPNIP, "AddPeer", func() error { return a.dev.AddPeer(p.PubKey()) })
|
||||
}
|
||||
|
||||
func (a *App) devAddDirect(p *Peer, endpoint netip.AddrPort) {
|
||||
if err := a.dev.AddDirect(p.PubKey(), endpoint, p.VPNIP); err != nil {
|
||||
log.Fatalf("Failed to add peer %v: %v", p.VPNIP, err)
|
||||
}
|
||||
devRetry(p.VPNIP, "AddDirect", func() error { return a.dev.AddDirect(p.PubKey(), endpoint, p.VPNIP) })
|
||||
}
|
||||
|
||||
func (a *App) devSetRelay(p *Peer, endpoint netip.AddrPort) {
|
||||
if err := a.dev.SetRelay(p.PubKey(), endpoint, a.vpnNet); err != nil {
|
||||
log.Fatalf("Failed to add relay %v: %v", p.VPNIP, err)
|
||||
}
|
||||
devRetry(p.VPNIP, "SetRelay", func() error { return a.dev.SetRelay(p.PubKey(), endpoint, a.vpnNet) })
|
||||
}
|
||||
|
||||
func (a *App) devPromote(p *Peer) {
|
||||
if err := a.dev.Promote(p.PubKey(), p.VPNIP); err != nil {
|
||||
log.Fatalf("Failed to promote peer %v: %v", p.VPNIP, err)
|
||||
}
|
||||
devRetry(p.VPNIP, "Promote", func() error { return a.dev.Promote(p.PubKey(), p.VPNIP) })
|
||||
}
|
||||
|
||||
func (a *App) devAddProbe(p *Peer, endpoint netip.AddrPort) {
|
||||
if err := a.dev.AddProbe(p.PubKey(), endpoint); err != nil {
|
||||
log.Fatalf("Failed to add probe %v: %v", p.VPNIP, err)
|
||||
}
|
||||
devRetry(p.VPNIP, "AddProbe", func() error { return a.dev.AddProbe(p.PubKey(), endpoint) })
|
||||
}
|
||||
|
||||
func (a *App) devRemove(p *Peer) {
|
||||
if err := a.dev.RemovePeer(p.PubKey()); err != nil {
|
||||
log.Fatalf("Failed to remove peer %v: %v", p.VPNIP, err)
|
||||
}
|
||||
devRetry(p.VPNIP, "RemovePeer", func() error { return a.dev.RemovePeer(p.PubKey()) })
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user