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 }, }