github.com/tonto/cli@v0.0.0-20180104210444-aec958fa47db/update.go (about) 1 package main 2 3 import ( 4 "log" 5 "os" 6 "os/exec" 7 "os/signal" 8 "syscall" 9 10 "github.com/urfave/cli" 11 ) 12 13 func updateCmd() cli.Command { 14 return cli.Command{ 15 Name: "update", 16 Usage: "pulls latest functions server", 17 Action: update, 18 } 19 } 20 21 func update(c *cli.Context) error { 22 args := []string{"pull", 23 functionsDockerImage, 24 } 25 cmd := exec.Command("docker", args...) 26 cmd.Stdout = os.Stdout 27 cmd.Stderr = os.Stderr 28 err := cmd.Start() 29 if err != nil { 30 log.Fatalln("starting command failed:", err) 31 } 32 33 done := make(chan error, 1) 34 go func() { 35 done <- cmd.Wait() 36 }() 37 // catch ctrl-c and kill 38 sigC := make(chan os.Signal, 2) 39 signal.Notify(sigC, os.Interrupt, syscall.SIGTERM) 40 select { 41 case <-sigC: 42 log.Println("interrupt caught, exiting") 43 err = cmd.Process.Kill() 44 if err != nil { 45 log.Println("error: could not kill process") 46 } 47 case err := <-done: 48 if err != nil { 49 log.Println("processed finished with error:", err) 50 } else { 51 log.Println("process finished gracefully") 52 } 53 } 54 return nil 55 }