123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- package smart
- import (
- "errors"
- "fmt"
- "os"
- "path/filepath"
- "strings"
- "github.com/anatol/smart.go"
- )
- type SATAAttrData struct {
- Id uint8
- Name string
- Type int
- RawVal uint64
- Current uint8
- Worst uint8
- }
- type SMARTData struct {
- ModelNumber string
- SerialNumber string
- Size uint64
- Temperature int
-
- NameSpaceUtilizations []uint64
- PowerOnHours uint64
- PowerCycles uint64
- UnsafeShutdowns uint64
- MediaErrors uint64
-
- SATAAttrs []*SATAAttrData
- }
- func GetSMARTData(disk string) (*SMARTData, error) {
- if !strings.HasPrefix(disk, "/dev/") {
- disk = filepath.Join("/dev", disk)
- }
-
- if _, err := os.Stat(disk); os.IsNotExist(err) {
- return nil, fmt.Errorf("disk %s does not exist", disk)
- }
-
- isNVMe := strings.HasPrefix(disk, "/dev/nvme")
- isSATA := strings.HasPrefix(disk, "/dev/sd")
-
- if !isNVMe && !isSATA {
- return nil, fmt.Errorf("disk %s is not an NVMe or SATA disk", disk)
- }
- if isNVMe {
- return getNVMESMART(disk)
- } else if isSATA {
- return getSATASMART(disk)
- }
- return nil, errors.New("unsupported disk type")
- }
- func IsRootDisk(deviceFilePath string) bool {
- deviceFilename := filepath.Base(deviceFilePath)
- if !(strings.HasPrefix(deviceFilename, "sd") || strings.HasPrefix(deviceFilename, "nvme")) {
- return false
- }
- if strings.HasPrefix(deviceFilename, "sd") && len(deviceFilename) > 3 {
- return false
- }
- if strings.HasPrefix(deviceFilename, "nvme") && len(deviceFilename) > 5 {
- return false
- }
- return true
- }
- func IsDiskSupportedType(disk string) bool {
- return IsNVMeDevice(disk) || IsSATADevice(disk)
- }
- func IsSATADevice(disk string) bool {
- if !strings.HasPrefix(disk, "/dev/") {
- disk = filepath.Join("/dev", disk)
- }
- _, err := smart.OpenSata(disk)
- return err == nil
- }
- func IsNVMeDevice(disk string) bool {
- if !strings.HasPrefix(disk, "/dev/") {
- disk = filepath.Join("/dev", disk)
- }
- _, err := smart.OpenNVMe(disk)
- return err == nil
- }
|