From facff5ed44b6f2b58e0200355a507c0fac750d85 Mon Sep 17 00:00:00 2001 From: Eugene Yakubovich Date: Tue, 10 Feb 2015 12:32:07 -0800 Subject: [PATCH] net: copy netconf files into container dir The user might modify or delete the net config files while the container is running. This will mess up the plugins on the teardown path. Copying them into a the container directory and using them from there should guard against that. It also lays the foundation for GC to process unremoved files. --- networking/networking.go | 43 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/networking/networking.go b/networking/networking.go index 41e677c..950558d 100644 --- a/networking/networking.go +++ b/networking/networking.go @@ -16,6 +16,7 @@ package networking import ( "fmt" + "io" "log" "net" "os" @@ -171,18 +172,30 @@ func (n *Networking) EnterContNS() error { return util.SetNS(n.contNS, syscall.CLONE_NEWNET) } +func (e *containerEnv) netDir() string { + return filepath.Join(e.rktRoot, "net") +} + func (e *containerEnv) setupNets(netns string, nets []Net) ([]activeNet, error) { - var err error + err := os.MkdirAll(e.netDir(), 0755) + if err != nil { + return nil, err + } active := []activeNet{} for i, nt := range nets { + log.Printf("Setup: executing net-plugin %v", nt.Type) + an := activeNet{ Net: nt, ifName: fmt.Sprintf(ifnamePattern, i), } - log.Printf("Setup: executing net-plugin %v", nt.Type) + if an.Filename, err = copyFileToDir(nt.Filename, e.netDir()); err != nil { + err = fmt.Errorf("error copying %q to %q: %v", nt.Filename, e.netDir(), err) + break + } an.ip, err = e.netPluginAdd(&nt, netns, nt.args, an.ifName) if err != nil { @@ -206,10 +219,17 @@ func (e *containerEnv) teardownNets(netns string, nets []activeNet) { nt := nets[i] log.Printf("Teardown: executing net-plugin %v", nt.Type) + err := e.netPluginDel(&nt.Net, netns, nt.args, nt.ifName) if err != nil { log.Printf("Error deleting %q: %v", nt.Name, err) } + + // Delete the conf file to signal that the network was + // torn down (or at least attempted to) + if err = os.Remove(nt.Filename); err != nil { + log.Printf("Error deleting %q: %v", nt.Filename, err) + } } } @@ -285,3 +305,22 @@ func bindMountFile(src, dstDir, dstFile string) error { return syscall.Mount(src, dst, "none", syscall.MS_BIND, "") } + +func copyFileToDir(src, dstdir string) (string, error) { + dst := filepath.Join(dstdir, filepath.Base(src)) + + s, err := os.Open(src) + if err != nil { + return "", err + } + defer s.Close() + + d, err := os.Create(dst) + if err != nil { + return "", err + } + defer d.Close() + + _, err = io.Copy(d, s) + return dst, err +}