mirror of
https://github.com/yusing/godoxy.git
synced 2026-03-18 15:23:51 +01:00
- Add `StreamPort` configuration to agent configuration and environment variables - Implement TCP and UDP stream client support in agent package - Update agent verification to test stream connectivity (TCP/UDP) - Add `/info` endpoint to agent HTTP handler for version, name, runtime, and stream port - Remove /version, /name, /runtime APIs, replaced by /info - Update agent compose template to expose stream port for TCP and UDP - Update agent creation API to optionally specify stream port (defaults to port + 1) - Modify `StreamRoute` to pass agent configuration to stream implementations - Update `TCPTCPStream` and `UDPUDPStream` to use agent stream tunneling when agent is configured - Add support for both direct connections and agent-tunneled connections in stream routes This enables agents to handle TCP and UDP route tunneling, expanding the proxy capabilities beyond HTTP-only connections.
95 lines
2.5 KiB
Go
95 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"net"
|
|
"os"
|
|
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
"github.com/yusing/godoxy/agent/pkg/agent"
|
|
"github.com/yusing/godoxy/agent/pkg/agent/stream"
|
|
"github.com/yusing/godoxy/agent/pkg/env"
|
|
"github.com/yusing/godoxy/agent/pkg/server"
|
|
"github.com/yusing/godoxy/internal/metrics/systeminfo"
|
|
socketproxy "github.com/yusing/godoxy/socketproxy/pkg"
|
|
gperr "github.com/yusing/goutils/errs"
|
|
httpServer "github.com/yusing/goutils/server"
|
|
strutils "github.com/yusing/goutils/strings"
|
|
"github.com/yusing/goutils/task"
|
|
"github.com/yusing/goutils/version"
|
|
)
|
|
|
|
func main() {
|
|
writer := zerolog.ConsoleWriter{
|
|
Out: os.Stderr,
|
|
TimeFormat: "01-02 15:04",
|
|
}
|
|
zerolog.TimeFieldFormat = writer.TimeFormat
|
|
log.Logger = zerolog.New(writer).Level(zerolog.InfoLevel).With().Timestamp().Logger()
|
|
ca := &agent.PEMPair{}
|
|
err := ca.Load(env.AgentCACert)
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("init CA error")
|
|
}
|
|
caCert, err := ca.ToTLSCert()
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("init CA error")
|
|
}
|
|
|
|
srv := &agent.PEMPair{}
|
|
srv.Load(env.AgentSSLCert)
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("init SSL error")
|
|
}
|
|
srvCert, err := srv.ToTLSCert()
|
|
if err != nil {
|
|
log.Fatal().Err(err).Msg("init SSL error")
|
|
}
|
|
|
|
log.Info().Msgf("GoDoxy Agent version %s", version.Get())
|
|
log.Info().Msgf("Agent name: %s", env.AgentName)
|
|
log.Info().Msgf("Agent port: %d", env.AgentPort)
|
|
log.Info().Msgf("Agent runtime: %s", env.Runtime)
|
|
|
|
log.Info().Msg(`
|
|
Tips:
|
|
1. To change the agent name, you can set the AGENT_NAME environment variable.
|
|
2. To change the agent port, you can set the AGENT_PORT environment variable.
|
|
`)
|
|
|
|
t := task.RootTask("agent", false)
|
|
opts := server.Options{
|
|
CACert: caCert,
|
|
ServerCert: srvCert,
|
|
Port: env.AgentPort,
|
|
}
|
|
|
|
server.StartAgentServer(t, opts)
|
|
|
|
tcpListener, err := net.ListenTCP("tcp", &net.TCPAddr{Port: env.AgentStreamPort})
|
|
if err != nil {
|
|
gperr.LogFatal("failed to listen on port", err)
|
|
}
|
|
tcpServer := stream.NewTCPServer(t.Context(), tcpListener, caCert.Leaf, srvCert)
|
|
go tcpServer.Start()
|
|
|
|
udpServer := stream.NewUDPServer(t.Context(), &net.UDPAddr{Port: env.AgentStreamPort}, caCert.Leaf, srvCert)
|
|
go udpServer.Start()
|
|
|
|
if socketproxy.ListenAddr != "" {
|
|
runtime := strutils.Title(string(env.Runtime))
|
|
|
|
log.Info().Msgf("%s socket listening on: %s", runtime, socketproxy.ListenAddr)
|
|
opts := httpServer.Options{
|
|
Name: runtime,
|
|
HTTPAddr: socketproxy.ListenAddr,
|
|
Handler: socketproxy.NewHandler(),
|
|
}
|
|
httpServer.StartServer(t, opts)
|
|
}
|
|
|
|
systeminfo.Poller.Start()
|
|
|
|
task.WaitExit(3)
|
|
}
|