about summary refs log tree commit diff
path: root/main.go
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2023-08-26 02:09:22 +0200
committerMel <einebeere@gmail.com>2023-08-26 02:09:22 +0200
commit04ce21ba35b50d6857051715b2d87cb7f2074e8b (patch)
tree81f17f4ecae949f33525b09e706b79097385a12f /main.go
parent27c39fce776c395711a9a70ca6a195515ec5ba5e (diff)
downloadcthcous-04ce21ba35b50d6857051715b2d87cb7f2074e8b.tar.zst
cthcous-04ce21ba35b50d6857051715b2d87cb7f2074e8b.zip
Add config HEAD main
Diffstat (limited to 'main.go')
-rw-r--r--main.go82
1 files changed, 76 insertions, 6 deletions
diff --git a/main.go b/main.go
index 79bb0d4..0ac0413 100644
--- a/main.go
+++ b/main.go
@@ -5,7 +5,9 @@ import (
 	"context"
 	"encoding/base64"
 	"encoding/binary"
+	"encoding/json"
 	"errors"
+	"flag"
 	"fmt"
 	"io"
 	"log/slog"
@@ -18,6 +20,10 @@ import (
 	"time"
 )
 
+const version = "0.0.1"
+
+const defaultConfigPath = "/etc/cthcous/config.json"
+
 const defaultReadTimeout = 2 * time.Second
 
 type BridgeInfo struct {
@@ -27,14 +33,35 @@ type BridgeInfo struct {
 }
 
 func main() {
-	slog.Info("starting cthcous...")
+	slog.Info(fmt.Sprintf("starting cthcous v%s...", version))
+
+	flags := parseFlags()
+	if flags.ConfigPath == "" {
+		slog.Warn("no config path specified. using default.", slog.String("path", defaultConfigPath))
+		flags.ConfigPath = defaultConfigPath
+	}
 
-	ports := []uint{1234, 4321}
-	socketDir := "./"
+	slog.Info("loading config...", slog.String("path", flags.ConfigPath))
+	config, err := loadConfig(flags.ConfigPath)
+	if err != nil {
+		slog.Error("could not load config.", slog.Any("error", err))
+		return
+	}
 
-	bridgeInfos := make([]BridgeInfo, len(ports))
-	for i, port := range ports {
-		socketPath := fmt.Sprintf("%s/%d.socket", socketDir, port)
+	if len(config.Ports) == 0 {
+		slog.Error("no ports specified in config. nothing to do. exiting.")
+		return
+	}
+
+	bridgeInfos := make([]BridgeInfo, len(config.Ports))
+	for i, port := range config.Ports {
+		var socketPath string
+		if override, ok := config.PathOverrides[port]; ok {
+			slog.Info("using override for a socket path.", slog.Any("port", port), slog.String("path", override))
+			socketPath = override
+		} else {
+			socketPath = fmt.Sprintf("%s/%d.socket", config.SocketDir, port)
+		}
 		socketPath = path.Clean(socketPath)
 
 		bridgeInfos[i] = BridgeInfo{
@@ -63,6 +90,7 @@ func main() {
 	}
 
 	wg.Wait()
+	slog.Info("cthcous wait group completed. cya!")
 }
 
 func openBridgeSocket(ctx context.Context, wg *sync.WaitGroup, logger *slog.Logger, info BridgeInfo) {
@@ -164,3 +192,45 @@ func makeID() string {
 	binary.LittleEndian.PutUint64(b[:], r)
 	return base64.StdEncoding.EncodeToString(b[:])
 }
+
+type Flags struct {
+	ConfigPath string
+}
+
+func parseFlags() (flags Flags) {
+	flag.StringVar(&flags.ConfigPath, "c", "", "path to config file")
+	flag.Parse()
+	return
+}
+
+type Config struct {
+	Ports         []uint          `json:"ports"`
+	SocketDir     string          `json:"socketDir"`
+	PathOverrides map[uint]string `json:"pathOverrides"`
+}
+
+var defaultConfig = Config{
+	Ports:         []uint{},
+	SocketDir:     "/run/cthcous/",
+	PathOverrides: map[uint]string{},
+}
+
+func loadConfig(path string) (Config, error) {
+	configFile, err := os.Open(path)
+	if err != nil {
+		if errors.Is(err, os.ErrNotExist) {
+			return Config{}, fmt.Errorf("config file does not exist: %w", err)
+		}
+
+		return Config{}, err
+	}
+	defer configFile.Close()
+
+	config := defaultConfig
+	err = json.NewDecoder(configFile).Decode(&config)
+	if err != nil {
+		return Config{}, fmt.Errorf("could not decode config file: %w", err)
+	}
+
+	return config, nil
+}