1 |
|
-module(mod_version). |
2 |
|
|
3 |
|
-behaviour(gen_mod). |
4 |
|
-behaviour(mongoose_module_metrics). |
5 |
|
|
6 |
|
-include("jlib.hrl"). |
7 |
|
-include("mongoose_config_spec.hrl"). |
8 |
|
|
9 |
|
-export([start/2]). |
10 |
|
-export([stop/1]). |
11 |
|
-export([supported_features/0]). |
12 |
|
-export([config_spec/0]). |
13 |
|
-export([process_iq/5]). |
14 |
|
|
15 |
|
-ignore_xref([process_iq/5]). |
16 |
|
|
17 |
|
-xep([{xep, 92}, {version, "1.1"}]). |
18 |
|
|
19 |
|
-spec start(mongooseim:host_type(), gen_mod:module_opts()) -> any(). |
20 |
|
start(HostType, #{iqdisc := IQDisc}) -> |
21 |
2 |
gen_iq_handler:add_iq_handler_for_domain(HostType, ?NS_VERSION, ejabberd_local, |
22 |
|
fun ?MODULE:process_iq/5, #{}, IQDisc). |
23 |
|
|
24 |
|
-spec stop(mongooseim:host_type()) -> any(). |
25 |
|
stop(HostType) -> |
26 |
2 |
gen_iq_handler:remove_iq_handler_for_domain(HostType, ?NS_VERSION, ejabberd_local). |
27 |
|
|
28 |
|
-spec supported_features() -> [atom()]. |
29 |
|
supported_features() -> |
30 |
2 |
[dynamic_domains]. |
31 |
|
|
32 |
|
-spec config_spec() -> mongoose_config_spec:config_section(). |
33 |
|
config_spec() -> |
34 |
186 |
#section{ |
35 |
|
items = #{<<"iqdisc">> => mongoose_config_spec:iqdisc(), |
36 |
|
<<"os_info">> => #option{type = boolean} |
37 |
|
}, |
38 |
|
defaults = #{<<"iqdisc">> => no_queue, |
39 |
|
<<"os_info">> => false} |
40 |
|
}. |
41 |
|
|
42 |
|
-spec process_iq(mongoose_acc:t(), jid:jid(), jid:jid(), jlib:iq(), any()) -> |
43 |
|
{mongoose_acc:t(), jlib:iq()}. |
44 |
|
process_iq(Acc, _From, _To, #iq{type = set, sub_el = SubEl} = IQ, _Extra) -> |
45 |
:-( |
{Acc, IQ#iq{type = error, sub_el = [SubEl, mongoose_xmpp_errors:not_allowed()]}}; |
46 |
|
process_iq(Acc, _From, _To, #iq{type = get} = IQ, _Extra) -> |
47 |
2 |
HostType = mongoose_acc:host_type(Acc), |
48 |
2 |
{Name, Version} = mongoose_info(), |
49 |
2 |
{Acc, IQ#iq{type = result, |
50 |
|
sub_el = |
51 |
|
[#xmlel{name = <<"query">>, |
52 |
|
attrs = [{<<"xmlns">>, ?NS_VERSION}], |
53 |
|
children = |
54 |
|
[#xmlel{name = <<"name">>, attrs = [], |
55 |
|
children =[#xmlcdata{content = Name}]}, |
56 |
|
#xmlel{name = <<"version">>, attrs = [], |
57 |
|
children =[#xmlcdata{content = Version}]} |
58 |
|
] ++ add_os_info(HostType)}]}}. |
59 |
|
|
60 |
|
-spec add_os_info(mongooseim:host_type()) -> [exml:element()] | []. |
61 |
|
add_os_info(HostType) -> |
62 |
2 |
case gen_mod:get_module_opt(HostType, ?MODULE, os_info) of |
63 |
|
true -> |
64 |
1 |
[#xmlel{name = <<"os">>, attrs = [], |
65 |
|
children = [#xmlcdata{content = os_info()}]}]; |
66 |
|
_ -> |
67 |
1 |
[] |
68 |
|
end. |
69 |
|
|
70 |
|
-spec mongoose_info() -> {binary(), binary()}. |
71 |
|
mongoose_info() -> |
72 |
2 |
{ok, Version} = application:get_key(mongooseim, vsn), |
73 |
2 |
{<<"MongooseIM">>, list_to_binary(Version)}. |
74 |
|
|
75 |
|
-spec os_info() -> binary(). |
76 |
|
os_info() -> |
77 |
1 |
{Family, Name} = os:type(), |
78 |
1 |
{Major, Minor, Release} = os:version(), |
79 |
1 |
list_to_binary( |
80 |
|
atom_to_list(Family) ++ " " ++ |
81 |
|
atom_to_list(Name) ++ " " ++ |
82 |
|
integer_to_list(Major) ++ "." ++ |
83 |
|
integer_to_list(Minor) ++ "." ++ |
84 |
|
integer_to_list(Release) |
85 |
|
). |