forked from toolshed/abra
102 lines
2.4 KiB
Go
102 lines
2.4 KiB
Go
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: "<server>",
|
|
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
|
|
},
|
|
}
|