44 "bufio"
55 "flag"
66 "fmt"
7- "io/ioutil "
7+ "log "
88 "os"
99 "os/exec"
1010 "regexp"
@@ -26,14 +26,12 @@ type EnvVar struct {
2626}
2727
2828func main () {
29-
3029 var configFile string
3130 flag .StringVar (& configFile , "c" , "/etc/traefik/traefik.toml" , "Traefik config file to use, default: /etc/traefik/traefik.toml" )
3231 flag .Parse ()
3332
3433 if _ , err := os .Stat (configFile ); err != nil {
35- fmt .Println ("Config file" , configFile , "not found" )
36- os .Exit (1 )
34+ log .Fatalln ("Config file not found:" , configFile )
3735 }
3836
3937 if len (os .Args ) <= 1 {
@@ -52,7 +50,6 @@ func main() {
5250 handleError (err )
5351
5452 runCmd ()
55- os .Exit (0 )
5653}
5754
5855// Run CMD specified in Dockerfile or runtime and send output to stdout
@@ -79,29 +76,23 @@ func runCmd() {
7976
8077func handleError (err error ) {
8178 if err != nil {
82- fmt .Println (err )
83- os .Exit (1 )
79+ log .Fatalln (err )
8480 }
8581}
8682
8783// ReadTraefikToml reads the Traefik config file from filesystem and returns as byte array
8884func ReadTraefikToml (filename string ) ([]byte , error ) {
89- file , err := ioutil .ReadFile (filename )
85+ file , err := os .ReadFile (filename )
9086 if err != nil {
91- return []byte {}, fmt .Errorf ("Unable to read config file at %s" , filename )
87+ return []byte {}, fmt .Errorf ("unable to read config file at %s" , filename )
9288 }
9389
9490 return file , nil
9591}
9692
9793// WriteTraefikToml writes updated Traefix config to filesystem
9894func WriteTraefikToml (filename string , contents []byte ) error {
99- err := ioutil .WriteFile (filename , contents , 0644 )
100- if err != nil {
101- return err
102- }
103-
104- return nil
95+ return os .WriteFile (filename , contents , 0644 )
10596}
10697
10798// UpdateConfigContent replaces placeholders with values from environment variables
@@ -116,38 +107,38 @@ func UpdateConfigContent(config []byte, replacements []Replacement) []byte {
116107
117108// BuildReplacementsFromEnv Build []Replacement from env vars
118109func BuildReplacementsFromEnv () ([]Replacement , error ) {
110+ letsEncryptURLs := map [string ]string {
111+ "staging" : "https://acme-staging.api.letsencrypt.org/directory" ,
112+ "production" : "https://acme-v01.api.letsencrypt.org/directory" ,
113+ }
119114
120115 var configReplacements []Replacement
121116
122117 envVars := GetEnvVarModels ()
123118 for _ , envvar := range envVars {
124119 value := os .Getenv (envvar .Name )
125- if value == "" && envvar .Required {
126- return configReplacements , fmt .Errorf ("Missing required env var: %s. Description: %s" , envvar .Name , envvar .Desc )
120+ if value == "" {
121+ if envvar .Required {
122+ return configReplacements , fmt .Errorf ("missing required env var: %s. Description: %s" , envvar .Name , envvar .Desc )
123+ }
124+
125+ value = envvar .Default
126+ continue
127127 }
128128
129- if value != "" {
130- if envvar .Name == "LETS_ENCRYPT_CA" {
131- if value == "staging" {
132- value = "https://acme-staging.api.letsencrypt.org/directory"
133- } else if value == "production" {
134- value = "https://acme-v01.api.letsencrypt.org/directory"
135- }
136- } else if envvar .Name == "SANS" {
137- sans := strings .Split (value , "," )
138- value = ""
139- for _ , san := range sans {
140- value += "\" " + san + "\" , "
141- }
142- value = strings .TrimRight (value , ", " )
129+ switch envvar .Name {
130+ case "LETS_ENCRYPT_CA" :
131+ if v , ok := letsEncryptURLs [value ]; ok {
132+ value = v
143133 }
144- configReplacements = append (configReplacements , Replacement {
145- Key : envvar .Name ,
146- Value : value ,
147- })
148- } else if value == "" && ! envvar .Required {
149- value = envvar .Default
134+ case "SANS" :
135+ value = `"` + strings .ReplaceAll (value , "," , `", "` ) + `"`
150136 }
137+
138+ configReplacements = append (configReplacements , Replacement {
139+ Key : envvar .Name ,
140+ Value : value ,
141+ })
151142 }
152143
153144 return configReplacements , nil
0 commit comments