extract.go 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package smart
  2. import (
  3. "fmt"
  4. "github.com/anatol/smart.go"
  5. )
  6. /* Extract SATA drive SMART data */
  7. func getSATASMART(diskpath string) (*SMARTData, error) {
  8. dev, err := smart.OpenSata(diskpath)
  9. if err != nil {
  10. return nil, err
  11. }
  12. defer dev.Close()
  13. c, err := dev.Identify()
  14. if err != nil {
  15. return nil, err
  16. }
  17. sm, err := dev.ReadSMARTData()
  18. if err != nil {
  19. return nil, err
  20. }
  21. _, capacity, _, _, _ := c.Capacity()
  22. sataAttrs := []*SATAAttrData{}
  23. for _, attr := range sm.Attrs {
  24. thisAttrID := attr.Id
  25. thisAttrName := attr.Name
  26. thisAttrType := attr.Type
  27. thisAttrRawVal := attr.ValueRaw
  28. val, low, high, _, err := attr.ParseAsTemperature()
  29. if err != nil {
  30. continue
  31. }
  32. fmt.Println("Temperature: ", val, low, high)
  33. thisAttrData := SATAAttrData{
  34. Id: thisAttrID,
  35. Name: thisAttrName,
  36. Type: thisAttrType,
  37. RawVal: thisAttrRawVal,
  38. Current: attr.Current,
  39. Worst: attr.Worst,
  40. }
  41. sataAttrs = append(sataAttrs, &thisAttrData)
  42. }
  43. smartData := SMARTData{
  44. ModelNumber: c.ModelNumber(),
  45. SerialNumber: c.SerialNumber(),
  46. Size: capacity,
  47. SATAAttrs: sataAttrs,
  48. }
  49. return &smartData, nil
  50. }
  51. /* Extract NVMe drive SMART data */
  52. func getNVMESMART(diskpath string) (*SMARTData, error) {
  53. dev, err := smart.OpenNVMe(diskpath)
  54. if err != nil {
  55. return nil, err
  56. }
  57. defer dev.Close()
  58. c, nss, err := dev.Identify()
  59. if err != nil {
  60. return nil, err
  61. }
  62. NameSpaceUtilizations := []uint64{}
  63. for _, ns := range nss {
  64. NameSpaceUtilizations = append(NameSpaceUtilizations, ns.Nuse*ns.LbaSize())
  65. }
  66. sm, _ := dev.ReadSMART()
  67. smartData := SMARTData{
  68. ModelNumber: c.ModelNumber(),
  69. SerialNumber: c.SerialNumber(),
  70. Size: c.Tnvmcap.Val[0],
  71. NameSpaceUtilizations: NameSpaceUtilizations,
  72. Temperature: int(sm.Temperature),
  73. PowerOnHours: sm.PowerOnHours.Val[0],
  74. PowerCycles: sm.PowerCycles.Val[0],
  75. UnsafeShutdowns: sm.UnsafeShutdowns.Val[0],
  76. MediaErrors: sm.MediaErrors.Val[0],
  77. }
  78. return &smartData, nil
  79. }