main.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "flag"
  6. "fmt"
  7. "github.com/oz123/gupta"
  8. "log"
  9. "os"
  10. "time"
  11. )
  12. func readProcStatLine(r *os.File) string {
  13. buf := make([]byte, 80)
  14. r.ReadAt(buf, 0)
  15. idx := bytes.Index(buf, []byte("cpu0"))
  16. line := string(buf[:idx])
  17. r.Seek(0, 0)
  18. return line
  19. }
  20. var Usage = func() {
  21. fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
  22. flag.PrintDefaults()
  23. }
  24. func main() {
  25. var interval int
  26. var partition, netInterface string
  27. var load, memory, cpu bool
  28. flag.IntVar(&interval, "i", 5, "polling inteval")
  29. flag.BoolVar(&memory, "m", false, "Poll memory")
  30. flag.BoolVar(&load, "l", false, "Poll load")
  31. flag.BoolVar(&cpu, "c", false, "poll CPU usage")
  32. flag.StringVar(&partition, "p", "", "Poll disk usage (partition)")
  33. flag.StringVar(&netInterface, "n", "", "Network usage (interface)")
  34. flag.Parse()
  35. if load == false && memory == false && cpu == false {
  36. Usage()
  37. os.Exit(1)
  38. }
  39. fmt.Println(gupta.Hello())
  40. r, _ := os.Open("/proc/stat")
  41. m, _ := os.Open("/proc/meminfo")
  42. defer r.Close()
  43. defer m.Close()
  44. for true {
  45. report := gupta.GuptaReport{}
  46. line := readProcStatLine(r)
  47. time.Sleep(time.Duration(interval) * time.Second)
  48. if cpu {
  49. lineNew := readProcStatLine(r)
  50. cpustat := gupta.NewCPUStat(line, lineNew)
  51. report.CPUUsage = &cpustat
  52. }
  53. if memory {
  54. mem := gupta.NewMemory(m)
  55. report.MemoryUsage = &mem
  56. }
  57. writer := os.Stdout
  58. enc := json.NewEncoder(writer)
  59. if err := enc.Encode(&report); err != nil {
  60. log.Println(err)
  61. }
  62. r.Seek(0, 0)
  63. m.Seek(0, 0)
  64. }
  65. }