more phansastic gus

This commit is contained in:
Jeff Carr 2025-03-11 10:26:46 -05:00
parent 09e7dfbb2b
commit c941ec541e
1 changed files with 80 additions and 18 deletions

98
main.go
View File

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