diff --git a/cmd/edge-node/main.go b/cmd/edge-node/main.go index 9a90a19..2143457 100644 --- a/cmd/edge-node/main.go +++ b/cmd/edge-node/main.go @@ -25,7 +25,7 @@ func main() { Product(teaconst.ProductName). Usage(teaconst.ProcessName + " [-v|start|stop|restart|status|quit|test|reload|service|daemon|pprof|accesslog]"). Usage(teaconst.ProcessName + " [trackers|goman|conns|gc]"). - Usage(teaconst.ProcessName + " [ip.drop|ip.reject|ip.remove] IP") + Usage(teaconst.ProcessName + " [ip.drop|ip.reject|ip.remove|ip.close] IP") app.On("test", func() { err := nodes.NewNode().Test() @@ -241,6 +241,38 @@ func main() { } } }) + app.On("ip.close", func() { + var args = os.Args[2:] + if len(args) == 0 { + fmt.Println("Usage: edge-node ip.close IP") + return + } + var ip = args[0] + if len(net.ParseIP(ip)) == 0 { + fmt.Println("IP '" + ip + "' is invalid") + return + } + + fmt.Println("close ip '" + ip) + + var sock = gosock.NewTmpSock(teaconst.ProcessName) + reply, err := sock.Send(&gosock.Command{ + Code: "closeIP", + Params: map[string]any{ + "ip": ip, + }, + }) + if err != nil { + fmt.Println("[ERROR]" + err.Error()) + } else { + var errString = maps.NewMap(reply.Params).GetString("error") + if len(errString) > 0 { + fmt.Println("[ERROR]" + errString) + } else { + fmt.Println("ok") + } + } + }) app.On("ip.remove", func() { var args = os.Args[2:] if len(args) == 0 { diff --git a/internal/conns/linger.go b/internal/conns/linger.go new file mode 100644 index 0000000..9246b1b --- /dev/null +++ b/internal/conns/linger.go @@ -0,0 +1,7 @@ +// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package conns + +type LingerConn interface { + SetLinger(sec int) error +} diff --git a/internal/conns/map.go b/internal/conns/map.go index f7459dd..3f52afb 100644 --- a/internal/conns/map.go +++ b/internal/conns/map.go @@ -102,6 +102,13 @@ func (this *Map) CloseIPConns(ip string) { if ok { for _, conn := range conns { + // 设置Linger + lingerConn, isLingerConn := conn.(LingerConn) + if isLingerConn { + _ = lingerConn.SetLinger(0) + } + + // 关闭 _ = conn.Close() } diff --git a/internal/nodes/node.go b/internal/nodes/node.go index 9d65cb4..775fa7c 100644 --- a/internal/nodes/node.go +++ b/internal/nodes/node.go @@ -923,6 +923,11 @@ func (this *Node) listenSock() error { } else { _ = cmd.ReplyOk() } + case "closeIP": + var m = maps.NewMap(cmd.Params) + var ip = m.GetString("ip") + conns.SharedMap.CloseIPConns(ip) + _ = cmd.ReplyOk() case "removeIP": var m = maps.NewMap(cmd.Params) var ip = m.GetString("ip")