diff options
| author | Jeff Carr <[email protected]> | 2025-03-11 10:26:46 -0500 | 
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-03-11 12:16:21 -0500 | 
| commit | c941ec541ee9edc81e99708d9c000d65f8d1d812 (patch) | |
| tree | f8765b1500e6c8baab6d500ce7d2c2fd170c0ec1 | |
| parent | 09e7dfbb2b34f5281bc3fef0b02c13db714db212 (diff) | |
more phansastic gusv0.0.4
| -rw-r--r-- | main.go | 98 | 
1 files changed, 80 insertions, 18 deletions
@@ -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  }  | 
