From 15c5b67917d758560e5e71bbffce4b5a9a826dba Mon Sep 17 00:00:00 2001 From: Sam Burba Date: Tue, 11 Feb 2025 15:30:47 -0800 Subject: [PATCH 1/3] add support for get disk serial number on darwin --- disk/disk_darwin.go | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/disk/disk_darwin.go b/disk/disk_darwin.go index 94f10b9..9f90b0c 100644 --- a/disk/disk_darwin.go +++ b/disk/disk_darwin.go @@ -5,8 +5,11 @@ package disk import ( "context" + "encoding/json" "errors" "fmt" + "os/exec" + "strings" "unsafe" "golang.org/x/sys/unix" @@ -88,8 +91,60 @@ func getFsType(stat unix.Statfs_t) string { return common.ByteToString(stat.Fstypename[:]) } +type SPNVMeDataTypeItem struct { + Name string `json:"_name"` + BsdName string `json:"bsd_name"` + DetachableDrive string `json:"detachable_drive"` + DeviceModel string `json:"device_model"` + DeviceRevision string `json:"device_revision"` + DeviceSerial string `json:"device_serial"` + PartitionMapType string `json:"partition_map_type"` + RemovableMedia string `json:"removable_media"` + Size string `json:"size"` + SizeInBytes int64 `json:"size_in_bytes"` + SmartStatus string `json:"smart_status"` + SpnvmeTrimSupport string `json:"spnvme_trim_support"` + Volumes []struct { + Name string `json:"_name"` + BsdName string `json:"bsd_name"` + Iocontent string `json:"iocontent"` + Size string `json:"size"` + SizeInBytes int `json:"size_in_bytes"` + } `json:"volumes"` +} + func SerialNumberWithContext(ctx context.Context, name string) (string, error) { - return "", common.ErrNotImplementedError + cmd := exec.Command("system_profiler", "SPNVMeDataType", "-json") + + output, err := cmd.Output() + if err != nil { + return "", err + } + + var temp struct { + SPNVMeDataType []struct { + Items []SPNVMeDataTypeItem `json:"_items"` + } `json:"SPNVMeDataType"` + } + + err = json.Unmarshal(output, &temp) + if err != nil { + return "", fmt.Errorf("failed to unmarshal JSON: %w", err) + } + + // Extract all serial numbers into a single string + var serialNumbers []string + for _, data := range temp.SPNVMeDataType { + for _, item := range data.Items { + serialNumbers = append(serialNumbers, item.DeviceSerial) + } + } + + if len(serialNumbers) == 0 { + return "", fmt.Errorf("no serial numbers found") + } + + return strings.Join(serialNumbers, ", "), nil } func LabelWithContext(ctx context.Context, name string) (string, error) { From 9fc28f2f22404b672b07875380d8b2e33cfa10ce Mon Sep 17 00:00:00 2001 From: Sam Burba Date: Sat, 1 Mar 2025 00:04:08 -0800 Subject: [PATCH 2/3] Refactor: Improve formatting, update struct naming, and optimize JSON parsing. a --- disk/disk_darwin.go | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/disk/disk_darwin.go b/disk/disk_darwin.go index 9f90b0c..ff66063 100644 --- a/disk/disk_darwin.go +++ b/disk/disk_darwin.go @@ -8,7 +8,6 @@ import ( "encoding/json" "errors" "fmt" - "os/exec" "strings" "unsafe" @@ -91,7 +90,7 @@ func getFsType(stat unix.Statfs_t) string { return common.ByteToString(stat.Fstypename[:]) } -type SPNVMeDataTypeItem struct { +type spnvmeDataTypeItem struct { Name string `json:"_name"` BsdName string `json:"bsd_name"` DetachableDrive string `json:"detachable_drive"` @@ -113,29 +112,27 @@ type SPNVMeDataTypeItem struct { } `json:"volumes"` } -func SerialNumberWithContext(ctx context.Context, name string) (string, error) { - cmd := exec.Command("system_profiler", "SPNVMeDataType", "-json") +type spnvmeDataWrapper struct { + SPNVMeDataType []struct { + Items []spnvmeDataTypeItem `json:"_items"` + } `json:"SPNVMeDataType"` +} - output, err := cmd.Output() +func SerialNumberWithContext(ctx context.Context, name string) (string, error) { + output, err := invoke.CommandWithContext(ctx, "system_profiler", "SPNVMeDataType", "-json") if err != nil { return "", err } - var temp struct { - SPNVMeDataType []struct { - Items []SPNVMeDataTypeItem `json:"_items"` - } `json:"SPNVMeDataType"` - } - - err = json.Unmarshal(output, &temp) - if err != nil { + var data spnvmeDataWrapper + if err := json.Unmarshal(output, &data); err != nil { return "", fmt.Errorf("failed to unmarshal JSON: %w", err) } // Extract all serial numbers into a single string var serialNumbers []string - for _, data := range temp.SPNVMeDataType { - for _, item := range data.Items { + for _, spnvmeData := range data.SPNVMeDataType { + for _, item := range spnvmeData.Items { serialNumbers = append(serialNumbers, item.DeviceSerial) } } From 6d4c8e567ef3ade074e958253eb446b72402dc2f Mon Sep 17 00:00:00 2001 From: shirou Date: Sat, 29 Mar 2025 13:46:28 +0900 Subject: [PATCH 3/3] [disk][darwin]:rename unused parameter in function to fix lint --- disk/disk_darwin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/disk/disk_darwin.go b/disk/disk_darwin.go index 0446de9..04d1564 100644 --- a/disk/disk_darwin.go +++ b/disk/disk_darwin.go @@ -118,7 +118,7 @@ type spnvmeDataWrapper struct { } `json:"SPNVMeDataType"` } -func SerialNumberWithContext(ctx context.Context, name string) (string, error) { +func SerialNumberWithContext(ctx context.Context, _ string) (string, error) { output, err := invoke.CommandWithContext(ctx, "system_profiler", "SPNVMeDataType", "-json") if err != nil { return "", err