k3s/vendor/github.com/rootless-containers/rootlesskit/pkg/child/resolvconf.go

47 lines
1.5 KiB
Go

package child
import (
"io/ioutil"
"os"
"path/filepath"
"github.com/pkg/errors"
"github.com/rootless-containers/rootlesskit/pkg/common"
)
func generateResolvConf(dns string) []byte {
return []byte("nameserver " + dns + "\n")
}
func writeResolvConf(dns string) error {
// remove copied-up link
_ = os.Remove("/etc/resolv.conf")
if err := ioutil.WriteFile("/etc/resolv.conf", generateResolvConf(dns), 0644); err != nil {
return errors.Wrapf(err, "writing %s", "/etc/resolv.conf")
}
return nil
}
// mountResolvConf does not work when /etc/resolv.conf is a managed by
// systemd or NetworkManager, because our bind-mounted /etc/resolv.conf (in our namespaces)
// is unexpectedly unmounted when /etc/resolv.conf is recreated in the initial initial namespace.
//
// If /etc/resolv.conf is a symlink, e.g. to ../run/systemd/resolve/stub-resolv.conf,
// our bind-mounted /etc/resolv.conf is still unmounted when /run/systemd/resolve/stub-resolv.conf is recreated.
//
// Use writeResolvConf with copying-up /etc for most cases.
func mountResolvConf(tempDir, dns string) error {
myResolvConf := filepath.Join(tempDir, "resolv.conf")
if err := ioutil.WriteFile(myResolvConf, generateResolvConf(dns), 0644); err != nil {
return errors.Wrapf(err, "writing %s", myResolvConf)
}
cmds := [][]string{
{"mount", "--bind", myResolvConf, "/etc/resolv.conf"},
}
if err := common.Execs(os.Stderr, os.Environ(), cmds); err != nil {
return errors.Wrapf(err, "executing %v", cmds)
}
return nil
}