// initBroker() sets up the connection to the RabbitMQ broker func initBroker(orig_ctx Context) (ctx Context, err error) { defer func() { if e := recover(); e != nil { err = fmt.Errorf("initBroker() -> %v", e) } ctx.Channels.Log <- mig.Log{Desc: "leaving initBroker()"}.Debug() }() ctx = orig_ctx // dialing address use format "<scheme>://<user>:<pass>@<host>:<port><vhost>" var scheme, user, pass, host, port, vhost string if ctx.MQ.UseTLS { scheme = "amqps" } else { scheme = "amqp" } if ctx.MQ.User == "" { panic("MQ User is missing") } user = ctx.MQ.User if ctx.MQ.Pass == "" { panic("MQ Pass is missing") } pass = ctx.MQ.Pass if ctx.MQ.Host == "" { panic("MQ Host is missing") } host = ctx.MQ.Host if ctx.MQ.Port < 1 { panic("MQ Port is missing") } port = fmt.Sprintf("%d", ctx.MQ.Port) vhost = ctx.MQ.Vhost dialaddr := scheme + "://" + user + ":" + pass + "@" + host + ":" + port + "/" + vhost if ctx.MQ.Timeout == "" { ctx.MQ.Timeout = "600s" } timeout, err := time.ParseDuration(ctx.MQ.Timeout) if err != nil { panic("Failed to parse timeout duration") } // create an AMQP configuration with specific timers var dialConfig amqp.Config dialConfig.ConnectionTimeout = timeout dialConfig.Heartbeat = timeout // create the TLS configuration if ctx.MQ.UseTLS { // import the client certificates cert, err := tls.LoadX509KeyPair(ctx.MQ.TLScert, ctx.MQ.TLSkey) if err != nil { panic(err) } // import the ca cert data, err := ioutil.ReadFile(ctx.MQ.CAcert) ca := x509.NewCertPool() if ok := ca.AppendCertsFromPEM(data); !ok { panic("failed to import CA Certificate") } TLSconfig := tls.Config{Certificates: []tls.Certificate{cert}, RootCAs: ca, InsecureSkipVerify: false, Rand: rand.Reader} dialConfig.TLSClientConfig = &TLSconfig } // Setup the AMQP broker connection ctx.MQ.conn, err = amqp.DialConfig(dialaddr, dialConfig) if err != nil { panic(err) } ctx.MQ.Chan, err = ctx.MQ.conn.Channel() if err != nil { panic(err) } // declare the "mig" exchange used for all publications err = ctx.MQ.Chan.ExchangeDeclare("mig", "topic", true, false, false, false, nil) if err != nil { panic(err) } ctx.Channels.Log <- mig.Log{Sev: "info", Desc: "AMQP connection opened"} return }
func initMQ(orig_ctx Context) (ctx Context, err error) { ctx = orig_ctx defer func() { if e := recover(); e != nil { err = fmt.Errorf("initMQ() -> %v", e) } ctx.Channels.Log <- mig.Log{Desc: "leaving initMQ()"}.Debug() }() //Define the AMQP binding ctx.MQ.Bind.Queue = fmt.Sprintf("mig.agt.%s", ctx.Agent.QueueLoc) ctx.MQ.Bind.Key = fmt.Sprintf("mig.agt.%s", ctx.Agent.QueueLoc) // parse the dial string and use TLS if using amqps if strings.Contains(AMQPBROKER, "amqps://") { ctx.MQ.UseTLS = true } // create an AMQP configuration with specific timers var dialConfig amqp.Config dialConfig.ConnectionTimeout = 10 * ctx.Sleeper dialConfig.Heartbeat = 2 * ctx.Sleeper if ctx.MQ.UseTLS { // import the client certificates cert, err := tls.X509KeyPair([]byte(AGENTCERT), []byte(AGENTKEY)) if err != nil { panic(err) } // import the ca cert ca := x509.NewCertPool() if ok := ca.AppendCertsFromPEM([]byte(CACERT)); !ok { panic("failed to import CA Certificate") } TLSconfig := tls.Config{Certificates: []tls.Certificate{cert}, RootCAs: ca, InsecureSkipVerify: false, Rand: rand.Reader} dialConfig.TLSClientConfig = &TLSconfig } // Open a non-encrypted AMQP connection ctx.MQ.conn, err = amqp.DialConfig(AMQPBROKER, dialConfig) if err != nil { panic(err) } ctx.MQ.Chan, err = ctx.MQ.conn.Channel() if err != nil { panic(err) } // Limit the number of message the channel will receive at once err = ctx.MQ.Chan.Qos(7, // prefetch count (in # of msg) 0, // prefetch size (in bytes) false) // is global _, err = ctx.MQ.Chan.QueueDeclare(ctx.MQ.Bind.Queue, // Queue name true, // is durable false, // is autoDelete false, // is exclusive false, // is noWait nil) // AMQP args if err != nil { panic(err) } err = ctx.MQ.Chan.QueueBind(ctx.MQ.Bind.Queue, // Queue name ctx.MQ.Bind.Key, // Routing key name "mig", // Exchange name false, // is noWait nil) // AMQP args if err != nil { panic(err) } // Consume AMQP message into channel ctx.MQ.Bind.Chan, err = ctx.MQ.Chan.Consume(ctx.MQ.Bind.Queue, // queue name "", // some tag false, // is autoAck false, // is exclusive false, // is noLocal false, // is noWait nil) // AMQP args if err != nil { panic(err) } return }