mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 20:52:33 +02:00
72 lines
1.6 KiB
Go
72 lines
1.6 KiB
Go
package v1
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/coder/websocket/wsjson"
|
|
agentPkg "github.com/yusing/go-proxy/agent/pkg/agent"
|
|
U "github.com/yusing/go-proxy/internal/api/v1/utils"
|
|
config "github.com/yusing/go-proxy/internal/config/types"
|
|
"github.com/yusing/go-proxy/internal/metrics/systeminfo"
|
|
)
|
|
|
|
func SystemInfo(cfg config.ConfigInstance, w http.ResponseWriter, r *http.Request) {
|
|
isWS := strings.HasSuffix(r.URL.Path, "/ws")
|
|
agentName := r.URL.Query().Get("agent_name")
|
|
if agentName == "" {
|
|
if isWS {
|
|
systeminfo.Poller.ServeWS(cfg.Value().MatchDomains, w, r)
|
|
} else {
|
|
systeminfo.Poller.ServeHTTP(w, r)
|
|
}
|
|
return
|
|
}
|
|
|
|
agent, ok := cfg.GetAgent(agentName)
|
|
if !ok {
|
|
U.HandleErr(w, r, U.ErrInvalidKey("agent_name"), http.StatusNotFound)
|
|
return
|
|
}
|
|
if !isWS {
|
|
respData, status, err := agent.Forward(r, agentPkg.EndpointSystemInfo)
|
|
if err != nil {
|
|
U.HandleErr(w, r, err)
|
|
return
|
|
}
|
|
if status != http.StatusOK {
|
|
http.Error(w, string(respData), status)
|
|
return
|
|
}
|
|
U.WriteBody(w, respData)
|
|
} else {
|
|
clientConn, err := U.InitiateWS(cfg.Value().MatchDomains, w, r)
|
|
if err != nil {
|
|
U.HandleErr(w, r, err)
|
|
return
|
|
}
|
|
agentConn, _, err := agent.Websocket(r.Context(), agentPkg.EndpointSystemInfo)
|
|
if err != nil {
|
|
U.HandleErr(w, r, err)
|
|
return
|
|
}
|
|
//nolint:errcheck
|
|
defer agentConn.CloseNow()
|
|
var data []byte
|
|
for {
|
|
select {
|
|
case <-r.Context().Done():
|
|
return
|
|
default:
|
|
err := wsjson.Read(r.Context(), agentConn, &data)
|
|
if err == nil {
|
|
err = wsjson.Write(r.Context(), clientConn, data)
|
|
}
|
|
if err != nil {
|
|
U.HandleErr(w, r, err)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|