rm bin and fix README
This commit is contained in:
parent
e7ba96b263
commit
1e02cd1363
40
README
40
README
|
@ -1,31 +1,55 @@
|
||||||
emqtt
|
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
|
make
|
||||||
|
|
||||||
|
release
|
||||||
|
=======
|
||||||
|
|
||||||
|
#generate a release in rel/emqtt folder
|
||||||
|
|
||||||
|
make generate
|
||||||
|
|
||||||
|
deloy
|
||||||
|
=====
|
||||||
|
|
||||||
|
cp -R rel/emqtt $INSTALL_DIR
|
||||||
|
|
||||||
start
|
start
|
||||||
======
|
======
|
||||||
|
|
||||||
|
cd $INSTALL_DRI/emqtt
|
||||||
|
|
||||||
|
#debug mode
|
||||||
|
|
||||||
./bin/emqtt console
|
./bin/emqtt console
|
||||||
|
|
||||||
|
#startup
|
||||||
|
|
||||||
./bin/emqtt start
|
./bin/emqtt start
|
||||||
|
|
||||||
|
status
|
||||||
|
======
|
||||||
|
|
||||||
|
./bin/emqtt_ctl status
|
||||||
|
|
||||||
stop
|
stop
|
||||||
====
|
====
|
||||||
|
|
||||||
./bin/emqtt stop
|
./bin/emqtt stop
|
||||||
|
|
||||||
status
|
|
||||||
======
|
|
||||||
./bin/emqtt_ctl status
|
|
||||||
|
|
||||||
logs
|
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