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  }