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; |
