...

Source file src/github.com/Microsoft/hcsshim/internal/cmd/diag.go

Documentation: github.com/Microsoft/hcsshim/internal/cmd

     1  //go:build windows
     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  // ExecInUvm is a helper function used to execute commands specified in `req` inside the given UVM.
    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  // ExecInShimHost is a helper function used to execute commands specified in `req` in the shim's
    42  // hosting system.
    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