rm bin and fix README
This commit is contained in:
parent
e7ba96b263
commit
1e02cd1363
40
README
40
README
|
@ -1,31 +1,55 @@
|
|||
emqtt
|
||||
=====
|
||||
|
||||
erlang mqtt broker based on rabbitmq network layer.
|
||||
erlang mqtt broker.
|
||||
|
||||
compile
|
||||
requires
|
||||
========
|
||||
|
||||
erlang R15B+
|
||||
|
||||
git client
|
||||
|
||||
build
|
||||
=======
|
||||
|
||||
require erlang R15B+ and git client
|
||||
|
||||
make
|
||||
|
||||
release
|
||||
=======
|
||||
|
||||
#generate a release in rel/emqtt folder
|
||||
|
||||
make generate
|
||||
|
||||
deloy
|
||||
=====
|
||||
|
||||
cp -R rel/emqtt $INSTALL_DIR
|
||||
|
||||
start
|
||||
======
|
||||
|
||||
cd $INSTALL_DRI/emqtt
|
||||
|
||||
#debug mode
|
||||
|
||||
./bin/emqtt console
|
||||
|
||||
#startup
|
||||
|
||||
./bin/emqtt start
|
||||
|
||||
status
|
||||
======
|
||||
|
||||
./bin/emqtt_ctl status
|
||||
|
||||
stop
|
||||
====
|
||||
|
||||
./bin/emqtt stop
|
||||
|
||||
status
|
||||
======
|
||||
./bin/emqtt_ctl status
|
||||
|
||||
logs
|
||||
====
|
||||
|
||||
|
|
179
bin/emqtt
179
bin/emqtt
|
@ -1,179 +0,0 @@
|
|||
#!/bin/bash
|
||||
# -*- tab-width:4;indent-tabs-mode:nil -*-
|
||||
# ex: ts=4 sw=4 et
|
||||
|
||||
RUNNER_SCRIPT_DIR=$(cd ${0%/*} && pwd)
|
||||
|
||||
RUNNER_BASE_DIR=${RUNNER_SCRIPT_DIR%/*}
|
||||
RUNNER_ETC_DIR=$RUNNER_BASE_DIR/etc
|
||||
RUNNER_LOG_DIR=$RUNNER_BASE_DIR/log
|
||||
# Note the trailing slash on $PIPE_DIR/
|
||||
PIPE_DIR=/tmp/$RUNNER_BASE_DIR/
|
||||
RUNNER_USER=
|
||||
|
||||
# Make sure this script is running as the appropriate user
|
||||
if [ ! -z "$RUNNER_USER" ] && [ `whoami` != "$RUNNER_USER" ]; then
|
||||
exec sudo -u $RUNNER_USER -i $0 $@
|
||||
fi
|
||||
|
||||
# Make sure CWD is set to runner base dir
|
||||
cd $RUNNER_BASE_DIR
|
||||
|
||||
# Make sure log directory exists
|
||||
mkdir -p $RUNNER_LOG_DIR
|
||||
# Identify the script name
|
||||
SCRIPT=`basename $0`
|
||||
|
||||
# Parse out release and erts info
|
||||
ERLANG_BASE_DIR=/usr/local/lib/erlang
|
||||
START_ERL=`cat $ERLANG_BASE_DIR/releases/start_erl.data`
|
||||
ERTS_VSN=${START_ERL% *}
|
||||
APP_VSN=${START_ERL#* }
|
||||
|
||||
VMARGS_PATH="$RUNNER_ETC_DIR/emqtt.args"
|
||||
|
||||
CONFIG_PATH="$RUNNER_ETC_DIR/emqtt.config"
|
||||
|
||||
# Extract the target node name from node.args
|
||||
NAME_ARG=`egrep '^-s?name' $VMARGS_PATH`
|
||||
if [ -z "$NAME_ARG" ]; then
|
||||
echo "emqtt.args needs to have either -name or -sname parameter."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Extract the target cookie
|
||||
COOKIE_ARG=`grep '^-setcookie' $VMARGS_PATH`
|
||||
if [ -z "$COOKIE_ARG" ]; then
|
||||
echo "emqtt.args needs to have a -setcookie parameter."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Add ERTS bin dir to our path
|
||||
ERTS_PATH=$ERLANG_BASE_DIR/erts-$ERTS_VSN/bin
|
||||
|
||||
# Setup command to control the node
|
||||
NODETOOL="escript $RUNNER_BASE_DIR/bin/nodetool $NAME_ARG $COOKIE_ARG"
|
||||
|
||||
# Check the first argument for instructions
|
||||
case "$1" in
|
||||
start)
|
||||
# Make sure there is not already a node running
|
||||
RES=`$NODETOOL ping`
|
||||
if [ "$RES" = "pong" ]; then
|
||||
echo "Node is already running!"
|
||||
exit 1
|
||||
fi
|
||||
HEART_COMMAND="$RUNNER_BASE_DIR/bin/$SCRIPT start"
|
||||
export HEART_COMMAND
|
||||
mkdir -p $PIPE_DIR
|
||||
shift # remove $1
|
||||
$ERTS_PATH/run_erl -daemon $PIPE_DIR $RUNNER_LOG_DIR "exec $RUNNER_BASE_DIR/bin/$SCRIPT console $@" 2>&1
|
||||
;;
|
||||
|
||||
stop)
|
||||
# Wait for the node to completely stop...
|
||||
case `uname -s` in
|
||||
Linux|Darwin|FreeBSD|DragonFly|NetBSD|OpenBSD)
|
||||
# PID COMMAND
|
||||
PID=`ps ax -o pid= -o command=|\
|
||||
grep "$RUNNER_BASE_DIR/.*/[b]eam"|awk '{print $1}'`
|
||||
;;
|
||||
SunOS)
|
||||
# PID COMMAND
|
||||
PID=`ps -ef -o pid= -o args=|\
|
||||
grep "$RUNNER_BASE_DIR/.*/[b]eam"|awk '{print $1}'`
|
||||
;;
|
||||
CYGWIN*)
|
||||
# UID PID PPID TTY STIME COMMAND
|
||||
PID=`ps -efW|grep "$RUNNER_BASE_DIR/.*/[b]eam"|awk '{print $2}'`
|
||||
;;
|
||||
esac
|
||||
$NODETOOL stop
|
||||
ES=$?
|
||||
if [ "$ES" -ne 0 ]; then
|
||||
exit $ES
|
||||
fi
|
||||
while `kill -0 $PID 2>/dev/null`;
|
||||
do
|
||||
sleep 1
|
||||
done
|
||||
;;
|
||||
|
||||
restart)
|
||||
## Restart the VM without exiting the process
|
||||
$NODETOOL restart
|
||||
ES=$?
|
||||
if [ "$ES" -ne 0 ]; then
|
||||
exit $ES
|
||||
fi
|
||||
;;
|
||||
|
||||
reboot)
|
||||
## Restart the VM completely (uses heart to restart it)
|
||||
$NODETOOL reboot
|
||||
ES=$?
|
||||
if [ "$ES" -ne 0 ]; then
|
||||
exit $ES
|
||||
fi
|
||||
;;
|
||||
|
||||
ping)
|
||||
## See if the VM is alive
|
||||
$NODETOOL ping
|
||||
ES=$?
|
||||
if [ "$ES" -ne 0 ]; then
|
||||
exit $ES
|
||||
fi
|
||||
;;
|
||||
|
||||
attach)
|
||||
# Make sure a node IS running
|
||||
RES=`$NODETOOL ping`
|
||||
ES=$?
|
||||
if [ "$ES" -ne 0 ]; then
|
||||
echo "Node is not running!"
|
||||
exit $ES
|
||||
fi
|
||||
|
||||
shift
|
||||
exec $ERTS_PATH/to_erl $PIPE_DIR
|
||||
;;
|
||||
|
||||
console)
|
||||
# .boot file typically just $SCRIPT (ie, the app name)
|
||||
# however, for debugging, sometimes start_clean.boot is useful:
|
||||
#case "$1" in
|
||||
# console) BOOTFILE=$SCRIPT ;;
|
||||
# console_clean) BOOTFILE=start_clean ;;
|
||||
#esac
|
||||
# Setup beam-required vars
|
||||
ERL_LIBS=$RUNNER_BASE_DIR/lib
|
||||
ROOTDIR=$RUNNER_BASE_DIR
|
||||
BINDIR=$ERTS_PATH
|
||||
EMU=beam
|
||||
PROGNAME=`echo $0 | sed 's/.*\\///'`
|
||||
CMD="$ERTS_PATH/erl -pa $RUNNER_BASE_DIR/ebin -config $CONFIG_PATH -args_file $VMARGS_PATH -- ${1+"$@"}"
|
||||
export ERL_LIBS
|
||||
export EMU
|
||||
export ROOTDIR
|
||||
export BINDIR
|
||||
export PROGNAME
|
||||
|
||||
# Dump environment info for logging purposes
|
||||
echo "Exec: $CMD"
|
||||
echo "Root: $ROOTDIR"
|
||||
|
||||
# Log the startup
|
||||
logger -t "$SCRIPT[$$]" "Starting up"
|
||||
|
||||
# Start the VM
|
||||
exec $CMD
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: $SCRIPT {start|stop|restart|reboot|ping|console||attach}"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
exit 0
|
159
bin/emqtt_ctl
159
bin/emqtt_ctl
|
@ -1,159 +0,0 @@
|
|||
#!/bin/bash
|
||||
|
||||
RUNNER_SCRIPT_DIR=$(cd ${0%/*} && pwd)
|
||||
|
||||
RUNNER_BASE_DIR=${RUNNER_SCRIPT_DIR%/*}
|
||||
RUNNER_ETC_DIR=$RUNNER_BASE_DIR/etc
|
||||
RUNNER_BIN_DIR=$RUNNER_BASE_DIR/bin
|
||||
RUNNER_LOG_DIR=$RUNNER_BASE_DIR/log
|
||||
|
||||
RUNNER_EBIN_DIR=$RUNNER_BASE_DIR/ebin
|
||||
RUNNER_USER=
|
||||
|
||||
# Make sure CWD is set to runner base dir
|
||||
cd $RUNNER_BASE_DIR
|
||||
|
||||
# Extract the target node name from node.args
|
||||
NAME_ARG=`grep '\-[s]*name' $RUNNER_ETC_DIR/emqtt.args`
|
||||
if [ -z "$NAME_ARG" ]; then
|
||||
echo "emqtt.args needs to have either -name or -sname parameter."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Learn how to specify node name for connection from remote nodes
|
||||
echo "$NAME_ARG" | grep '^-sname' > /dev/null 2>&1
|
||||
if [ "X$?" = "X0" ]; then
|
||||
NAME_PARAM="-sname"
|
||||
NAME_HOST=""
|
||||
else
|
||||
NAME_PARAM="-name"
|
||||
echo "$NAME_ARG" | grep '@.*' > /dev/null 2>&1
|
||||
if [ "X$?" = "X0" ]; then
|
||||
NAME_HOST=`echo "${NAME_ARG}" | sed -e 's/.*\(@.*\)$/\1/'`
|
||||
else
|
||||
NAME_HOST=""
|
||||
fi
|
||||
fi
|
||||
|
||||
# Extract the target cookie
|
||||
COOKIE_ARG=`grep '\-setcookie' $RUNNER_ETC_DIR/emqtt.args`
|
||||
if [ -z "$COOKIE_ARG" ]; then
|
||||
echo "emqtt.args needs to have a -setcookie parameter."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Identify the script name
|
||||
SCRIPT=`basename $0`
|
||||
|
||||
# Parse out release and erts info
|
||||
ERLANG_BASE_DIR=/usr/local/lib/erlang
|
||||
START_ERL=`cat $ERLANG_BASE_DIR/releases/start_erl.data`
|
||||
ERTS_VSN=${START_ERL% *}
|
||||
APP_VSN=${START_ERL#* }
|
||||
|
||||
# Add ERTS bin dir to our path
|
||||
ERTS_PATH=$ERLANG_BASE_DIR/erts-$ERTS_VSN/bin
|
||||
|
||||
# Setup command to control the node
|
||||
NODETOOL="$ERTS_PATH/escript $RUNNER_BIN_DIR/nodetool $NAME_ARG $COOKIE_ARG"
|
||||
|
||||
# Check the first argument for instructions
|
||||
case "$1" in
|
||||
status)
|
||||
if [ $# -ne 1 ]; then
|
||||
echo "Usage: $SCRIPT status"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure the local node IS running
|
||||
RES=`$NODETOOL ping`
|
||||
if [ "$RES" != "pong" ]; then
|
||||
echo "Node is not running!"
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
|
||||
$NODETOOL rpc emqtt_ctl status $@
|
||||
;;
|
||||
|
||||
cluster_info)
|
||||
if [ $# -ne 1 ]; then
|
||||
echo "Usage: $SCRIPT cluster_info"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure the local node IS running
|
||||
RES=`$NODETOOL ping`
|
||||
if [ "$RES" != "pong" ]; then
|
||||
echo "Node is not running!"
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
|
||||
$NODETOOL rpc emqtt_ctl cluster_info $@
|
||||
;;
|
||||
|
||||
|
||||
cluster)
|
||||
if [ $# -ne 2 ]; then
|
||||
echo "Usage: $SCRIPT cluster <Node>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure the local node IS running
|
||||
RES=`$NODETOOL ping`
|
||||
if [ "$RES" != "pong" ]; then
|
||||
echo "emqtt is not running!"
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
|
||||
$NODETOOL rpc emqtt_ctl cluster $@
|
||||
;;
|
||||
|
||||
add_user)
|
||||
if [ $# -ne 3 ]; then
|
||||
echo "Usage: $SCRIPT add_user <Username> <Password>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure the local node IS running
|
||||
RES=`$NODETOOL ping`
|
||||
if [ "$RES" != "pong" ]; then
|
||||
echo "emqtt is not running!"
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
|
||||
$NODETOOL rpc emqtt_ctl add_user $@
|
||||
;;
|
||||
|
||||
delete_user)
|
||||
if [ $# -ne 2 ]; then
|
||||
echo "Usage: $SCRIPT delete_user <Username>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Make sure the local node IS running
|
||||
RES=`$NODETOOL ping`
|
||||
if [ "$RES" != "pong" ]; then
|
||||
echo "emqtt is not running!"
|
||||
exit 1
|
||||
fi
|
||||
shift
|
||||
|
||||
$NODETOOL rpc emqtt_ctl delete_user $@
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "Usage: $SCRIPT"
|
||||
echo " status #query emqtt status"
|
||||
echo " cluster_info #query cluster nodes"
|
||||
echo " cluster <Node> #cluster node"
|
||||
echo " add_user <Username> <Password> #add user"
|
||||
echo " delete_user <Username> #delete user"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
esac
|
||||
|
138
bin/nodetool
138
bin/nodetool
|
@ -1,138 +0,0 @@
|
|||
%% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*-
|
||||
%% ex: ft=erlang ts=4 sw=4 et
|
||||
%% -------------------------------------------------------------------
|
||||
%%
|
||||
%% nodetool: Helper Script for interacting with live nodes
|
||||
%%
|
||||
%% -------------------------------------------------------------------
|
||||
|
||||
main(Args) ->
|
||||
ok = start_epmd(),
|
||||
%% Extract the args
|
||||
{RestArgs, TargetNode} = process_args(Args, [], undefined),
|
||||
|
||||
%% See if the node is currently running -- if it's not, we'll bail
|
||||
case {net_kernel:hidden_connect_node(TargetNode), net_adm:ping(TargetNode)} of
|
||||
{true, pong} ->
|
||||
ok;
|
||||
{_, pang} ->
|
||||
io:format("Node ~p not responding to pings.\n", [TargetNode]),
|
||||
halt(1)
|
||||
end,
|
||||
|
||||
case RestArgs of
|
||||
["ping"] ->
|
||||
%% If we got this far, the node already responsed to a ping, so just dump
|
||||
%% a "pong"
|
||||
io:format("pong\n");
|
||||
["stop"] ->
|
||||
io:format("~p\n", [rpc:call(TargetNode, init, stop, [], 60000)]);
|
||||
["restart"] ->
|
||||
io:format("~p\n", [rpc:call(TargetNode, init, restart, [], 60000)]);
|
||||
["reboot"] ->
|
||||
io:format("~p\n", [rpc:call(TargetNode, init, reboot, [], 60000)]);
|
||||
["rpc", Module, Function | RpcArgs] ->
|
||||
case rpc:call(TargetNode, list_to_atom(Module), list_to_atom(Function),
|
||||
RpcArgs, 60000) of
|
||||
ok ->
|
||||
ok;
|
||||
{badrpc, Reason} ->
|
||||
io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]),
|
||||
halt(1);
|
||||
_ ->
|
||||
halt(1)
|
||||
end;
|
||||
["rpcterms", Module, Function, ArgsAsString] ->
|
||||
case rpc:call(TargetNode, list_to_atom(Module), list_to_atom(Function),
|
||||
consult(ArgsAsString), 60000) of
|
||||
{badrpc, Reason} ->
|
||||
io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]),
|
||||
halt(1);
|
||||
Other ->
|
||||
io:format("~p\n", [Other])
|
||||
end;
|
||||
Other ->
|
||||
io:format("Other: ~p\n", [Other]),
|
||||
io:format("Usage: nodetool {ping|stop|restart|reboot}\n")
|
||||
end,
|
||||
net_kernel:stop().
|
||||
|
||||
process_args([], Acc, TargetNode) ->
|
||||
{lists:reverse(Acc), TargetNode};
|
||||
process_args(["-setcookie", Cookie | Rest], Acc, TargetNode) ->
|
||||
erlang:set_cookie(node(), list_to_atom(Cookie)),
|
||||
process_args(Rest, Acc, TargetNode);
|
||||
process_args(["-name", TargetName | Rest], Acc, _) ->
|
||||
ThisNode = append_node_suffix(TargetName, "_ctrl_"),
|
||||
{ok, _} = net_kernel:start([ThisNode, longnames]),
|
||||
process_args(Rest, Acc, nodename(TargetName));
|
||||
process_args(["-sname", TargetName | Rest], Acc, _) ->
|
||||
ThisNode = append_node_suffix(TargetName, "_ctrl_"),
|
||||
{ok, _} = net_kernel:start([ThisNode, shortnames]),
|
||||
process_args(Rest, Acc, nodename(TargetName));
|
||||
process_args([Arg | Rest], Acc, Opts) ->
|
||||
process_args(Rest, [Arg | Acc], Opts).
|
||||
|
||||
|
||||
start_epmd() ->
|
||||
[] = os:cmd(epmd_path() ++ " -daemon"),
|
||||
ok.
|
||||
|
||||
epmd_path() ->
|
||||
ErtsBinDir = filename:dirname(escript:script_name()),
|
||||
Name = "epmd",
|
||||
case os:find_executable(Name, ErtsBinDir) of
|
||||
false ->
|
||||
case os:find_executable(Name) of
|
||||
false ->
|
||||
io:format("Could not find epmd.~n"),
|
||||
halt(1);
|
||||
GlobalEpmd ->
|
||||
GlobalEpmd
|
||||
end;
|
||||
Epmd ->
|
||||
Epmd
|
||||
end.
|
||||
|
||||
|
||||
nodename(Name) ->
|
||||
case string:tokens(Name, "@") of
|
||||
[_Node, _Host] ->
|
||||
list_to_atom(Name);
|
||||
[Node] ->
|
||||
[_, Host] = string:tokens(atom_to_list(node()), "@"),
|
||||
list_to_atom(lists:concat([Node, "@", Host]))
|
||||
end.
|
||||
|
||||
append_node_suffix(Name, Suffix) ->
|
||||
case string:tokens(Name, "@") of
|
||||
[Node, Host] ->
|
||||
list_to_atom(lists:concat([Node, Suffix, os:getpid(), "@", Host]));
|
||||
[Node] ->
|
||||
list_to_atom(lists:concat([Node, Suffix, os:getpid()]))
|
||||
end.
|
||||
|
||||
|
||||
%%
|
||||
%% Given a string or binary, parse it into a list of terms, ala file:consult/0
|
||||
%%
|
||||
consult(Str) when is_list(Str) ->
|
||||
consult([], Str, []);
|
||||
consult(Bin) when is_binary(Bin)->
|
||||
consult([], binary_to_list(Bin), []).
|
||||
|
||||
consult(Cont, Str, Acc) ->
|
||||
case erl_scan:tokens(Cont, Str, 0) of
|
||||
{done, Result, Remaining} ->
|
||||
case Result of
|
||||
{ok, Tokens, _} ->
|
||||
{ok, Term} = erl_parse:parse_term(Tokens),
|
||||
consult([], Remaining, [Term | Acc]);
|
||||
{eof, _Other} ->
|
||||
lists:reverse(Acc);
|
||||
{error, Info, _} ->
|
||||
{error, Info}
|
||||
end;
|
||||
{more, Cont1} ->
|
||||
consult(Cont1, eof, Acc)
|
||||
end.
|
Loading…
Reference in New Issue