From 58126df9101ad1f9446fc698dd55fa882ffac5e4 Mon Sep 17 00:00:00 2001 From: Mxmilu666 Date: Mon, 20 Oct 2025 20:36:42 +0800 Subject: [PATCH] feat(api): add endpoint to retrieve all proxies --- pkg/metrics/mem/server.go | 6 ++++-- pkg/util/version/version.go | 2 +- server/dashboard_api.go | 25 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/pkg/metrics/mem/server.go b/pkg/metrics/mem/server.go index 70cfc1c1..d9ff2384 100644 --- a/pkg/metrics/mem/server.go +++ b/pkg/metrics/mem/server.go @@ -206,8 +206,9 @@ func (m *serverMetrics) GetProxiesByType(proxyType string) []*ProxyStats { m.mu.Lock() defer m.mu.Unlock() + filterAll := proxyType == "" || proxyType == "all" for name, proxyStats := range m.info.ProxyStatistics { - if proxyStats.ProxyType != proxyType { + if !filterAll && proxyStats.ProxyType != proxyType { continue } @@ -233,8 +234,9 @@ func (m *serverMetrics) GetProxiesByTypeAndName(proxyType string, proxyName stri m.mu.Lock() defer m.mu.Unlock() + filterAll := proxyType == "" || proxyType == "all" for name, proxyStats := range m.info.ProxyStatistics { - if proxyStats.ProxyType != proxyType { + if !filterAll && proxyStats.ProxyType != proxyType { continue } diff --git a/pkg/util/version/version.go b/pkg/util/version/version.go index 0f4ec433..214808da 100644 --- a/pkg/util/version/version.go +++ b/pkg/util/version/version.go @@ -14,7 +14,7 @@ package version -var version = "0.65.0" +var version = "LoliaFRP 0.65.0" func Full() string { return version diff --git a/server/dashboard_api.go b/server/dashboard_api.go index 09f4ea38..dc258ac9 100644 --- a/server/dashboard_api.go +++ b/server/dashboard_api.go @@ -55,6 +55,7 @@ func (svr *Service) registerRouteHandlers(helper *httppkg.RouterRegisterHelper) subRouter.HandleFunc("/api/proxy/{type}/{name}/kick", svr.apiKickProxyByTypeAndName).Methods("POST") subRouter.HandleFunc("/api/traffic/{name}", svr.apiProxyTraffic).Methods("GET") subRouter.HandleFunc("/api/proxies", svr.deleteProxies).Methods("DELETE") + subRouter.HandleFunc("/api/proxies", svr.apiProxiesAll).Methods("GET") // view subRouter.Handle("/favicon.ico", http.FileServer(helper.AssetsFS)).Methods("GET") @@ -212,6 +213,29 @@ type GetProxyInfoResp struct { Proxies []*ProxyStatsInfo `json:"proxies"` } +// GET /api/proxies +// Return all proxies across types (tcp, udp, http, https, stcp, xtcp, tcpmux) +func (svr *Service) apiProxiesAll(w http.ResponseWriter, r *http.Request) { + res := GeneralResponse{Code: 200} + defer func() { + log.Infof("http response [%s]: code [%d]", r.URL.Path, res.Code) + w.WriteHeader(res.Code) + if len(res.Msg) > 0 { + _, _ = w.Write([]byte(res.Msg)) + } + }() + log.Infof("http request: [%s]", r.URL.Path) + + proxyInfoResp := GetProxyInfoResp{} + proxyInfoResp.Proxies = svr.getProxyStatsByType("all") + slices.SortFunc(proxyInfoResp.Proxies, func(a, b *ProxyStatsInfo) int { + return cmp.Compare(a.Name, b.Name) + }) + + buf, _ := json.Marshal(&proxyInfoResp) + res.Msg = string(buf) +} + // /api/proxy/:type func (svr *Service) apiProxyByType(w http.ResponseWriter, r *http.Request) { res := GeneralResponse{Code: 200} @@ -238,6 +262,7 @@ func (svr *Service) apiProxyByType(w http.ResponseWriter, r *http.Request) { } func (svr *Service) getProxyStatsByType(proxyType string) (proxyInfos []*ProxyStatsInfo) { + // mem.StatsCollector now supports proxyType=="all" or "" to return all proxies proxyStats := mem.StatsCollector.GetProxiesByType(proxyType) proxyInfos = make([]*ProxyStatsInfo, 0, len(proxyStats)) for _, ps := range proxyStats {