From 25de5ee94d851abfa9a97488209af428d93548ab Mon Sep 17 00:00:00 2001 From: Ery Lee Date: Fri, 13 Mar 2015 11:52:50 +0800 Subject: [PATCH] plugin --- CHANGELOG.md | 28 +++++++++ apps/emqttd/src/emqttd_ctl.erl | 41 +++++++++--- apps/emqttd/src/emqttd_plugin.erl | 5 +- apps/emqttd/src/emqttd_plugin_manager.erl | 59 +++++++++++++++++ rel/files/emqttd_ctl | 77 +++++++++++------------ 5 files changed, 158 insertions(+), 52 deletions(-) create mode 100644 apps/emqttd/src/emqttd_plugin_manager.erl diff --git a/CHANGELOG.md b/CHANGELOG.md index b6d508950..cfd116d6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,34 @@ eMQTTD ChangeLog ================== +v0.8.0-alpha (2015-03-20) +------------------------- + +MQTT/WebSocket + +v0.7.0-alpha (2015-03-20) +------------------------- + +Admin Console + +v0.6.0-alpha (2015-03-20) +------------------------- + +Plugin Architecture + +Mnesia Authentication + +MySQL Auth + +LDAP Auth + +PG Auth + +Mnesia ACL + +MySQL ACL + + v0.5.0-alpha (2015-03-12) ------------------------- diff --git a/apps/emqttd/src/emqttd_ctl.erl b/apps/emqttd/src/emqttd_ctl.erl index a1347f1b8..f09b39cba 100644 --- a/apps/emqttd/src/emqttd_ctl.erl +++ b/apps/emqttd/src/emqttd_ctl.erl @@ -36,11 +36,14 @@ -define(PRINT(Format, Args), io:format(Format, Args)). --export([status/1, cluster/1, - listeners/1, - useradd/1, userdel/1, +-export([status/1, broker/1, - bridges/1, start_bridge/1, stop_bridge/1]). + cluster/1, + listeners/1, + bridges/1, + plugins/1, + useradd/1, + userdel/1]). status([]) -> {InternalStatus, _ProvidedStatus} = init:get_status(), @@ -97,23 +100,42 @@ listeners([]) -> ?PRINT(" current_clients: ~p~n", [esockd:get_current_clients(Pid)]) end, esockd:listeners()). -bridges([]) -> +bridges(["list"]) -> lists:foreach(fun({{Node, Topic}, _Pid}) -> ?PRINT("bridge: ~s ~s~n", [Node, Topic]) - end, emqttd_bridge_sup:bridges()). + end, emqttd_bridge_sup:bridges()); -start_bridge([SNode, Topic]) -> +bridges(["start", SNode, Topic]) -> case emqttd_bridge_sup:start_bridge(list_to_atom(SNode), list_to_binary(Topic)) of {ok, _} -> ?PRINT_MSG("bridge is started.~n"); {error, Error} -> ?PRINT("error: ~p~n", [Error]) - end. + end; -stop_bridge([SNode, Topic]) -> +bridges(["stop", SNode, Topic]) -> case emqttd_bridge_sup:stop_bridge(list_to_atom(SNode), list_to_binary(Topic)) of ok -> ?PRINT_MSG("bridge is stopped.~n"); {error, Error} -> ?PRINT("error: ~p~n", [Error]) end. +plugins(["list"]) -> + Plugins = emqttd_plugin_manager:list(), + lists:foreach(fun({Name, Attrs}) -> + ?PRINT("plugin ~s~n", [Name]), + [?PRINT(" ~s:~p~n", [Attr, Val]) || {Attr, Val} <- Attrs] + end, Plugins); + +plugins(["load", Name]) -> + case emqttd_plugin_manager:load(list_to_atom(Name)) of + ok -> ?PRINT("plugin ~s is loaded successfully.~n", [Name]); + {error, Reason} -> ?PRINT("error: ~s~n", [Reason]) + end; + +plugins(["unload", Name]) -> + case emqttd_plugin_manager:load(list_to_atom(Name)) of + ok -> ?PRINT("plugin ~s is unloaded successfully.~n", [Name]); + {error, Reason} -> ?PRINT("error: ~s~n", [Reason]) + end. + node_name(SNode) -> SNode1 = case string:tokens(SNode, "@") of @@ -132,3 +154,4 @@ node_name(SNode) -> end, list_to_atom(SNode1). + diff --git a/apps/emqttd/src/emqttd_plugin.erl b/apps/emqttd/src/emqttd_plugin.erl index 099966362..c5fbfe342 100644 --- a/apps/emqttd/src/emqttd_plugin.erl +++ b/apps/emqttd/src/emqttd_plugin.erl @@ -20,8 +20,11 @@ %%% SOFTWARE. %%%----------------------------------------------------------------------------- %%% @doc -%%% emqttd plugin framework. +%%% emqttd plugin. %%% %%% @end %%%----------------------------------------------------------------------------- + -module(emqttd_plugin). + +-record(plugin, {name, app, attrs}). diff --git a/apps/emqttd/src/emqttd_plugin_manager.erl b/apps/emqttd/src/emqttd_plugin_manager.erl new file mode 100644 index 000000000..37cfac690 --- /dev/null +++ b/apps/emqttd/src/emqttd_plugin_manager.erl @@ -0,0 +1,59 @@ +%%%----------------------------------------------------------------------------- +%%% @Copyright (C) 2012-2015, Feng Lee +%%% +%%% Permission is hereby granted, free of charge, to any person obtaining a copy +%%% of this software and associated documentation files (the "Software"), to deal +%%% in the Software without restriction, including without limitation the rights +%%% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +%%% copies of the Software, and to permit persons to whom the Software is +%%% furnished to do so, subject to the following conditions: +%%% +%%% The above copyright notice and this permission notice shall be included in all +%%% copies or substantial portions of the Software. +%%% +%%% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +%%% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +%%% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +%%% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +%%% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +%%% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +%%% SOFTWARE. +%%%----------------------------------------------------------------------------- +%%% @doc +%%% emqttd plugin manager. +%%% +%%% @end +%%%----------------------------------------------------------------------------- +-module(emqttd_plugin_manager). + +-export([list/0, load/1, unload/1]). + +%%------------------------------------------------------------------------------ +%% @doc +%% List all loaded plugins. +%% +%% @end +%%------------------------------------------------------------------------------ +list() -> + []. + +%%------------------------------------------------------------------------------ +%% @doc +%% Load Plugin. +%% +%% @end +%%------------------------------------------------------------------------------ +load(Name) when is_atom(Name) -> + ok. + +%%------------------------------------------------------------------------------ +%% @doc +%% Unload Plugin. +%% +%% @end +%%------------------------------------------------------------------------------ +unload(Name) when is_atom(Name) -> + ok. + + + diff --git a/rel/files/emqttd_ctl b/rel/files/emqttd_ctl index 2754cf982..0e75cc5ab 100755 --- a/rel/files/emqttd_ctl +++ b/rel/files/emqttd_ctl @@ -150,7 +150,7 @@ case "$1" in broker) if [ $# -gt 2 ]; then - echo "Usage: $SCRIPT broker [stats | metrics]" + echo "Usage: $SCRIPT broker [status | stats | metrics]" exit 1 fi @@ -166,55 +166,45 @@ case "$1" in ;; bridges) - if [ $# -gt 1 ]; then - echo "Usage: $SCRIPT bridges" - exit 1 - fi # Make sure the local node IS running RES=`$NODETOOL ping` if [ "$RES" != "pong" ]; then echo "emqttd is not running!" exit 1 fi - shift - - $NODETOOL rpc emqttd_ctl bridges $@ - ;; - - start_bridge) - if [ $# -ne 3 ]; then - echo "Usage: $SCRIPT start_bridge " + if [[ $# -eq 2 ]] && [[ $2 = "list" ]]; then + $NODETOOL rpc emqttd_ctl bridges list + elif [ $# -eq 4 ]; then + shift + $NODETOOL rpc emqttd_ctl bridges $@ + else + echo "Usage: " + echo "$SCRIPT bridges list" + echo "$SCRIPT bridges start " + echo "$SCRIPT bridges stop " exit 1 fi - + ;; + plugins) # Make sure the local node IS running RES=`$NODETOOL ping` if [ "$RES" != "pong" ]; then echo "emqttd is not running!" exit 1 fi - shift - - $NODETOOL rpc emqttd_ctl start_bridge $@ - ;; - - stop_bridge) - if [ $# -ne 3 ]; then - echo "Usage: $SCRIPT stop_bridge " + if [ $# -eq 2 && $2 = "list"]; then + $NODETOOL rpc emqttd_ctl plugins list + elif [ $# -eq 3 ]; then + shift + $NODETOOL rpc emqttd_ctl plugins $@ + else + echo "Usage: " + echo "$SCRIPT plugins list" + echo "$SCRIPT plugins load " + echo "$SCRIPT plugins unload " exit 1 fi - - # Make sure the local node IS running - RES=`$NODETOOL ping` - if [ "$RES" != "pong" ]; then - echo "emqttd is not running!" - exit 1 - fi - shift - - $NODETOOL rpc emqttd_ctl stop_bridge $@ ;; - listeners) if [ $# -gt 1 ]; then echo "Usage: $SCRIPT listeners" @@ -233,15 +223,18 @@ case "$1" in *) echo "Usage: $SCRIPT" - echo " status #query emqttd status" - echo " listeners #query emqttd listeners" - echo " broker [stats | metrics] #query broker stats/metrics" - echo " cluster [] #query or cluster nodes" - echo " bridges #query bridges" - echo " start_bridge #start bridge" - echo " stop_bridge #stop bridge" - echo " useradd #add user" - echo " userdel #delete user" + echo " status #query status" + echo " broker [stats | metrics] #query broker stats or metrics" + echo " cluster [] #query or cluster nodes" + echo " plugins list #query loaded plugins" + echo " plugins load #load plugin" + echo " plugins unload #unload plugin" + echo " bridges list #query bridges" + echo " bridges start #start bridge" + echo " bridges stop #stop bridge" + echo " useradd #add user" + echo " userdel #delete user" + echo " listeners #query broker listeners" exit 1 ;;