| // +build !windows | |
| package main | |
| import ( | |
| "encoding/json" | |
| "path/filepath" | |
| "github.com/containerd/containerd/api/services/execution" | |
| protobuf "github.com/gogo/protobuf/types" | |
| specs "github.com/opencontainers/runtime-spec/specs-go" | |
| "github.com/urfave/cli" | |
| ) | |
| func createProcessSpec(args []string, cwd string, tty bool) specs.Process { | |
| env := []string{ | |
| "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", | |
| } | |
| if tty { | |
| env = append(env, "TERM=xterm") | |
| } | |
| if cwd == "" { | |
| cwd = "/" | |
| } | |
| return specs.Process{ | |
| Args: args, | |
| Env: env, | |
| Terminal: tty, | |
| Cwd: cwd, | |
| NoNewPrivileges: true, | |
| User: specs.User{ | |
| UID: 0, | |
| GID: 0, | |
| }, | |
| Capabilities: &specs.LinuxCapabilities{ | |
| Bounding: capabilities, | |
| Permitted: capabilities, | |
| Inheritable: capabilities, | |
| Effective: capabilities, | |
| Ambient: capabilities, | |
| }, | |
| Rlimits: []specs.LinuxRlimit{ | |
| { | |
| Type: "RLIMIT_NOFILE", | |
| Hard: uint64(1024), | |
| Soft: uint64(1024), | |
| }, | |
| }, | |
| } | |
| } | |
| func newExecRequest(context *cli.Context, tmpDir, id string) (*execution.ExecRequest, error) { | |
| process := createProcessSpec(context.Args(), context.String("cwd"), context.Bool("tty")) | |
| data, err := json.Marshal(process) | |
| if err != nil { | |
| return nil, err | |
| } | |
| return &execution.ExecRequest{ | |
| ID: id, | |
| Spec: &protobuf.Any{ | |
| TypeUrl: specs.Version, | |
| Value: data, | |
| }, | |
| Terminal: context.Bool("tty"), | |
| Stdin: filepath.Join(tmpDir, "stdin"), | |
| Stdout: filepath.Join(tmpDir, "stdout"), | |
| Stderr: filepath.Join(tmpDir, "stderr"), | |
| }, nil | |
| } |