From 1c6477531cae34db8dd21ee33d346b0e9edd1ec5 Mon Sep 17 00:00:00 2001 From: Alexander Renz Date: Sat, 12 Apr 2025 09:49:14 +0200 Subject: [PATCH] fix: 2.9 ipv4|ipv6|auto --- cmd/server/main.go | 65 ++++++++++++++++++++++++++++++++++++++-------- config.toml | 24 +++++++++++++---- wiki.md | 12 +++++++++ 3 files changed, 85 insertions(+), 16 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index f53b4a3..86f5a2c 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -136,6 +136,7 @@ type ServerConfig struct { Logging LoggingConfig `mapstructure:"logging"` GlobalExtensions []string `mapstructure:"globalextensions"` FileNaming string `mapstructure:"filenaming"` + ForceProtocol string `mapstructure:"forceprotocol"` // NEW field // Removed TempPath, LoggingJSON } @@ -381,16 +382,41 @@ func createAndMountISO(size, mountpoint, charset string) error { return nil } -var dialer = &net.Dialer{ - DualStack: true, - Timeout: 5 * time.Second, +func initializeNetworkProtocol(forceProtocol string) (*net.Dialer, error) { + switch forceProtocol { + case "ipv4": + return &net.Dialer{ + Timeout: 5 * time.Second, + DualStack: false, + Control: func(network, address string, c syscall.RawConn) error { + if network == "tcp6" { + return fmt.Errorf("IPv6 is disabled by forceprotocol setting") + } + return nil + }, + }, nil + case "ipv6": + return &net.Dialer{ + Timeout: 5 * time.Second, + DualStack: false, + Control: func(network, address string, c syscall.RawConn) error { + if network == "tcp4" { + return fmt.Errorf("IPv4 is disabled by forceprotocol setting") + } + return nil + }, + }, nil + case "auto": + return &net.Dialer{ + Timeout: 5 * time.Second, + DualStack: true, + }, nil + default: + return nil, fmt.Errorf("invalid forceprotocol value: %s", forceProtocol) + } } -var dualStackClient = &http.Client{ - Transport: &http.Transport{ - DialContext: dialer.DialContext, - }, -} +var dualStackClient *http.Client func main() { setDefaults() @@ -469,8 +495,9 @@ func main() { log.Infof("Server PreCaching: %v", conf.Server.PreCaching) log.Infof("Server FileTTLEnabled: %v", conf.Server.FileTTLEnabled) log.Infof("Server DeduplicationEnabled: %v", conf.Server.DeduplicationEnabled) - log.Infof("Server BindIP: %s", conf.Server.BindIP) // Hinzugefügt: Logging für BindIP - log.Infof("Server FileNaming: %s", conf.Server.FileNaming) // Added: Logging for FileNaming + log.Infof("Server BindIP: %s", conf.Server.BindIP) // Hinzugefügt: Logging für BindIP + log.Infof("Server FileNaming: %s", conf.Server.FileNaming) // Added: Logging for FileNaming + log.Infof("Server ForceProtocol: %s", conf.Server.ForceProtocol) // Added: Logging for ForceProtocol err = writePIDFile(conf.Server.PIDFilePath) // Write PID file after config is loaded if err != nil { @@ -590,6 +617,17 @@ func main() { log.Fatalf("Invalid IdleTimeout: %v", err) } + // Initialize network protocol based on forceprotocol setting + dialer, err := initializeNetworkProtocol(conf.Server.ForceProtocol) + if err != nil { + log.Fatalf("Failed to initialize network protocol: %v", err) + } + dualStackClient = &http.Client{ + Transport: &http.Transport{ + DialContext: dialer.DialContext, + }, + } + server := &http.Server{ Addr: conf.Server.BindIP + ":" + conf.Server.ListenPort, // Geändert: Nutzung von BindIP Handler: router, @@ -668,6 +706,7 @@ deduplicationenabled = true globalextensions = [".txt", ".pdf", ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".tiff", ".svg", ".webp"] # FileNaming options: "HMAC", "None" filenaming = "HMAC" +forceprotocol = "auto" [logging] level = "info" @@ -733,7 +772,7 @@ uploadqueuesize = 50 # Add file-specific configurations here [build] -version = "2.7-Stable" +version = "2.9-Stable" `) } @@ -827,6 +866,7 @@ func setDefaults() { viper.SetDefault("server.loggingjson", false) viper.SetDefault("server.filettlenabled", true) viper.SetDefault("server.deduplicationenabled", true) + viper.SetDefault("server.forceprotocol", "auto") viper.SetDefault("timeouts.readtimeout", "4800s") viper.SetDefault("timeouts.writetimeout", "4800s") @@ -1181,6 +1221,9 @@ func logSystemInfo() { log.Infof("Platform Family: %s", hInfo.PlatformFamily) log.Infof("Platform Version: %s", hInfo.PlatformVersion) log.Infof("Kernel Version: %s", hInfo.KernelVersion) + + // Log the forceprotocol configuration + log.Infof("Force Protocol: %s", conf.Server.ForceProtocol) } func initMetrics() { diff --git a/config.toml b/config.toml index 65d7c35..a50ce0f 100644 --- a/config.toml +++ b/config.toml @@ -1,5 +1,19 @@ -[server] -// ...existing code... -# FileNaming options: "HMAC", "None" -FileNaming = "HMAC" -// ...existing code... +# Server configuration +listenport = "8080" # TCP port for incoming requests +unixsocket = false # Use Unix domain socket instead of TCP +storagepath = "/path/to/hmac-file-server/data/" # Directory to store uploaded files +loglevel = "debug" # Logging level: "debug", "info", "warn", "error" +logfile = "/path/to/hmac-file-server.log" # Path to log file; leave empty to use stdout +metricsenabled = true # Enable Prometheus metrics +metricsport = "9090" # Port for Prometheus metrics +deduplicationenabled = true +minfreebytes = "5GB" # Minimum free disk space required +filettl = "2Y" # Time-to-live for files +filettlenabled = false # Enable TTL checks and cleanup +autoadjustworkers = true # Automatically adjust worker threads based on load +networkevents = false # Enable detailed network event logging +pidfilepath = "./hmac-file-server.pid" # Path to PID file +precaching = true # Pre-cache file structures on startup + +# New option to force network protocol +forceprotocol = "auto" # Options: "ipv4", "ipv6", "auto" diff --git a/wiki.md b/wiki.md index 5effbc9..df20dc9 100644 --- a/wiki.md +++ b/wiki.md @@ -62,6 +62,9 @@ autoadjustworkers = true # Automatically adjust worker threads based on load networkevents = false # Enable detailed network event logging pidfilepath = "./hmac-file-server.pid" # Path to PID file precaching = true # Pre-cache file structures on startup + +# New option to force network protocol +forceprotocol = "auto" # Options: "ipv4", "ipv6", "auto" ``` #### Configuration Options @@ -143,6 +146,14 @@ precaching = true # Pre-cache file structures on startup - *Description*: Enables pre-caching of file structures on startup to improve access speed and performance. - *Default*: `true` +- **forceprotocol**: + - *Type*: `String` + - *Description*: Specifies the network protocol to use for server communication. + - `"ipv4"`: Forces the server to use IPv4. + - `"ipv6"`: Forces the server to use IPv6. + - `"auto"`: Uses the system's default behavior (dual-stack). + - *Default*: `"auto"` + --- ### Deduplication Settings @@ -495,6 +506,7 @@ autoadjustworkers = true networkevents = false pidfilepath = "./hmac-file-server.pid" precaching = true +forceprotocol = "auto" # Deduplication settings [deduplication]