From f31886d7159dea96ccf1aafa016718b51ab7929c Mon Sep 17 00:00:00 2001 From: partisan Date: Thu, 8 Aug 2024 16:49:30 +0200 Subject: [PATCH] clean up --- common.go | 34 +++++++++++ config.go | 149 ++++++++++++++++++++++++++++++++++++++++++++++++ init.go | 151 ------------------------------------------------- open-search.go | 22 ------- 4 files changed, 183 insertions(+), 173 deletions(-) create mode 100644 config.go diff --git a/common.go b/common.go index 7d30861..4a0beae 100644 --- a/common.go +++ b/common.go @@ -1,7 +1,11 @@ package main import ( + "crypto/rand" + "encoding/base64" "html/template" + "log" + "strings" ) var ( @@ -15,3 +19,33 @@ var ( }, } ) + +func generateStrongRandomString(length int) string { + bytes := make([]byte, length) + _, err := rand.Read(bytes) + if err != nil { + log.Fatalf("Error generating random string: %v", err) + } + return base64.URLEncoding.EncodeToString(bytes)[:length] +} + +// Checks if the URL already includes a protocol +func hasProtocol(url string) bool { + return strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") +} + +// Checks if the domain is a local address +func isLocalAddress(domain string) bool { + return domain == "localhost" || strings.HasPrefix(domain, "127.") || strings.HasPrefix(domain, "192.168.") || strings.HasPrefix(domain, "10.") +} + +// Ensures that HTTP or HTTPS is befor the adress if needed +func addProtocol(domain string) string { + if hasProtocol(domain) { + return domain + } + if isLocalAddress(domain) { + return "http://" + domain + } + return "https://" + domain +} diff --git a/config.go b/config.go new file mode 100644 index 0000000..a004359 --- /dev/null +++ b/config.go @@ -0,0 +1,149 @@ +package main + +import ( + "bufio" + "fmt" + "log" + "os" + "strconv" + "strings" + + "github.com/fsnotify/fsnotify" + "gopkg.in/ini.v1" +) + +func initConfig() error { + if _, err := os.Stat(configFilePath); os.IsNotExist(err) { + return createConfig() + } + + fmt.Println("Configuration file already exists.") + config = loadConfig() + return nil +} + +func createConfig() error { + reader := bufio.NewReader(os.Stdin) + + fmt.Println("Configuration file not found.") + fmt.Print("Do you want to use default values? (yes/no): ") + useDefaults, _ := reader.ReadString('\n') + + if strings.TrimSpace(useDefaults) != "yes" { + fmt.Print("Enter port (default 5000): ") + portStr, _ := reader.ReadString('\n') + if portStr != "\n" { + port, err := strconv.Atoi(strings.TrimSpace(portStr)) + if err != nil { + config.Port = 5000 + } else { + config.Port = port + } + } + + fmt.Print("Enter your domain address (default localhost): ") + domain, _ := reader.ReadString('\n') + if domain != "\n" { + config.Domain = strings.TrimSpace(domain) + } + } else { + config = defaultConfig + } + + if config.AuthCode == "" { + config.AuthCode = generateStrongRandomString(64) + fmt.Printf("Generated connection code: %s\n", config.AuthCode) + } + + saveConfig(config) + return nil +} + +func saveConfig(config Config) { + cfg := ini.Empty() + sec := cfg.Section("") + sec.Key("Port").SetValue(strconv.Itoa(config.Port)) + sec.Key("AuthCode").SetValue(config.AuthCode) + sec.Key("PeerID").SetValue(config.PeerID) + + peers := strings.Join(config.Peers, ",") + sec.Key("Peers").SetValue(peers) + sec.Key("Domain").SetValue(config.Domain) + + err := cfg.SaveTo(configFilePath) + if err != nil { + fmt.Println("Error writing to config file:", err) + } +} + +func loadConfig() Config { + cfg, err := ini.Load(configFilePath) + if err != nil { + log.Fatalf("Error opening config file: %v", err) + } + + port, err := cfg.Section("").Key("Port").Int() + if err != nil || port == 0 { + port = 5000 // Default to 5000 if not set or error + } + + peersStr := cfg.Section("").Key("Peers").String() + var peers []string + if peersStr != "" { + peers = strings.Split(peersStr, ",") + for i, peer := range peers { + peers[i] = addProtocol(peer) + } + } + + domain := cfg.Section("").Key("Domain").String() + if domain == "" { + domain = "localhost" // Default to localhost if not set + } + + config = Config{ + Port: port, + AuthCode: cfg.Section("").Key("AuthCode").String(), + PeerID: cfg.Section("").Key("PeerID").String(), + Peers: peers, + Domain: domain, + } + + return config +} + +func startFileWatcher() { + watcher, err := fsnotify.NewWatcher() + if err != nil { + log.Fatal(err) + } + + go func() { + defer watcher.Close() + for { + select { + case event, ok := <-watcher.Events: + if !ok { + return + } + if event.Op&fsnotify.Write == fsnotify.Write { + log.Println("Modified file:", event.Name) + configLock.Lock() + config = loadConfig() + configLock.Unlock() + // Perform your logic here to handle the changes in the config file + } + case err, ok := <-watcher.Errors: + if !ok { + return + } + log.Println("Error:", err) + } + } + }() + + err = watcher.Add(configFilePath) + if err != nil { + log.Fatal(err) + } +} diff --git a/init.go b/init.go index 915bd3c..c807cfe 100644 --- a/init.go +++ b/init.go @@ -1,19 +1,10 @@ package main import ( - "bufio" - "crypto/rand" - "encoding/base64" "fmt" "log" - "os" - "strconv" - "strings" "sync" "time" - - "github.com/fsnotify/fsnotify" - "gopkg.in/ini.v1" ) type Config struct { @@ -67,145 +58,3 @@ func main() { runServer() } - -func initConfig() error { - if _, err := os.Stat(configFilePath); os.IsNotExist(err) { - return createConfig() - } - - fmt.Println("Configuration file already exists.") - config = loadConfig() - return nil -} - -func createConfig() error { - reader := bufio.NewReader(os.Stdin) - - fmt.Println("Configuration file not found.") - fmt.Print("Do you want to use default values? (yes/no): ") - useDefaults, _ := reader.ReadString('\n') - - if strings.TrimSpace(useDefaults) != "yes" { - fmt.Print("Enter port (default 5000): ") - portStr, _ := reader.ReadString('\n') - if portStr != "\n" { - port, err := strconv.Atoi(strings.TrimSpace(portStr)) - if err != nil { - config.Port = 5000 - } else { - config.Port = port - } - } - - fmt.Print("Enter your domain address (default localhost): ") - domain, _ := reader.ReadString('\n') - if domain != "\n" { - config.Domain = strings.TrimSpace(domain) - } - } else { - config = defaultConfig - } - - if config.AuthCode == "" { - config.AuthCode = generateStrongRandomString(64) - fmt.Printf("Generated connection code: %s\n", config.AuthCode) - } - - saveConfig(config) - return nil -} - -func saveConfig(config Config) { - cfg := ini.Empty() - sec := cfg.Section("") - sec.Key("Port").SetValue(strconv.Itoa(config.Port)) - sec.Key("AuthCode").SetValue(config.AuthCode) - sec.Key("PeerID").SetValue(config.PeerID) - - peers := strings.Join(config.Peers, ",") - sec.Key("Peers").SetValue(peers) - sec.Key("Domain").SetValue(config.Domain) - - err := cfg.SaveTo(configFilePath) - if err != nil { - fmt.Println("Error writing to config file:", err) - } -} - -func loadConfig() Config { - cfg, err := ini.Load(configFilePath) - if err != nil { - log.Fatalf("Error opening config file: %v", err) - } - - port, err := cfg.Section("").Key("Port").Int() - if err != nil || port == 0 { - port = 5000 // Default to 5000 if not set or error - } - - peersStr := cfg.Section("").Key("Peers").String() - var peers []string - if peersStr != "" { - peers = strings.Split(peersStr, ",") - } - - domain := cfg.Section("").Key("Domain").String() - if domain == "" { - domain = "localhost" // Default to localhost if not set - } - - config = Config{ - Port: port, - AuthCode: cfg.Section("").Key("AuthCode").String(), - PeerID: cfg.Section("").Key("PeerID").String(), - Peers: peers, - Domain: domain, - } - - return config -} - -func generateStrongRandomString(length int) string { - bytes := make([]byte, length) - _, err := rand.Read(bytes) - if err != nil { - log.Fatalf("Error generating random string: %v", err) - } - return base64.URLEncoding.EncodeToString(bytes)[:length] -} - -func startFileWatcher() { - watcher, err := fsnotify.NewWatcher() - if err != nil { - log.Fatal(err) - } - - go func() { - defer watcher.Close() - for { - select { - case event, ok := <-watcher.Events: - if !ok { - return - } - if event.Op&fsnotify.Write == fsnotify.Write { - log.Println("Modified file:", event.Name) - configLock.Lock() - config = loadConfig() - configLock.Unlock() - // Perform your logic here to handle the changes in the config file - } - case err, ok := <-watcher.Errors: - if !ok { - return - } - log.Println("Error:", err) - } - } - }() - - err = watcher.Add(configFilePath) - if err != nil { - log.Fatal(err) - } -} diff --git a/open-search.go b/open-search.go index f6214a5..86d7e4e 100644 --- a/open-search.go +++ b/open-search.go @@ -4,7 +4,6 @@ import ( "encoding/xml" "fmt" "os" - "strings" ) type OpenSearchDescription struct { @@ -21,27 +20,6 @@ type URL struct { Template string `xml:"template,attr"` } -// Checks if the URL already includes a protocol -func hasProtocol(url string) bool { - return strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") -} - -// Checks if the domain is a local address -func isLocalAddress(domain string) bool { - return domain == "localhost" || strings.HasPrefix(domain, "127.") || strings.HasPrefix(domain, "192.168.") || strings.HasPrefix(domain, "10.") -} - -// Ensures that HTTP or HTTPS is befor the adress if needed -func addProtocol(domain string) string { - if hasProtocol(domain) { - return domain - } - if isLocalAddress(domain) { - return "http://" + domain - } - return "https://" + domain -} - func generateOpenSearchXML(config Config) { baseURL := addProtocol(config.Domain)