k3s/vendor/github.com/rootless-containers/rootlesskit/pkg/child/hosts.go
2020-01-31 21:41:27 -07:00

65 lines
1.6 KiB
Go

package child
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"golang.org/x/sys/unix"
"github.com/pkg/errors"
)
// generateEtcHosts makes sure the current hostname is resolved into
// 127.0.0.1 or ::1, not into the host eth0 IP address.
//
// Note that /etc/hosts is not used by nslookup/dig. (Use `getent ahostsv4` instead.)
func generateEtcHosts() ([]byte, error) {
etcHosts, err := ioutil.ReadFile("/etc/hosts")
if err != nil {
return nil, err
}
hostname, err := os.Hostname()
if err != nil {
return nil, err
}
// FIXME: no need to add the entry if already added
s := fmt.Sprintf("%s\n127.0.0.1 %s\n::1 %s\n",
string(etcHosts), hostname, hostname)
return []byte(s), nil
}
// writeEtcHosts is akin to writeResolvConf
// TODO: dedupe
func writeEtcHosts() error {
newEtcHosts, err := generateEtcHosts()
if err != nil {
return err
}
// remove copied-up link
_ = os.Remove("/etc/hosts")
if err := ioutil.WriteFile("/etc/hosts", newEtcHosts, 0644); err != nil {
return errors.Wrapf(err, "writing /etc/hosts")
}
return nil
}
// mountEtcHosts is akin to mountResolvConf
// TODO: dedupe
func mountEtcHosts(tempDir string) error {
newEtcHosts, err := generateEtcHosts()
if err != nil {
return err
}
myEtcHosts := filepath.Join(tempDir, "hosts")
if err := ioutil.WriteFile(myEtcHosts, newEtcHosts, 0644); err != nil {
return errors.Wrapf(err, "writing %s", myEtcHosts)
}
if err := unix.Mount(myEtcHosts, "/etc/hosts", "", uintptr(unix.MS_BIND), ""); err != nil {
return errors.Wrapf(err, "failed to create bind mount /etc/hosts for %s", myEtcHosts)
}
return nil
}