...
1
2
3 package cmd
4
5 import (
6 "context"
7 "errors"
8 "os/exec"
9
10 "github.com/Microsoft/hcsshim/internal/log"
11 "github.com/Microsoft/hcsshim/internal/logfields"
12 "github.com/Microsoft/hcsshim/internal/uvm"
13 )
14
15
16 func ExecInUvm(ctx context.Context, vm *uvm.UtilityVM, req *CmdProcessRequest) (int, error) {
17 if len(req.Args) == 0 {
18 return 0, errors.New("missing command")
19 }
20 np, err := NewNpipeIO(ctx, req.Stdin, req.Stdout, req.Stderr, req.Terminal, 0)
21 if err != nil {
22 return 0, err
23 }
24 defer np.Close(ctx)
25 cmd := CommandContext(ctx, vm, req.Args[0], req.Args[1:]...)
26 if req.Workdir != "" {
27 cmd.Spec.Cwd = req.Workdir
28 }
29 if vm.OS() == "windows" {
30 cmd.Spec.User.Username = `NT AUTHORITY\SYSTEM`
31 }
32 cmd.Spec.Terminal = req.Terminal
33 cmd.Stdin = np.Stdin()
34 cmd.Stdout = np.Stdout()
35 cmd.Stderr = np.Stderr()
36 cmd.Log = log.G(ctx).WithField(logfields.UVMID, vm.ID())
37 err = cmd.Run()
38 return cmd.ExitState.ExitCode(), err
39 }
40
41
42
43 func ExecInShimHost(ctx context.Context, req *CmdProcessRequest) (int, error) {
44 if len(req.Args) == 0 {
45 return 0, errors.New("missing command")
46 }
47 cmdArgsWithoutName := []string{""}
48 if len(req.Args) > 1 {
49 cmdArgsWithoutName = req.Args[1:]
50 }
51 np, err := NewNpipeIO(ctx, req.Stdin, req.Stdout, req.Stderr, req.Terminal, 0)
52 if err != nil {
53 return 0, err
54 }
55 defer np.Close(ctx)
56 cmd := exec.Command(req.Args[0], cmdArgsWithoutName...)
57 cmd.Stdin = np.Stdin()
58 cmd.Stdout = np.Stdout()
59 cmd.Stderr = np.Stderr()
60 err = cmd.Run()
61 if err != nil {
62 if exiterr, ok := err.(*exec.ExitError); ok {
63 return exiterr.ExitCode(), exiterr
64 }
65 return -1, err
66 }
67 return 0, nil
68 }
69
View as plain text