github.com/schwarzm/garden-linux@v0.0.0-20150507151835-33bca2147c47/linux_backend/hooks.go (about) 1 package linux_backend 2 3 import ( 4 "encoding/json" 5 "net" 6 "os" 7 "os/exec" 8 "strconv" 9 10 "github.com/cloudfoundry-incubator/garden-linux/hook" 11 "github.com/cloudfoundry-incubator/garden-linux/network" 12 "github.com/cloudfoundry-incubator/garden-linux/process" 13 ) 14 15 type Config struct { 16 Network json.RawMessage `json:"network"` 17 } 18 19 //go:generate counterfeiter . ContainerInitializer 20 type ContainerInitializer interface { 21 MountProc() error 22 MountTmp() error 23 } 24 25 func RegisterHooks(hs hook.HookSet, runner Runner, config process.Env, containerInitializer ContainerInitializer, configurer network.Configurer) { 26 hs.Register(hook.PARENT_BEFORE_CLONE, func() { 27 must(runner.Run(exec.Command("./hook-parent-before-clone.sh"))) 28 }) 29 30 hs.Register(hook.PARENT_AFTER_CLONE, func() { 31 must(runner.Run(exec.Command("./hook-parent-after-clone.sh"))) 32 must(configureHostNetwork(config, configurer)) 33 }) 34 35 hs.Register(hook.CHILD_AFTER_PIVOT, func() { 36 must(configureContainerNetwork(config, configurer)) 37 38 must(containerInitializer.MountProc()) 39 must(containerInitializer.MountTmp()) 40 41 // Temporary until /etc/seed functionality removed 42 if _, err := os.Stat("/etc/seed"); err == nil { 43 must(exec.Command("/bin/sh", "-c", ". /etc/seed").Run()) 44 } 45 }) 46 } 47 48 func configureHostNetwork(config process.Env, configurer network.Configurer) error { 49 _, ipNet, err := net.ParseCIDR(config["network_cidr"]) 50 if err != nil { 51 return err 52 } 53 54 mtu, err := strconv.ParseInt(config["container_iface_mtu"], 0, 64) 55 if err != nil { 56 return err 57 } 58 59 // Temporary until PID is passed in from Go rewrite of wshd. 60 containerPid, _ := pidFromFile("../run/wshd.pid") 61 if err != nil { 62 return err 63 } 64 65 err = configurer.ConfigureHost(&network.HostConfig{ 66 HostIntf: config["network_host_iface"], 67 BridgeName: config["bridge_iface"], 68 BridgeIP: net.ParseIP(config["network_host_ip"]), 69 ContainerIntf: config["network_container_iface"], 70 ContainerPid: containerPid, 71 Subnet: ipNet, 72 Mtu: int(mtu), 73 }) 74 if err != nil { 75 return err 76 } 77 78 return nil 79 } 80 81 func configureContainerNetwork(config process.Env, configurer network.Configurer) error { 82 83 _, ipNet, err := net.ParseCIDR(config["network_cidr"]) 84 if err != nil { 85 return err 86 } 87 88 mtu, err := strconv.ParseInt(config["container_iface_mtu"], 0, 64) 89 if err != nil { 90 return err 91 } 92 93 err = configurer.ConfigureContainer(&network.ContainerConfig{ 94 Hostname: config["id"], 95 ContainerIntf: config["network_container_iface"], 96 ContainerIP: net.ParseIP(config["network_container_ip"]), 97 GatewayIP: net.ParseIP(config["network_host_ip"]), 98 Subnet: ipNet, 99 Mtu: int(mtu), 100 }) 101 if err != nil { 102 return err 103 } 104 105 return nil 106 } 107 108 func must(err error) { 109 if err != nil { 110 panic(err) 111 } 112 } 113 114 type Runner interface { 115 Run(*exec.Cmd) error 116 }