core/services/agents/main_queue.go
Vitaliy Pavlov 2c4eaf6809 stage WIP
2024-08-23 20:57:09 +07:00

95 lines
2.2 KiB
Go

package agents
import (
"encoding/json"
"fmt"
"log"
agent "system-trace/core/amqp/types"
"github.com/wagslane/go-rabbitmq"
)
var mainQueueName string = "SYSTEM_TRACE_MAIN"
func CreateMainQueueConsumer(broker *rabbitmq.Conn) {
consumer, err := rabbitmq.NewConsumer(
broker,
mainQueueName,
rabbitmq.WithConsumerOptionsRoutingKey(""),
rabbitmq.WithConsumerOptionsExchangeName("controller"),
rabbitmq.WithConsumerOptionsExchangeDeclare,
)
if err != nil {
log.Fatal(err)
}
if err = consumer.Run(handleMessageFromMainQueue); err != nil {
log.Fatal(err)
}
}
func handleMessageFromMainQueue(message rabbitmq.Delivery) rabbitmq.Action {
am := new(agent.AgentMessage)
if err := json.Unmarshal(message.Body, &am); err != nil {
// TODO error log
return rabbitmq.NackDiscard
}
action := handleAgentMessage(am)
return action
}
func handleAgentMessage(message *agent.AgentMessage) rabbitmq.Action {
switch message.Message {
case agent.AGENT_HELLO:
{
if message.Data == nil {
fmt.Println("No data in received message hello")
// TODO error log
return rabbitmq.NackDiscard
}
if len(message.Data.Hostname) <= 0 {
fmt.Println("Hostname field are not presented in received message hello")
// TODO error log
return rabbitmq.NackDiscard
}
if len(message.Data.Interfaces) <= 0 {
fmt.Println("Interfaces field are not presented in received message hello")
// TODO error log
return rabbitmq.NackDiscard
}
if len(message.Data.Version) <= 0 {
fmt.Println("Version field are not presented in received message hello")
// TODO error log
return rabbitmq.NackDiscard
}
// TODO create or update agent from hello message
return rabbitmq.Ack
}
case agent.AGENT_ERROR:
{
if message.Data == nil {
fmt.Println("No data in received message hello")
// TODO error log
return rabbitmq.NackDiscard
}
if len(message.Data.Error) <= 0 {
fmt.Println("Error field are not presented in received message hello")
// TODO error log
return rabbitmq.NackDiscard
}
// TODO save log
return rabbitmq.Ack
}
// case agent.AGENT_STATUS:
// {
// }
// case agent.AGENT_PING:
// {
// }
}
return rabbitmq.NackDiscard
}