Packaged Plugins¤
With the aMQTT plugins framework, one can add additional functionality without
having to rewrite core logic in the broker or client. Plugins can be loaded and configured using
the plugins section of the config file (or parameter passed to the class).
Broker¤
By default, EventLoggerPlugin, PacketLoggerPlugin, AnonymousAuthPlugin and BrokerSysPlugin are activated
and configured for the broker:
---
listeners:
default:
type: tcp
bind: 0.0.0.0:1883
plugins:
amqtt.plugins.logging_amqtt.EventLoggerPlugin:
amqtt.plugins.logging_amqtt.PacketLoggerPlugin:
amqtt.plugins.authentication.AnonymousAuthPlugin:
allow_anonymous: true
amqtt.plugins.sys.broker.BrokerSysPlugin:
sys_interval: 20
Loading plugins from EntryPoints in pyproject.toml has been deprecated
Previously, all plugins were loaded from EntryPoints:
[project.entry-points."amqtt.broker.plugins"]
event_logger_plugin = "amqtt.plugins.logging_amqtt:EventLoggerPlugin"
packet_logger_plugin = "amqtt.plugins.logging_amqtt:PacketLoggerPlugin"
auth_anonymous = "amqtt.plugins.authentication:AnonymousAuthPlugin"
auth_file = "amqtt.plugins.authentication:FileAuthPlugin"
topic_taboo = "amqtt.plugins.topic_checking:TopicTabooPlugin"
topic_acl = "amqtt.plugins.topic_checking:TopicAccessControlListPlugin"
broker_sys = "amqtt.plugins.sys.broker:BrokerSysPlugin"
But the previous default config only caused 4 plugins to be active:
---
listeners:
default:
type: tcp
bind: 0.0.0.0:1883
sys_interval: 20
auth:
plugins:
- auth_anonymous
allow-anonymous: true
topic-check:
enabled: False
Client¤
By default, the PacketLoggerPlugin is activated and configured for the client:
---
keep_alive: 10
ping_delay: 1
default_qos: 0
default_retain: false
auto_reconnect: true
cleansession: true
reconnect_max_interval: 10
reconnect_retries: 2
connection:
uri: "mqtt://127.0.0.1"
plugins:
amqtt.plugins.logging_amqtt.PacketLoggerPlugin:
Plugins¤
Anonymous (Auth Plugin)¤
amqtt.plugins.authentication.AnonymousAuthPlugin
Authentication plugin allowing anonymous access.
Config
dataclass
¤
Configuration for AnonymousAuthPlugin.
allow_anonymous
class-attribute
instance-attribute
¤
allow_anonymous: bool = field(default=True)
Allow all anonymous authentication (even with no username).
Danger
even if allow_anonymous is set to false, the plugin will still allow access if a username is provided by the client
EntryPoint-style configuration is deprecated
auth:
plugins:
- auth_anonymous
allow-anonymous: true # if false, providing a username will allow access
Password File (Auth Plugin)¤
amqtt.plugins.authentication.FileAuthPlugin
Authentication plugin based on a file-stored user database.
Config
dataclass
¤
Configuration for FileAuthPlugin.
password_file
class-attribute
instance-attribute
¤
password_file: str | Path | None = None
Path to file with username:password pairs, one per line. All passwords are encoded using sha-512.
EntryPoint-style configuration is deprecated
auth:
plugins:
- auth_file
password-file: /path/to/password_file
File Format
The file includes username:password pairs, one per line.
The password should be encoded using sha-512 with mkpasswd -m sha-512 or:
import sys
from getpass import getpass
from passlib.hash import sha512_crypt
passwd = input() if not sys.stdin.isatty() else getpass()
print(sha512_crypt.hash(passwd))
Taboo (Topic Plugin)¤
amqtt.plugins.topic_checking.TopicTabooPlugin
Prevents using topics named: prohibited, top-secret, and data/classified
Configuration
plugins:
amqtt.plugins.topic_checking.TopicTabooPlugin:
EntryPoint-style configuration is deprecated
topic-check:
enabled: true
plugins:
- topic_taboo
ACL (Topic Plugin)¤
amqtt.plugins.topic_checking.TopicAccessControlListPlugin
Configuration
Each acl category are a list a key-value pair, where:
<username>:["<topic1>", "<topic2>", ...](string, list[string]): username of the client followed by a list of allowed topics (wildcards are supported:#,+).
# and $SYS topics
Per the MQTT 3.1.1 spec 4.7.2, a single # will not allow access to $ broker
topics; need to additionally specify $SYS/# to allow a client full access subscribe & receive.
Also MQTT spec prevents clients from publishing to topics starting with $; these will be ignored.
If set to None, no restrictions are placed on client subscriptions (legacy behavior). An empty list will block clients from using any topics.
-
subscribe-acl(mapping): determines subscription access. -
acl(mapping): Deprecated and replaced bysubscribe-acl. -
publish-acl(mapping): determines publish access. -
receive-acl(mapping): determines if a message can be sent to a client.Reserved usernames
- The username
adminis allowed access to all topics. - The username
anonymouswill control allowed topics, if using theauth_anonymousplugin.
- The username
plugins:
amqtt.plugins.topic_checking.TopicAccessControlListPlugin:
acl:
- username: ["list", "of", "allowed", "topics", "for", "subscribing"]
- .
publish_acl:
- username: ["list", "of", "allowed", "topics", "for", "publishing"]
- .
EntryPoint-style configuration is deprecated
topic-check:
enabled: true
plugins:
- topic_acl
publish-acl:
- username: ["list", "of", "allowed", "topics", "for", "publishing"]
- .
acl:
- username: ["list", "of", "allowed", "topics", "for", "subscribing"]
- .
$SYS topics¤
amqtt.plugins.sys.broker.BrokerSysPlugin
Publishes, on a periodic basis, statistics about the broker
Configuration
sys_interval- int, seconds between updates (default: 20)
plugins:
amqtt.plugins.sys.broker.BrokerSysPlugin:
sys_interval: 20 # int, seconds between updates
Supported Topics
$SYS/broker/version(string)$SYS/broker/load/bytes/received(int)$SYS/broker/load/bytes/sent(int)$SYS/broker/messages/received(int)$SYS/broker/messages/sent(int)$SYS/broker/time(int, current time in epoch seconds)$SYS/broker/uptime(int, seconds since broker start)$SYS/broker/uptime/formatted(string, start time of broker in UTC)$SYS/broker/clients/connected(int, number of currently connected clients)$SYS/broker/clients/disconnected(int, number of clients that have disconnected)$SYS/broker/clients/maximum(int, maximum number of clients connected)$SYS/broker/clients/total(int)$SYS/broker/messages/inflight(int)$SYS/broker/messages/inflight/in(int)$SYS/broker/messages/inflight/out(int)$SYS/broker/messages/inflight/stored(int)$SYS/broker/messages/publish/received(int)$SYS/broker/messages/publish/sent(int)$SYS/broker/messages/retained/count(int)$SYS/broker/messages/subscriptions/count(int)$SYS/broker/heap/size(float, MB)$SYS/broker/heap/maximum(float, MB)$SYS/broker/cpu/percent(float, %)$SYS/broker/cpu/maximum(float, %)
Event Logger¤
amqtt.plugins.logging_amqtt.EventLoggerPlugin
This plugin issues log messages when broker and mqtt events are triggered:
- info level messages for
client connectedandclient disconnected - debug level for all others
plugins:
amqtt.plugins.logging_amqtt.EventLoggerPlugin:
Packet Logger¤
amqtt.plugins.logging_amqtt.PacketLoggerPlugin
This plugin issues debug-level messages for mqtt events: on_mqtt_packet_sent
and on_mqtt_packet_received.
plugins:
amqtt.plugins.logging_amqtt.PacketLoggerPlugin: