package diskfs import ( "errors" "fmt" "os/exec" "strconv" "strings" "imuslab.com/arozos/mod/utils" ) /* diskfs.go This module handle file system creation and formatting */ // Storage Device meta was generated by lsblk type StorageDeviceMeta struct { Name string Size int64 RO bool DevType string MountPoint string } // Check if the file format driver is installed on this host // if a format is supported, mkfs.(format) should be symlinked under /sbin func FormatPackageInstalled(fsType string) bool { return utils.FileExists("/sbin/mkfs." + fsType) } // Create file system, support ntfs, ext4 and fat32 only func FormatStorageDevice(fsType string, devicePath string) error { // Check if the filesystem type is supported switch fsType { case "ext4": // Format the device with the specified filesystem type cmd := exec.Command("sudo", "mkfs."+fsType, devicePath) output, err := cmd.CombinedOutput() if err != nil { return errors.New("unable to format device: " + string(output)) } return nil case "vfat", "fat", "fat32": //Check if mkfs.fat exists if !FormatPackageInstalled("vfat") { return errors.New("unable to format device as fat (vfat). dosfstools not installed?") } // Format the device with the specified filesystem type cmd := exec.Command("sudo", "mkfs.vfat", devicePath) output, err := cmd.CombinedOutput() if err != nil { return errors.New("unable to format device: " + string(output)) } return nil case "ntfs": //Check if ntfs-3g exists if !FormatPackageInstalled("ntfs") { return errors.New("unable to format device as ntfs: ntfs-3g not installed?") } //Format the drive cmd := exec.Command("sudo", "mkfs.ntfs", devicePath) output, err := cmd.CombinedOutput() if err != nil { return errors.New("unable to format device: " + string(output)) } return nil default: return fmt.Errorf("unsupported filesystem type: %s", fsType) } } // List all the storage device in the system, set minSize to 0 for no filter func ListAllStorageDevices(minSize int64) ([]*StorageDeviceMeta, error) { cmd := exec.Command("sudo", "lsblk", "-b") output, err := cmd.CombinedOutput() if err != nil { return nil, fmt.Errorf("lsblk error: %v", err) } // Split the output into lines lines := strings.Split(string(output), "\n") var devices []*StorageDeviceMeta // Parse each line to extract device information for _, line := range lines[1:] { // Skip the header line fields := strings.Fields(line) if len(fields) < 7 { continue } size, err := strconv.ParseInt(fields[3], 10, 64) if err != nil { return nil, fmt.Errorf("error parsing device size: %v", err) } ro := fields[4] == "1" device := &StorageDeviceMeta{ Name: fields[0], Size: size, RO: ro, DevType: fields[5], MountPoint: fields[6], } // Filter devices based on minimum size if size >= minSize { devices = append(devices, device) } } return devices, nil }