raid.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package raid
  2. import (
  3. "errors"
  4. "fmt"
  5. "os"
  6. "os/exec"
  7. "path/filepath"
  8. "runtime"
  9. )
  10. /*
  11. RAID management package for handling RAID and Virtual Image Creation
  12. for Linux with mdadm installed
  13. */
  14. type Manager struct {
  15. }
  16. func PackageExists(packageName string) (bool, error) {
  17. cmd := exec.Command("dpkg-query", "-W", "-f='${Status}'", packageName)
  18. output, err := cmd.Output()
  19. if err != nil {
  20. if exitError, ok := err.(*exec.ExitError); ok && exitError.ExitCode() == 1 {
  21. // Package not found
  22. return false, nil
  23. }
  24. return false, fmt.Errorf("error checking package: %v", err)
  25. }
  26. // Check if the output contains "install ok installed"
  27. return string(output) == "'install ok installed'", nil
  28. }
  29. // Create a new raid manager
  30. func NewRaidManager() (*Manager, error) {
  31. //Check if platform is supported
  32. if runtime.GOOS != "linux" {
  33. return nil, errors.New("ArozOS do not support RAID management on this platform")
  34. }
  35. //Check if mdadm exists
  36. mdadmExists, err := PackageExists("mdadm")
  37. if err != nil || !mdadmExists {
  38. return nil, errors.New("mdadm not installed on this host")
  39. }
  40. return &Manager{}, nil
  41. }
  42. // Create a virtual image partition at given path with given size
  43. func CreateVirtualPartition(imagePath string, totalSize int64) error {
  44. cmd := exec.Command("sudo", "dd", "if=/dev/zero", "of="+imagePath, "bs=4M", "count="+fmt.Sprintf("%dM", totalSize/(4*1024*1024)))
  45. cmd.Stdout = os.Stdout
  46. cmd.Stderr = os.Stderr
  47. err := cmd.Run()
  48. if err != nil {
  49. return fmt.Errorf("dd error: %v", err)
  50. }
  51. return nil
  52. }
  53. // Format the given image file
  54. func FormatVirtualPartition(imagePath string) error {
  55. //Check if image actually exists
  56. if _, err := os.Stat(imagePath); os.IsNotExist(err) {
  57. return errors.New("image file does not exist")
  58. }
  59. if filepath.Ext(imagePath) != ".img" {
  60. return errors.New("given file is not an image path")
  61. }
  62. cmd := exec.Command("sudo", "mkfs.ext4", imagePath)
  63. cmd.Stdout = os.Stdout
  64. cmd.Stderr = os.Stderr
  65. err := cmd.Run()
  66. if err != nil {
  67. return fmt.Errorf("error running mkfs.ext4 command: %v", err)
  68. }
  69. return nil
  70. }