1 |
|
-module(mongoose_server_api). |
2 |
|
|
3 |
|
-export([get_loglevel_mongooseimctl/0]). |
4 |
|
|
5 |
|
-export([status/0, get_cookie/0, join_cluster/1, leave_cluster/0, |
6 |
|
remove_from_cluster/1, stop/0, restart/0, remove_node/1, set_loglevel/1, |
7 |
|
get_loglevel/0]). |
8 |
|
|
9 |
|
-ignore_xref([get_loglevel_mongooseimctl/0]). |
10 |
|
|
11 |
|
-spec get_loglevel_mongooseimctl() -> {ok, iolist()}. |
12 |
|
get_loglevel_mongooseimctl() -> |
13 |
:-( |
Level = mongoose_logs:get_global_loglevel(), |
14 |
:-( |
Number = mongoose_logs:loglevel_keyword_to_number(Level), |
15 |
:-( |
String = io_lib:format("global loglevel is ~p, which means '~p'", [Number, Level]), |
16 |
:-( |
{ok, String}. |
17 |
|
|
18 |
|
-spec get_loglevel() -> {ok, mongoose_logs:atom_log_level()}. |
19 |
|
get_loglevel() -> |
20 |
20 |
{ok, mongoose_logs:get_global_loglevel()}. |
21 |
|
|
22 |
|
-spec set_loglevel(mongoose_logs:atom_log_level()) -> {ok, iolist()} | {invalid_level, iolist()}. |
23 |
|
set_loglevel(Level) -> |
24 |
20 |
case mongoose_logs:set_global_loglevel(Level) of |
25 |
|
ok -> |
26 |
20 |
{ok, "Log level successfully set."}; |
27 |
|
{error, _} -> |
28 |
:-( |
{invalid_level, io_lib:format("Log level ~p does not exist.", [Level])} |
29 |
|
end. |
30 |
|
|
31 |
|
-spec status() -> {ok, {boolean(), iolist(), iolist()}}. |
32 |
|
status() -> |
33 |
2 |
{InternalStatus, ProvidedStatus} = init:get_status(), |
34 |
2 |
String1 = io_lib:format("The node ~p is ~p. Status: ~p.", |
35 |
|
[node(), InternalStatus, ProvidedStatus]), |
36 |
2 |
Result = |
37 |
|
case lists:keysearch(mongooseim, 1, application:which_applications()) of |
38 |
|
false -> |
39 |
:-( |
{false, String1 ++ " MongooseIM is not running in that node.", |
40 |
|
"MongooseIM is not running in that node"}; |
41 |
|
{value, {_, _, Version}} -> |
42 |
2 |
{true, |
43 |
|
String1 ++ io_lib:format(" MongooseIM ~s is running in that node.", [Version]), |
44 |
|
lists:nth(1, string:split(Version, "-"))} |
45 |
|
end, |
46 |
2 |
{ok, Result}. |
47 |
|
|
48 |
|
-spec get_cookie() -> {ok, iolist()}. |
49 |
|
get_cookie() -> |
50 |
2 |
{ok, atom_to_list(erlang:get_cookie())}. |
51 |
|
|
52 |
|
-spec join_cluster(string()) -> {ok, iolist()} |
53 |
|
| {pang | already_joined | mnesia_error | error, iolist()}. |
54 |
|
join_cluster(NodeString) -> |
55 |
9 |
NodeAtom = list_to_atom(NodeString), |
56 |
9 |
NodeList = mnesia:system_info(db_nodes), |
57 |
9 |
case lists:member(NodeAtom, NodeList) of |
58 |
|
true -> |
59 |
1 |
String = io_lib:format( |
60 |
|
"The MongooseIM node ~s has already joined the cluster.", [NodeString]), |
61 |
1 |
{already_joined, String}; |
62 |
|
_ -> |
63 |
8 |
do_join_cluster(NodeAtom) |
64 |
|
end. |
65 |
|
|
66 |
|
do_join_cluster(Node) -> |
67 |
8 |
try mongoose_cluster:join(Node) of |
68 |
|
ok -> |
69 |
7 |
String = io_lib:format("You have successfully added the MongooseIM node" |
70 |
|
" ~p to the cluster with node member ~p.", [node(), Node]), |
71 |
7 |
{ok, String} |
72 |
|
catch |
73 |
|
error:pang -> |
74 |
1 |
String = io_lib:format( |
75 |
|
"Timeout while attempting to connect to a MongooseIM node ~s~n", [Node]), |
76 |
1 |
{pang, String}; |
77 |
|
error:{cant_get_storage_type, {T, E, R}} -> |
78 |
:-( |
String = |
79 |
|
io_lib:format("Cannot get storage type for table ~p. Reason: ~p:~p", [T, E, R]), |
80 |
:-( |
{mnesia_error, String}; |
81 |
|
E:R -> |
82 |
:-( |
String = |
83 |
|
io_lib:format("Failed to join the cluster. Reason: ~p:~p", [E, R]), |
84 |
:-( |
{error, String} |
85 |
|
end. |
86 |
|
|
87 |
|
-spec leave_cluster() -> {ok, string()} | {error | not_in_cluster, iolist()}. |
88 |
|
leave_cluster() -> |
89 |
9 |
NodeList = mnesia:system_info(running_db_nodes), |
90 |
9 |
ThisNode = node(), |
91 |
9 |
case NodeList of |
92 |
|
[ThisNode] -> |
93 |
5 |
String = io_lib:format("The MongooseIM node ~p is not in the cluster~n", [node()]), |
94 |
5 |
{not_in_cluster, String}; |
95 |
|
_ -> |
96 |
4 |
do_leave_cluster() |
97 |
|
end. |
98 |
|
|
99 |
|
do_leave_cluster() -> |
100 |
4 |
try mongoose_cluster:leave() of |
101 |
|
ok -> |
102 |
4 |
String = io_lib:format( |
103 |
|
"The MongooseIM node ~p has successfully left the cluster~n", [node()]), |
104 |
4 |
{ok, String} |
105 |
|
catch |
106 |
|
E:R -> |
107 |
:-( |
String = io_lib:format("Failed to leave the cluster. Reason: ~p:~p", [E, R]), |
108 |
:-( |
{error, String} |
109 |
|
end. |
110 |
|
|
111 |
|
-spec remove_from_cluster(string()) -> {ok, iolist()} | |
112 |
|
{node_is_alive | mnesia_error | rpc_error, iolist()}. |
113 |
|
remove_from_cluster(NodeString) -> |
114 |
4 |
Node = list_to_atom(NodeString), |
115 |
4 |
IsNodeAlive = mongoose_cluster:is_node_alive(Node), |
116 |
4 |
case IsNodeAlive of |
117 |
|
true -> |
118 |
2 |
remove_rpc_alive_node(Node); |
119 |
|
false -> |
120 |
2 |
remove_dead_node(Node) |
121 |
|
end. |
122 |
|
|
123 |
|
remove_dead_node(DeadNode) -> |
124 |
2 |
try mongoose_cluster:remove_from_cluster(DeadNode) of |
125 |
|
ok -> |
126 |
2 |
String = |
127 |
|
io_lib:format( |
128 |
|
"The dead MongooseIM node ~p has been removed from the cluster~n", [DeadNode]), |
129 |
2 |
{ok, String} |
130 |
|
catch |
131 |
|
error:{node_is_alive, DeadNode} -> |
132 |
:-( |
String = io_lib:format( |
133 |
|
"The MongooseIM node ~p is alive but shoud not be.", [DeadNode]), |
134 |
:-( |
{node_is_alive, String}; |
135 |
|
error:{del_table_copy_schema, R} -> |
136 |
:-( |
String = io_lib:format("Cannot delete table schema. Reason: ~p", [R]), |
137 |
:-( |
{mnesia_error, String} |
138 |
|
end. |
139 |
|
|
140 |
|
remove_rpc_alive_node(AliveNode) -> |
141 |
2 |
case rpc:call(AliveNode, mongoose_cluster, leave, []) of |
142 |
|
{badrpc, Reason} -> |
143 |
:-( |
String = |
144 |
|
io_lib:format( |
145 |
|
"Cannot remove the MongooseIM node ~p~n. RPC Reason: ~p", [AliveNode, Reason]), |
146 |
:-( |
{rpc_error, String}; |
147 |
|
ok -> |
148 |
2 |
String = io_lib:format( |
149 |
|
"The MongooseIM node ~p has been removed from the cluster", [AliveNode]), |
150 |
2 |
{ok, String}; |
151 |
|
Unknown -> |
152 |
:-( |
String = io_lib:format("Unknown error: ~p", [Unknown]), |
153 |
:-( |
{rpc_error, String} |
154 |
|
end. |
155 |
|
|
156 |
|
-spec stop() -> ok. |
157 |
|
stop() -> |
158 |
:-( |
timer:sleep(500), |
159 |
:-( |
init:stop(). |
160 |
|
|
161 |
|
-spec restart() -> ok. |
162 |
|
restart() -> |
163 |
:-( |
timer:sleep(500), |
164 |
:-( |
init:restart(). |
165 |
|
|
166 |
|
-spec remove_node(string()) -> {ok, iolist()}. |
167 |
|
remove_node(Node) -> |
168 |
:-( |
mnesia:del_table_copy(schema, list_to_atom(Node)), |
169 |
:-( |
{ok, "MongooseIM node removed from the Mnesia schema"}. |