GetDevices now returns a complete description w/ disk partitions

pull/13/head
Paulo Truta 2021-06-06 17:10:08 +00:00
parent fd002987fa
commit 1ee82baf8a
1 changed files with 102 additions and 17 deletions

View File

@ -2,6 +2,7 @@ package storage
import (
"bufio"
"fmt"
"strings"
"github.com/edgebox-iot/edgeboxctl/internal/utils"
@ -17,6 +18,7 @@ type Device struct {
MIN string `json:"min"`
RM string `json:"rm"`
RO string `json:"ro"`
Partitions []Partition `json:"partitions"`
Status DeviceStatus `json:"status"`
}
@ -26,45 +28,128 @@ type DeviceStatus struct {
Description string `json:"description"`
}
// MaybeDevice : Boolean flag for validation of device existance
type MaybeDevice struct {
Device Device `json:"device"`
Valid bool `json:"valid"`
}
// Partition : Struct representing a partition / filesystem (Empty Mountpoint means it is not mounted)
type Partition struct {
ID string `json:"id"`
Size string `json:"size"`
MAJ string `json:"maj"`
MIN string `json:"min"`
RM string `json:"rm"`
RO string `json:"ro"`
Filesystem string `json:"filesystem"`
Mountpoint string `json:"mountpoint"`
}
const mainDiskID = "mmcblk0"
func GetDevice() MaybeDevice {
result := MaybeDevice{
Device: Device{},
Valid: false,
}
return result
}
// GetDevices : Returns a list of all available sotrage devices in structs filled with information
func GetDevices() []Device {
var devices []Device
cmdArgs := []string{"--raw", "--nodeps", "--noheadings"}
cmdArgs := []string{"--raw", "--noheadings"}
cmdOutput := utils.Exec("lsblk", cmdArgs)
cmdOutputReader := strings.NewReader(cmdOutput)
scanner := bufio.NewScanner(cmdOutputReader)
scanner.Split(bufio.ScanLines)
mainDevice := true
var currentDevice Device
var currentPartitions []Partition
firstDevice := true
for scanner.Scan() {
// 1 Device is represented here. Extract words in order for filling a Device struct
// Example deviceRawInfo: "mmcblk0 179:0 0 29.7G 0 disk"
deviceRawInfo := strings.Fields(scanner.Text())
majMin := strings.SplitN(deviceRawInfo[1], ":", 2)
device := Device{
ID: deviceRawInfo[0],
Name: deviceRawInfo[0],
Size: deviceRawInfo[3],
MainDevice: mainDevice,
MAJ: majMin[0],
MIN: majMin[1],
RO: deviceRawInfo[4],
RM: deviceRawInfo[2],
Status: DeviceStatus{ID: 1, Description: "healthy"},
isDevice := true
if deviceRawInfo[5] == "part" {
isDevice = false
}
// Once the first device is found, set to false.
if mainDevice == true {
mainDevice = false
if isDevice {
// Clean up on the last device being prepared. Append all partitions found and delete the currentPartitions list afterwards.
// The first device found should not run the cleanup lines below
fmt.Println("Processing Device")
if !firstDevice {
fmt.Println("Appending finalized device info to list")
currentDevice.Partitions = currentPartitions
currentPartitions = []Partition{}
devices = append(devices, currentDevice)
} else {
fmt.Println("First device, not appending to list")
firstDevice = false
}
mainDevice := false
device := Device{
ID: deviceRawInfo[0],
Name: deviceRawInfo[0],
Size: deviceRawInfo[3],
MainDevice: mainDevice,
MAJ: majMin[0],
MIN: majMin[1],
RM: deviceRawInfo[2],
RO: deviceRawInfo[4],
Status: DeviceStatus{ID: 1, Description: "healthy"},
}
if device.ID == mainDiskID {
device.MainDevice = true
}
currentDevice = device
} else {
fmt.Println("Processing Partition")
mountpoint := ""
if len(deviceRawInfo) > 7 {
mountpoint = deviceRawInfo[7]
}
// It is a partition, part of the last device read.
partition := Partition{
ID: deviceRawInfo[0],
Size: deviceRawInfo[3],
MAJ: majMin[0],
MIN: majMin[1],
RM: deviceRawInfo[2],
RO: deviceRawInfo[4],
Filesystem: "",
Mountpoint: mountpoint,
}
currentPartitions = append(currentPartitions, partition)
}
devices = append(devices, device)
}
devices = append([]Device{currentDevice}, devices...) // Prepending the first device...
return devices
}