package main import ( "beelzebub/parser" "beelzebub/protocols" "beelzebub/tracer" log "github.com/sirupsen/logrus" "io" "os" ) var quit = make(chan struct{}) func main() { parser := parser.Init("./configurations/beelzebub.yaml", "./configurations/services/") coreConfigurations, err := parser.ReadConfigurationsCore() if err != nil { log.Fatal(err) } fileLogs := configureLoggingByConfigurations(coreConfigurations.Core.Logging) defer fileLogs.Close() beelzebubServicesConfiguration, err := parser.ReadConfigurationsServices() if err != nil { log.Fatal(err) } // Init Protocol strategies secureShellStrategy := &protocols.SecureShellStrategy{} hypertextTransferProtocolStrategy := &protocols.HypertextTransferProtocolStrategy{} // Init protocol manager, with simple log on stout trace strategy and default protocol HTTP protocolManager := protocols.InitProtocolManager(traceStrategyStdout, hypertextTransferProtocolStrategy) for _, beelzebubServiceConfiguration := range beelzebubServicesConfiguration { switch beelzebubServiceConfiguration.Protocol { case "http": protocolManager.SetProtocolStrategy(hypertextTransferProtocolStrategy) break case "ssh": protocolManager.SetProtocolStrategy(secureShellStrategy) break default: log.Fatalf("Protocol %s not managed", beelzebubServiceConfiguration.Protocol) continue } err := protocolManager.InitService(beelzebubServiceConfiguration) if err != nil { log.Errorf("Error during init protocol: %s, %s", beelzebubServiceConfiguration.Protocol, err.Error()) } } <-quit } func traceStrategyStdout(event tracer.Event) { log.WithFields(log.Fields{ "status": event.Status.String(), "event": event, }).Info("New Event") } func configureLoggingByConfigurations(configurations parser.Logging) *os.File { file, err := os.OpenFile(configurations.LogsPath, os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666) if err != nil { log.Fatalf("error opening file: %v", err) } log.SetOutput(io.MultiWriter(os.Stdout, file)) log.SetFormatter(&log.JSONFormatter{ DisableTimestamp: configurations.LogDisableTimestamp, }) log.SetReportCaller(configurations.DebugReportCaller) if configurations.Debug { log.SetLevel(log.DebugLevel) } else { log.SetLevel(log.InfoLevel) } return file }