58 lines
1.7 KiB
Go
58 lines
1.7 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"strings"
|
|
)
|
|
|
|
// EventProcessor is an Interface for event-specific classes that will process
|
|
// events based on their specific fiends.
|
|
type EventProcessor interface {
|
|
FormatLogs(*Event, []string) ([]string, error)
|
|
FillExtraData(*Event, OpenStackActioner) error
|
|
}
|
|
|
|
// Event is a class representing an event accepted from the AMQP, and the
|
|
// additional attributes that have been parsed from it.
|
|
type Event struct {
|
|
EventData *openStackEvent
|
|
RawData []byte
|
|
IPs map[string][]string
|
|
SecurityGroupRules []*osSecurityGroupRule
|
|
LogLines []string
|
|
Processor EventProcessor
|
|
QualysScanID string
|
|
QualysScanError string
|
|
}
|
|
|
|
// ParseEvent takes the []byte that has been received from the AMQP message,
|
|
// demarshals the JSON, and then returns the event data as well as an event
|
|
// processor specific to that type of event.
|
|
func ParseEvent(message []byte) (Event, error) {
|
|
var osEvent openStackEvent
|
|
if err := json.Unmarshal(message, &osEvent); err != nil {
|
|
return Event{}, err
|
|
}
|
|
|
|
e := Event{
|
|
EventData: &osEvent,
|
|
RawData: message,
|
|
}
|
|
|
|
if Debug {
|
|
log.Printf("Event detected: %s\n", osEvent.EventType)
|
|
}
|
|
|
|
switch {
|
|
case strings.Contains(e.EventData.EventType, "security_group_rule.create.end"):
|
|
e.Processor = EventSecurityGroupRuleChange{ChangeType: "sg_rule_add"}
|
|
case strings.Contains(e.EventData.EventType, "security_group_rule.delete.end"):
|
|
e.Processor = EventSecurityGroupRuleChange{ChangeType: "sg_rule_del"}
|
|
// case strings.Contains(e.EventData.EventType, "port.create.end"):
|
|
// e.Processor = EventPortChange{ChangeType: "port_create"}
|
|
}
|
|
|
|
return e, nil
|
|
}
|