summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Carr <[email protected]>2025-03-09 06:32:14 -0500
committerJeff Carr <[email protected]>2025-03-09 06:32:14 -0500
commiteaedaded622316d3b59c2f3765cd2362e96ce54c (patch)
tree483f1d67ecc990c1079bbccbfc9d89106332abfe
parent93852523e66c2646c8997c014f7c060b7baf0df8 (diff)
make a portmap protobuf & ConfigSave()
-rw-r--r--Makefile2
-rw-r--r--config.go107
-rw-r--r--main.go44
-rw-r--r--portmap.proto11
4 files changed, 163 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index c361aa4..4879292 100644
--- a/Makefile
+++ b/Makefile
@@ -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
+}
diff --git a/main.go b/main.go
index 5264b69..e5ea927 100644
--- a/main.go
+++ b/main.go
@@ -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;