monit helper for quota monitoring in go

I want to keep under control a system where each user has an amount of filesystem quota reserved; in particular I would like to get notified if and when a user exceeds some treshold. Since I already have Monit in place in the server, I took the chance to write a small Go utility in order to retrieve the quota percentage. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 // quotachecker.go package main import ( "os" "os/exec" "regexp" "strconv" "strings" ) func main() { //a fake implementation, just for testing purpose //cmd := exec.Command("/bin/sh", "-c", "cat fakequota.txt") cmd := exec.Command("/usr/bin/repquota", "-a") stdout, err := cmd.Output() if err != nil { panic(err.Error()) } re, err := regexp.Compile("^[[:alnum:]]+\\s+--\\s+\\d+\\s+\\d+") if err != nil { panic(err.Error()) } percent_max := 0 result := strings.Split(string(stdout), "\n") for _, line := range result { match := re.MatchString(line) if !match { continue } fields := strings.Fields(line) spaceused, err := strconv.ParseInt(fields[2], 10, 64) if err != nil { panic(err.Error()) } spacetotal, err := strconv.ParseInt(fields[4], 10, 64) if err != nil { panic(err.Error()) } if spacetotal == 0 { continue } //calculate max percent used percent := int(100 * spaceused / spacetotal) if percent > percent_max { percent_max = int(percent) } } os.Exit(percent_max) } This is also an example on how to run external programs in Go and filter the output using regular expressions. ...

March 30, 2016 · Andrea Manzini