diff --git a/cli/cli.go b/cli/cli.go index 97a20b1d1..e3ef2067a 100644 --- a/cli/cli.go +++ b/cli/cli.go @@ -55,6 +55,7 @@ func RunApp(version, commit string) { server.ServerCommand, recipe.RecipeCommand, VersionCommand, + UpgradeCommand, }, Flags: []cli.Flag{ VerboseFlag, diff --git a/cli/internal/command.go b/cli/internal/command.go new file mode 100644 index 000000000..70924c7ea --- /dev/null +++ b/cli/internal/command.go @@ -0,0 +1,38 @@ +package internal + +import ( + "bufio" + "fmt" + "os/exec" +) + +func RunCmd(cmd *exec.Cmd) error { + r, err := cmd.StdoutPipe() + if err != nil { + return err + } + + cmd.Stderr = cmd.Stdout + done := make(chan struct{}) + scanner := bufio.NewScanner(r) + + go func() { + for scanner.Scan() { + line := scanner.Text() + fmt.Println(line) + } + done <- struct{}{} + }() + + if err := cmd.Start(); err != nil { + return err + } + + <-done + + if err := cmd.Wait(); err != nil { + return err + } + + return nil +} diff --git a/cli/upgrade.go b/cli/upgrade.go new file mode 100644 index 000000000..c43b0e451 --- /dev/null +++ b/cli/upgrade.go @@ -0,0 +1,22 @@ +package cli + +import ( + "os/exec" + + "coopcloud.tech/abra/cli/internal" + "github.com/sirupsen/logrus" + "github.com/urfave/cli/v2" +) + +// UpgradeCommand upgrades abra in-place. +var UpgradeCommand = &cli.Command{ + Name: "upgrade", + Usage: "Upgrade abra", + Action: func(c *cli.Context) error { + cmd := exec.Command("bash", "-c", "curl -s https://install.abra.coopcloud.tech | bash") + if err := internal.RunCmd(cmd); err != nil { + logrus.Fatal(err) + } + return nil + }, +}