github.com/devcamcar/cli@v0.0.0-20181107134215-706a05759d18/objects/server/server.go (about)

     1  package server
     2  
     3  import (
     4  	"log"
     5  	"os"
     6  	"os/exec"
     7  	"os/signal"
     8  	"syscall"
     9  
    10  	"github.com/fnproject/cli/common"
    11  	"github.com/urfave/cli"
    12  )
    13  
    14  func update(c *cli.Context) error {
    15  	args := []string{"pull",
    16  		common.FunctionsDockerImage,
    17  	}
    18  	cmd := exec.Command("docker", args...)
    19  	cmd.Stdout = os.Stdout
    20  	cmd.Stderr = os.Stderr
    21  	err := cmd.Start()
    22  	if err != nil {
    23  		log.Fatalln("Starting command failed:", err)
    24  	}
    25  
    26  	done := make(chan error, 1)
    27  	go func() {
    28  		done <- cmd.Wait()
    29  	}()
    30  	// catch ctrl-c and kill
    31  	sigC := make(chan os.Signal, 2)
    32  	signal.Notify(sigC, os.Interrupt, syscall.SIGTERM)
    33  	select {
    34  	case <-sigC:
    35  		log.Println("Interrupt caught, exiting")
    36  		err = cmd.Process.Kill()
    37  		if err != nil {
    38  			log.Println("Error: could not kill process")
    39  		}
    40  	case err := <-done:
    41  		if err != nil {
    42  			log.Println("Processed finished with error:", err)
    43  		} else {
    44  			log.Println("Process finished gracefully")
    45  		}
    46  	}
    47  	return nil
    48  }