@@ -7,26 +7,27 @@ import (
77 "log/slog"
88 "net"
99 "net/http"
10+ "os"
1011 "regexp"
12+ "strconv"
1113 "strings"
1214)
1315
14- const LogSourcePosition = false // set to true to log the source position (file and line) of the log message
15-
16- const (
16+ var (
1717 defaultAllowFrom = "127.0.0.1/32" // allowed IPs to connect to the proxy
1818 defaultAllowHealthcheck = false // allow health check requests (HEAD http://localhost:55555/health)
1919 defaultLogJSON = false // if true, log in JSON format
2020 defaultLogLevel = "INFO" // log level as string
2121 defaultListenIP = "127.0.0.1" // ip address to bind the server to
22- defaultProxyPort = 2375 // tcp port to listen on
22+ defaultProxyPort = uint ( 2375 ) // tcp port to listen on
2323 defaultSocketPath = "/var/run/docker.sock" // path to the unix socket
2424 defaultShutdownGraceTime = uint (10 ) // Maximum time in seconds to wait for the server to shut down gracefully
2525 defaultWatchdogInterval = uint (0 ) // watchdog interval in seconds (0 to disable)
2626 defaultStopOnWatchdog = false // set to true to stop the program when the socket gets unavailable (otherwise log only)
2727)
2828
2929type Config struct {
30+ AllowedRequests map [string ]* regexp.Regexp
3031 AllowFrom string
3132 AllowHealthcheck bool
3233 LogJSON bool
@@ -38,19 +39,17 @@ type Config struct {
3839 SocketPath string
3940}
4041
41- var (
42- AllowedRequests map [string ]* regexp.Regexp
43- )
44-
4542// used for list of allowed requests
4643type methodRegex struct {
47- method string
48- regexString string
44+ method string
45+ regexStringFromEnv string
46+ regexStringFromParam string
4947}
5048
5149// mr is the allowlist of requests per http method
52- // default: regegString is empty, so regexCompiled stays nil and the request is blocked
53- // if regexString is set with a command line parameter, all requests matching the method and path matching the regex are allowed
50+ // default: regexStringFromEnv and regexStringFromParam are empty, so regexCompiled stays nil and the request is blocked
51+ // if regexStringParam is set with a command line parameter, all requests matching the method and path matching the regex are allowed
52+ // else if regexStringEnv from Environment ist checked
5453var mr = []methodRegex {
5554 {method : http .MethodGet },
5655 {method : http .MethodHead },
@@ -70,6 +69,55 @@ func InitConfig() (*Config, error) {
7069 proxyPort uint
7170 logLevel string
7271 )
72+
73+ if val , ok := os .LookupEnv ("SP_ALLOWFROM" ); ok && val != "" {
74+ defaultAllowFrom = val
75+ }
76+ if val , ok := os .LookupEnv ("SP_ALLOWHEALTHCHECK" ); ok {
77+ if parsedVal , err := strconv .ParseBool (val ); err == nil {
78+ defaultAllowHealthcheck = parsedVal
79+ }
80+ }
81+ if val , ok := os .LookupEnv ("SP_LOGJSON" ); ok {
82+ if parsedVal , err := strconv .ParseBool (val ); err == nil {
83+ defaultLogJSON = parsedVal
84+ }
85+ }
86+ if val , ok := os .LookupEnv ("SP_LISTENIP" ); ok && val != "" {
87+ defaultListenIP = val
88+ }
89+ if val , ok := os .LookupEnv ("SP_LOGLEVEL" ); ok && val != "" {
90+ defaultLogLevel = val
91+ }
92+ if val , ok := os .LookupEnv ("SP_PROXYPORT" ); ok && val != "" {
93+ if parsedVal , err := strconv .ParseUint (val , 10 , 32 ); err == nil {
94+ defaultProxyPort = uint (parsedVal )
95+ }
96+ }
97+ if val , ok := os .LookupEnv ("SP_SHUTDOWNGRACETIME" ); ok && val != "" {
98+ if parsedVal , err := strconv .ParseUint (val , 10 , 32 ); err == nil {
99+ defaultShutdownGraceTime = uint (parsedVal )
100+ }
101+ }
102+ if val , ok := os .LookupEnv ("SP_SOCKETPATH" ); ok && val != "" {
103+ defaultSocketPath = val
104+ }
105+ if val , ok := os .LookupEnv ("SP_STOPONWATCHDOG" ); ok {
106+ if parsedVal , err := strconv .ParseBool (val ); err == nil {
107+ defaultStopOnWatchdog = parsedVal
108+ }
109+ }
110+ if val , ok := os .LookupEnv ("SP_WATCHDOGINTERVAL" ); ok && val != "" {
111+ if parsedVal , err := strconv .ParseUint (val , 10 , 32 ); err == nil {
112+ defaultWatchdogInterval = uint (parsedVal )
113+ }
114+ }
115+ for i := 0 ; i < len (mr ); i ++ {
116+ if val , ok := os .LookupEnv ("SP_ALLOW_" + mr [i ].method ); ok && val != "" {
117+ mr [i ].regexStringFromEnv = val
118+ }
119+ }
120+
73121 flag .StringVar (& cfg .AllowFrom , "allowfrom" , defaultAllowFrom , "allowed IPs or hostname to connect to the proxy" )
74122 flag .BoolVar (& cfg .AllowHealthcheck , "allowhealthcheck" , defaultAllowHealthcheck , "allow health check requests (HEAD http://localhost:55555/health)" )
75123 flag .BoolVar (& cfg .LogJSON , "logjson" , defaultLogJSON , "log in JSON format (otherwise log in plain text" )
@@ -81,11 +129,11 @@ func InitConfig() (*Config, error) {
81129 flag .BoolVar (& cfg .StopOnWatchdog , "stoponwatchdog" , defaultStopOnWatchdog , "stop the program when the socket gets unavailable (otherwise log only)" )
82130 flag .UintVar (& cfg .WatchdogInterval , "watchdoginterval" , defaultWatchdogInterval , "watchdog interval in seconds (0 to disable)" )
83131 for i := 0 ; i < len (mr ); i ++ {
84- flag .StringVar (& mr [i ].regexString , "allow" + mr [i ].method , mr [ i ]. regexString , "regex for " + mr [i ].method + " requests (not set means method is not allowed)" )
132+ flag .StringVar (& mr [i ].regexStringFromParam , "allow" + mr [i ].method , "" , "regex for " + mr [i ].method + " requests (not set means method is not allowed)" )
85133 }
86134 flag .Parse ()
87135
88- // pcheck listenIP and proxyPort
136+ // check listenIP and proxyPort
89137 if net .ParseIP (listenIP ) == nil {
90138 return nil , fmt .Errorf ("invalid IP \" %s\" for listenip" , listenIP )
91139 }
@@ -109,14 +157,20 @@ func InitConfig() (*Config, error) {
109157 }
110158
111159 // compile regexes for allowed requests
112- AllowedRequests = make (map [string ]* regexp.Regexp )
160+ cfg . AllowedRequests = make (map [string ]* regexp.Regexp )
113161 for _ , rx := range mr {
114- if rx .regexString != "" {
115- r , err := regexp .Compile ("^" + rx .regexString + "$" )
162+ if rx .regexStringFromParam != "" {
163+ r , err := regexp .Compile ("^" + rx .regexStringFromParam + "$" )
164+ if err != nil {
165+ return nil , fmt .Errorf ("invalid regex \" %s\" for method %s in command line parameter: %s" , rx .regexStringFromParam , rx .method , err )
166+ }
167+ cfg .AllowedRequests [rx .method ] = r
168+ } else if rx .regexStringFromEnv != "" {
169+ r , err := regexp .Compile ("^" + rx .regexStringFromEnv + "$" )
116170 if err != nil {
117- return nil , fmt .Errorf ("invalid regex \" %s\" for method %s: %s" , rx .regexString , rx .method , err )
171+ return nil , fmt .Errorf ("invalid regex \" %s\" for method %s in env variable : %s" , rx .regexStringFromParam , rx .method , err )
118172 }
119- AllowedRequests [rx .method ] = r
173+ cfg . AllowedRequests [rx .method ] = r
120174 }
121175 }
122176 return & cfg , nil
0 commit comments