diff --git a/errors.go b/errors.go index c5313c7..c385003 100644 --- a/errors.go +++ b/errors.go @@ -11,4 +11,7 @@ var ( // ErrExecTimeout means that the provided context was done before the command finished execution. ErrExecTimeout = errors.New("command timed out") + + // ErrInsufficientPermissions means the calling executable was invoked without enough permissions to run the selected command + ErrInsufficientPermissions = errors.New("insufficient permissions for action") ) diff --git a/systemctl.go b/systemctl.go index 4d54196..4667aa2 100644 --- a/systemctl.go +++ b/systemctl.go @@ -2,6 +2,7 @@ package systemctl // TODO func IsFailed(unit string) (bool, error) { + return false, nil } diff --git a/util.go b/util.go new file mode 100644 index 0000000..960742d --- /dev/null +++ b/util.go @@ -0,0 +1,40 @@ +package systemctl + +import ( + "bytes" + "context" + "os/exec" +) + +var systemctl string + +const killed = 130 + +func init() { + path, err := exec.LookPath("systemctl") + if err != nil { + panic(ErrNotInstalled) + } + systemctl = path +} + +func execute(ctx context.Context, args []string) (string, string, int, error) { + var ( + err error + stderr bytes.Buffer + stdout bytes.Buffer + code int + output string + warnings string + ) + + cmd := exec.CommandContext(ctx, systemctl, args...) + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err = cmd.Run() + output = stdout.String() + warnings = stderr.String() + code = cmd.ProcessState.ExitCode() + + return output, warnings, code, err +}