diff --git a/cmd/ctr/events.go b/cmd/ctr/events.go new file mode 100644 index 0000000..218b6d5 --- /dev/null +++ b/cmd/ctr/events.go @@ -0,0 +1,61 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + + "github.com/nats-io/go-nats" + "github.com/urfave/cli" +) + +var eventsCommand = cli.Command{ + Name: "events", + Usage: "display containerd events", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "subject, s", + Usage: "subjects filter", + Value: "containerd.>", + }, + }, + Action: func(context *cli.Context) error { + nc, err := nats.Connect(nats.DefaultURL) + if err != nil { + return err + } + nec, err := nats.NewEncodedConn(nc, nats.JSON_ENCODER) + if err != nil { + nc.Close() + return err + } + defer nec.Close() + + evCh := make(chan *nats.Msg, 64) + sub, err := nec.Subscribe(context.String("subject"), func(e *nats.Msg) { + evCh <- e + }) + if err != nil { + return err + } + defer sub.Unsubscribe() + + for { + e, more := <-evCh + if !more { + break + } + + var prettyJSON bytes.Buffer + + err := json.Indent(&prettyJSON, e.Data, "", "\t") + if err != nil { + fmt.Println(string(e.Data)) + } else { + fmt.Println(prettyJSON.String()) + } + } + + return nil + }, +} diff --git a/cmd/ctr/exec.go b/cmd/ctr/exec.go index be694ac..62833e8 100644 --- a/cmd/ctr/exec.go +++ b/cmd/ctr/exec.go @@ -18,6 +18,10 @@ var execCommand = cli.Command{ Name: "id, i", Usage: "target container id", }, + cli.StringFlag{ + Name: "pid, p", + Usage: "new process id", + }, cli.StringFlag{ Name: "cwd, c", Usage: "current working directory for the process", @@ -48,6 +52,7 @@ var execCommand = cli.Command{ sOpts := &execution.StartProcessRequest{ ContainerID: id, Process: &execution.Process{ + ID: context.String("pid"), Cwd: context.String("cwd"), Terminal: context.Bool("tty"), Args: context.Args(), diff --git a/cmd/ctr/main.go b/cmd/ctr/main.go index a880c72..a067932 100644 --- a/cmd/ctr/main.go +++ b/cmd/ctr/main.go @@ -36,6 +36,7 @@ containerd client app.Commands = []cli.Command{ runCommand, execCommand, + eventsCommand, } app.Before = func(context *cli.Context) error { if context.GlobalBool("debug") {