1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- package nhook
- import (
- "crypto/tls"
- "crypto/x509"
- "fmt"
- "io/ioutil"
- "strings"
- "github.com/nats-io/nats.go"
- "github.com/sirupsen/logrus"
- )
- // NatsConfig represents the minimum entries that are needed to connect to Nats over TLS
- type NatsConfig struct {
- CAFiles []string `json:"ca_files"`
- KeyFile string `json:"key_file"`
- CertFile string `json:"cert_file"`
- Servers []string `json:"servers"`
- }
- // ServerString will build the proper string for nats connect
- func (config *NatsConfig) ServerString() string {
- return strings.Join(config.Servers, ",")
- }
- // LogFields will return all the fields relevant to this config
- func (config *NatsConfig) LogFields() logrus.Fields {
- return logrus.Fields{
- "servers": config.Servers,
- "ca_files": config.CAFiles,
- "key_file": config.KeyFile,
- "cert_file": config.CertFile,
- }
- }
- // TLSConfig will load the TLS certificate
- func (config *NatsConfig) TLSConfig() (*tls.Config, error) {
- pool := x509.NewCertPool()
- for _, caFile := range config.CAFiles {
- caData, err := ioutil.ReadFile(caFile)
- if err != nil {
- return nil, err
- }
- if !pool.AppendCertsFromPEM(caData) {
- return nil, fmt.Errorf("Failed to add CA cert at %s", caFile)
- }
- }
- cert, err := tls.LoadX509KeyPair(config.CertFile, config.KeyFile)
- if err != nil {
- return nil, err
- }
- tlsConfig := &tls.Config{
- RootCAs: pool,
- Certificates: []tls.Certificate{cert},
- MinVersion: tls.VersionTLS12,
- }
- return tlsConfig, nil
- }
- func ConnectToNatsNoTls(config *NatsConfig) (*nats.Conn, error) {
- return nats.Connect(config.ServerString(), nats.MaxReconnects(-1))
- }
- // ConnectToNats will do a TLS connection to the nats servers specified
- func ConnectToNats(config *NatsConfig) (*nats.Conn, error) {
- tlsConfig, err := config.TLSConfig()
- if err != nil {
- return nil, err
- }
- return nats.Connect(config.ServerString(), nats.Secure(tlsConfig))
- }
- // ConnectToNatsWithError will do a TLS connection to the nats servers specified
- func ConnectToNatsWithError(config *NatsConfig, eHandler nats.ErrHandler) (*nats.Conn, error) {
- tlsConfig, err := config.TLSConfig()
- if err != nil {
- return nil, err
- }
- if eHandler != nil {
- return nats.Connect(config.ServerString(), nats.Secure(tlsConfig), nats.ErrorHandler(eHandler))
- } else {
- return nats.Connect(config.ServerString(), nats.Secure(tlsConfig))
- }
- }
|