04e96d05fc
When a user enters a CLI with a StringFlags or StringSliceFlags and does not add a value the CLI mistakently takes the next option and uses it as a value. This usually ends up with an error like not enough options or others. Some times it could also succeed, with weird results. This patch looks for any values that begin with a "-" and return an error. Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
92 lines
2.3 KiB
Go
92 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/kubernetes-incubator/cri-o/libkpod"
|
|
"github.com/pkg/errors"
|
|
"github.com/urfave/cli"
|
|
)
|
|
|
|
var (
|
|
logsFlags = []cli.Flag{
|
|
cli.BoolFlag{
|
|
Name: "details",
|
|
Usage: "Show extra details provided to the logs",
|
|
Hidden: true,
|
|
},
|
|
cli.BoolFlag{
|
|
Name: "follow, f",
|
|
Usage: "Follow log output. The default is false",
|
|
},
|
|
cli.StringFlag{
|
|
Name: "since",
|
|
Usage: "Show logs since TIMESTAMP",
|
|
},
|
|
cli.Uint64Flag{
|
|
Name: "tail",
|
|
Usage: "Output the specified number of LINES at the end of the logs. Defaults to 0, which prints all lines",
|
|
},
|
|
}
|
|
logsDescription = "The kpod logs command batch-retrieves whatever logs are present for a container at the time of execution. This does not guarantee execution" +
|
|
"order when combined with kpod run (i.e. your run may not have generated any logs at the time you execute kpod logs"
|
|
logsCommand = cli.Command{
|
|
Name: "logs",
|
|
Usage: "Fetch the logs of a container",
|
|
Description: logsDescription,
|
|
Flags: logsFlags,
|
|
Action: logsCmd,
|
|
ArgsUsage: "CONTAINER",
|
|
}
|
|
)
|
|
|
|
func logsCmd(c *cli.Context) error {
|
|
args := c.Args()
|
|
if len(args) != 1 {
|
|
return errors.Errorf("'kpod logs' requires exactly one container name/ID")
|
|
}
|
|
if err := validateFlags(c, logsFlags); err != nil {
|
|
return err
|
|
}
|
|
container := c.Args().First()
|
|
var opts libkpod.LogOptions
|
|
opts.Details = c.Bool("details")
|
|
opts.Follow = c.Bool("follow")
|
|
opts.SinceTime = time.Time{}
|
|
if c.IsSet("since") {
|
|
// parse time, error out if something is wrong
|
|
since, err := time.Parse("2006-01-02T15:04:05.999999999-07:00", c.String("since"))
|
|
if err != nil {
|
|
return errors.Wrapf(err, "could not parse time: %q", c.String("since"))
|
|
}
|
|
opts.SinceTime = since
|
|
}
|
|
opts.Tail = c.Uint64("tail")
|
|
|
|
config, err := getConfig(c)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "could not get config")
|
|
}
|
|
server, err := libkpod.New(config)
|
|
if err != nil {
|
|
return errors.Wrapf(err, "could not create container server")
|
|
}
|
|
defer server.Shutdown()
|
|
err = server.Update()
|
|
if err != nil {
|
|
return errors.Wrapf(err, "could not update list of containers")
|
|
}
|
|
logs := make(chan string)
|
|
go func() {
|
|
err = server.GetLogs(container, logs, opts)
|
|
}()
|
|
printLogs(logs)
|
|
return err
|
|
}
|
|
|
|
func printLogs(logs chan string) {
|
|
for line := range logs {
|
|
fmt.Println(line)
|
|
}
|
|
}
|