Advertisement
Guest User

Untitled

a guest
May 24th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.82 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "syscall"
  5.     "fmt"
  6.     "log"
  7.     "github.com/go-telegram-bot-api/telegram-bot-api"
  8.     "time"
  9.     "strings"
  10.     "flag"
  11.     "strconv"
  12. )
  13.  
  14. var (
  15.     token string
  16.     treshold float64
  17.     interval float64
  18.     mPoints []string
  19.     chatIds = []string{}
  20. )
  21.  
  22. type DiskStatus struct {
  23.     All uint64
  24.     Used uint64
  25.     Free uint64
  26. }
  27.  
  28. func DiskUsage(path string) (*DiskStatus, error) {
  29.     fs := syscall.Statfs_t{}
  30.     err := syscall.Statfs(path, &fs)
  31.     if err != nil {
  32.         log.Println("Can't get data for", path, err)
  33.         return nil, err
  34.     }
  35.     var disk DiskStatus
  36.     disk.All = fs.Blocks * uint64(fs.Bsize)
  37.     disk.Free = fs.Bfree * uint64(fs.Bsize)
  38.     disk.Used = disk.All - disk.Free
  39.     return &disk, nil
  40. }
  41.  
  42. func HumanizeSize(bytes uint64) string {
  43.     points := [6]string{"B", "KB", "MB", "GB", "TB", "PB"}
  44.     size := float64(bytes)
  45.     index := 0
  46.     for size > 1024 && index < len(points) {
  47.         size /= 1024
  48.         index++
  49.     }
  50.     return fmt.Sprintf("%.2f%s", size, points[index])
  51. }
  52.  
  53. func SendMessage(text string, chatId int64) {
  54.     bot, err := tgbotapi.NewBotAPI(token)
  55.     if err != nil {
  56.         log.Println("Failed initializion telegram API.", err)
  57.         return
  58.     }
  59.  
  60.     msg := tgbotapi.NewMessage(chatId, text)
  61.     bot.Send(msg)
  62. }
  63.  
  64. func Notify(text string) {
  65.     if token == "" {
  66.         log.Println("Token is empty.")
  67.         return
  68.     }
  69.  
  70.     if len(chatIds) < 1 {
  71.         log.Println("Chat ids not found.")
  72.         return
  73.     }
  74.  
  75.     for _, id := range chatIds {
  76.         chatId, err := strconv.Atoi(id)
  77.         if err != nil {
  78.             log.Println(err)
  79.             continue
  80.         }
  81.         SendMessage(text, int64(chatId))
  82.     }
  83. }
  84.  
  85. func CheckStatus(mPoints []string) {
  86.     for _, path := range mPoints {
  87.         disk, err := DiskUsage(path)
  88.         if err != nil {
  89.             log.Println(err)
  90.             continue
  91.         }
  92.         percent := float64(disk.Used) / float64(disk.All)
  93.         freePercent := (1 - percent) * 100.0
  94.         if freePercent <= treshold {
  95.             Notify(fmt.Sprintf("Low disk space: '%s' (%s)\n", path, HumanizeSize(disk.Free)))
  96.         }
  97.     }
  98. }
  99.  
  100. func schedule(duration time.Duration, function func()) {
  101.     for {
  102.         timer := time.NewTimer(duration)
  103.         <-timer.C
  104.         function()
  105.     }
  106. }
  107.  
  108. func init() {
  109.     var paths string
  110.     var userIds string
  111.  
  112.     flag.StringVar(&paths, "p", "", "Set mount points for monitoring. Separator: \".\" Ex. /volume1,/volume2")
  113.     flag.StringVar(&token, "t", "", "Telegram bot token.")
  114.     flag.StringVar(&userIds, "c", "", "Users chat ids for send notifications.")
  115.     flag.Float64Var(&interval, "i",600.0, "Disk check interval in seconds. Default: 600 seconds")
  116.     flag.Float64Var(&treshold, "d", 5.0, "Alert disk space treshold in percent. Default: 10%")
  117.     flag.Parse()
  118.  
  119.     if paths != "" {
  120.         mPoints = strings.Split(paths, ",")
  121.     }
  122.  
  123.     if userIds != "" {
  124.         chatIds = strings.Split(userIds, ",")
  125.     }
  126. }
  127.  
  128. func main() {
  129.     if len(mPoints) < 1 {
  130.         log.Fatalln("Mount points empty.")
  131.     }
  132.     schedule(time.Second * time.Duration(interval), func() {
  133.         CheckStatus(mPoints)
  134.     })
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement