yanic/main.go

85 lines
2.1 KiB
Go
Raw Normal View History

2015-12-29 04:08:03 +01:00
package main
import (
"encoding/json"
2016-02-19 11:30:42 +01:00
"flag"
2015-12-29 04:08:03 +01:00
"log"
2016-02-19 11:13:30 +01:00
"net/http"
"os"
"os/signal"
"reflect"
"strings"
"syscall"
"time"
"github.com/monitormap/micro-daemon/models"
"github.com/monitormap/micro-daemon/responed"
"github.com/monitormap/micro-daemon/websocketserver"
2015-12-29 14:05:47 +01:00
)
2016-02-19 11:30:42 +01:00
var (
wsserverForNodes = websocketserver.NewServer("/nodes")
responedDaemon *responed.Daemon
nodes = models.NewNodes()
outputFile string
collectInterval time.Duration
saveInterval time.Duration
2016-02-19 11:30:42 +01:00
)
func main() {
2016-02-19 11:30:42 +01:00
var collectSeconds, saveSeconds int
2016-02-19 11:41:39 +01:00
flag.StringVar(&outputFile, "output", "webroot/nodes.json", "path output file")
2016-02-19 11:30:42 +01:00
flag.IntVar(&collectSeconds, "collectInterval", 15, "interval for data collections")
flag.IntVar(&saveSeconds, "saveInterval", 5, "interval for data saving")
flag.Parse()
2015-12-29 14:05:47 +01:00
2016-02-19 11:30:42 +01:00
collectInterval = time.Second * time.Duration(collectSeconds)
saveInterval = time.Second * time.Duration(saveSeconds)
go wsserverForNodes.Listen()
go nodes.Saver(outputFile, saveInterval)
responedDaemon = responed.NewDaemon(func(coll *responed.Collector, res *responed.Response) {
var result map[string]interface{}
json.Unmarshal(res.Raw, &result)
2016-02-19 11:30:42 +01:00
nodeID, _ := result["node_id"].(string)
if nodeID == "" {
log.Println("unable to parse node_id")
return
}
node := nodes.Get(nodeID)
2015-12-29 14:05:47 +01:00
// Set result
elem := reflect.ValueOf(node).Elem()
field := elem.FieldByName(strings.Title(coll.CollectType))
if !reflect.DeepEqual(field, result) {
2016-02-25 21:38:40 +01:00
log.Printf("Start sendAll after recieve %s", coll.CollectType)
log.Printf("Field: %V", field)
log.Printf("Result: %V", result)
wsserverForNodes.SendAll(node)
2016-02-25 21:38:40 +01:00
log.Print("End")
}
field.Set(reflect.ValueOf(result))
})
go responedDaemon.ListenAndSend(collectInterval)
http.Handle("/", http.FileServer(http.Dir("webroot")))
//TODO bad
2016-02-19 11:13:30 +01:00
log.Fatal(http.ListenAndServe(":8080", nil))
// Wait for End
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
sig := <-sigs
log.Println("received", sig)
// Close everything at the end
wsserverForNodes.Close()
responedDaemon.Close()
2015-12-29 04:08:03 +01:00
}