From ed859c02439c2027d78d20cdb3e84a29f49ced99 Mon Sep 17 00:00:00 2001 From: knoflook Date: Fri, 3 Dec 2021 10:32:58 +0100 Subject: [PATCH] NOT WORKING: WIP on adding server-wide logs functionality --- cli/internal/validate.go | 29 +++++++++++ cli/server/logs.go | 101 +++++++++++++++++++++++++++++++++++++++ cli/server/server.go | 1 + 3 files changed, 131 insertions(+) create mode 100644 cli/server/logs.go diff --git a/cli/internal/validate.go b/cli/internal/validate.go index 7c5896ae2..dd2fce1cc 100644 --- a/cli/internal/validate.go +++ b/cli/internal/validate.go @@ -112,6 +112,35 @@ func ValidateApp(c *cli.Context) config.App { return app } +// ValidateAppByName ensures the app is valid and takes an app name as an argument, not context. +func ValidateAppByName(c *cli.Context, appName string) config.App { + if AppName != "" { + appName = AppName + logrus.Debugf("programmatically setting app name to %s", appName) + } + + if appName == "" { + ShowSubcommandHelpAndError(c, errors.New("no app provided")) + } + + app, err := app.Get(appName) + if err != nil { + logrus.Fatal(err) + } + + if err := recipe.EnsureExists(app.Type); err != nil { + logrus.Fatal(err) + } + + if err := ssh.EnsureHostKey(app.Server); err != nil { + logrus.Fatal(err) + } + + logrus.Debugf("validated '%s' as app argument", appName) + + return app +} + // ValidateDomain ensures the domain name arg is valid. func ValidateDomain(c *cli.Context) (string, error) { domainName := c.Args().First() diff --git a/cli/server/logs.go b/cli/server/logs.go new file mode 100644 index 000000000..48b1c9ade --- /dev/null +++ b/cli/server/logs.go @@ -0,0 +1,101 @@ +package server + +import ( + "fmt" + "io" + "os" + + "coopcloud.tech/abra/cli/internal" + "coopcloud.tech/abra/pkg/client" + "coopcloud.tech/abra/pkg/config" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/sirupsen/logrus" + "github.com/urfave/cli/v2" +) + +var Taillen string +var TaillenFlag = &cli.StringFlag{ + Name: "tail", + Aliases: []string{"t"}, + Value: "5", + Destination: &Taillen, + Usage: "change how many lines are shown", +} + +var serverLogsCommand = &cli.Command{ + Name: "logs", + Aliases: []string{"l"}, + ArgsUsage: "", + Usage: "show logs from all apps from server", + Flags: []cli.Flag{ + TaillenFlag, + internal.StderrFlag, + internal.StdoutFlag, + internal.HealthcheckFlag, + }, + Action: func(c *cli.Context) error { + serverName, err := internal.ValidateServer(c) + serviceName := "" + if !internal.Stderr && !internal.Stdout && !internal.Healthcheck { + internal.Stderr = true + internal.Stdout = true + internal.Healthcheck = true + } + + logrus.Debugf("flags parsed. --stderr: %t, --stdout: %t, --healthcheck: %t", internal.Stderr, internal.Stdout, internal.Healthcheck) + if err != nil { + logrus.Fatal(err) + } + appMap, err := config.LoadAppFiles(serverName) + if err != nil { + logrus.Fatal(err) + } + + logOpts := types.ContainerLogsOptions{ + Details: false, + Follow: false, + ShowStderr: internal.Stderr, + ShowStdout: internal.Stdout, + Tail: Taillen, + Timestamps: true, + } + + var appFiles []config.App + for appname, _ := range appMap { + app := internal.ValidateAppByName(c, appname) + appFiles = append(appFiles, app) + } + for _, app := range appFiles { + fmt.Println(app) + logrus.Debugf("checking logs for: %s", app.Name) + cl, err := client.New(app.Server) + if err != nil { + logrus.Fatal(err) + } + logrus.Debugf("tailing logs for all services") + filters := filters.NewArgs() + filters.Add("name", service) + serviceOpts := types.ServiceListOptions{Filters: filters} + services, err := cl.ServiceList(c.Context, serviceOpts) + if err != nil { + logrus.Fatal(err) + } + logs, err := cl.ServiceLogs(c.Context, services[0].ID, logOpts) + if err != nil { + logrus.Fatal(err) + } + logrus.Info(app.StackName()) + for { + _, err = io.Copy(os.Stdout, logs) + if err == io.EOF { + break + } else if err != nil { + logrus.Fatal(err) + } + } + logs.Close() + } + return nil + }, +} diff --git a/cli/server/server.go b/cli/server/server.go index c299e1d14..3a0c1e351 100644 --- a/cli/server/server.go +++ b/cli/server/server.go @@ -23,5 +23,6 @@ apps, see available flags on "server add" for more. serverAddCommand, serverListCommand, serverRemoveCommand, + serverLogsCommand, }, }