-
Notifications
You must be signed in to change notification settings - Fork 41
/
resolv.go
73 lines (60 loc) · 2.09 KB
/
resolv.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 kawasaki
import (
"fmt"
"net"
"os"
"path/filepath"
"code.cloudfoundry.org/lager/v3"
)
//counterfeiter:generate . HostFileCompiler
type HostFileCompiler interface {
Compile(log lager.Logger, ip net.IP, handle string, additionalHostEntries []string) ([]byte, error)
}
//counterfeiter:generate . ResolvCompiler
type ResolvCompiler interface {
Determine(resolvContents string, hostIP net.IP, pluginNameservers, operatorNameservers, additionalNameservers []net.IP, pluginSearchDomains []string) []string
}
type ResolvConfigurer struct {
HostsFileCompiler HostFileCompiler
ResolvCompiler ResolvCompiler
ResolvFilePath string
DepotDir string
}
func (d *ResolvConfigurer) Configure(log lager.Logger, cfg NetworkConfig, pid int) error {
log = log.Session("dns-resolve-configure")
containerHostsContents, err := d.HostsFileCompiler.Compile(log, cfg.ContainerIP, cfg.ContainerHandle, cfg.AdditionalHostEntries)
if err != nil {
log.Error("compiling-hosts-file", err)
return err
}
if err := writeExistingFile(filepath.Join(d.DepotDir, cfg.ContainerHandle, "hosts"), containerHostsContents); err != nil {
log.Error("writing-hosts-file", err)
return err
}
hostResolvContents, err := os.ReadFile(d.ResolvFilePath)
if err != nil {
log.Error("reading-host-resolv-file", err)
return err
}
resolvEntries := d.ResolvCompiler.Determine(string(hostResolvContents), cfg.BridgeIP, cfg.PluginNameservers, cfg.OperatorNameservers, cfg.AdditionalNameservers, cfg.PluginSearchDomains)
containerResolvContents := ""
for _, resolvEntry := range resolvEntries {
containerResolvContents = fmt.Sprintf("%s%s\n", containerResolvContents, resolvEntry)
}
if err := writeExistingFile(filepath.Join(d.DepotDir, cfg.ContainerHandle, "resolv.conf"), []byte(containerResolvContents)); err != nil {
log.Error("writing-resolv-file", err)
return err
}
return nil
}
func writeExistingFile(path string, contents []byte) error {
file, err := os.OpenFile(path, os.O_WRONLY, 0644)
if err != nil {
return err
}
defer file.Close()
if _, err := file.Write(contents); err != nil {
return err
}
return nil
}