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) } }