func (ctx *RktRunCtx) cleanupChildren() error { for _, child := range ctx.children { if child.Cmd.ProcessState.Exited() { logger.Logf("Child %q already exited", child.Cmd.Path) continue } logger.Logf("Shutting down child %q", child.Cmd.Path) if err := child.Cmd.Process.Kill(); err != nil { return err } if _, err := child.Cmd.Process.Wait(); err != nil { return err } } return nil }
func HTTPServe(addr string, timeout int) error { hostname, err := os.Hostname() if err != nil { panic(err) } originalListener, err := net.Listen("tcp4", addr) if err != nil { panic(err) } sl, err := stoppableListener.New(originalListener) if err != nil { panic(err) } c := make(chan string) go func() { logger.Logf("%v: serving on %v\n", hostname, addr) // Wait for either timeout or connect from client select { case <-time.After(time.Duration(timeout) * time.Second): { logger.Logf("%v: Serve timed out after %v seconds\n", hostname, timeout) } case client := (<-c): { logger.Logf("%v: Serve got a connection from %v\n", hostname, client) } } sl.Stop() }() serveMux := http.NewServeMux() serveMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { logger.Logf("%v: Serve got a connection from %v\n", hostname, r.RemoteAddr) fmt.Fprintf(w, "%v", hostname) c <- r.RemoteAddr }) err = http.Serve(sl, serveMux) if err != nil && err.Error() == "Listener stopped" { err = nil } return err }
func HTTPGet(addr string) (string, error) { logger.Logf("Connecting to %v", addr) res, err := http.Get(fmt.Sprintf("%v", addr)) if err != nil { return "", err } text, err := ioutil.ReadAll(res.Body) res.Body.Close() if err != nil { return "", err } return string(text), nil }
func (ctx *RktRunCtx) Cleanup() { if ctx.mds != nil { ctx.mds.Process.Kill() ctx.mds.Wait() os.Remove("/run/rkt/metadata-svc.sock") } if err := ctx.cleanupChildren(); err != nil { logger.Logf("Error during child cleanup: %v", err) } ctx.RunGC() for _, d := range ctx.directories { d.cleanup() } }