-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
96 lines (80 loc) · 1.9 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package main
import (
"log"
"net/http"
"os"
"path/filepath"
"strings"
"text/template"
)
type fallback struct {
defaultPath string
fs http.FileSystem
}
func (fb fallback) Open(path string) (http.File, error) {
f, err := fb.fs.Open(path)
if os.IsNotExist(err) {
log.Printf("Serving %s instead of %s: %v", fb.defaultPath, path, err)
return fb.fs.Open(fb.defaultPath)
}
log.Printf("Serving %s", path)
return f, err
}
func main() {
AutoInjection(os.Args[1:]...)
var fileSystem = fallback{
defaultPath: "/index.html",
fs: http.Dir("/srv/http"),
}
handler := http.FileServer(fileSystem)
http.Handle("/", handler)
log.Printf("Listening at 0.0.0.0:80")
log.Fatalln(http.ListenAndServe(":80", nil))
}
func readEnv() (env map[string]string) {
env = make(map[string]string)
for _, setting := range os.Environ() {
pair := strings.SplitN(setting, "=", 2)
env[pair[0]] = pair[1]
}
return
}
func AutoInjection(files ...string) {
for _, patern := range files {
fs, err := filepath.Glob(patern)
if err != nil {
log.Printf("[WARN] Injecting for the pattern %s failed : %v", patern, err)
} else if len(fs) == 0 {
log.Printf("[WARN] Injecting for the pattern %s returned no files", patern)
}
for _, f := range fs {
err := InjectEnv(f)
if err != nil {
log.Printf("[FAIL] Injecting on file %s: error %v", f, err)
} else {
log.Printf("[DONE] Injecting on file %s", f)
}
}
}
}
func InjectEnv(fileName string) error {
env := readEnv()
t := template.New(filepath.Base(fileName))
if delims, ok := env["DELIM"]; ok {
if delimEnd, ok := env["DELIM_END"]; ok {
t = t.Delims(delims, delimEnd)
} else {
t = t.Delims(delims, delims)
}
}
t, err := t.ParseFiles(fileName)
if err != nil {
return err
}
file, err := os.OpenFile(fileName, os.O_WRONLY|os.O_TRUNC, 0777)
if err != nil {
return err
}
file.Truncate(0)
return t.Execute(file, env)
}