summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-03-11 10:26:46 -0500
committerJeff Carr <[email protected]>2025-03-11 12:16:21 -0500
commitc941ec541ee9edc81e99708d9c000d65f8d1d812 (patch)
treef8765b1500e6c8baab6d500ce7d2c2fd170c0ec1 /main.go
parent09e7dfbb2b34f5281bc3fef0b02c13db714db212 (diff)
more phansastic gusv0.0.4
Diffstat (limited to 'main.go')
-rw-r--r--main.go98
1 files 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
}