From c941ec541ee9edc81e99708d9c000d65f8d1d812 Mon Sep 17 00:00:00 2001 From: Jeff Carr Date: Tue, 11 Mar 2025 10:26:46 -0500 Subject: [PATCH] more phansastic gus --- main.go | 98 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 80 insertions(+), 18 deletions(-) diff --git a/main.go b/main.go index d770790..889df91 100644 --- a/main.go +++ b/main.go @@ -4,11 +4,14 @@ package main import ( + "bufio" "embed" "fmt" "io" "net" "os" + "strings" + sync "sync" "time" "github.com/google/uuid" @@ -98,18 +101,47 @@ func doME(pm *Portmap, gus net.Listener) { log.Info("Listening on ", s) */ - // Accept incoming connection - clientConn, err := gus.Accept() - if err != nil { - log.Printf("Failed to accept client connection: %v", err) - return - } - // log.Printf("Client connected: %s", clientConn.RemoteAddr()) + for { + // Accept incoming connection + src, err := gus.Accept() + if err != nil { + log.Printf("Failed to accept client connection: %v\n", err) + return + } - // make a new event from this new connection - log.Printf("Connected on port %d from client: %s to where = %s\n", localport, clientConn.RemoteAddr(), where) - // Handle the connection in a separate goroutine - // go handleConnection(clientConn, connect, port) + // make a new event from this new connection + log.Printf("/me Connected on port %d from client: %s to where = %s\n", localport, src.RemoteAddr(), where) + fmt.Fprintln(src, "/me hello") + + reader := bufio.NewReader(src) + + // Read one line + line, err := reader.ReadString('\n') + if err != nil { + log.Info("Error reading line:", err) + return + } + log.Info("gus got Received:", line) + parts := strings.Fields(line) + if len(parts) != 3 { + return + } + if parts[0] != "/me" { + return + } + if parts[1] != "hostname" { + return + } + hostname := parts[2] + msg := fmt.Sprintf("got hostname %s for %s", hostname, src.RemoteAddr()) + log.Info("gus:", msg) + fmt.Fprintln(src, msg) + + if hostname == "framebook.wit.com" { + // Handle the connection in a separate goroutine + go handleConnection(src, pm.Dest, int(pm.Localport)) + } + } } func gus3000(pm *Portmap) { @@ -169,8 +201,9 @@ func handleConnection(clientConn net.Conn, where string, localport int) { me.eventsChanged = true // Bidirectional copy of data - go io.Copy(targetConn, clientConn) // Client -> Target - io.Copy(clientConn, targetConn) // Target -> Client + // go io.Copy(targetConn, clientConn) // Client -> Target + // io.Copy(clientConn, targetConn) // Target -> Client + ioCopy(clientConn, targetConn) // if the socket closes, record the close time e.Etime = timestamppb.New(time.Now()) @@ -179,17 +212,46 @@ func handleConnection(clientConn net.Conn, where string, localport int) { } func enablePort(port int, dest string) { + var found bool all := me.portmaps.All() for all.Scan() { pm := all.Next() if int(pm.Localport) == port { + found = true log.Info("Found port!", port) - } - if pm.Enabled { - log.Info("portmap already enabled for", pm.Localport, "to", pm.Dest) - } else { - log.Info("portmap not enabled for", pm.Localport, "to", pm.Dest) + if pm.Enabled { + log.Info("portmap already enabled for", pm.Localport, "to", pm.Dest) + } else { + log.Info("portmap not enabled for", pm.Localport, "to", pm.Dest) + } } // go gus3000(pm) } + if !found { + log.Info("Did not find port =", port) + } +} + +// should cleanly close both +func ioCopy(clientConn, targetConn net.Conn) { + defer clientConn.Close() + defer targetConn.Close() + + var wg sync.WaitGroup + wg.Add(2) + + // Copy data in both directions + go func() { + defer wg.Done() + io.Copy(targetConn, clientConn) // Client -> Target + targetConn.Close() // Ensure closure on EOF/error + }() + + go func() { + defer wg.Done() + io.Copy(clientConn, targetConn) // Target -> Client + clientConn.Close() // Ensure closure on EOF/error + }() + + wg.Wait() // Wait for both copies to complete }