github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/utils/scriptrunner/scriptrunner.go (about)

     1  // Copyright 2017 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package scriptrunner
     5  
     6  import (
     7  	"time"
     8  
     9  	"github.com/juju/clock"
    10  	"github.com/juju/errors"
    11  	"github.com/juju/utils/exec"
    12  )
    13  
    14  type ScriptResult struct {
    15  	Stdout []byte
    16  	Stderr []byte
    17  	Code   int
    18  }
    19  
    20  func RunCommand(command string, environ []string, clock clock.Clock, timeout time.Duration) (*ScriptResult, error) {
    21  	cmd := exec.RunParams{
    22  		Commands:    command,
    23  		Environment: environ,
    24  		Clock:       clock,
    25  	}
    26  
    27  	err := cmd.Run()
    28  	if err != nil {
    29  		return nil, errors.Trace(err)
    30  	}
    31  
    32  	var cancel chan struct{}
    33  
    34  	if timeout != 0 {
    35  		cancel = make(chan struct{})
    36  		go func() {
    37  			<-clock.After(timeout)
    38  			close(cancel)
    39  		}()
    40  	}
    41  
    42  	result, err := cmd.WaitWithCancel(cancel)
    43  
    44  	if err != nil {
    45  		err = errors.Trace(err)
    46  	}
    47  
    48  	return &ScriptResult{
    49  		Stdout: result.Stdout,
    50  		Stderr: result.Stderr,
    51  		Code:   result.Code,
    52  	}, err
    53  }