status.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package raid
  2. import (
  3. "fmt"
  4. "os/exec"
  5. )
  6. // RAIDStatus represents the status of a RAID array.
  7. type RAIDStatus int
  8. const (
  9. RAIDStatusNormal RAIDStatus = 0
  10. RAIDStatusOneFailed RAIDStatus = 1
  11. RAIDStatusUnusable RAIDStatus = 2
  12. RAIDStatusError RAIDStatus = 4
  13. RAIDStatusUnknown RAIDStatus = -1
  14. )
  15. // GetRAIDStatus scans and checks a given RAID array and returns the array status.
  16. func GetRAIDStatus(arrayName string) (RAIDStatus, error) {
  17. cmd := exec.Command("mdadm", "--detail", arrayName)
  18. output, err := cmd.CombinedOutput()
  19. if err != nil {
  20. // Error occurred while getting information about the array
  21. return RAIDStatusError, fmt.Errorf("error getting RAID array status: %v", err)
  22. }
  23. exitStatus := cmd.ProcessState.ExitCode()
  24. switch exitStatus {
  25. case 0:
  26. // The array is functioning normally
  27. return RAIDStatusNormal, nil
  28. case 1:
  29. // The array has at least one failed device
  30. return RAIDStatusOneFailed, nil
  31. case 2:
  32. // The array has multiple failed devices such that it is unusable
  33. return RAIDStatusUnusable, nil
  34. case 4:
  35. // There was an error while trying to get information about the device
  36. return RAIDStatusError, fmt.Errorf("error getting information about the RAID array: %s", string(output))
  37. default:
  38. // Unknown exit status
  39. return RAIDStatusUnknown, fmt.Errorf("unknown exit status: %d", exitStatus)
  40. }
  41. }
  42. // toString returns the string representation of the RAIDStatus.
  43. func (status RAIDStatus) toString() string {
  44. switch status {
  45. case RAIDStatusNormal:
  46. return "Normal"
  47. case RAIDStatusOneFailed:
  48. return "One Failed Device"
  49. case RAIDStatusUnusable:
  50. return "Unusable (Multiple Failed Devices)"
  51. case RAIDStatusError:
  52. return "Error"
  53. case RAIDStatusUnknown:
  54. return "Unknown"
  55. default:
  56. return "Invalid Status"
  57. }
  58. }
  59. // Report if the RAID array is healthy
  60. func (status RAIDStatus) isHealthy() bool {
  61. switch status {
  62. case RAIDStatusNormal:
  63. return true
  64. default:
  65. return false
  66. }
  67. }