Merge branch 'feature/df' into 'master'
Feature/df See merge request !8
This commit is contained in:
commit
3b8552d758
53
df/main.go
Normal file
53
df/main.go
Normal file
@ -0,0 +1,53 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"jsh"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Converts raw output of "ps" into a slice of Filesystem objects
|
||||
func DfOutputToFilesystems(out string) *[]jsh.Filesystem {
|
||||
filesystems := []jsh.Filesystem{}
|
||||
lines := strings.Split(out, "\n")
|
||||
header, fses := lines[0], lines[1:]
|
||||
numFields := len(strings.Fields(header))
|
||||
|
||||
for _, fs := range fses {
|
||||
allFields := jsh.FieldsN(fs, numFields)
|
||||
if len(allFields) != 0 {
|
||||
fields := append(allFields[0:4], allFields[5])
|
||||
p, err := jsh.NewFilesystem(fields)
|
||||
if err == nil {
|
||||
filesystems = append(filesystems, *p)
|
||||
}
|
||||
}
|
||||
}
|
||||
return &filesystems
|
||||
}
|
||||
|
||||
func runJsonMode() {
|
||||
dfOut := string(*jsh.FallbackWithArgs("df", []string{"-B1"}))
|
||||
filesystemsPtr := DfOutputToFilesystems(dfOut)
|
||||
frame := jsh.JshFrame{*filesystemsPtr, []string{}}
|
||||
|
||||
queue := make(chan *jsh.JshFrame)
|
||||
done := make(chan bool)
|
||||
go jsh.OutputFrames(queue, done)
|
||||
queue <- &frame
|
||||
close(queue)
|
||||
<-done
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Parse for JSON flag.
|
||||
jsonModePtr := flag.Bool("json", false, "a bool")
|
||||
flag.Parse()
|
||||
|
||||
if !*jsonModePtr {
|
||||
fmt.Printf("%s", jsh.Fallback("df"))
|
||||
} else {
|
||||
runJsonMode()
|
||||
}
|
||||
}
|
22
df/main_test.go
Normal file
22
df/main_test.go
Normal file
@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"jsh"
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestPsOutputToProcesses(t *testing.T) {
|
||||
psOutput := `USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
|
||||
root 1 0.0 0.1 26204 4916 ? Ss 00:39 0:00 /sbin/init
|
||||
root 2 0.0 0.0 0 0 ? S 00:39 0:00 [kthreadd]`
|
||||
processes := PsOutputToProcesses(psOutput)
|
||||
expected := []jsh.Process{jsh.Process{"root", "1", "0.0", "0.1", "26204",
|
||||
"4916", "?", "Ss", "00:39", "0:00", "/sbin/init"},
|
||||
jsh.Process{"root", "2", "0.0", "0.0", "0", "0", "?", "S", "00:39",
|
||||
"0:00", "[kthreadd]"}}
|
||||
actual := *processes
|
||||
if !reflect.DeepEqual(expected, actual) {
|
||||
t.Errorf("Processes not parsed correctly.\n%s != %s", expected, actual)
|
||||
}
|
||||
}
|
35
filesystem.go
Normal file
35
filesystem.go
Normal file
@ -0,0 +1,35 @@
|
||||
/* File for Filesystem-related structs and methods */
|
||||
|
||||
package jsh
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// Filesystem is a struct for marshalling into JSON output for the df utility.
|
||||
type Filesystem struct {
|
||||
Name string
|
||||
Size int
|
||||
Used int
|
||||
Available int
|
||||
MountPoint string
|
||||
}
|
||||
|
||||
// NewFilesystem
|
||||
func NewFilesystem(args []string) (procPtr *Filesystem, err error) {
|
||||
err = nil
|
||||
// 11 = number of fields in the Filesystem struct
|
||||
if len(args) != 5 {
|
||||
procPtr = &Filesystem{}
|
||||
err = errors.New("Unexpected number of columns")
|
||||
} else {
|
||||
// TODO: add error checking
|
||||
size, _ := strconv.Atoi(args[1])
|
||||
used, _ := strconv.Atoi(args[2])
|
||||
available, _ := strconv.Atoi(args[2])
|
||||
procPtr = &Filesystem{
|
||||
args[0], size, used, available, args[4]}
|
||||
}
|
||||
return
|
||||
}
|
28
filesystem_test.go
Normal file
28
filesystem_test.go
Normal file
@ -0,0 +1,28 @@
|
||||
package jsh
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestNewFilesystem(t *testing.T) {
|
||||
tooManyArgs := []string{"1", "2", "3", "4"}
|
||||
_, err := NewFilesystem(tooManyArgs)
|
||||
if err == nil {
|
||||
t.Errorf("Passing 4 strings should raise an error")
|
||||
}
|
||||
|
||||
tooFewArgs := []string{"1", "2", "3", "4", "5", "6"}
|
||||
_, err = NewFilesystem(tooFewArgs)
|
||||
if err == nil {
|
||||
t.Errorf("Passing 6 strings should raise an error")
|
||||
}
|
||||
|
||||
justRightArgs := []string{"1", "2", "3", "4", "5"}
|
||||
proc, err := NewFilesystem(justRightArgs)
|
||||
if err != nil {
|
||||
t.Errorf("Passing 5 strings should not raise an error")
|
||||
}
|
||||
expected := Filesystem{"1", "2", "3", "4", "5"}
|
||||
actual := *proc
|
||||
if expected != actual {
|
||||
t.Errorf("Filesystem was incorrectly generated:\n%s != %s", expected, actual)
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user