diff --git a/demo/disk.go b/demo/disk.go index 35f53d3..62fe814 100644 --- a/demo/disk.go +++ b/demo/disk.go @@ -21,10 +21,15 @@ var diskCommands = cli.Command{ Action: diskNewPartition, }, { - Name: "scan", - Usage: "Scan disks on the system and dump data", + Name: "dump", + Usage: "Scan disks on the system and dump data (json)", Action: diskScan, }, + { + Name: "show", + Usage: "Scan disks on the system and dump data (human)", + Action: diskShow, + }, }, } @@ -72,6 +77,43 @@ func diskScan(c *cli.Context) error { return nil } +func diskShow(c *cli.Context) error { + var err error + + mysys := linux.System() + matchAll := func(d disko.Disk) bool { + return true + } + + if c.Args().Len() == 1 { + disk, err := mysys.ScanDisk(c.Args().First()) + if err != nil { + return err + } + + fmt.Printf("%s\n", disk.Details()) + + return nil + } + + var disks disko.DiskSet + if c.Args().Len() == 0 { + disks, err = mysys.ScanAllDisks(matchAll) + } else { + disks, err = mysys.ScanDisks(matchAll, c.Args().Slice()...) + } + + if err != nil { + return err + } + + for _, d := range disks { + fmt.Printf("%s\n", d.Details()) + } + + return nil +} + func diskNewPartition(c *cli.Context) error { mysys := linux.System() fname := c.Args().First() diff --git a/disk.go b/disk.go index 34d8ce1..b350b8f 100644 --- a/disk.go +++ b/disk.go @@ -3,6 +3,7 @@ package disko import ( "encoding/json" "fmt" + "sort" ) // DiskType enumerates supported disk types. @@ -263,7 +264,16 @@ func (d Disk) Details() string { lfmt := "[%2s %10s %10s %10s %-16s]\n" buf := fmt.Sprintf(lfmt, "#", "Start", "Last", "Size", "Name") - for _, p := range d.Partitions { + pNums := make([]uint, 0, len(d.Partitions)) + for n := range d.Partitions { + pNums = append(pNums, n) + } + + sort.Slice(pNums, func(i, j int) bool { return pNums[i] < pNums[j] }) + + for _, n := range pNums { + p := d.Partitions[n] + if fsn < len(fss) && fss[fsn].Start < p.Start { buf += fmt.Sprintf(lfmt, "-", mbo(fss[fsn].Start), mbe(fss[fsn].Last), mbo(fss[fsn].Size()), "") fsn++