diff options
-rwxr-xr-x | priv/templates/extended_bin | 11 | ||||
-rw-r--r-- | priv/templates/nodetool | 31 | ||||
-rw-r--r-- | src/rlx_prv_overlay.erl | 4 | ||||
-rw-r--r-- | test/rlx_release_SUITE.erl | 3 | ||||
-rw-r--r-- | test/rlx_test_utils.erl | 1 |
5 files changed, 47 insertions, 3 deletions
diff --git a/priv/templates/extended_bin b/priv/templates/extended_bin index b873958..8c523d9 100755 --- a/priv/templates/extended_bin +++ b/priv/templates/extended_bin @@ -441,9 +441,18 @@ case "$1" in relx_nodetool rpcterms $@ ;; + eval) + # Make sure a node IS running + if ! relx_nodetool "ping" > /dev/null; then + echo "Node is not running!" + exit 1 + fi + shift + relx_nodetool "eval" $@ + ;; *) - echo "Usage: $REL_NAME {start|start_boot <file>|foreground|stop|restart|reboot|pid|ping|console|console_clean|console_boot <file>|attach|remote_console|upgrade|escript|rpc|rpcterms}" + echo "Usage: $REL_NAME {start|start_boot <file>|foreground|stop|restart|reboot|pid|ping|console|console_clean|console_boot <file>|attach|remote_console|upgrade|escript|rpc|rpcterms|eval}" exit 1 ;; esac diff --git a/priv/templates/nodetool b/priv/templates/nodetool index b3cd247..1f409f5 100644 --- a/priv/templates/nodetool +++ b/priv/templates/nodetool @@ -52,9 +52,38 @@ main(Args) -> Other -> io:format("~p\n", [Other]) end; + ["eval" | ListOfArgs] -> + % shells may process args into more than one, and end up stripping + % spaces, so this converts all of that to a single string to parse + String = binary_to_list( + list_to_binary( + string:join(ListOfArgs," ") + ) + ), + + % then just as a convenience to users, if they forgot a trailing + % '.' add it for them. + Normalized = + case lists:reverse(String) of + [$. | _] -> String; + R -> lists:reverse([$. | R]) + end, + + % then scan and parse the string + {ok, Scanned, _} = erl_scan:string(Normalized), + {ok, Parsed } = erl_parse:parse_exprs(Scanned), + + % and evaluate it on the remote node + case rpc:call(TargetNode, erl_eval, exprs, [Parsed, [] ]) of + {value, Value, _} -> + io:format ("~p\n",[Value]); + {badrpc, Reason} -> + io:format("RPC to ~p failed: ~p\n", [TargetNode, Reason]), + halt(1) + end; Other -> io:format("Other: ~p\n", [Other]), - io:format("Usage: nodetool {ping|stop|restart|reboot|rpc|rpcterms} [RPC]\n") + io:format("Usage: nodetool {ping|stop|restart|reboot|rpc|rpcterms|eval [Terms]} [RPC]\n") end, net_kernel:stop(). diff --git a/src/rlx_prv_overlay.erl b/src/rlx_prv_overlay.erl index 412e5ba..becdb32 100644 --- a/src/rlx_prv_overlay.erl +++ b/src/rlx_prv_overlay.erl @@ -197,7 +197,9 @@ merge_overlay_vars(State, FileNames) -> %% to the current one being read OverlayRelativeRoot = filename:dirname(FileName), NewTerms = check_overlay_inclusion(State, OverlayRelativeRoot, Terms), - lists:ukeymerge(1, lists:ukeysort(1, NewTerms), Acc); + lists:foldl(fun(NewTerm, A) -> + lists:keystore(element(1, NewTerm), 1, A, NewTerm) + end, Acc, NewTerms); {error, Reason} -> ec_cmd_log:warn(rlx_state:log(State), format_error({unable_to_read_varsfile, FileName, Reason})), diff --git a/test/rlx_release_SUITE.erl b/test/rlx_release_SUITE.erl index 710370a..780b1c8 100644 --- a/test/rlx_release_SUITE.erl +++ b/test/rlx_release_SUITE.erl @@ -550,6 +550,7 @@ overlay_release(Config) -> VarsFile1 = filename:join([LibDir1, "vars1.config"]), rlx_test_utils:write_config(VarsFile1, [{yahoo, "yahoo"}, {yahoo2, [{foo, "bar"}]}, + {foo_yahoo, "foo_{{yahoo}}"}, {foo_dir, "foodir"}]), VarsFile2 = filename:join([LibDir1, "vars2.config"]), @@ -610,6 +611,8 @@ overlay_release(Config) -> proplists:get_value(release_name, TemplateData)), ?assertEqual("yahoo/foo4", proplists:get_value(yahoo4, TemplateData)), + ?assertEqual("foo_yahoo", + proplists:get_value(foo_yahoo, TemplateData)), ?assertEqual("yahoo", proplists:get_value(google, TemplateData)). diff --git a/test/rlx_test_utils.erl b/test/rlx_test_utils.erl index 9db2835..1157e3f 100644 --- a/test/rlx_test_utils.erl +++ b/test/rlx_test_utils.erl @@ -77,4 +77,5 @@ test_template_contents() -> "{yahoo4, \"{{yahoo4}}\"}.\n" "{yahoo, \"{{yahoo}}\"}.\n" "{foo_dir, \"{{foo_dir}}\"}.\n" + "{foo_yahoo, \"{{foo_yahoo}}\"}.\n" "{google, \"{{google}}\"}.\n". |