From 7ed1ddaa401d61ee6e6c18f897df78925a3e36ed Mon Sep 17 00:00:00 2001 From: 0xTux <0xtux@pm.me> Date: Tue, 22 Oct 2024 21:14:52 +0530 Subject: [PATCH] feat: add control server --- internal/server/init.go | 16 +++++++++++++- internal/server/tcp.go | 49 +++++++++++++++++++++++++++++++++++++++++ internal/server/trok.go | 49 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 internal/server/tcp.go create mode 100644 internal/server/trok.go diff --git a/internal/server/init.go b/internal/server/init.go index a23aed5..f72b1bb 100644 --- a/internal/server/init.go +++ b/internal/server/init.go @@ -5,9 +5,23 @@ Copyright © 2024 tux <0xtux@pm.me> package server import ( + "os" + "os/signal" + "github.com/rs/zerolog/log" ) func Start(port uint16) { - log.Info().Msgf("Hello from server: %d", port) + var trok Trok + if err := trok.Init(port); err != nil { + log.Fatal().Msgf("failed to init trok %v", err) + } + + signalChan := make(chan os.Signal, 1) + signal.Notify(signalChan, os.Interrupt) + + trok.Start() + defer trok.Stop() + + <-signalChan } diff --git a/internal/server/tcp.go b/internal/server/tcp.go new file mode 100644 index 0000000..22be89d --- /dev/null +++ b/internal/server/tcp.go @@ -0,0 +1,49 @@ +/* +Copyright © 2024 tux <0xtux@pm.me> +*/ + +package server + +import ( + "fmt" + "net" +) + +type TCPServer struct { + title string + listener net.Listener +} + +func (s *TCPServer) Init(port uint16, title string) error { + address := ":" + if port > 0 { + address = fmt.Sprintf(":%d", port) + } + + ln, err := net.Listen("tcp", address) + if err != nil { + return err + } + + s.title = title + s.listener = ln + return nil +} + +func (s *TCPServer) Start(handler func(conn net.Conn)) error { + for { + conn, err := s.listener.Accept() + if err != nil { + return err + } + go handler(conn) + } +} + +func (s *TCPServer) Stop() error { + return s.listener.Close() +} + +func (s *TCPServer) Port() uint16 { + return uint16(s.listener.Addr().(*net.TCPAddr).Port) +} diff --git a/internal/server/trok.go b/internal/server/trok.go new file mode 100644 index 0000000..24700f4 --- /dev/null +++ b/internal/server/trok.go @@ -0,0 +1,49 @@ +/* +Copyright © 2024 tux <0xtux@pm.me> +*/ + +package server + +import ( + "bufio" + "net" + + "github.com/rs/zerolog/log" +) + +type Trok struct { + controlServer TCPServer +} + +func (t *Trok) Init(port uint16) error { + err := t.controlServer.Init(port, "Controller") + return err +} + +func (t *Trok) Start() { + go t.controlServer.Start(t.ControlConnHandler) + log.Info().Msgf("started Trok server on port %d", t.controlServer.Port()) +} + +func (t *Trok) Stop() { + t.controlServer.Stop() + log.Info().Msgf("stopped Trok server on port %d", t.controlServer.Port()) +} + +func (t *Trok) ControlConnHandler(conn net.Conn) { + reader := bufio.NewReader(conn) + + for { + data, err := reader.ReadString('\n') + if err != nil { + if netErr, ok := err.(net.Error); ok && netErr.Timeout() { + log.Warn().Msgf("connection timed out: %s", conn.RemoteAddr()) + } else { + log.Logger.Info().Msgf("connection closed: %s", err) + } + return + } + + log.Info().Msgf(data) + } +}