diff options
| author | Jeff Carr <[email protected]> | 2025-03-09 06:32:14 -0500 | 
|---|---|---|
| committer | Jeff Carr <[email protected]> | 2025-03-09 06:32:14 -0500 | 
| commit | eaedaded622316d3b59c2f3765cd2362e96ce54c (patch) | |
| tree | 483f1d67ecc990c1079bbccbfc9d89106332abfe | |
| parent | 93852523e66c2646c8997c014f7c060b7baf0df8 (diff) | |
make a portmap protobuf & ConfigSave()
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | config.go | 107 | ||||
| -rw-r--r-- | main.go | 44 | ||||
| -rw-r--r-- | portmap.proto | 11 | 
4 files changed, 163 insertions, 1 deletions
@@ -30,7 +30,7 @@ vet:  	@echo this go binary package builds okay  clean: -	rm -f go.* +	rm -f go.* *.pb.go  	rm -f gus  portmap.pb.go: portmap.proto diff --git a/config.go b/config.go new file mode 100644 index 0000000..afbb159 --- /dev/null +++ b/config.go @@ -0,0 +1,107 @@ +package main + +// functions to import and export the protobuf +// data to and from config files + +import ( +	"errors" +	"fmt" +	"os" +	"path/filepath" + +	"go.wit.com/log" +	"google.golang.org/protobuf/proto" +) + +func (m *Portmaps) ConfigSave() error { +	if m == nil { +		return fmt.Errorf("ConfigSave() nil") +	} +	s := m.FormatTEXT() +	log.Info("proto.Marshal() worked len", len(s)) +	configWrite([]byte(s)) +	return nil +} + +func (m *Portmaps) ConfigLoad() error { +	if m == nil { +		return errors.New("It's not safe to run ConfigLoad() on a nil ?") +	} +	if os.Getenv("CLOUD_HOME") == "" { +		homeDir, _ := os.UserHomeDir() +		fullpath := filepath.Join(homeDir, ".config/cloud") +		os.Setenv("CLOUD_HOME", fullpath) +	} + +	var data []byte +	var err error +	if data, err = loadFile("gus.text"); err != nil { +		// something went wrong loading the file +		return err +	} + +	if data != nil { +		if err = proto.Unmarshal(data, m); err != nil { +			log.Warn("broken gus.text config file", "gus.text") +			return err +		} +		return nil +	} + +	log.Log(INFO, "gus.ConfigLoad() has", m.Len(), "port mappings") +	return nil +} + +func loadFile(filename string) ([]byte, error) { +	homeDir, err := os.UserHomeDir() +	p := filepath.Join(homeDir, ".config/cloud") +	fullname := filepath.Join(p, filename) +	data, err := os.ReadFile(fullname) +	if errors.Is(err, os.ErrNotExist) { +		// if file does not exist, just return nil. this +		return nil, nil +	} +	if err != nil { +		// log.Info("open config file :", err) +		return nil, err +	} +	return data, nil +} + +func (m *Portmaps) loadFile(fname string) ([]byte, error) { +	fullname := filepath.Join(os.Getenv("CLOUD_HOME"), fname) + +	data, err := os.ReadFile(fullname) +	if err != nil { +		// log.Info("open config file :", err) +		return nil, err +	} +	return data, nil +} + +func configWrite(data []byte) error { +	homeDir, err := os.UserHomeDir() +	p := filepath.Join(homeDir, ".config/cloud") +	fname := filepath.Join(p, "gus.text") +	cfgfile, err := os.OpenFile(fname, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) +	defer cfgfile.Close() +	if err != nil { +		log.Warn("open config file :", err) +		return err +	} +	cfgfile.Write(data) +	return nil +} + +func (m *Portmaps) configWrite(fname string, data []byte) error { +	fullname := filepath.Join(os.Getenv("CLOUD_HOME"), fname) + +	cfgfile, err := os.OpenFile(fullname, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) +	defer cfgfile.Close() +	if err != nil { +		log.Warn("open config file :", err) +		return err +	} +	cfgfile.Write(data) +	return nil +} @@ -4,6 +4,8 @@  package main  import ( +	"io" +	"net"  	"os"  	"time" @@ -35,5 +37,47 @@ func main() {  	// go NewWatchdog() +	go listen3000() +  	startHTTP()  } + +func listen3000() { +	// Listen on local port 3000 +	listener, err := net.Listen("tcp", "0.0.0.0:3000") +	if err != nil { +		log.Fatalf("Failed to listen on port 3000: %v", err) +	} +	defer listener.Close() +	log.Println("Listening on port 3000...") + +	for { +		// Accept incoming connection +		clientConn, err := listener.Accept() +		if err != nil { +			log.Printf("Failed to accept client connection: %v", err) +			continue +		} +		log.Printf("Client connected: %s", clientConn.RemoteAddr()) + +		// Handle the connection in a separate goroutine +		go handleConnection(clientConn) +	} +} + +func handleConnection(clientConn net.Conn) { +	defer clientConn.Close() + +	// Connect to the target server +	targetConn, err := net.Dial("tcp", "go.wit.com:44355") +	if err != nil { +		log.Printf("Failed to connect to go.wit.com %v", err) +		return +	} +	defer targetConn.Close() +	log.Printf("Connected to target server: %s", targetConn.RemoteAddr()) + +	// Bidirectional copy of data +	go io.Copy(targetConn, clientConn) // Client -> Target +	io.Copy(clientConn, targetConn)    // Target -> Client +} diff --git a/portmap.proto b/portmap.proto index c798895..a1a6814 100644 --- a/portmap.proto +++ b/portmap.proto @@ -2,6 +2,17 @@ syntax = "proto3";  package gus; +message Event { +        string             hostname     = 1; +        string             version      = 2; +} + +message Events { +        string             uuid         = 1; +        string             version      = 2; +        repeated Event     events       = 3; +} +  message Portmap {          int64              listen       = 1;          string             connect      = 2;  | 
