Merge pull request #7605 from emqx/emqx-conf-function-export

fix: add update_conf function for emqx_conf.
This commit is contained in:
JianBo He 2022-04-13 15:57:40 +08:00 committed by GitHub
commit 79f945fc94
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 126 additions and 44 deletions

View File

@ -255,6 +255,27 @@ end}.
{validator, "range4ports", "must be 1024 to 134217727", {validator, "range4ports", "must be 1024 to 134217727",
fun(X) -> X >= 1024 andalso X =< 134217727 end}. fun(X) -> X >= 1024 andalso X =< 134217727 end}.
{validator, "range:0-2", "must be 0 to 2",
fun(X) -> X >= 0 andalso X =< 2 end}.
{validator, "range:0-128", "must be 0 to 128",
fun(X) -> X >= 0 andalso X =< 128 end}.
{validator, "range:0-65535", "must be 0 to 65535",
fun(X) -> X >= 0 andalso X =< 65535 end}.
{validator, "range:1-65535", "must be 1 to 65535",
fun(X) -> X >= 1 andalso X =< 65535 end}.
{validator, "range:1-9", "must be 1 to 9",
fun(X) -> X >= 1 andalso X =< 9 end}.
{validator, "range:8-15", "must be 8 to 15",
fun(X) -> X >= 8 andalso X =< 15 end}.
{validator, "range:0-1024", "must be 0 to 1024",
fun(X) -> X >= 0 andalso X =< 1024 end}.
%% @doc http://www.erlang.org/doc/man/erl.html#%2bzdbbl %% @doc http://www.erlang.org/doc/man/erl.html#%2bzdbbl
{mapping, "node.dist_buffer_size", "vm_args.+zdbbl", [ {mapping, "node.dist_buffer_size", "vm_args.+zdbbl", [
{datatype, bytesize}, {datatype, bytesize},
@ -290,10 +311,10 @@ end}.
{default, 1000}, {default, 1000},
{datatype, integer}, {datatype, integer},
hidden, hidden,
{validators, ["positive_integer"]} {validators, ["range:0-inf"]}
]}. ]}.
{validator, "positive_integer", "must be a positive integer", {validator, "range:0-inf", "must be non neg_integer",
fun(X) -> X >= 0 end}. fun(X) -> X >= 0 end}.
%% Note: OTP R15 and earlier uses -env ERL_MAX_ETS_TABLES, %% Note: OTP R15 and earlier uses -env ERL_MAX_ETS_TABLES,
@ -758,7 +779,8 @@ end}.
%% @doc Set the Maximum topic levels. %% @doc Set the Maximum topic levels.
{mapping, "mqtt.max_topic_levels", "emqx.max_topic_levels", [ {mapping, "mqtt.max_topic_levels", "emqx.max_topic_levels", [
{default, 128}, {default, 128},
{datatype, integer} {datatype, integer},
{validators, ["range:0-inf"]}
]}. ]}.
%% @doc Set the Maximum QoS allowed. %% @doc Set the Maximum QoS allowed.
@ -771,7 +793,8 @@ end}.
%% @doc Set the Maximum Topic Alias. %% @doc Set the Maximum Topic Alias.
{mapping, "mqtt.max_topic_alias", "emqx.max_topic_alias", [ {mapping, "mqtt.max_topic_alias", "emqx.max_topic_alias", [
{default, 65535}, {default, 65535},
{datatype, integer} {datatype, integer},
{validators, ["range:0-65535"]}
]}. ]}.
%% @doc Whether the server supports MQTT retained messages. %% @doc Whether the server supports MQTT retained messages.
@ -868,7 +891,8 @@ end}.
%% @doc Set the Maximum topic levels. %% @doc Set the Maximum topic levels.
{mapping, "zone.$name.max_topic_levels", "emqx.zones", [ {mapping, "zone.$name.max_topic_levels", "emqx.zones", [
{datatype, integer} {datatype, integer},
{validators, ["range:0-128"]}
]}. ]}.
%% @doc Set the Maximum QoS allowed. %% @doc Set the Maximum QoS allowed.

View File

@ -10,6 +10,8 @@
{load_module, emqx_session, brutal_purge, soft_purge, []}, {load_module, emqx_session, brutal_purge, soft_purge, []},
{load_module, emqx_metrics, brutal_purge, soft_purge, []}, {load_module, emqx_metrics, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{suspend, [esockd_acceptor,emqx_connection, emqx_ws_connection]}, {suspend, [esockd_acceptor,emqx_connection, emqx_ws_connection]},
{load_module, emqx_frame, brutal_purge, soft_purge, []}, {load_module, emqx_frame, brutal_purge, soft_purge, []},
{update, emqx_connection, {advanced, []}}, {update, emqx_connection, {advanced, []}},
@ -37,6 +39,8 @@
{load_module, emqx_channel, brutal_purge, soft_purge, []}, {load_module, emqx_channel, brutal_purge, soft_purge, []},
{load_module, emqx_session, brutal_purge, soft_purge, []}, {load_module, emqx_session, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]}, {suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]},
{load_module, emqx_frame, brutal_purge, soft_purge, []}, {load_module, emqx_frame, brutal_purge, soft_purge, []},
{update, emqx_connection, {advanced, []}}, {update, emqx_connection, {advanced, []}},
@ -80,6 +84,8 @@
{load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<"4.2.4">>, [ {<<"4.2.4">>, [
@ -104,6 +110,8 @@
{load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<"4.2.5">>, [ {<<"4.2.5">>, [
@ -128,6 +136,7 @@
{load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<"4.2.[6-7]">>, [ {<<"4.2.[6-7]">>, [
@ -146,6 +155,8 @@
{load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []},
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<"4.2.8">>, [ {<<"4.2.8">>, [
@ -156,6 +167,8 @@
{load_module, emqx_ws_connection, brutal_purge, soft_purge, []}, {load_module, emqx_ws_connection, brutal_purge, soft_purge, []},
{load_module, emqx_cm, brutal_purge, soft_purge, []}, {load_module, emqx_cm, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []},
{load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []},
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
@ -168,6 +181,8 @@
{load_module, emqx_connection, brutal_purge, soft_purge, []}, {load_module, emqx_connection, brutal_purge, soft_purge, []},
{load_module, emqx_ws_connection, brutal_purge, soft_purge, []}, {load_module, emqx_ws_connection, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []},
{load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []},
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
@ -180,6 +195,9 @@
{load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []},
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
{load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<".*">>, []} {<<".*">>, []}
@ -192,6 +210,8 @@
{load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []},
{load_module, emqx_metrics, brutal_purge, soft_purge, []}, {load_module, emqx_metrics, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]}, {suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]},
{load_module, emqx_frame, brutal_purge, soft_purge, []}, {load_module, emqx_frame, brutal_purge, soft_purge, []},
{update, emqx_connection, {advanced, []}}, {update, emqx_connection, {advanced, []}},
@ -218,6 +238,8 @@
{load_module, emqx_shared_sub, brutal_purge, soft_purge, []}, {load_module, emqx_shared_sub, brutal_purge, soft_purge, []},
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]}, {suspend, [esockd_acceptor, emqx_connection, emqx_ws_connection]},
{load_module, emqx_channel, brutal_purge, soft_purge, []}, {load_module, emqx_channel, brutal_purge, soft_purge, []},
{load_module, emqx_session, brutal_purge, soft_purge, []}, {load_module, emqx_session, brutal_purge, soft_purge, []},
@ -263,6 +285,8 @@
{load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<"4.2.4">>, [ {<<"4.2.4">>, [
@ -287,6 +311,8 @@
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
{load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<"4.2.5">>, [ {<<"4.2.5">>, [
@ -311,6 +337,8 @@
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
{load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<"4.2.[6-7]">>, [ {<<"4.2.[6-7]">>, [
@ -329,6 +357,8 @@
{load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []},
{load_module, emqx_misc,brutal_purge,soft_purge,[]}, {load_module, emqx_misc,brutal_purge,soft_purge,[]},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<"4.2.8">>, [ {<<"4.2.8">>, [
@ -342,6 +372,8 @@
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
{load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<"4.2.9">>, [ {<<"4.2.9">>, [
@ -351,6 +383,8 @@
{load_module, emqx_connection, brutal_purge, soft_purge, []}, {load_module, emqx_connection, brutal_purge, soft_purge, []},
{load_module, emqx_ws_connection, brutal_purge, soft_purge, []}, {load_module, emqx_ws_connection, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []}, {load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []},
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
{load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []},
@ -363,6 +397,9 @@
{load_module, emqx_app, brutal_purge, soft_purge, []}, {load_module, emqx_app, brutal_purge, soft_purge, []},
{load_module, emqx_os_mon, brutal_purge, soft_purge, []}, {load_module, emqx_os_mon, brutal_purge, soft_purge, []},
{load_module, emqx_alarm, brutal_purge, soft_purge, []}, {load_module, emqx_alarm, brutal_purge, soft_purge, []},
{load_module, emqx_limiter, brutal_purge, soft_purge, []},
{load_module, emqx_listeners, brutal_purge, soft_purge, []},
{load_module, emqx_sys, brutal_purge, soft_purge, []},
{load_module, emqx_plugins, brutal_purge, soft_purge, []} {load_module, emqx_plugins, brutal_purge, soft_purge, []}
]}, ]},
{<<".*">>, []} {<<".*">>, []}

View File

@ -23,7 +23,8 @@
, init/4 %% XXX: Compatible with before 4.2 version , init/4 %% XXX: Compatible with before 4.2 version
, info/1 , info/1
, check/2 , check/2
, update_overall_limiter/4 , update_overall_limiter/3
, delete_overall_limiter/1
]). ]).
-record(limiter, { -record(limiter, {
@ -154,14 +155,18 @@ is_message_limiter(conn_messages_routing) -> true;
is_message_limiter(overall_messages_routing) -> true; is_message_limiter(overall_messages_routing) -> true;
is_message_limiter(_) -> false. is_message_limiter(_) -> false.
update_overall_limiter(Zone, Name, Capacity, Interval) -> update_overall_limiter(Zone, Capacity, Interval) ->
case is_overall_limiter(Name) of try
false -> false; esockd_limiter:update({Zone, overall_messages_routing}, Capacity, Interval),
_ -> true
try catch _:_:_ ->
esockd_limiter:update({Zone, Name}, Capacity, Interval), false
true end.
catch _:_:_ ->
false delete_overall_limiter(Zone) ->
end try
esockd_limiter:delete({Zone, overall_messages_routing}),
true
catch _:_:_ ->
false
end. end.

View File

@ -29,6 +29,7 @@
, start_listener/3 , start_listener/3
, stop_listener/1 , stop_listener/1
, stop_listener/3 , stop_listener/3
, update_listeners_env/2
, restart_listener/1 , restart_listener/1
, restart_listener/3 , restart_listener/3
]). ]).
@ -114,6 +115,20 @@ with_port({Addr, Port}, Opts = #{socket_opts := SocketOption}) ->
restart() -> restart() ->
lists:foreach(fun restart_listener/1, emqx:get_env(listeners, [])). lists:foreach(fun restart_listener/1, emqx:get_env(listeners, [])).
update_listeners_env(Action, NewConf = #{name := NewName, proto := NewProto}) ->
Listener = emqx:get_env(listeners, []),
Listener1 = lists:filter(
fun(#{name := Name, proto := Proto}) ->
not (Name =:= NewName andalso Proto =:= NewProto)
end, Listener),
Listener2 =
case Action of
update -> [NewConf | Listener1];
delete -> Listener1
end,
application:set_env(emqx, listeners, Listener2),
ok.
-spec(restart_listener(listener()) -> any()). -spec(restart_listener(listener()) -> any()).
restart_listener({Proto, ListenOn, Options}) -> restart_listener({Proto, ListenOn, Options}) ->
restart_listener(Proto, ListenOn, Options). restart_listener(Proto, ListenOn, Options).

View File

@ -96,7 +96,15 @@ sysdescr() ->
%% @doc Get sys uptime %% @doc Get sys uptime
-spec(uptime() -> string()). -spec(uptime() -> string()).
uptime() -> uptime() ->
gen_server:call(?SYS, uptime). {TotalWallClock, _} = erlang:statistics(wall_clock),
uptime(TotalWallClock div 1000).
uptime(Seconds) ->
{D, {H, M, S}} = calendar:seconds_to_daystime(Seconds),
L0 = [{D, " days"}, {H, " hours"}, {M, " minutes"}, {S, " seconds"}],
L1 = lists:dropwhile(fun({K, _}) -> K =:= 0 end, L0),
L2 = lists:map(fun({Time, Unit}) -> [integer_to_list(Time), Unit] end, L1),
lists:flatten(lists:join(", ", L2)).
%% @doc Get sys datetime %% @doc Get sys datetime
-spec(datetime() -> string()). -spec(datetime() -> string()).
@ -139,9 +147,6 @@ heartbeat(State) ->
tick(State) -> tick(State) ->
State#state{ticker = start_timer(sys_interval(), tick)}. State#state{ticker = start_timer(sys_interval(), tick)}.
handle_call(uptime, _From, State) ->
{reply, uptime(State), State};
handle_call(Req, _From, State) -> handle_call(Req, _From, State) ->
?LOG(error, "Unexpected call: ~p", [Req]), ?LOG(error, "Unexpected call: ~p", [Req]),
{reply, ignored, State}. {reply, ignored, State}.
@ -151,7 +156,7 @@ handle_cast(Msg, State) ->
{noreply, State}. {noreply, State}.
handle_info({timeout, TRef, heartbeat}, State = #state{heartbeat = TRef}) -> handle_info({timeout, TRef, heartbeat}, State = #state{heartbeat = TRef}) ->
publish(uptime, iolist_to_binary(uptime(State))), publish(uptime, iolist_to_binary(uptime())),
publish(datetime, iolist_to_binary(datetime())), publish(datetime, iolist_to_binary(datetime())),
{noreply, heartbeat(State)}; {noreply, heartbeat(State)};
@ -174,24 +179,6 @@ terminate(_Reason, #state{heartbeat = TRef1, ticker = TRef2}) ->
%% Internal functions %% Internal functions
%%----------------------------------------------------------------------------- %%-----------------------------------------------------------------------------
uptime(#state{start_time = Ts}) ->
Secs = timer:now_diff(erlang:timestamp(), Ts) div 1000000,
lists:flatten(uptime(seconds, Secs)).
uptime(seconds, Secs) when Secs < 60 ->
[integer_to_list(Secs), " seconds"];
uptime(seconds, Secs) ->
[uptime(minutes, Secs div 60), integer_to_list(Secs rem 60), " seconds"];
uptime(minutes, M) when M < 60 ->
[integer_to_list(M), " minutes, "];
uptime(minutes, M) ->
[uptime(hours, M div 60), integer_to_list(M rem 60), " minutes, "];
uptime(hours, H) when H < 24 ->
[integer_to_list(H), " hours, "];
uptime(hours, H) ->
[uptime(days, H div 24), integer_to_list(H rem 24), " hours, "];
uptime(days, D) ->
[integer_to_list(D), " days, "].
publish(uptime, Uptime) -> publish(uptime, Uptime) ->
safe_publish(systop(uptime), Uptime); safe_publish(systop(uptime), Uptime);
publish(datetime, Datetime) -> publish(datetime, Datetime) ->

View File

@ -42,10 +42,24 @@ end_per_suite(_Config) ->
% error('TODO'). % error('TODO').
t_uptime(_) -> t_uptime(_) ->
?assertEqual(<<"1 seconds">>, iolist_to_binary(emqx_sys:uptime(seconds, 1))), ?assert(is_list(emqx_sys:uptime())),
?assertEqual(<<"1 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(seconds, 60))), ?assertEqual(<<"1 seconds">>, iolist_to_binary(emqx_sys:uptime(1))),
?assertEqual(<<"1 hours, 0 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(seconds, 3600))), ?assertEqual(<<"1 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(60))),
?assertEqual(<<"1 days, 0 hours, 0 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(seconds, 86400))). ?assertEqual(<<"1 hours, 0 minutes, 0 seconds">>, iolist_to_binary(emqx_sys:uptime(3600))),
?assertEqual(<<"1 hours, 1 minutes, 1 seconds">>, iolist_to_binary(emqx_sys:uptime(3661))),
?assertEqual(<<"1 days, 0 hours, 0 minutes, 0 seconds">>,
iolist_to_binary(emqx_sys:uptime(86400))),
lists:map(fun({D, H, M, S}) ->
Expect = <<
(integer_to_binary(D))/binary, " days, ",
(integer_to_binary(H))/binary, " hours, ",
(integer_to_binary(M))/binary, " minutes, ",
(integer_to_binary(S))/binary, " seconds"
>>,
Actual = iolist_to_binary(emqx_sys:uptime(D * 86400 + H * 3600 + M * 60 + S)),
?assertEqual(Expect, Actual)
end,
[{1, 2, 3, 4}, {10, 20, 30, 40}, {2222, 3, 56, 59}, {59, 23, 59, 59}]).
% t_datetime(_) -> % t_datetime(_) ->
% error('TODO'). % error('TODO').