package raid import ( "bufio" "fmt" "os" "os/exec" "strings" ) // Get the next avaible RAID array name func GetNextAvailableMDDevice() (string, error) { for i := 0; i < 100; i++ { mdDevice := fmt.Sprintf("/dev/md%d", i) if _, err := os.Stat(mdDevice); os.IsNotExist(err) { return mdDevice, nil } } return "", fmt.Errorf("no available /dev/mdX devices found") } // DANGER: Wipe the whole disk given the disk path func (m *Manager) WipeDisk(diskPath string) error { // Unmount the disk isMounted, _ := DeviceIsMounted(diskPath) if isMounted { umountCmd := exec.Command("sudo", "umount", diskPath) if err := umountCmd.Run(); err != nil { return fmt.Errorf("error unmounting disk %s: %v", diskPath, err) } } // Wipe all filesystem signatures on the entire disk wipeCmd := exec.Command("sudo", "wipefs", "--all", "--force", diskPath) if err := wipeCmd.Run(); err != nil { return fmt.Errorf("error wiping filesystem signatures on %s: %v", diskPath, err) } return nil } // Check if a device is mounted given the path name, like /dev/sdc func DeviceIsMounted(devicePath string) (bool, error) { // Open the mountinfo file file, err := os.Open("/proc/mounts") if err != nil { return false, fmt.Errorf("error opening /proc/mounts: %v", err) } defer file.Close() // Scan the mountinfo file line by line scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() fields := strings.Fields(line) if len(fields) >= 2 && fields[0] == devicePath { // Device is mounted return true, nil } } // Device is not mounted return false, nil }