From da6ffcc2833d274c360b1aedb20a791746caabee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Fri, 12 Jul 2024 00:25:49 +0900 Subject: [PATCH] fix(wg): stop signal handling --- gold/link/listen.go | 3 ++- gold/link/me.go | 18 ++++++++++++------ lower/tun_darwin.go | 2 +- lower/tun_linux.go | 2 +- main.go | 9 ++++++++- upper/services/wg/wg.go | 3 ++- 6 files changed, 26 insertions(+), 11 deletions(-) diff --git a/gold/link/listen.go b/gold/link/listen.go index 4b80757..42f3c5a 100644 --- a/gold/link/listen.go +++ b/gold/link/listen.go @@ -2,6 +2,7 @@ package link import ( "bytes" + "errors" "io" "net" "net/netip" @@ -49,7 +50,7 @@ func (m *Me) listenudp() (conn *net.UDPConn, err error) { logrus.Debugln("[listen] lock index", i) lbf := listenbuff[i*65536 : (i+1)*65536] n, addr, err := conn.ReadFromUDP(lbf) - if m.loop == nil { + if m.loop == nil || errors.Is(err, net.ErrClosed) { logrus.Warnln("[listen] quit listening") return } diff --git a/gold/link/me.go b/gold/link/me.go index a3bad7e..7985874 100644 --- a/gold/link/me.go +++ b/gold/link/me.go @@ -132,13 +132,19 @@ func (m *Me) EndPoint() net.Addr { func (m *Me) Close() error { m.loop = nil m.connections = nil - _ = m.udpconn.Close() - m.udpconn = nil + if m.udpconn != nil { + _ = m.udpconn.Close() + m.udpconn = nil + } m.router = nil - m.recving.Destroy() - m.recving = nil - m.recved.Destroy() - m.recved = nil + if m.recving != nil { + m.recving.Destroy() + m.recving = nil + } + if m.recved != nil { + m.recved.Destroy() + m.recved = nil + } if m.nic != nil { m.nic.Down() return m.nic.Close() diff --git a/lower/tun_darwin.go b/lower/tun_darwin.go index 0b0712a..776ff67 100644 --- a/lower/tun_darwin.go +++ b/lower/tun_darwin.go @@ -13,9 +13,9 @@ func (n *NIC) Up() { } func (n *NIC) Down() { - execute("ifconfig", n.ifce.Name(), "down") execute("route", "delete", n.subnet, "-interface", n.ifce.Name()) for _, c := range n.cidrs { execute("route", "delete", c, "-interface", n.ifce.Name()) } + execute("ifconfig", n.ifce.Name(), "down") } diff --git a/lower/tun_linux.go b/lower/tun_linux.go index 6b991ef..3dad251 100644 --- a/lower/tun_linux.go +++ b/lower/tun_linux.go @@ -14,9 +14,9 @@ func (n *NIC) Up() { } func (n *NIC) Down() { - execute("/sbin/ip", "link", "set", "dev", n.ifce.Name(), "down") execute("/sbin/ip", "route", "del", n.subnet, "dev", n.ifce.Name()) for _, c := range n.cidrs { execute("/sbin/ip", "route", "del", c, "dev", n.ifce.Name()) } + execute("/sbin/ip", "link", "set", "dev", n.ifce.Name(), "down") } diff --git a/main.go b/main.go index 94ce130..e8cce83 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,9 @@ import ( "flag" "fmt" "os" + "os/signal" "strings" + "syscall" base14 "github.com/fumiama/go-base16384" curve "github.com/fumiama/go-x25519" @@ -155,7 +157,12 @@ func main() { os.Exit(0) } - defer w.Stop() + mc := make(chan os.Signal, 1) + signal.Notify(mc, os.Interrupt, syscall.SIGQUIT, syscall.SIGTERM) + go func() { + <-mc + w.Stop() + }() w.Run(upper.ServiceWireGold, upper.ServiceWireGold) } diff --git a/upper/services/wg/wg.go b/upper/services/wg/wg.go index 4d3e1a1..d9632a2 100644 --- a/upper/services/wg/wg.go +++ b/upper/services/wg/wg.go @@ -56,11 +56,12 @@ func (wg *WG) Run(srcport, destport uint16) { wg.init(srcport, destport) _, err := wg.me.ListenNIC() if err != nil { - logrus.Panicln(err) + logrus.Warnln(err) } } func (wg *WG) Stop() { + logrus.Warnln("[wg] stopping...") _ = wg.me.Close() }