2024-01-20 00:21:59 +02:00
|
|
|
package hardware
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bufio"
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
|
|
|
"os/exec"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2024-01-20 01:27:10 +02:00
|
|
|
func GetSystemHardDrives() ([]*HardDrive, error) {
|
2024-01-20 00:21:59 +02:00
|
|
|
|
|
|
|
// Execute the lsblk command to get detailed block device information
|
|
|
|
cmd := exec.Command("lsblk", "-d", "-o", "NAME,TRAN,SIZE,MODEL,SERIAL,TYPE")
|
|
|
|
var out bytes.Buffer
|
|
|
|
cmd.Stdout = &out
|
|
|
|
err := cmd.Run()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Failed to execute command:", err)
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
2024-01-20 01:27:10 +02:00
|
|
|
var hardDrives []*HardDrive
|
2024-01-20 00:21:59 +02:00
|
|
|
|
|
|
|
// Scan the output line by line
|
|
|
|
scanner := bufio.NewScanner(&out)
|
|
|
|
for scanner.Scan() {
|
|
|
|
line := scanner.Text()
|
|
|
|
|
|
|
|
// Skip the header line
|
|
|
|
if strings.Contains(line, "NAME") {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// Split the line into columns
|
|
|
|
cols := strings.Fields(line)
|
|
|
|
if len(cols) < 6 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// Filter out nvme drives (M.2)
|
|
|
|
if cols[1] != "nvme" {
|
2024-01-20 01:27:10 +02:00
|
|
|
hd := &HardDrive{
|
2024-01-20 00:21:59 +02:00
|
|
|
Name: cols[0],
|
|
|
|
Transport: cols[1],
|
|
|
|
Size: cols[2],
|
|
|
|
Model: cols[3],
|
|
|
|
Serial: cols[4],
|
|
|
|
Type: cols[5],
|
|
|
|
Temperature: 0,
|
|
|
|
}
|
|
|
|
hardDrives = append(hardDrives, hd)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle error
|
|
|
|
if err := scanner.Err(); err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return hardDrives, nil
|
|
|
|
}
|