Feng il y a 10 ans
Parent
commit
b94776a42d
1 fichiers modifiés avec 441 ajouts et 18 suppressions
  1. 441 18
      docs/source/plugins.rst

+ 441 - 18
docs/source/plugins.rst

@@ -5,43 +5,466 @@
 Plugins
 =======
 
-------------------------------------
-emqttd_plugin_template
-------------------------------------
+The emqttd broker could be extended by plugins. Users could develop plugins to customize authentication, ACL and functions of the broker, or integrate the broker with other systems.
 
------------------------------------
+The plugins that emqtt project released:
+
++---------------------------+---------------------------+
+| Plugin                    | Description               |
++===========================+===========================+
+| `emqttd_plugin_template`_ | Plugin Template           |
++---------------------------+---------------------------+
+| `emqttd_dashboard`_       | Web Dashboard             |
++---------------------------+---------------------------+
+| `emqttd_plugin_mysql`_    | MySQL Auth/ACL Plugin     |
++---------------------------+---------------------------+
+| `emqttd_plugin_pgsql`_    | PostgreSQL Auth/ACL Plugin|
++---------------------------+---------------------------+
+| `emqttd_plugin_redis`_    | Redis Auth/ACL Plugin     |
++---------------------------+---------------------------+
+| `emqttd_stomp`_           | Stomp Protocol Plugin     |
++---------------------------+---------------------------+
+| `emqttd_sockjs`_          | Stomp over SockJS Plugin  |
++---------------------------+---------------------------+
+| `emqttd_recon`_           | Recon Plugin              |
++---------------------------+---------------------------+
+
+----------------------------------------
+emqttd_plugin_template - Plugin Template
+----------------------------------------
+
+A plugin is just a normal Erlang application under the 'emqttd/plugins' folder. Each plugin has e configuration file: 'etc/plugin.config'.
+
+plugins/emqttd_plugin_template is a demo plugin: 
+
++------------------------+---------------------------+
+| File                   | Description               |
++========================+===========================+
+| etc/plugin.config      | Plugin config file        |
++------------------------+---------------------------+
+| ebin/                  | Erlang program files      |
++------------------------+---------------------------+
+
+Load, unload Plugin
+-------------------
+
+Use 'bin/emqttd_ctl plugins' CLI to load, unload a plugin::
+
+    ./bin/emqttd_ctl plugins load <PluginName>
+
+    ./bin/emqttd_ctl plugins unload <PluginName>
+
+    ./bin/emqttd_ctl plugins list
+
+----------------------------------
 emqttd_dashboard: Dashboard Plugin
------------------------------------
+----------------------------------
+
+The Web Dashboard of emqttd broker. Address: http://localhost:18083, Default User: admin, Password: public
+
+.. image:: _static/images/dashboard.png
 
 Configure Dashboard
---------------------
+-------------------
+
+plugins/emqttd_dashboard/etc/plugin.config::
+
+    [
+      {emqttd_dashboard, [
+        {default_admin, [
+          {login, "admin"},
+          {password, "public"}
+        ]},
+        {listener,
+          {emqttd_dashboard, 18083, [
+            {acceptors, 4},
+            {max_clients, 512}]}
+        }
+      ]}
+    ].
 
 -------------------------------------------
-emqttd_plugin_mysql: 
+emqttd_plugin_mysql - MySQL Auth/ACL Plugin
 -------------------------------------------
 
+MQTT Authentication, ACL with MySQL database.
+
+MQTT User Table
+---------------
+
+.. code:: sql
+
+    CREATE TABLE `mqtt_user` (
+      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+      `username` varchar(100) DEFAULT NULL,
+      `password` varchar(100) DEFAULT NULL,
+      `salt` varchar(20) DEFAULT NULL,
+      `created` datetime DEFAULT NULL,
+      PRIMARY KEY (`id`),
+      UNIQUE KEY `mqtt_username` (`username`)
+    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+MQTT ACL Table
+--------------
+
+.. code:: sql
+
+    CREATE TABLE `mqtt_acl` (
+      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+      `allow` int(1) DEFAULT NULL COMMENT '0: deny, 1: allow',
+      `ipaddr` varchar(60) DEFAULT NULL COMMENT 'IpAddress',
+      `username` varchar(100) DEFAULT NULL COMMENT 'Username',
+      `clientid` varchar(100) DEFAULT NULL COMMENT 'ClientId',
+      `access` int(2) NOT NULL COMMENT '1: subscribe, 2: publish, 3: pubsub',
+      `topic` varchar(100) NOT NULL DEFAULT '' COMMENT 'Topic Filter',
+      PRIMARY KEY (`id`)
+    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+
+emqttd_plugin_mysql/etc/plugin.config
+-------------------------------------
+
+Configure MySQL host, username, password and database::
+
+    [
+
+    {emqttd_plugin_mysql, [
+
+        {mysql_pool, [
+            %% ecpool options
+            {pool_size, 4},
+            {auto_reconnect, 3},
+
+            %% mysql options
+            {host,     "localhost"},
+            {port,     3306},
+            {user,     ""},
+            {password, ""},
+            {database, "mqtt"},
+            {encoding, utf8}
+        ]},
+
+        %% select password only
+        {authquery, "select password from mqtt_user where username = '%u' limit 1"},
+
+        %% hash algorithm: md5, sha, sha256, pbkdf2?
+        {password_hash, sha256},
+
+        %% select password with salt
+        %% {authquery, "select password, salt from mqtt_user where username = '%u'"},
+
+        %% sha256 with salt prefix
+        %% {password_hash, {salt, sha256}},
+
+        %% sha256 with salt suffix
+        %% {password_hash, {sha256, salt}},
+
+        %% comment this query, the acl will be disabled
+        {aclquery, "select * from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c'"},
+
+        %% If no rules matched, return...
+        {acl_nomatch, allow}
+    ]}
+    ].
+
+Load emqttd_plugin_mysql plugin
+-------------------------------
+
+.. code::
+
+    ./bin/emqttd_ctl plugins load emqttd_plugin_mysql
+
 ------------------------------------------------
-emqttd_plugin_pgsql: 
+emqttd_plugin_pgsql - PostgreSQL Auth/ACL Plugin
 ------------------------------------------------
 
---------------------------------------------
-emqttd_plugin_redis: 
---------------------------------------------
+MQTT Authentication, ACL with PostgreSQL Database.
+
+MQTT User Table
+---------------
+
+.. code:: sql
+
+    CREATE TABLE mqtt_user (
+      id SERIAL primary key,
+      username character varying(100),
+      password character varying(100),
+      salt character varying(40)
+    );
+
+MQTT ACL Table
+--------------
+
+.. code:: sql
+
+    CREATE TABLE mqtt_acl (
+      id SERIAL primary key,
+      allow integer,
+      ipaddr character varying(60),
+      username character varying(100),
+      clientid character varying(100),
+      access  integer,
+      topic character varying(100)
+    );
+
+    INSERT INTO mqtt_acl (id, allow, ipaddr, username, clientid, access, topic)
+    VALUES
+        (1,1,NULL,'$all',NULL,2,'#'),
+        (2,0,NULL,'$all',NULL,1,'$SYS/#'),
+        (3,0,NULL,'$all',NULL,1,'eq #'),
+        (5,1,'127.0.0.1',NULL,NULL,2,'$SYS/#'),
+        (6,1,'127.0.0.1',NULL,NULL,2,'#'),
+        (7,1,NULL,'dashboard',NULL,1,'$SYS/#');
+
+Configure emqttd_plugin_pgsql/etc/plugin.config
+-----------------------------------------------
+
+Configure host, username, password and database of PostgreSQL::
+
+    [
+
+      {emqttd_plugin_pgsql, [
+
+        {pgsql_pool, [
+          %% ecpool options
+          {pool_size, 4},
+          {auto_reconnect, 3},
+
+          %% pgsql options
+          {host, "localhost"},
+          {port, 5432},
+          {username, "feng"},
+          {password, ""},
+          {database, "mqtt"},
+          {encoding,  utf8}
+        ]},
+
+        %% select password only
+        {authquery, "select password from mqtt_user where username = '%u' limit 1"},
+
+        %% hash algorithm: md5, sha, sha256, pbkdf2?
+        {password_hash, sha256},
+
+        %% select password with salt
+        %% {authquery, "select password, salt from mqtt_user where username = '%u'"},
+
+        %% sha256 with salt prefix
+        %% {password_hash, {salt, sha256}},
+
+        %% sha256 with salt suffix
+        %% {password_hash, {sha256, salt}},
+
+        %% Comment this query, the acl will be disabled. Notice: don't edit this query!
+        {aclquery, "select allow, ipaddr, username, clientid, access, topic from mqtt_acl
+                     where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c'"},
+
+        %% If no rules matched, return...
+        {acl_nomatch, allow}
+      ]}
+    ].
+
+Load emqttd_plugin_pgsql Plugin
+-------------------------------
+
+.. code:: shell
+
+    ./bin/emqttd_ctl plugins load emqttd_plugin_pgsql
+
+-------------------------------------------
+emqttd_plugin_redis - Redis Auth/ACL Plugin
+-------------------------------------------
+
+MQTT Authentication, ACL with Redis.
+
+Configure emqttd_plugin_redis/etc/plugin.config
+-----------------------------------------------
+
+.. code:: erlang
+
+    [
+      {emqttd_plugin_redis, [
+
+        {eredis_pool, [
+          %% ecpool options
+          {pool_size, 8},
+          {auto_reconnect, 2},
+
+          %% eredis options
+          {host, "127.0.0.1"},
+          {port, 6379},
+          {database, 0},
+          {password, ""}
+        ]},
+
+        %% HMGET mqtt_user:%u password
+        {authcmd, ["HGET", "mqtt_user:%u", "password"]},
+
+        %% Password hash algorithm: plain, md5, sha, sha256, pbkdf2?
+        {password_hash, sha256},
+
+        %% SMEMBERS mqtt_acl:%u
+        {aclcmd, ["SMEMBERS", "mqtt_acl:%u"]},
+
+        %% If no rules matched, return...
+        {acl_nomatch, deny},
+
+        %% Store subscriptions to redis when SUBSCRIBE packets received.
+        {subcmd, ["HMSET", "mqtt_subs:%u"]},
+
+        %% Load Subscriptions form Redis when client connected.
+        {loadsub, ["HGETALL", "mqtt_subs:%u"]},
+
+        %% Remove subscriptions from redis when UNSUBSCRIBE packets received.
+        {unsubcmd, ["HDEL", "mqtt_subs:%u"]}
+
+      ]}
+    ].
+
+Load emqttd_plugin_redis Plugin
+-------------------------------
+
+.. code:: console
+
+    ./bin/emqttd_ctl plugins load emqttd_plugin_redis
 
 -----------------------------
-emqttd_stomp: 
+emqttd_stomp - STOMP Protocol
 -----------------------------
 
---------------------------------
-emqttd_sockjs: 
---------------------------------
+Support STOMP 1.0/1.1/1.2 clients to connect to emqttd broker and communicate with MQTT Clients.
+
+Configure emqttd_stomp/etc/plugin.config
+----------------------------------------
+
+.. NOTE:: TCP Port for STOMP Protocol: 61613
+
+.. code:: erlang
+
+    [
+      {emqttd_stomp, [
+
+        {default_user, [
+            {login,    "guest"},
+            {passcode, "guest"}
+        ]},
+
+        {allow_anonymous, true},
 
---------------------------------
-emqttd_recon: Recon Plugin
---------------------------------
+        %%TODO: unused...
+        {frame, [
+          {max_headers,       10},
+          {max_header_length, 1024},
+          {max_body_length,   8192}
+        ]},
 
+        {listeners, [
+          {emqttd_stomp, 61613, [
+            {acceptors,   4},
+            {max_clients, 512}
+          ]}
+        ]}
+
+      ]}
+    ].
+
+Load emqttd_stomp Plugin
+------------------------
+
+.. code::
+
+    ./bin/emqttd_ctl plugins load emqttd_stomp
+
+
+-----------------------------------
+emqttd_sockjs - Stomp/SockJS Plugin
+-----------------------------------
+
+emqttd_sockjs plugin enables web browser to connect to emqttd broker and communicate with MQTT clients.
+
+.. NOTE:: Default TCP Port: 61616
+
+Configure emqttd_sockjs
+-----------------------
+
+.. code:: erlang
+
+    [
+      {emqttd_sockjs, [
+
+        {sockjs, []},
+
+        {cowboy_listener, {stomp_sockjs, 61616, 4}},
+
+      ]}
+    ].
+
+Load emqttd_sockjs Plugin
 -------------------------
+
+.. NOTE:: emqttd_stomp Plugin required.
+
+.. code:: console
+
+    ./bin/emqttd_ctl plugins load emqttd_stomp
+
+    ./bin/emqttd_ctl plugins load emqttd_sockjs
+
+SockJS Demo Page
+----------------
+
+http://localhost:61616/index.html
+
+---------------------------
+emqttd_recon - Recon Plugin
+---------------------------
+
+The plugin will load `recon`_ library on a running emqttd broker. Recon libray helps to debug and optimize an Erlang application.
+
+Load emqttd_recon Plugin
+------------------------
+
+.. code:: console
+
+    ./bin/emqttd_ctl plugins load emqttd_recon
+
+Recon CLI
+---------
+
+.. code:: console
+
+    ./bin/emqttd_ctl recon
+
+    recon memory                 #recon_alloc:memory/2
+    recon allocated              #recon_alloc:memory(allocated_types, current|max)
+    recon bin_leak               #recon:bin_leak(100)
+    recon node_stats             #recon:node_stats(10, 1000)
+    recon remote_load Mod        #recon:remote_load(Mod)
+
+
+------------------------
 Plugin Development Guide
+------------------------
+
+Create a Plugin Project
+-----------------------
+
+Register Auth/ACL Modules
 -------------------------
 
+Register Handlers for Hooks
+---------------------------
+
+Register CLI Modules
+--------------------
+
+
+.. _emqttd_dashboard:       https://github.com/emqtt/emqttd_dashboard
+.. _emqttd_plugin_mysql:    https://github.com/emqtt/emqttd_plugin_mysql
+.. _emqttd_plugin_pgsql:    https://github.com/emqtt/emqttd_plugin_pgsql
+.. _emqttd_plugin_redis:    https://github.com/emqtt/emqttd_plugin_redis
+.. _emqttd_stomp:           https://github.com/emqtt/emqttd_stomp
+.. _emqttd_sockjs:          https://github.com/emqtt/emqttd_sockjs
+.. _emqttd_recon:           https://github.com/emqtt/emqttd_recon
+.. _emqttd_plugin_template: https://github.com/emqtt/emqttd_plugin_template
+.. _recon:                  http://ferd.github.io/recon/