diff --git a/Makefile b/Makefile index 7bf3500..9b22c42 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ BINARY=nasctl -VERSION?=0.7.1 +VERSION?=0.7.2 GO?=go LDFLAGS=-s -w -X github.com/darroyo/nasctl/internal/web.Version=$(VERSION) -X github.com/darroyo/nasctl/internal/web.Commit=$(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) BUILD_FLAGS=CGO_ENABLED=0 diff --git a/internal/storage/capabilities.go b/internal/storage/capabilities.go index 99dfa8e..04e6215 100644 --- a/internal/storage/capabilities.go +++ b/internal/storage/capabilities.go @@ -2,6 +2,7 @@ package storage import ( "context" + "os/exec" "github.com/darroyo/nasctl/internal/db" "github.com/darroyo/nasctl/internal/system" @@ -15,17 +16,17 @@ type Capabilities struct { } func Probe(ctx context.Context) (Capabilities, error) { - rsyncOut, _, _ := system.Run(ctx, "command", "-v", "rsync") - snapraidOut, _, _ := system.Run(ctx, "command", "-v", "snapraid") - mergerfsOut, _, _ := system.Run(ctx, "command", "-v", "mergerfs") + _, rsyncErr := exec.LookPath("rsync") + _, snapraidErr := exec.LookPath("snapraid") + _, mergerfsErr := exec.LookPath("mergerfs") _, _, mergerfsMountedErr := system.Run(ctx, "grep", "-q", "fuse.mergerfs", "/proc/mounts") return Capabilities{ - Rsync: len(rsyncOut) > 0, - MergerfsBin: len(mergerfsOut) > 0, + Rsync: rsyncErr == nil, + MergerfsBin: mergerfsErr == nil, MergerfsMounted: mergerfsMountedErr == nil, - SnapraidBin: len(snapraidOut) > 0, + SnapraidBin: snapraidErr == nil, }, nil } diff --git a/internal/storage/capabilities_test.go b/internal/storage/capabilities_test.go new file mode 100644 index 0000000..6b10f19 --- /dev/null +++ b/internal/storage/capabilities_test.go @@ -0,0 +1,49 @@ +package storage + +import ( + "context" + "os/exec" + "testing" +) + +func TestProbeDetectsRsync(t *testing.T) { + caps, err := Probe(context.Background()) + if err != nil { + t.Fatalf("Probe: %v", err) + } + _, rsyncErr := exec.LookPath("rsync") + if rsyncErr != nil && caps.Rsync { + t.Error("Probe claims rsync is available but exec.LookPath says it is not") + } + if rsyncErr == nil && !caps.Rsync { + t.Error("exec.LookPath found rsync but Probe did not detect it") + } +} + +func TestProbeDetectsSnapraid(t *testing.T) { + caps, err := Probe(context.Background()) + if err != nil { + t.Fatalf("Probe: %v", err) + } + _, snapraidErr := exec.LookPath("snapraid") + if snapraidErr != nil && caps.SnapraidBin { + t.Error("Probe claims snapraid is available but exec.LookPath says it is not") + } + if snapraidErr == nil && !caps.SnapraidBin { + t.Error("exec.LookPath found snapraid but Probe did not detect it") + } +} + +func TestProbeDetectsMergerfsBin(t *testing.T) { + caps, err := Probe(context.Background()) + if err != nil { + t.Fatalf("Probe: %v", err) + } + _, mergerfsErr := exec.LookPath("mergerfs") + if mergerfsErr != nil && caps.MergerfsBin { + t.Error("Probe claims mergerfs is available but exec.LookPath says it is not") + } + if mergerfsErr == nil && !caps.MergerfsBin { + t.Error("exec.LookPath found mergerfs but Probe did not detect it") + } +}