diff --git a/cmd/control/cli.go b/cmd/control/cli.go index b3b92192..6b57c832 100644 --- a/cmd/control/cli.go +++ b/cmd/control/cli.go @@ -1,6 +1,7 @@ package control import ( + "fmt" "os" "github.com/codegangsta/cli" @@ -14,7 +15,7 @@ func Main() { app := cli.NewApp() app.Name = os.Args[0] - app.Usage = "Control and configure RancherOS" + app.Usage = fmt.Sprintf("Control and configure RancherOS\nbuilt: %s", config.BuildDate) app.Version = config.Version app.Author = "Rancher Labs, Inc." app.EnableBashCompletion = true diff --git a/cmd/control/selinux.go b/cmd/control/selinux.go index 37328441..a3bfa4f8 100644 --- a/cmd/control/selinux.go +++ b/cmd/control/selinux.go @@ -11,7 +11,6 @@ import ( func selinuxCommand() cli.Command { app := cli.Command{} app.Name = "selinux" - app.Usage = "Launch SELinux tools container." app.Action = func(c *cli.Context) error { argv := []string{"system-docker", "run", "-it", "--privileged", "--rm", "--net", "host", "--pid", "host", "--ipc", "host", diff --git a/cmd/control/service/service.go b/cmd/control/service/service.go index 3915dd8b..a7d5f83d 100644 --- a/cmd/control/service/service.go +++ b/cmd/control/service/service.go @@ -36,7 +36,6 @@ func Commands() cli.Command { app := cli.Command{} app.Name = "service" app.ShortName = "s" - app.Usage = "Command line interface for services and compose." app.Before = beforeApp app.Flags = append(dockerApp.DockerClientFlags(), cli.BoolFlag{ Name: "verbose,debug", diff --git a/cmd/power/power.go b/cmd/power/power.go index 560e0e07..9882bbb7 100644 --- a/cmd/power/power.go +++ b/cmd/power/power.go @@ -196,15 +196,21 @@ func shutDownContainers() error { } var stopErrorStrings []string + consoleContainerIdx := -1 - for _, container := range containers { + for idx, container := range containers { if container.ID == currentContainerID { continue } + if container.Names[0] == "/console" { + consoleContainerIdx = idx + continue + } - log.Infof("Stopping %s : %v", container.ID[:12], container.Names) + log.Infof("Stopping %s : %s", container.Names[0], container.ID[:12]) stopErr := client.ContainerStop(context.Background(), container.ID, timeout) if stopErr != nil { + log.Errorf("------- Error Stopping %s : %s", container.Names[0], stopErr.Error()) stopErrorStrings = append(stopErrorStrings, " ["+container.ID+"] "+stopErr.Error()) } } @@ -215,8 +221,31 @@ func shutDownContainers() error { if container.ID == currentContainerID { continue } + if container.Names[0] == "/console" { + continue + } + log.Infof("Waiting %s : %s", container.Names[0], container.ID[:12]) _, waitErr := client.ContainerWait(context.Background(), container.ID) if waitErr != nil { + log.Errorf("------- Error Waiting %s : %s", container.Names[0], waitErr.Error()) + waitErrorStrings = append(waitErrorStrings, " ["+container.ID+"] "+waitErr.Error()) + } + } + + // and now stop the console + if consoleContainerIdx != -1 { + container := containers[consoleContainerIdx] + log.Infof("Console Stopping %v : %s", container.Names, container.ID[:12]) + stopErr := client.ContainerStop(context.Background(), container.ID, timeout) + if stopErr != nil { + log.Errorf("------- Error Stopping %v : %s", container.Names, stopErr.Error()) + stopErrorStrings = append(stopErrorStrings, " ["+container.ID+"] "+stopErr.Error()) + } + + log.Infof("Console Waiting %v : %s", container.Names, container.ID[:12]) + _, waitErr := client.ContainerWait(context.Background(), container.ID) + if waitErr != nil { + log.Errorf("------- Error Waiting %v : %s", container.Names, waitErr.Error()) waitErrorStrings = append(waitErrorStrings, " ["+container.ID+"] "+waitErr.Error()) } } diff --git a/cmd/power/shutdown.go b/cmd/power/shutdown.go index 23a07019..3c72406d 100644 --- a/cmd/power/shutdown.go +++ b/cmd/power/shutdown.go @@ -28,7 +28,7 @@ func Shutdown() { app := cli.NewApp() app.Name = os.Args[0] - app.Usage = "Control and configure RancherOS" + app.Usage = fmt.Sprintf("%s RancherOS\nbuilt: %s", app.Name, config.BuildDate) app.Version = config.Version app.Author = "Rancher Labs, Inc." app.EnableBashCompletion = true @@ -136,6 +136,11 @@ func Shutdown() { }) } //TODO: add the time and msg flags... + app.HideHelp = true + + log.Infof("%s, %s", app.Usage, app.Version) + fmt.Printf("%s, %s", app.Usage, app.Version) + app.Run(os.Args) } diff --git a/cmd/respawn/respawn.go b/cmd/respawn/respawn.go index ee504af5..2ef47b08 100644 --- a/cmd/respawn/respawn.go +++ b/cmd/respawn/respawn.go @@ -1,6 +1,7 @@ package respawn import ( + "fmt" "io" "io/ioutil" "os" @@ -13,6 +14,7 @@ import ( "time" "github.com/codegangsta/cli" + "github.com/rancher/os/config" "github.com/rancher/os/log" ) @@ -28,6 +30,11 @@ func Main() { runtime.LockOSThread() app := cli.NewApp() + app.Name = os.Args[0] + app.Usage = fmt.Sprintf("%s RancherOS\nbuilt: %s", app.Name, config.BuildDate) + app.Version = config.Version + app.Author = "Rancher Labs, Inc." + app.Flags = []cli.Flag{ cli.StringFlag{ Name: "file, f", @@ -36,6 +43,9 @@ func Main() { } app.Action = run + log.Infof("%s, %s", app.Usage, app.Version) + fmt.Printf("%s, %s", app.Usage, app.Version) + app.Run(os.Args) } @@ -69,17 +79,21 @@ func run(c *cli.Context) error { panic(err) } - var wg sync.WaitGroup + lines := strings.Split(string(input), "\n") + doneChannel := make(chan string, len(lines)) - for _, line := range strings.Split(string(input), "\n") { + for _, line := range lines { if strings.TrimSpace(line) == "" || strings.Index(strings.TrimSpace(line), "#") == 0 { continue } - wg.Add(1) - go execute(line, &wg) + go execute(line, doneChannel) } - wg.Wait() + for i := 0; i < len(lines); i++ { + line := <-doneChannel + log.Infof("FINISHED: %s", line) + fmt.Printf("FINISHED: %s", line) + } return nil } @@ -101,19 +115,20 @@ func termPids() { defer processLock.Unlock() for _, process := range processes { + log.Infof("sending SIGTERM to %d", process.Pid) process.Signal(syscall.SIGTERM) } } -func execute(line string, wg *sync.WaitGroup) { - defer wg.Done() +func execute(line string, doneChannel chan string) { + defer func() { doneChannel <- line }() start := time.Now() count := 0 - for { - args := strings.Split(line, " ") + args := strings.Split(line, " ") + for { cmd := exec.Command(args[0], args[1:]...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr diff --git a/config/types.go b/config/types.go index c463136f..6ff50a19 100755 --- a/config/types.go +++ b/config/types.go @@ -51,6 +51,7 @@ const ( var ( OemConfigFile = OEM + "/oem-config.yml" Version string + BuildDate string Arch string Suffix string OsRepo string diff --git a/scripts/build-target b/scripts/build-target index b7e9d3fe..34524caa 100755 --- a/scripts/build-target +++ b/scripts/build-target @@ -14,6 +14,7 @@ fi OUTPUT=${OUTPUT:-bin/ros} echo Building $OUTPUT +BUILDDATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') -CONST="-X github.com/docker/docker/dockerversion.GitCommit=${COMMIT} -X github.com/docker/docker/dockerversion.Version=${DOCKER_PATCH_VERSION} -X github.com/docker/docker/dockerversion.BuildTime=$(date -u +'%Y-%m-%dT%H:%M:%SZ') -X github.com/docker/docker/dockerversion.IAmStatic=true -X github.com/rancher/os/config.Version=${VERSION} -X github.com/rancher/os/config.OsRepo=${OS_REPO}" +CONST="-X github.com/docker/docker/dockerversion.GitCommit=${COMMIT} -X github.com/docker/docker/dockerversion.Version=${DOCKER_PATCH_VERSION} -X github.com/docker/docker/dockerversion.BuildTime='${BUILDDATE}' -X github.com/docker/docker/dockerversion.IAmStatic=true -X github.com/rancher/os/config.Version=${VERSION} -X github.com/rancher/os/config.OsRepo=${OS_REPO} -X github.com/rancher/os/config.BuildDate='${BUILDDATE}'" go build -tags "selinux cgo daemon netgo dnspatch" -installsuffix netgo -ldflags "$CONST -linkmode external -extldflags -static -s -w" -o ${OUTPUT}