69 lines
1.4 KiB
Go
69 lines
1.4 KiB
Go
package proxy
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
|
|
"git.secnex.io/secnex/masterlog"
|
|
"git.secnex.io/secnex/pgproxy/config"
|
|
)
|
|
|
|
// Proxy handles PostgreSQL connection proxying
|
|
type Proxy struct {
|
|
listener net.Listener
|
|
config *config.Config
|
|
mappings map[string]struct {
|
|
host string
|
|
port int
|
|
}
|
|
}
|
|
|
|
// NewProxy creates a new proxy instance
|
|
func NewProxy(config *config.Config) (*Proxy, error) {
|
|
addr := fmt.Sprintf("%s:%d", config.Listen.Address, config.Listen.Port)
|
|
listener, err := net.Listen("tcp", addr)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Build mappings map for quick lookup
|
|
mappings := make(map[string]struct {
|
|
host string
|
|
port int
|
|
})
|
|
for _, mapping := range config.Mappings {
|
|
port := mapping.Port
|
|
if port == 0 {
|
|
port = 5432 // Default PostgreSQL port
|
|
}
|
|
mappings[mapping.External] = struct {
|
|
host string
|
|
port int
|
|
}{
|
|
host: mapping.Internal,
|
|
port: port,
|
|
}
|
|
}
|
|
|
|
return &Proxy{
|
|
listener: listener,
|
|
config: config,
|
|
mappings: mappings,
|
|
}, nil
|
|
}
|
|
|
|
// Start starts the proxy server
|
|
func (p *Proxy) Start() error {
|
|
masterlog.Info("PostgreSQL proxy listening", map[string]interface{}{"address": p.config.Listen.Address, "port": p.config.Listen.Port})
|
|
|
|
for {
|
|
conn, err := p.listener.Accept()
|
|
if err != nil {
|
|
masterlog.Error("Error accepting connection", map[string]interface{}{"error": err})
|
|
continue
|
|
}
|
|
|
|
go p.handleConnection(conn)
|
|
}
|
|
}
|