diff --git a/zfs/pool.go b/zfs/pool.go index 5871b24..a985c3d 100644 --- a/zfs/pool.go +++ b/zfs/pool.go @@ -2,6 +2,8 @@ package zfs import ( "bufio" + "fmt" + "io" "os/exec" "strings" ) @@ -68,17 +70,23 @@ func poolNames() ([]string, error) { if err != nil { return nil, err } + stderr, err := cmd.StderrPipe() + if err != nil { + return nil, err + } scanner := bufio.NewScanner(out) if err = cmd.Start(); err != nil { - return nil, err + return nil, fmt.Errorf("Failed to start command '%s': %w", cmd.String(), err) } for scanner.Scan() { pools = append(pools, scanner.Text()) } + + stde, _ := io.ReadAll(stderr) if err = cmd.Wait(); err != nil { - return nil, err + return nil, fmt.Errorf("Failed to execute command '%s'; output: '%s' (%w)", cmd.String(), strings.TrimSpace(string(stde)), err) } return pools, nil diff --git a/zfs/zfs.go b/zfs/zfs.go index c270364..1d93fef 100644 --- a/zfs/zfs.go +++ b/zfs/zfs.go @@ -3,8 +3,10 @@ package zfs import ( "encoding/csv" "errors" + "fmt" "io" "os/exec" + "strings" ) var ( @@ -69,6 +71,11 @@ func execute(pool string, h handler, cmd string, args ...string) error { return err } + stderr, err := c.StderrPipe() + if err != nil { + return err + } + r := csv.NewReader(out) r.Comma = '\t' r.LazyQuotes = true @@ -76,7 +83,7 @@ func execute(pool string, h handler, cmd string, args ...string) error { r.FieldsPerRecord = 3 if err = c.Start(); err != nil { - return err + return fmt.Errorf("Failed to start command '%s': %w", c.String(), err) } for { @@ -92,7 +99,11 @@ func execute(pool string, h handler, cmd string, args ...string) error { } } - return c.Wait() + stde, _ := io.ReadAll(stderr) + if err = c.Wait(); err != nil { + return fmt.Errorf("Failed to execute command '%s'; output: '%s' (%w)", c.String(), strings.TrimSpace(string(stde)), err) + } + return nil } // New instantiates a ZFS Client