This implementation is similar to AMQP notifications: * Notifications are published on a single topic as a JSON feed * Topic is configurable, as is the QoS. Uses the paho.mqtt.golang library for the mqtt connection, and supports connections over tcp and websockets, with optional secure tls support. * Additionally the minio server configuration has been bumped up so mqtt configuration can be added. * Configuration migration code is added with tests. MQTT is an ISO standard M2M/IoT messaging protocol and was originally designed for applications for limited bandwidth networks. Today it's use is growing in the IoT space.
470 lines
13 KiB
Go
470 lines
13 KiB
Go
/*
|
|
* Minio Cloud Storage, (C) 2016, 2017 Minio, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package cmd
|
|
|
|
import "sync"
|
|
|
|
/////////////////// Config V1 ///////////////////
|
|
type configV1 struct {
|
|
Version string `json:"version"`
|
|
AccessKey string `json:"accessKeyId"`
|
|
SecretKey string `json:"secretAccessKey"`
|
|
}
|
|
|
|
/////////////////// Config V2 ///////////////////
|
|
type configV2 struct {
|
|
Version string `json:"version"`
|
|
Credentials struct {
|
|
AccessKey string `json:"accessKeyId"`
|
|
SecretKey string `json:"secretAccessKey"`
|
|
Region string `json:"region"`
|
|
} `json:"credentials"`
|
|
MongoLogger struct {
|
|
Addr string `json:"addr"`
|
|
DB string `json:"db"`
|
|
Collection string `json:"collection"`
|
|
} `json:"mongoLogger"`
|
|
SyslogLogger struct {
|
|
Network string `json:"network"`
|
|
Addr string `json:"addr"`
|
|
} `json:"syslogLogger"`
|
|
FileLogger struct {
|
|
Filename string `json:"filename"`
|
|
} `json:"fileLogger"`
|
|
}
|
|
|
|
/////////////////// Config V3 ///////////////////
|
|
// backendV3 type.
|
|
type backendV3 struct {
|
|
Type string `json:"type"`
|
|
Disk string `json:"disk,omitempty"`
|
|
Disks []string `json:"disks,omitempty"`
|
|
}
|
|
|
|
// syslogLogger v3
|
|
type syslogLoggerV3 struct {
|
|
Enable bool `json:"enable"`
|
|
Addr string `json:"address"`
|
|
Level string `json:"level"`
|
|
}
|
|
|
|
// loggerV3 type.
|
|
type loggerV3 struct {
|
|
Console struct {
|
|
Enable bool `json:"enable"`
|
|
Level string `json:"level"`
|
|
}
|
|
File struct {
|
|
Enable bool `json:"enable"`
|
|
Filename string `json:"fileName"`
|
|
Level string `json:"level"`
|
|
}
|
|
Syslog struct {
|
|
Enable bool `json:"enable"`
|
|
Addr string `json:"address"`
|
|
Level string `json:"level"`
|
|
} `json:"syslog"`
|
|
// Add new loggers here.
|
|
}
|
|
|
|
// configV3 server configuration version '3'.
|
|
type configV3 struct {
|
|
Version string `json:"version"`
|
|
|
|
// Backend configuration.
|
|
Backend backendV3 `json:"backend"`
|
|
|
|
// http Server configuration.
|
|
Addr string `json:"address"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV3 `json:"logger"`
|
|
}
|
|
|
|
// logger type representing version '4' logger config.
|
|
type loggerV4 struct {
|
|
Console struct {
|
|
Enable bool `json:"enable"`
|
|
Level string `json:"level"`
|
|
} `json:"console"`
|
|
File struct {
|
|
Enable bool `json:"enable"`
|
|
Filename string `json:"fileName"`
|
|
Level string `json:"level"`
|
|
} `json:"file"`
|
|
Syslog struct {
|
|
Enable bool `json:"enable"`
|
|
Addr string `json:"address"`
|
|
Level string `json:"level"`
|
|
} `json:"syslog"`
|
|
}
|
|
|
|
// configV4 server configuration version '4'.
|
|
type configV4 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV4 `json:"logger"`
|
|
}
|
|
|
|
// logger type representing version '5' logger config.
|
|
type loggerV5 struct {
|
|
Console struct {
|
|
Enable bool `json:"enable"`
|
|
Level string `json:"level"`
|
|
} `json:"console"`
|
|
File struct {
|
|
Enable bool `json:"enable"`
|
|
Filename string `json:"fileName"`
|
|
Level string `json:"level"`
|
|
} `json:"file"`
|
|
Syslog struct {
|
|
Enable bool `json:"enable"`
|
|
Addr string `json:"address"`
|
|
Level string `json:"level"`
|
|
} `json:"syslog"`
|
|
AMQP struct {
|
|
Enable bool `json:"enable"`
|
|
Level string `json:"level"`
|
|
URL string `json:"url"`
|
|
Exchange string `json:"exchange"`
|
|
RoutingKey string `json:"routingKey"`
|
|
ExchangeType string `json:"exchangeType"`
|
|
Mandatory bool `json:"mandatory"`
|
|
Immediate bool `json:"immediate"`
|
|
Durable bool `json:"durable"`
|
|
Internal bool `json:"internal"`
|
|
NoWait bool `json:"noWait"`
|
|
AutoDeleted bool `json:"autoDeleted"`
|
|
} `json:"amqp"`
|
|
ElasticSearch struct {
|
|
Enable bool `json:"enable"`
|
|
Level string `json:"level"`
|
|
URL string `json:"url"`
|
|
Index string `json:"index"`
|
|
} `json:"elasticsearch"`
|
|
Redis struct {
|
|
Enable bool `json:"enable"`
|
|
Level string `json:"level"`
|
|
Addr string `json:"address"`
|
|
Password string `json:"password"`
|
|
Key string `json:"key"`
|
|
} `json:"redis"`
|
|
}
|
|
|
|
// configV5 server configuration version '5'.
|
|
type configV5 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV5 `json:"logger"`
|
|
}
|
|
|
|
// consoleLogger - default logger if not other logging is enabled.
|
|
type consoleLoggerV1 struct {
|
|
Enable bool `json:"enable"`
|
|
Level string `json:"level"`
|
|
}
|
|
|
|
type fileLoggerV1 struct {
|
|
Enable bool `json:"enable"`
|
|
Filename string `json:"fileName"`
|
|
Level string `json:"level"`
|
|
}
|
|
|
|
type loggerV6 struct {
|
|
Console consoleLoggerV1 `json:"console"`
|
|
File fileLoggerV1 `json:"file"`
|
|
Syslog syslogLoggerV3 `json:"syslog"`
|
|
}
|
|
|
|
// configV6 server configuration version '6'.
|
|
type configV6 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV6 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify notifierV1 `json:"notify"`
|
|
}
|
|
|
|
// Notifier represents collection of supported notification queues in version
|
|
// 1 without NATS streaming.
|
|
type notifierV1 struct {
|
|
AMQP map[string]amqpNotify `json:"amqp"`
|
|
NATS map[string]natsNotifyV1 `json:"nats"`
|
|
ElasticSearch map[string]elasticSearchNotify `json:"elasticsearch"`
|
|
Redis map[string]redisNotify `json:"redis"`
|
|
PostgreSQL map[string]postgreSQLNotify `json:"postgresql"`
|
|
Kafka map[string]kafkaNotify `json:"kafka"`
|
|
}
|
|
|
|
// Notifier represents collection of supported notification queues in version 2
|
|
// with NATS streaming but without webhook.
|
|
type notifierV2 struct {
|
|
AMQP map[string]amqpNotify `json:"amqp"`
|
|
NATS map[string]natsNotify `json:"nats"`
|
|
ElasticSearch map[string]elasticSearchNotify `json:"elasticsearch"`
|
|
Redis map[string]redisNotify `json:"redis"`
|
|
PostgreSQL map[string]postgreSQLNotify `json:"postgresql"`
|
|
Kafka map[string]kafkaNotify `json:"kafka"`
|
|
}
|
|
|
|
// configV7 server configuration version '7'.
|
|
type serverConfigV7 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV6 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify notifierV1 `json:"notify"`
|
|
|
|
// Read Write mutex.
|
|
rwMutex *sync.RWMutex
|
|
}
|
|
|
|
// serverConfigV8 server configuration version '8'. Adds NATS notifier
|
|
// configuration.
|
|
type serverConfigV8 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV6 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify notifierV1 `json:"notify"`
|
|
|
|
// Read Write mutex.
|
|
rwMutex *sync.RWMutex
|
|
}
|
|
|
|
// serverConfigV9 server configuration version '9'. Adds PostgreSQL
|
|
// notifier configuration.
|
|
type serverConfigV9 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV6 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify notifierV1 `json:"notify"`
|
|
|
|
// Read Write mutex.
|
|
rwMutex *sync.RWMutex
|
|
}
|
|
|
|
type loggerV7 struct {
|
|
sync.RWMutex
|
|
Console consoleLoggerV1 `json:"console"`
|
|
File fileLoggerV1 `json:"file"`
|
|
}
|
|
|
|
// serverConfigV10 server configuration version '10' which is like
|
|
// version '9' except it drops support of syslog config, and makes the
|
|
// RWMutex global (so it does not exist in this struct).
|
|
type serverConfigV10 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV7 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify notifierV1 `json:"notify"`
|
|
}
|
|
|
|
// natsNotifyV1 - structure was valid until config V 11
|
|
type natsNotifyV1 struct {
|
|
Enable bool `json:"enable"`
|
|
Address string `json:"address"`
|
|
Subject string `json:"subject"`
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
Token string `json:"token"`
|
|
Secure bool `json:"secure"`
|
|
PingInterval int64 `json:"pingInterval"`
|
|
}
|
|
|
|
// serverConfigV11 server configuration version '11' which is like
|
|
// version '10' except it adds support for Kafka notifications.
|
|
type serverConfigV11 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV7 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify notifierV1 `json:"notify"`
|
|
}
|
|
|
|
// serverConfigV12 server configuration version '12' which is like
|
|
// version '11' except it adds support for NATS streaming notifications.
|
|
type serverConfigV12 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger loggerV7 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify notifierV2 `json:"notify"`
|
|
}
|
|
|
|
// serverConfigV13 server configuration version '13' which is like
|
|
// version '12' except it adds support for webhook notification.
|
|
type serverConfigV13 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger *loggerV7 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify *notifier `json:"notify"`
|
|
}
|
|
|
|
// serverConfigV14 server configuration version '14' which is like
|
|
// version '13' except it adds support of browser param.
|
|
type serverConfigV14 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
Browser BrowserFlag `json:"browser"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger *loggerV7 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify *notifier `json:"notify"`
|
|
}
|
|
|
|
// serverConfigV15 server configuration version '15' which is like
|
|
// version '14' except it adds mysql support
|
|
type serverConfigV15 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
Browser BrowserFlag `json:"browser"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger *loggerV7 `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify *notifier `json:"notify"`
|
|
}
|
|
|
|
// serverConfigV16 server configuration version '16' which is like
|
|
// version '15' except it makes a change to logging configuration.
|
|
type serverConfigV16 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
Browser BrowserFlag `json:"browser"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger *loggers `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify *notifier `json:"notify"`
|
|
}
|
|
|
|
// serverConfigV17 server configuration version '17' which is like
|
|
// version '16' except it adds support for "format" parameter in
|
|
// database event notification targets: PostgreSQL, MySQL, Redis and
|
|
// Elasticsearch.
|
|
type serverConfigV17 struct {
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
Browser BrowserFlag `json:"browser"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger *loggers `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify *notifier `json:"notify"`
|
|
}
|
|
|
|
// serverConfigV18 server configuration version '18' which is like
|
|
// version '17' except it adds support for "deliveryMode" parameter in
|
|
// the AMQP notification target.
|
|
type serverConfigV18 struct {
|
|
sync.RWMutex
|
|
Version string `json:"version"`
|
|
|
|
// S3 API configuration.
|
|
Credential credential `json:"credential"`
|
|
Region string `json:"region"`
|
|
Browser BrowserFlag `json:"browser"`
|
|
|
|
// Additional error logging configuration.
|
|
Logger *loggers `json:"logger"`
|
|
|
|
// Notification queue configuration.
|
|
Notify *notifier `json:"notify"`
|
|
}
|