-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathhosts.go
73 lines (61 loc) · 1.43 KB
/
hosts.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
package config
import (
"os"
"path"
"path/filepath"
"strings"
"github.com/pkg/errors"
yaml "gopkg.in/yaml.v2"
)
// HostConfigs maps hostnames to config.
type HostConfigs map[string]*JobConfig
func pathToHostVariantA(name string) string {
return path.Base(path.Dir(name))
}
func pathToHostVariantB(name string) string {
return strings.TrimSuffix(path.Base(name), ".yml")
}
func (h HostConfigs) readGlob(pattern string, matchToHost func(string) string) (err error) {
glob, err := filepath.Glob(pattern)
if err != nil {
err = errors.Wrapf(err, "expanding glob %q failed", pattern)
return
}
for _, match := range glob {
host := matchToHost(match)
if err = h.readHostConfig(host, match); err != nil {
return
}
}
return
}
func (h HostConfigs) readHostConfig(host, file string) (err error) {
if _, ok := h[host]; ok {
err = errors.Errorf("duplicate host config for %s found", host)
return
}
var f *os.File
if f, err = os.Open(file); err != nil {
return
}
defer f.Close()
j := JobConfig{}
if err = yaml.NewDecoder(f).Decode(&j); err != nil {
err = errors.Wrapf(err, "reading %q", file)
return
}
j.host = host
h[host] = &j
return
}
func (h HostConfigs) readHooks(root string) error {
for host, job := range h {
if err := job.PreScript.readFiles(root, host, "pre.*.sh"); err != nil {
return err
}
if err := job.PostScript.readFiles(root, host, "post.*.sh"); err != nil {
return err
}
}
return nil
}