117 lines
2.3 KiB
Go
117 lines
2.3 KiB
Go
package ws
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
|
|
"git.paulbsd.com/paulbsd/ipbl/src/config"
|
|
"git.paulbsd.com/paulbsd/ipbl/src/models"
|
|
"github.com/labstack/echo/v4"
|
|
"golang.org/x/net/websocket"
|
|
)
|
|
|
|
// HandleWSRR handle req rep flows
|
|
func HandleWSRR(c echo.Context, cfg *config.Config) error {
|
|
websocket.Handler(func(ws *websocket.Conn) {
|
|
defer ws.Close()
|
|
|
|
var welcome = wsWelcome{}
|
|
|
|
var msg []byte
|
|
err := websocket.Message.Receive(ws, &msg)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
|
|
err = json.Unmarshal(msg, &welcome)
|
|
if err == nil {
|
|
welcomeAgents(ws, welcome, "rr")
|
|
}
|
|
|
|
var lastip string
|
|
for {
|
|
var apievent = models.APIEvent{}
|
|
var event = models.Event{}
|
|
|
|
var msg []byte
|
|
err := websocket.Message.Receive(ws, &msg)
|
|
if err != nil {
|
|
log.Println(err)
|
|
return
|
|
}
|
|
|
|
err = json.Unmarshal(msg, &apievent)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
|
|
if lastip != "" && apievent.IPData.IP == lastip {
|
|
continue
|
|
}
|
|
|
|
switch apievent.MsgType {
|
|
case "bootstrap":
|
|
log.Printf("bootstrap: %s\n", apievent.Hostname)
|
|
for index, value := range listeners {
|
|
if index != apievent.Hostname && value.ConnectionPS != nil {
|
|
err = websocket.Message.Send(value.ConnectionPS, msg)
|
|
if err != nil {
|
|
log.Println(err)
|
|
gcConnOnError(ws)
|
|
}
|
|
}
|
|
}
|
|
case "add":
|
|
session := cfg.Db.NewSession()
|
|
event.APIParse(session, apievent)
|
|
session.Close()
|
|
|
|
err := event.Insert(cfg)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
|
|
for _, value := range listeners {
|
|
if value.ConnectionPS != nil {
|
|
err = websocket.Message.Send(value.ConnectionPS, msg)
|
|
if err != nil {
|
|
log.Println(err)
|
|
gcConnOnError(ws)
|
|
}
|
|
}
|
|
}
|
|
log.Printf("ws: Inserted event")
|
|
case "init":
|
|
for _, value := range listeners {
|
|
if value.ConnectionPS != nil {
|
|
err = websocket.Message.Send(value.ConnectionPS, msg)
|
|
if err != nil {
|
|
log.Println(err)
|
|
gcConnOnError(ws)
|
|
}
|
|
}
|
|
}
|
|
default:
|
|
}
|
|
|
|
err = websocket.Message.Send(ws, "OK")
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
|
|
/*
|
|
WebSocketChannel <- apievent
|
|
|
|
err = websocket.Message.Send(ws, "OK")
|
|
if err != nil {
|
|
//gcConn(ws, "rr")
|
|
log.Println(listeners)
|
|
return
|
|
}
|
|
*/
|
|
|
|
}
|
|
}).ServeHTTP(c.Response(), c.Request())
|
|
return nil
|
|
}
|