diff --git a/server-ctl.go b/server-ctl.go index a7cf0a3..fd465ab 100644 --- a/server-ctl.go +++ b/server-ctl.go @@ -105,6 +105,10 @@ type server_ctl_server_conns_id_routes_id_peers_id struct { server_ctl } +type server_ctl_server_conns_id_peers struct { + server_ctl +} + type server_ctl_server_routes struct { server_ctl } @@ -633,6 +637,64 @@ oops: } // ------------------------------------ +func (ctl *server_ctl_server_conns_id_peers) ServeHTTP(w http.ResponseWriter, req *http.Request) (int, error) { + var s *Server + var status_code int + var err error + var conn_id string + var je *json.Encoder + var cts *ServerConn + + s = ctl.s + je = json.NewEncoder(w) + + conn_id = req.PathValue("conn_id") + cts, err = s.FindServerConnByIdStr(conn_id) + if err != nil { + status_code = WriteJsonRespHeader(w, http.StatusNotFound) + je.Encode(JsonErrmsg{Text: err.Error()}) + goto oops + } + + switch req.Method { + case http.MethodGet: + var jsp []json_out_server_peer + var e *list.Element + + jsp = make([]json_out_server_peer, 0) + cts.pts_mtx.Lock() + for e = cts.pts_list.Front(); e != nil; e = e.Next() { + var pts *ServerPeerConn + pts = e.Value.(*ServerPeerConn) + jsp = append(jsp, json_out_server_peer{ + CId: pts.route.Cts.Id, + RId: pts.route.Id, + PId: pts.conn_id, + ServerPeerAddr: pts.conn.RemoteAddr().String(), + ServerLocalAddr: pts.conn.LocalAddr().String(), + ClientPeerAddr: pts.client_peer_raddr.Get(), + ClientLocalAddr: pts.client_peer_laddr.Get(), + CreatedMilli: pts.Created.UnixMilli(), + }) + } + cts.pts_mtx.Unlock() + + status_code = WriteJsonRespHeader(w, http.StatusOK) + if err = je.Encode(jsp); err != nil { goto oops } + + default: + status_code = WriteEmptyRespHeader(w, http.StatusMethodNotAllowed) + } + +//done: + return status_code, nil + +oops: + return status_code, err +} + +// ------------------------------------ + func (ctl *server_ctl_server_routes) ServeHTTP(w http.ResponseWriter, req *http.Request) (int, error) { var s *Server var status_code int diff --git a/server-peer.go b/server-peer.go index 365cf6e..518fdb7 100644 --- a/server-peer.go +++ b/server-peer.go @@ -17,6 +17,7 @@ type ServerPeerConn struct { Created time.Time node_in_server *list.Element + node_in_conn *list.Element stop_chan chan bool stop_req atomic.Bool @@ -154,6 +155,11 @@ done_without_stop: spc.node_in_server = nil spc.route.Cts.S.pts_mtx.Unlock() + spc.route.Cts.pts_mtx.Lock() + spc.route.Cts.pts_list.Remove(spc.node_in_conn) + spc.node_in_conn = nil + spc.route.Cts.pts_mtx.Unlock() + spc.route.Cts.S.bulletin.Enqueue( &ServerEvent{ Kind: SERVER_EVENT_PEER_DELETED, diff --git a/server.go b/server.go index cb58273..52f41b6 100644 --- a/server.go +++ b/server.go @@ -216,6 +216,9 @@ type ServerConn struct { route_map ServerRouteMap route_wg sync.WaitGroup + pts_mtx sync.Mutex + pts_list *list.List + wg sync.WaitGroup stop_req atomic.Bool stop_chan chan bool @@ -358,6 +361,10 @@ func (r *ServerRoute) AddNewServerPeerConn(c *net.TCPConn) (*ServerPeerConn, err pts.node_in_server = r.Cts.S.pts_list.PushBack(pts) r.Cts.S.pts_mtx.Unlock() + r.Cts.pts_mtx.Lock() + pts.node_in_conn = r.Cts.pts_list.PushBack(pts) + r.Cts.pts_mtx.Unlock() + r.Cts.S.bulletin.Enqueue( &ServerEvent{ Kind: SERVER_EVENT_PEER_ADDED, @@ -1415,6 +1422,8 @@ func NewServer(ctx context.Context, name string, logger Logger, cfg *ServerConfi s.WrapHttpHandler(&server_ctl_server_conns_id_routes_id_peers{server_ctl{s: &s, id: HS_ID_CTL}})) s.ctl_mux.Handle(s.Cfg.CtlPrefix + "/_ctl/server-conns/{conn_id}/routes/{route_id}/peers/{peer_id}", s.WrapHttpHandler(&server_ctl_server_conns_id_routes_id_peers_id{server_ctl{s: &s, id: HS_ID_CTL}})) + s.ctl_mux.Handle(s.Cfg.CtlPrefix + "/_ctl/server-conns/{conn_id}/peers", + s.WrapHttpHandler(&server_ctl_server_conns_id_peers{server_ctl{s: &s, id: HS_ID_CTL}})) s.ctl_mux.Handle(s.Cfg.CtlPrefix + "/_ctl/server-routes", s.WrapHttpHandler(&server_ctl_server_routes{server_ctl{s: &s, id: HS_ID_CTL}})) s.ctl_mux.Handle(s.Cfg.CtlPrefix + "/_ctl/server-peers", @@ -1811,6 +1820,7 @@ func (s *Server) AddNewServerConn(remote_addr *net.Addr, local_addr *net.Addr, p cts.stop_req.Store(false) cts.stop_chan = make(chan bool, 8) + cts.pts_list = list.New() s.cts_mtx.Lock()