=== Test case: config_parser_SUITE:instrumentation/1 (click for source code)
=== Config value:
[{watchdog,<0.73165.0>},
{tc_logfile,"/home/circleci/project/_build/test/logs/ct_run.mongooseim@localhost.2024-03-11_11.26.15/lib.mongooseim.logs/run.2024-03-11_11.26.16/config_parser_suite.instrumentation.22786.html"},
{tc_group_properties,[{name,instrumentation},parallel]},
{tc_group_path,[]},
{data_dir,"/home/circleci/project/_build/test/lib/mongooseim/test/config_parser_SUITE_data/"},
{priv_dir,"/home/circleci/project/_build/test/logs/ct_run.mongooseim@localhost.2024-03-11_11.26.15/lib.mongooseim.logs/run.2024-03-11_11.26.16/log_private/"}]
=== Current directory is "/home/circleci/project/_build/test/logs/ct_run.mongooseim@localhost.2024-03-11_11.26.15"
=== Started at 2024-03-11 11:26:48
*** CT Error Notification 2024-03-11 11:26:48.369 ***🔗
mongoose_config_parser_toml:process failed on line 77
Reason: {{config_error,"Could not read the TOML configuration file",[...]},
[{mongoose_config_parser_toml,...},{...}|...]}
Full error description and stacktrace
=== Ended at 2024-03-11 11:26:48
=== Location: [{mongoose_config_parser_toml,process,77},
{config_parser_SUITE,parse,3050},
{config_parser_SUITE,instrumentation,2931},
{test_server,ts_tc,1793},
{test_server,run_test_case_eval1,1302},
{test_server,run_test_case_eval,1234}]
=== === Reason: {config_error,"Could not read the TOML configuration file",
[#{reason => unexpected_key,
text => "TOML configuration error: Malformed node",
stacktrace =>
[{mongoose_config_parser_toml,get_spec_for_key,2,
[{file,
"/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
{line,116}]},
{mongoose_config_parser_toml,
'-parse_section/3-fun-1-',4,
[{file,
"/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
{line,102}]},
{maps,map_1,3,[{file,"maps.erl"},{line,441}]},
{maps,map_1,3,[{file,"maps.erl"},{line,441}]},
{maps,map,2,[{file,"maps.erl"},{line,426}]},
{mongoose_config_parser_toml,parse_section,3,
[{file,
"/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
{line,102}]},
{mongoose_config_parser_toml,handle_step,4,
[{file,
"/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
{line,155}]},
{mongoose_config_parser_toml,try_step,5,
[{file,
"/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
{line,264}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1594}]},
{mongoose_config_parser_toml,process,1,
[{file,
"/home/circleci/project/src/config/mongoose_config_parser_toml.erl"},
{line,70}]},
{config_parser_SUITE,parse,1,
[{file,
"/home/circleci/project/test/config_parser_SUITE.erl"},
{line,3050}]},
{config_parser_SUITE,instrumentation,1,
[{file,
"/home/circleci/project/test/config_parser_SUITE.erl"},
{line,2931}]},
{test_server,ts_tc,3,
[{file,"test_server.erl"},{line,1793}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1302}]},
{test_server,run_test_case_eval,9,
[{file,"test_server.erl"},{line,1234}]}],
items =>
#{<<"access">> =>
{section,
#{default =>
{list,
{section,
#{<<"acl">> =>
{option,atom,non_empty,undefined,default},
<<"value">> =>
{option,int_or_atom,any,undefined,default}},
any,all,any,map,undefined,#{},default,
when_present},
any,list,undefined,default}},
any,[],any,map,undefined,#{},host_config,
when_present},
<<"acl">> =>
{section,
#{default =>
{list,
{section,
#{<<"match">> =>
{option,atom,
{enum,
[all,none,current_domain,
any_hosted_domain]},
undefined,default},
<<"resource">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"resource_glob">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"resource_regexp">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"server">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"server_glob">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"server_regexp">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"user">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"user_glob">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"user_regexp">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default}},
any,[],any,map,undefined,
#{<<"match">> => current_domain},
default,when_present},
any,list,undefined,default}},
any,[],any,map,undefined,#{},host_config,
when_present},
<<"auth">> =>
{section,
#{<<"anonymous">> =>
{section,
#{<<"allow_multiple_connections">> =>
{option,boolean,any,undefined,default},
<<"backend">> =>
{option,atom,
{module,ejabberd_auth_anonymous},
undefined,default},
<<"protocol">> =>
{option,atom,
{enum,[sasl_anon,login_anon,both]},
undefined,default}},
any,[],any,map,undefined,
#{<<"allow_multiple_connections">> => false,
<<"backend">> => mnesia,
<<"protocol">> => sasl_anon},
default,when_present},
<<"dummy">> =>
{section,
#{<<"base_time">> =>
{option,integer,non_negative,undefined,
default},
<<"variance">> =>
{option,integer,positive,undefined,default}},
any,[],any,map,undefined,
#{<<"base_time">> => 50,<<"variance">> => 450},
default,when_present},
<<"external">> =>
{section,
#{<<"instances">> =>
{option,integer,positive,undefined,default},
<<"program">> =>
{option,string,non_empty,undefined,default}},
any,
[<<"program">>],
any,map,undefined,
#{<<"instances">> => 1},
default,when_present},
<<"http">> =>
{section,
#{<<"basic_auth">> =>
{option,string,any,undefined,default}},
any,[],any,map,undefined,#{},default,
when_present},
<<"internal">> =>
{section,#{},any,[],any,map,undefined,#{},
default,when_present},
<<"jwt">> =>
{section,
#{<<"algorithm">> =>
{option,binary,
{enum,
[<<"HS256">>,<<"RS256">>,<<"ES256">>,
<<"HS386">>,<<"RS386">>,<<"ES386">>,
<<"HS512">>,<<"RS512">>,<<"ES512">>]},
undefined,default},
<<"secret">> =>
{section,
#{<<"env">> =>
{option,string,non_empty,undefined,
default},
<<"file">> =>
{option,string,filename,undefined,
default},
<<"value">> =>
{option,binary,any,undefined,default}},
any,[],any,list,
fun ejabberd_auth_jwt:process_jwt_secret/1,
#{},default,when_present},
<<"username_key">> =>
{option,atom,non_empty,undefined,default}},
any,all,any,map,undefined,#{},default,
when_present},
<<"ldap">> =>
{section,
#{<<"base">> =>
{option,binary,any,undefined,default},
<<"bind_pool_tag">> =>
{option,atom,non_empty,undefined,default},
<<"deref">> =>
{option,atom,
{enum,[never,always,finding,searching]},
undefined,default},
<<"dn_filter">> =>
{section,
#{<<"attributes">> =>
{list,
{option,binary,any,undefined,default},
any,list,undefined,default},
<<"filter">> =>
{option,binary,ldap_filter,undefined,
default}},
any,
[<<"filter">>],
any,map,
fun mongoose_ldap_config:process_dn_filter/1,
#{<<"attributes">> => []},
default,when_present},
<<"filter">> =>
{option,binary,any,undefined,default},
<<"local_filter">> =>
{section,
#{<<"attribute">> =>
{option,string,non_empty,undefined,
default},
<<"operation">> =>
{option,atom,
{enum,[equal,notequal]},
undefined,default},
<<"values">> =>
{list,
{option,string,any,undefined,default},
non_empty,list,undefined,default}},
any,all,any,map,
fun mongoose_ldap_config:process_local_filter/1,
#{},default,when_present},
<<"pool_tag">> =>
{option,atom,pool_name,undefined,default},
<<"uids">> =>
{list,
{section,
#{<<"attr">> =>
{option,binary,any,undefined,default},
<<"format">> =>
{option,binary,any,undefined,default}},
any,
[<<"attr">>],
any,map,
fun mongoose_ldap_config:process_uids/1,
#{},default,when_present},
any,list,undefined,default}},
any,[],any,map,undefined,
#{<<"base">> => <<>>,
<<"bind_pool_tag">> => bind,
<<"deref">> => never,
<<"dn_filter">> => {undefined,[]},
<<"filter">> => <<>>,
<<"local_filter">> => undefined,
<<"pool_tag">> => default,
<<"uids">> => [{<<"uid">>,<<"%u">>}]},
default,when_present},
<<"max_users_per_domain">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"methods">> =>
{list,
{option,atom,
{module,ejabberd_auth},
undefined,default},
any,list,undefined,default},
<<"password">> =>
{section,
#{<<"format">> =>
{option,atom,
{enum,[scram,plain]},
undefined,default},
<<"hash">> =>
{list,
{option,atom,
{enum,[sha,sha224,sha256,sha384,sha512]},
undefined,default},
unique_non_empty,list,undefined,default},
<<"scram_iterations">> =>
{option,integer,positive,undefined,default}},
any,[],any,map,undefined,
#{<<"format">> => scram,
<<"scram_iterations">> => 10000},
default,always},
<<"pki">> =>
{section,#{},any,[],any,map,undefined,#{},
default,when_present},
<<"rdbms">> =>
{section,
#{<<"users_number_estimate">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"users_number_estimate">> => false},
default,when_present},
<<"sasl_external">> =>
{list,
{option,atom,any,
fun mongoose_config_spec:process_sasl_external/1,
default},
any,list,undefined,default},
<<"sasl_mechanisms">> =>
{list,
{option,atom,
{module,cyrsasl},
fun mongoose_config_spec:process_sasl_mechanism/1,
default},
any,list,undefined,default}},
any,[],any,map,
fun mongoose_config_spec:process_auth/1,
#{<<"max_users_per_domain">> => infinity,
<<"sasl_external">> => [standard],
<<"sasl_mechanisms">> =>
[cyrsasl_scram_sha512_plus,cyrsasl_scram_sha512,
cyrsasl_scram_sha384_plus,cyrsasl_scram_sha384,
cyrsasl_scram_sha256_plus,cyrsasl_scram_sha256,
cyrsasl_scram_sha224_plus,cyrsasl_scram_sha224,
cyrsasl_scram_sha1_plus,cyrsasl_scram_sha1,
cyrsasl_plain,cyrsasl_anonymous,cyrsasl_oauth]},
host_config,always},
<<"general">> =>
{section,
#{<<"all_metrics_are_global">> =>
{option,boolean,any,undefined,global_config},
<<"component_backend">> =>
{option,atom,
{module,mongoose_component},
undefined,global_config},
<<"default_server_domain">> =>
{option,binary,non_empty,
fun mongoose_config_spec:process_host/1,
global_config},
<<"domain_certfile">> =>
{list,
{section,
#{<<"certfile">> =>
{option,string,filename,undefined,default},
<<"domain">> =>
{option,binary,non_empty,undefined,default}},
any,all,any,map,
fun mongoose_config_spec:process_domain_cert/1,
#{},default,when_present},
any,map,undefined,global_config},
<<"hide_service_name">> =>
{option,boolean,any,undefined,global_config},
<<"host_types">> =>
{list,
{option,binary,non_empty,undefined,default},
unique,list,undefined,global_config},
<<"hosts">> =>
{list,
{option,binary,non_empty,
fun mongoose_config_spec:process_host/1,
default},
unique,list,undefined,global_config},
<<"http_server_name">> =>
{option,string,any,undefined,global_config},
<<"language">> =>
{option,binary,non_empty,undefined,global_config},
<<"loglevel">> =>
{option,atom,loglevel,undefined,global_config},
<<"max_fsm_queue">> =>
{option,integer,positive,undefined,global_config},
<<"rdbms_server_type">> =>
{option,atom,
{enum,[mssql,pgsql]},
undefined,global_config},
<<"registration_timeout">> =>
{option,int_or_infinity,positive,undefined,
global_config},
<<"replaced_wait_timeout">> =>
{option,integer,positive,undefined,host_config},
<<"route_subdomains">> =>
{option,atom,{enum,[s2s]},undefined,host_config},
<<"routing_modules">> =>
{list,
{option,atom,module,undefined,default},
any,list,
fun xmpp_router:expand_routing_modules/1,
global_config},
<<"s2s_backend">> =>
{option,atom,
{module,mongoose_s2s},
undefined,global_config},
<<"sm_backend">> =>
{option,atom,
{module,ejabberd_sm},
undefined,global_config}},
any,
[<<"default_server_domain">>],
any,list,fun mongoose_config_spec:process_general/1,
#{<<"all_metrics_are_global">> => false,
<<"component_backend">> => mnesia,
<<"hide_service_name">> => false,
<<"host_types">> => [],<<"hosts">> => [],
<<"language">> => <<"en">>,
<<"loglevel">> => warning,
<<"rdbms_server_type">> => generic,
<<"registration_timeout">> => 600,
<<"replaced_wait_timeout">> => 2000,
<<"routing_modules">> =>
[{router_handler,
fun mongoose_router_global:filter/4,
fun mongoose_router_global:route/4},
{router_handler,
fun mongoose_router_localdomain:filter/4,
fun mongoose_router_localdomain:route/4},
{router_handler,
fun mongoose_router_external_localnode:filter/4,
fun mongoose_router_external_localnode:route/4},
{router_handler,
fun mongoose_router_external:filter/4,
fun mongoose_router_external:route/4},
{router_handler,
fun mongoose_router_dynamic_domains:filter/4,
fun mongoose_router_dynamic_domains:route/4},
{router_handler,fun ejabberd_s2s:filter/4,
fun ejabberd_s2s:route/4}],
<<"s2s_backend">> => mnesia,
<<"sm_backend">> => mnesia},
none,when_present},
<<"host_config">> =>
{list,
{section,
#{<<"access">> =>
{section,
#{default =>
{list,
{section,
#{<<"acl">> =>
{option,atom,non_empty,undefined,
default},
<<"value">> =>
{option,int_or_atom,any,undefined,
default}},
any,all,any,map,undefined,#{},default,
when_present},
any,list,undefined,default}},
any,[],any,map,undefined,#{},host_config,
when_present},
<<"acl">> =>
{section,
#{default =>
{list,
{section,
#{<<"match">> =>
{option,atom,
{enum,
[all,none,current_domain,
any_hosted_domain]},
undefined,default},
<<"resource">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"resource_glob">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"resource_regexp">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"server">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"server_glob">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"server_regexp">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"user">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"user_glob">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default},
<<"user_regexp">> =>
{option,binary,any,
fun mongoose_config_spec:process_acl_condition/1,
default}},
any,[],any,map,undefined,
#{<<"match">> => current_domain},
default,when_present},
any,list,undefined,default}},
any,[],any,map,undefined,#{},host_config,
when_present},
<<"auth">> =>
{section,
#{<<"anonymous">> =>
{section,
#{<<"allow_multiple_connections">> =>
{option,boolean,any,undefined,default},
<<"backend">> =>
{option,atom,
{module,ejabberd_auth_anonymous},
undefined,default},
<<"protocol">> =>
{option,atom,
{enum,[sasl_anon,login_anon,both]},
undefined,default}},
any,[],any,map,undefined,
#{<<"allow_multiple_connections">> => false,
<<"backend">> => mnesia,
<<"protocol">> => sasl_anon},
default,when_present},
<<"dummy">> =>
{section,
#{<<"base_time">> =>
{option,integer,non_negative,undefined,
default},
<<"variance">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"base_time">> => 50,
<<"variance">> => 450},
default,when_present},
<<"external">> =>
{section,
#{<<"instances">> =>
{option,integer,positive,undefined,
default},
<<"program">> =>
{option,string,non_empty,undefined,
default}},
any,
[<<"program">>],
any,map,undefined,
#{<<"instances">> => 1},
default,when_present},
<<"http">> =>
{section,
#{<<"basic_auth">> =>
{option,string,any,undefined,default}},
any,[],any,map,undefined,#{},default,
when_present},
<<"internal">> =>
{section,#{},any,[],any,map,undefined,#{},
default,when_present},
<<"jwt">> =>
{section,
#{<<"algorithm">> =>
{option,binary,
{enum,
[<<"HS256">>,<<"RS256">>,<<"ES256">>,
<<"HS386">>,<<"RS386">>,<<"ES386">>,
<<"HS512">>,<<"RS512">>,<<"ES512">>]},
undefined,default},
<<"secret">> =>
{section,
#{<<"env">> =>
{option,string,non_empty,undefined,
default},
<<"file">> =>
{option,string,filename,undefined,
default},
<<"value">> =>
{option,binary,any,undefined,
default}},
any,[],any,list,
fun ejabberd_auth_jwt:process_jwt_secret/1,
#{},default,when_present},
<<"username_key">> =>
{option,atom,non_empty,undefined,
default}},
any,all,any,map,undefined,#{},default,
when_present},
<<"ldap">> =>
{section,
#{<<"base">> =>
{option,binary,any,undefined,default},
<<"bind_pool_tag">> =>
{option,atom,non_empty,undefined,
default},
<<"deref">> =>
{option,atom,
{enum,[never,always,finding,searching]},
undefined,default},
<<"dn_filter">> =>
{section,
#{<<"attributes">> =>
{list,
{option,binary,any,undefined,
default},
any,list,undefined,default},
<<"filter">> =>
{option,binary,ldap_filter,
undefined,default}},
any,
[<<"filter">>],
any,map,
fun mongoose_ldap_config:process_dn_filter/1,
#{<<"attributes">> => []},
default,when_present},
<<"filter">> =>
{option,binary,any,undefined,default},
<<"local_filter">> =>
{section,
#{<<"attribute">> =>
{option,string,non_empty,undefined,
default},
<<"operation">> =>
{option,atom,
{enum,[equal,notequal]},
undefined,default},
<<"values">> =>
{list,
{option,string,any,undefined,
default},
non_empty,list,undefined,default}},
any,all,any,map,
fun mongoose_ldap_config:process_local_filter/1,
#{},default,when_present},
<<"pool_tag">> =>
{option,atom,pool_name,undefined,
default},
<<"uids">> =>
{list,
{section,
#{<<"attr">> =>
{option,binary,any,undefined,
default},
<<"format">> =>
{option,binary,any,undefined,
default}},
any,
[<<"attr">>],
any,map,
fun mongoose_ldap_config:process_uids/1,
#{},default,when_present},
any,list,undefined,default}},
any,[],any,map,undefined,
#{<<"base">> => <<>>,
<<"bind_pool_tag">> => bind,
<<"deref">> => never,
<<"dn_filter">> => {undefined,[]},
<<"filter">> => <<>>,
<<"local_filter">> => undefined,
<<"pool_tag">> => default,
<<"uids">> => [{<<"uid">>,<<"%u">>}]},
default,when_present},
<<"max_users_per_domain">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"methods">> =>
{list,
{option,atom,
{module,ejabberd_auth},
undefined,default},
any,list,undefined,default},
<<"password">> =>
{section,
#{<<"format">> =>
{option,atom,
{enum,[scram,plain]},
undefined,default},
<<"hash">> =>
{list,
{option,atom,
{enum,
[sha,sha224,sha256,sha384,sha512]},
undefined,default},
unique_non_empty,list,undefined,
default},
<<"scram_iterations">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"format">> => scram,
<<"scram_iterations">> => 10000},
default,always},
<<"pki">> =>
{section,#{},any,[],any,map,undefined,#{},
default,when_present},
<<"rdbms">> =>
{section,
#{<<"users_number_estimate">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"users_number_estimate">> => false},
default,when_present},
<<"sasl_external">> =>
{list,
{option,atom,any,
fun mongoose_config_spec:process_sasl_external/1,
default},
any,list,undefined,default},
<<"sasl_mechanisms">> =>
{list,
{option,atom,
{module,cyrsasl},
fun mongoose_config_spec:process_sasl_mechanism/1,
default},
any,list,undefined,default}},
any,[],any,map,
fun mongoose_config_spec:process_auth/1,
#{<<"max_users_per_domain">> => infinity,
<<"sasl_external">> => [standard],
<<"sasl_mechanisms">> =>
[cyrsasl_scram_sha512_plus,
cyrsasl_scram_sha512,
cyrsasl_scram_sha384_plus,
cyrsasl_scram_sha384,
cyrsasl_scram_sha256_plus,
cyrsasl_scram_sha256,
cyrsasl_scram_sha224_plus,
cyrsasl_scram_sha224,
cyrsasl_scram_sha1_plus,cyrsasl_scram_sha1,
cyrsasl_plain,cyrsasl_anonymous,
cyrsasl_oauth]},
host_config,when_present},
<<"general">> =>
{section,
#{<<"all_metrics_are_global">> =>
{option,boolean,any,undefined,global_config},
<<"component_backend">> =>
{option,atom,
{module,mongoose_component},
undefined,global_config},
<<"default_server_domain">> =>
{option,binary,non_empty,
fun mongoose_config_spec:process_host/1,
global_config},
<<"domain_certfile">> =>
{list,
{section,
#{<<"certfile">> =>
{option,string,filename,undefined,
default},
<<"domain">> =>
{option,binary,non_empty,undefined,
default}},
any,all,any,map,
fun mongoose_config_spec:process_domain_cert/1,
#{},default,when_present},
any,map,undefined,global_config},
<<"hide_service_name">> =>
{option,boolean,any,undefined,global_config},
<<"host_types">> =>
{list,
{option,binary,non_empty,undefined,default},
unique,list,undefined,global_config},
<<"hosts">> =>
{list,
{option,binary,non_empty,
fun mongoose_config_spec:process_host/1,
default},
unique,list,undefined,global_config},
<<"http_server_name">> =>
{option,string,any,undefined,global_config},
<<"language">> =>
{option,binary,non_empty,undefined,
global_config},
<<"loglevel">> =>
{option,atom,loglevel,undefined,
global_config},
<<"max_fsm_queue">> =>
{option,integer,positive,undefined,
global_config},
<<"rdbms_server_type">> =>
{option,atom,
{enum,[mssql,pgsql]},
undefined,global_config},
<<"registration_timeout">> =>
{option,int_or_infinity,positive,undefined,
global_config},
<<"replaced_wait_timeout">> =>
{option,integer,positive,undefined,
host_config},
<<"route_subdomains">> =>
{option,atom,
{enum,[s2s]},
undefined,host_config},
<<"routing_modules">> =>
{list,
{option,atom,module,undefined,default},
any,list,
fun xmpp_router:expand_routing_modules/1,
global_config},
<<"s2s_backend">> =>
{option,atom,
{module,mongoose_s2s},
undefined,global_config},
<<"sm_backend">> =>
{option,atom,
{module,ejabberd_sm},
undefined,global_config}},
any,[],any,list,undefined,#{},none,
when_present},
<<"host">> =>
{option,binary,non_empty,undefined,remove},
<<"host_type">> =>
{option,binary,non_empty,undefined,remove},
<<"modules">> =>
{section,
#{<<"mod_time">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"iqdisc">> => one_queue},
default,when_present},
<<"mod_keystore">> =>
{section,
#{<<"keys">> =>
{list,
{section,
#{<<"name">> =>
{option,atom,non_empty,undefined,
default},
<<"path">> =>
{option,string,filename,undefined,
default},
<<"type">> =>
{option,atom,
{enum,[file,ram]},
undefined,default}},
any,
[<<"name">>,<<"type">>],
any,map,
fun mod_keystore:process_key/1,#{},
default,when_present},
any,map,undefined,default},
<<"ram_key_size">> =>
{option,integer,non_negative,undefined,
default}},
any,[],any,map,undefined,
#{<<"keys">> => #{},
<<"ram_key_size">> => 2048},
default,when_present},
<<"mod_disco">> =>
{section,
#{<<"extra_domains">> =>
{list,
{option,binary,domain,undefined,
default},
any,list,undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"server_info">> =>
{list,
{section,
#{<<"modules">> =>
{list,
{option,atom,module,undefined,
default},
any,list,undefined,default},
<<"name">> =>
{option,binary,non_empty,
undefined,default},
<<"urls">> =>
{list,
{option,binary,url,undefined,
default},
any,list,undefined,default}},
any,
[<<"name">>,<<"urls">>],
any,map,undefined,#{},default,
when_present},
any,list,undefined,default},
<<"users_can_see_hidden_services">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"extra_domains">> => [],
<<"iqdisc">> => one_queue,
<<"server_info">> => [],
<<"users_can_see_hidden_services">> =>
true},
default,when_present},
<<"mod_cache_users">> =>
{section,
#{<<"number_of_segments">> =>
{option,integer,positive,undefined,
default},
<<"strategy">> =>
{option,atom,
{enum,[fifo,lru]},
undefined,default},
<<"time_to_live">> =>
{option,int_or_infinity,positive,
undefined,default}},
any,[],any,map,
fun mongoose_user_cache:process_cache_config/1,
#{<<"number_of_segments">> => 3,
<<"strategy">> => fifo,
<<"time_to_live">> => 480},
default,when_present},
<<"mod_auth_token">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_auth_token},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"validity_period">> =>
{section,
#{<<"access">> =>
{section,
#{<<"unit">> =>
{option,atom,
{enum,
[days,hours,minutes,seconds]},
undefined,default},
<<"value">> =>
{option,integer,non_negative,
undefined,default}},
any,all,any,map,undefined,#{},
default,when_present},
<<"refresh">> =>
{section,
#{<<"unit">> =>
{option,atom,
{enum,
[days,hours,minutes,seconds]},
undefined,default},
<<"value">> =>
{option,integer,non_negative,
undefined,default}},
any,all,any,map,undefined,#{},
default,when_present}},
any,[],any,map,undefined,
#{<<"access">> =>
#{unit => hours,value => 1},
<<"refresh">> =>
#{unit => days,value => 25}},
default,always}},
any,[],any,map,undefined,
#{<<"backend">> => rdbms,
<<"iqdisc">> => no_queue},
default,when_present},
<<"mod_csi">> =>
{section,
#{<<"buffer_max">> =>
{option,int_or_infinity,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"buffer_max">> => 20},
default,when_present},
<<"mod_muc">> =>
{section,
#{<<"access">> =>
{option,atom,access_rule,undefined,
default},
<<"access_admin">> =>
{option,atom,access_rule,undefined,
default},
<<"access_create">> =>
{option,atom,access_rule,undefined,
default},
<<"access_persistent">> =>
{option,atom,access_rule,undefined,
default},
<<"backend">> =>
{option,atom,
{module,mod_muc},
undefined,default},
<<"default_room">> =>
{section,
#{<<"affiliations">> =>
{list,
{section,
#{<<"affiliation">> =>
{option,atom,non_empty,
undefined,default},
<<"resource">> =>
{option,binary,any,undefined,
default},
<<"server">> =>
{option,binary,domain,
undefined,default},
<<"user">> =>
{option,binary,non_empty,
undefined,default}},
any,all,any,map,
fun mod_muc:process_room_affiliation/1,
#{},default,when_present},
any,list,undefined,default},
<<"allow_change_subj">> =>
{option,boolean,any,undefined,
default},
<<"allow_multiple_sessions">> =>
{option,boolean,any,undefined,
default},
<<"allow_private_messages">> =>
{option,boolean,any,undefined,
default},
<<"allow_query_users">> =>
{option,boolean,any,undefined,
default},
<<"allow_user_invites">> =>
{option,boolean,any,undefined,
default},
<<"allow_visitor_nickchange">> =>
{option,boolean,any,undefined,
default},
<<"allow_visitor_status">> =>
{option,boolean,any,undefined,
default},
<<"anonymous">> =>
{option,boolean,any,undefined,
default},
<<"description">> =>
{option,binary,any,undefined,
default},
<<"logging">> =>
{option,boolean,any,undefined,
default},
<<"max_users">> =>
{option,integer,positive,undefined,
default},
<<"maygetmemberlist">> =>
{list,
{option,atom,non_empty,undefined,
default},
any,list,undefined,default},
<<"members_by_default">> =>
{option,boolean,any,undefined,
default},
<<"members_only">> =>
{option,boolean,any,undefined,
default},
<<"moderated">> =>
{option,boolean,any,undefined,
default},
<<"password">> =>
{option,binary,any,undefined,
default},
<<"password_protected">> =>
{option,boolean,any,undefined,
default},
<<"persistent">> =>
{option,boolean,any,undefined,
default},
<<"public">> =>
{option,boolean,any,undefined,
default},
<<"public_list">> =>
{option,boolean,any,undefined,
default},
<<"subject">> =>
{option,binary,any,undefined,
default},
<<"subject_author">> =>
{option,binary,any,undefined,
default},
<<"title">> =>
{option,binary,any,undefined,
default}},
any,[],any,map,undefined,
#{<<"affiliations">> => [],
<<"allow_change_subj">> => true,
<<"allow_multiple_sessions">> =>
false,
<<"allow_private_messages">> => true,
<<"allow_query_users">> => true,
<<"allow_user_invites">> => false,
<<"allow_visitor_nickchange">> =>
true,
<<"allow_visitor_status">> => true,
<<"anonymous">> => true,
<<"description">> => <<>>,
<<"logging">> => false,
<<"max_users">> => 200,
<<"maygetmemberlist">> => [],
<<"members_by_default">> => true,
<<"members_only">> => false,
<<"moderated">> => true,
<<"password">> => <<>>,
<<"password_protected">> => false,
<<"persistent">> => false,
<<"public">> => true,
<<"public_list">> => true,
<<"subject">> => <<>>,
<<"subject_author">> => <<>>,
<<"title">> => <<>>},
default,when_present},
<<"hibernate_timeout">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"hibernated_room_check_interval">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"hibernated_room_timeout">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"history_size">> =>
{option,integer,non_negative,undefined,
default},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"http_auth_pool">> =>
{option,atom,pool_name,undefined,
default},
<<"load_permanent_rooms_at_startup">> =>
{option,boolean,any,undefined,default},
<<"max_room_desc">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"max_room_id">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"max_room_name">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"max_user_conferences">> =>
{option,integer,non_negative,undefined,
default},
<<"max_users">> =>
{option,integer,positive,undefined,
default},
<<"max_users_admin_threshold">> =>
{option,integer,positive,undefined,
default},
<<"min_message_interval">> =>
{option,integer,non_negative,undefined,
default},
<<"min_presence_interval">> =>
{option,integer,non_negative,undefined,
default},
<<"online_backend">> =>
{option,atom,
{module,mod_muc_online},
undefined,default},
<<"room_shaper">> =>
{option,atom,shaper,undefined,default},
<<"user_message_shaper">> =>
{option,atom,shaper,undefined,default},
<<"user_presence_shaper">> =>
{option,atom,shaper,undefined,default}},
any,[],any,map,undefined,
#{<<"access">> => all,
<<"access_admin">> => none,
<<"access_create">> => all,
<<"access_persistent">> => all,
<<"backend">> => mnesia,
<<"default_room">> =>
#{public => true,description => <<>>,
persistent => false,title => <<>>,
password => <<>>,anonymous => true,
subject => <<>>,
allow_change_subj => true,
allow_query_users => true,
allow_private_messages => true,
allow_visitor_status => true,
allow_visitor_nickchange => true,
public_list => true,moderated => true,
members_by_default => true,
members_only => false,
allow_user_invites => false,
allow_multiple_sessions => false,
password_protected => false,
max_users => 200,
maygetmemberlist => [],
logging => false,affiliations => [],
subject_author => <<>>},
<<"hibernate_timeout">> => 90000,
<<"hibernated_room_check_interval">> =>
infinity,
<<"hibernated_room_timeout">> => infinity,
<<"history_size">> => 20,
<<"host">> => {prefix,<<"conference.">>},
<<"http_auth_pool">> => none,
<<"load_permanent_rooms_at_startup">> =>
false,
<<"max_room_desc">> => infinity,
<<"max_room_id">> => infinity,
<<"max_room_name">> => infinity,
<<"max_user_conferences">> => 10,
<<"max_users">> => 200,
<<"max_users_admin_threshold">> => 5,
<<"min_message_interval">> => 0,
<<"min_presence_interval">> => 0,
<<"online_backend">> => mnesia,
<<"room_shaper">> => none,
<<"user_message_shaper">> => none,
<<"user_presence_shaper">> => none},
default,when_present},
<<"mod_muc_log">> =>
{section,
#{<<"access_log">> =>
{option,atom,access_rule,undefined,
default},
<<"css_file">> =>
{option,binary,non_empty,undefined,
default},
<<"dirname">> =>
{option,atom,
{enum,[room_jid,room_name]},
undefined,default},
<<"dirtype">> =>
{option,atom,
{enum,[subdirs,plain]},
undefined,default},
<<"file_format">> =>
{option,atom,
{enum,[html,plaintext]},
undefined,default},
<<"outdir">> =>
{option,string,dirname,undefined,
default},
<<"spam_prevention">> =>
{option,boolean,any,undefined,default},
<<"timezone">> =>
{option,atom,
{enum,[local,universal]},
undefined,default},
<<"top_link">> =>
{section,
#{<<"target">> =>
{option,string,url,undefined,
default},
<<"text">> =>
{option,string,non_empty,undefined,
default}},
any,all,any,map,
fun mod_muc_log:process_top_link/1,#{},
default,when_present}},
any,[],any,map,undefined,
#{<<"access_log">> => muc_admin,
<<"css_file">> => false,
<<"dirname">> => room_jid,
<<"dirtype">> => subdirs,
<<"file_format">> => html,
<<"outdir">> => "www/muc",
<<"spam_prevention">> => true,
<<"timezone">> => local,
<<"top_link">> => {"/","Home"}},
default,when_present},
<<"mod_caps">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_caps},
undefined,default},
<<"cache_life_time">> =>
{option,integer,positive,undefined,
default},
<<"cache_size">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"cache_life_time">> => 86400,
<<"cache_size">> => 1000},
default,when_present},
<<"mod_roster">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_roster},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"store_current_id">> =>
{option,boolean,any,undefined,default},
<<"versioning">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"iqdisc">> => one_queue,
<<"store_current_id">> => false,
<<"versioning">> => false},
default,when_present},
<<"mod_extdisco">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"service">> =>
{list,
{section,
#{<<"host">> =>
{option,binary,non_empty,
undefined,default},
<<"password">> =>
{option,binary,non_empty,
undefined,default},
<<"port">> =>
{option,integer,port,undefined,
default},
<<"transport">> =>
{option,binary,
{enum,[<<"udp">>,<<"tcp">>]},
undefined,default},
<<"type">> =>
{option,atom,non_empty,undefined,
default},
<<"username">> =>
{option,binary,non_empty,
undefined,default}},
any,
[<<"type">>,<<"host">>],
any,map,undefined,#{},default,
when_present},
any,list,undefined,default}},
any,[],any,map,undefined,
#{<<"iqdisc">> => no_queue,
<<"service">> => []},
default,when_present},
<<"mod_offline_chatmarkers">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_offline_chatmarkers},
undefined,default},
<<"store_groupchat_messages">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => rdbms,
<<"store_groupchat_messages">> => false},
default,when_present},
<<"mod_private">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_private},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"backend">> => rdbms,
<<"iqdisc">> => one_queue},
default,when_present},
<<"mod_sic">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"iqdisc">> => one_queue},
default,when_present},
<<"mod_carboncopy">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"iqdisc">> => no_queue},
default,when_present},
default =>
{section,#{},any,[],any,map,undefined,#{},
default,when_present},
<<"mod_smart_markers">> =>
{section,
#{<<"async_writer">> =>
{section,
#{<<"pool_size">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"pool_size">> => 4},
default,always},
<<"backend">> =>
{option,atom,
{enum,[rdbms,rdbms_async]},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"keep_private">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => rdbms,
<<"iqdisc">> => no_queue,
<<"keep_private">> => false},
default,when_present},
<<"mod_global_distrib">> =>
{section,
#{<<"bounce">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,undefined,
default},
<<"max_retries">> =>
{option,integer,non_negative,
undefined,default},
<<"resend_after_ms">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"max_retries">> => 4,
<<"resend_after_ms">> => 200},
default,always},
<<"cache">> =>
{section,
#{<<"cache_missed">> =>
{option,boolean,any,undefined,
default},
<<"domain_lifetime_seconds">> =>
{option,integer,non_negative,
undefined,default},
<<"jid_lifetime_seconds">> =>
{option,integer,non_negative,
undefined,default},
<<"max_jids">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"cache_missed">> => true,
<<"domain_lifetime_seconds">> => 600,
<<"jid_lifetime_seconds">> => 5,
<<"max_jids">> => 10000},
default,always},
<<"connections">> =>
{section,
#{<<"advertised_endpoints">> =>
{list,
{section,
#{<<"host">> =>
{option,string,
network_address,undefined,
default},
<<"port">> =>
{option,integer,port,
undefined,default}},
any,all,any,map,
fun mod_global_distrib:process_endpoint/1,
#{},default,when_present},
any,list,undefined,default},
<<"connections_per_endpoint">> =>
{option,integer,non_negative,
undefined,default},
<<"disabled_gc_interval">> =>
{option,integer,positive,undefined,
default},
<<"endpoint_refresh_interval">> =>
{option,integer,positive,undefined,
default},
<<"endpoint_refresh_interval_when_empty">> =>
{option,integer,positive,undefined,
default},
<<"endpoints">> =>
{list,
{section,
#{<<"host">> =>
{option,string,
network_address,undefined,
default},
<<"port">> =>
{option,integer,port,
undefined,default}},
any,all,any,map,
fun mod_global_distrib:process_endpoint/1,
#{},default,when_present},
any,list,undefined,default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,
undefined,default},
<<"certfile">> =>
{option,string,filename,
undefined,default},
<<"ciphers">> =>
{option,string,any,undefined,
default},
<<"dhfile">> =>
{option,string,filename,
undefined,default},
<<"protocol_options">> =>
{list,
{option,string,non_empty,
undefined,default},
any,list,undefined,default},
<<"verify_mode">> =>
{option,atom,
{enum,
[peer,selfsigned_peer,none]},
undefined,default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present}},
any,[],any,map,undefined,
#{<<"connections_per_endpoint">> => 1,
<<"disabled_gc_interval">> => 60,
<<"endpoint_refresh_interval">> => 60,
<<"endpoint_refresh_interval_when_empty">> =>
3},
default,always},
<<"global_host">> =>
{option,binary,domain,undefined,default},
<<"hosts_refresh_interval">> =>
{option,integer,non_negative,undefined,
default},
<<"local_host">> =>
{option,binary,domain,undefined,default},
<<"message_ttl">> =>
{option,integer,non_negative,undefined,
default},
<<"redis">> =>
{section,
#{<<"expire_after">> =>
{option,integer,positive,undefined,
default},
<<"pool">> =>
{option,atom,pool_name,undefined,
default},
<<"refresh_after">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"expire_after">> => 120,
<<"pool">> => global_distrib,
<<"refresh_after">> => 60},
default,always}},
any,
[<<"global_host">>,<<"local_host">>],
any,map,
fun mod_global_distrib:process_opts/1,
#{<<"hosts_refresh_interval">> => 3000,
<<"message_ttl">> => 4},
default,when_present},
<<"mod_push_service_mongoosepush">> =>
{section,
#{<<"api_version">> =>
{option,binary,
{enum,[<<"v2">>,<<"v3">>]},
undefined,default},
<<"max_http_connections">> =>
{option,integer,non_negative,undefined,
default},
<<"pool_name">> =>
{option,atom,pool_name,undefined,
default}},
any,[],any,map,undefined,
#{<<"api_version">> => <<"v3">>,
<<"max_http_connections">> => 100,
<<"pool_name">> => undefined},
default,when_present},
<<"mod_bosh">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_bosh},
undefined,default},
<<"inactivity">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"max_pause">> =>
{option,integer,positive,undefined,
default},
<<"max_wait">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"server_acks">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"inactivity">> => 30,
<<"max_pause">> => 120,
<<"max_wait">> => infinity,
<<"server_acks">> => false},
default,when_present},
<<"mod_stream_management">> =>
{section,
#{<<"ack">> =>
{option,boolean,any,undefined,default},
<<"ack_freq">> =>
{option,integer,positive,undefined,
default},
<<"backend">> =>
{option,atom,
{module,mod_stream_management},
undefined,default},
<<"buffer">> =>
{option,boolean,any,undefined,default},
<<"buffer_max">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"resume_timeout">> =>
{option,integer,positive,undefined,
default},
<<"stale_h">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,undefined,
default},
<<"geriatric">> =>
{option,integer,positive,undefined,
default},
<<"repeat_after">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"enabled">> => false,
<<"geriatric">> => 3600,
<<"repeat_after">> => 1800},
default,always}},
any,[],any,map,
fun mod_stream_management:process_buffer_and_ack/1,
#{<<"ack">> => true,<<"ack_freq">> => 1,
<<"backend">> => mnesia,
<<"buffer">> => true,
<<"buffer_max">> => 100,
<<"resume_timeout">> => 600},
default,when_present},
<<"mod_inbox">> =>
{section,
#{<<"aff_changes">> =>
{option,boolean,any,undefined,default},
<<"async_writer">> =>
{section,
#{<<"pool_size">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"pool_size">> => 4},
default,always},
<<"backend">> =>
{option,atom,
{enum,[rdbms,rdbms_async]},
undefined,default},
<<"bin_clean_after">> =>
{option,integer,non_negative,
fun timer:hours/1,default},
<<"bin_ttl">> =>
{option,integer,non_negative,undefined,
default},
<<"boxes">> =>
{list,
{option,binary,non_empty,undefined,
default},
unique,list,undefined,default},
<<"delete_domain_limit">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"groupchat">> =>
{list,
{option,atom,
{enum,[muc,muclight]},
undefined,default},
any,list,undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"max_result_limit">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"remove_on_kicked">> =>
{option,boolean,any,undefined,default},
<<"reset_markers">> =>
{list,
{option,binary,
{enum,
[<<"received">>,<<"displayed">>,
<<"acknowledged">>]},
undefined,default},
any,list,undefined,default}},
any,[],any,map,
fun mod_inbox:process_inbox_boxes/1,
#{<<"aff_changes">> => true,
<<"backend">> => rdbms,
<<"bin_clean_after">> => 3600000,
<<"bin_ttl">> => 30,<<"boxes">> => [],
<<"delete_domain_limit">> => infinity,
<<"groupchat">> => [muclight],
<<"iqdisc">> => no_queue,
<<"max_result_limit">> => infinity,
<<"remove_on_kicked">> => true,
<<"reset_markers">> => [<<"displayed">>]},
default,when_present},
<<"mod_last">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_last},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"iqdisc">> => one_queue},
default,when_present},
<<"mod_event_pusher">> =>
{section,
#{<<"http">> =>
{section,
#{<<"handlers">> =>
{list,
{section,
#{<<"callback_module">> =>
{option,atom,module,undefined,
default},
<<"path">> =>
{option,binary,any,
fun mod_event_pusher_http:fix_path/1,
default},
<<"pool_name">> =>
{option,atom,pool_name,
undefined,default}},
any,[],any,map,undefined,
#{<<"callback_module">> =>
mod_event_pusher_http_defaults,
<<"path">> => <<>>,
<<"pool_name">> => http_pool},
default,when_present},
unique,list,undefined,default}},
any,[],any,map,undefined,
#{<<"handlers">> => []},
default,when_present},
<<"push">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_event_pusher_push},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,
undefined,default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"plugin_module">> =>
{option,atom,module,undefined,
default},
<<"virtual_pubsub_hosts">> =>
{list,
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
any,list,undefined,default},
<<"wpool">> =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,
undefined,default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,
undefined,default}},
any,[],any,map,undefined,
#{<<"call_timeout">> => 5000,
<<"strategy">> =>
available_worker,
<<"workers">> => 10},
default,always}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"iqdisc">> => one_queue,
<<"plugin_module">> =>
mod_event_pusher_push_plugin_defaults,
<<"virtual_pubsub_hosts">> => []},
default,when_present},
<<"rabbit">> =>
{section,
#{<<"chat_msg_exchange">> =>
{section,
#{<<"name">> =>
{option,binary,non_empty,
undefined,default},
<<"recv_topic">> =>
{option,binary,non_empty,
undefined,default},
<<"sent_topic">> =>
{option,binary,non_empty,
undefined,default},
<<"type">> =>
{option,binary,non_empty,
undefined,default}},
any,[],any,map,undefined,
#{<<"name">> => <<"chat_msg">>,
<<"recv_topic">> =>
<<"chat_msg_recv">>,
<<"sent_topic">> =>
<<"chat_msg_sent">>,
<<"type">> => <<"topic">>},
default,always},
<<"groupchat_msg_exchange">> =>
{section,
#{<<"name">> =>
{option,binary,non_empty,
undefined,default},
<<"recv_topic">> =>
{option,binary,non_empty,
undefined,default},
<<"sent_topic">> =>
{option,binary,non_empty,
undefined,default},
<<"type">> =>
{option,binary,non_empty,
undefined,default}},
any,[],any,map,undefined,
#{<<"name">> => <<"groupchat_msg">>,
<<"recv_topic">> =>
<<"groupchat_msg_recv">>,
<<"sent_topic">> =>
<<"groupchat_msg_sent">>,
<<"type">> => <<"topic">>},
default,always},
<<"presence_exchange">> =>
{section,
#{<<"name">> =>
{option,binary,non_empty,
undefined,default},
<<"type">> =>
{option,binary,non_empty,
undefined,default}},
any,[],any,map,undefined,
#{<<"name">> => <<"presence">>,
<<"type">> => <<"topic">>},
default,always}},
any,[],any,map,undefined,#{},default,
when_present},
<<"sns">> =>
{section,
#{<<"access_key_id">> =>
{option,string,any,undefined,
default},
<<"account_id">> =>
{option,string,any,undefined,
default},
<<"muc_messages_topic">> =>
{option,string,any,undefined,
default},
<<"plugin_module">> =>
{option,atom,module,undefined,
default},
<<"pm_messages_topic">> =>
{option,string,any,undefined,
default},
<<"pool_size">> =>
{option,integer,positive,undefined,
default},
<<"presence_updates_topic">> =>
{option,string,any,undefined,
default},
<<"publish_retry_count">> =>
{option,integer,non_negative,
undefined,default},
<<"publish_retry_time_ms">> =>
{option,integer,non_negative,
undefined,default},
<<"region">> =>
{option,string,any,undefined,
default},
<<"secret_access_key">> =>
{option,string,any,undefined,
default},
<<"sns_host">> =>
{option,string,any,undefined,
default}},
any,
[<<"sns_host">>,<<"region">>,
<<"access_key_id">>,
<<"secret_access_key">>,
<<"account_id">>],
any,map,undefined,
#{<<"plugin_module">> =>
mod_event_pusher_sns_defaults,
<<"pool_size">> => 100,
<<"publish_retry_count">> => 2,
<<"publish_retry_time_ms">> => 50},
default,when_present}},
any,[],any,map,undefined,#{},default,
when_present},
<<"mod_register">> =>
{section,
#{<<"access">> =>
{option,atom,access_rule,undefined,
default},
<<"ip_access">> =>
{list,
{section,
#{<<"address">> =>
{option,string,ip_mask,undefined,
default},
<<"policy">> =>
{option,atom,
{enum,[allow,deny]},
undefined,default}},
any,all,any,map,
fun mod_register:process_ip_access/1,
#{},default,when_present},
any,list,undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"password_strength">> =>
{option,integer,non_negative,undefined,
default},
<<"registration_watchers">> =>
{list,
{option,binary,jid,undefined,default},
any,list,undefined,default},
<<"welcome_message">> =>
{section,
#{<<"body">> =>
{option,string,any,undefined,
default},
<<"subject">> =>
{option,string,any,undefined,
default}},
any,[],any,map,
fun mod_register:process_welcome_message/1,
#{<<"body">> => [],<<"subject">> => []},
default,when_present}},
any,[],any,map,undefined,
#{<<"access">> => all,
<<"ip_access">> => [],
<<"iqdisc">> => one_queue,
<<"password_strength">> => 0,
<<"registration_watchers">> => []},
default,when_present},
<<"mod_jingle_sip">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_jingle_sip},
undefined,default},
<<"listen_port">> =>
{option,integer,port,undefined,default},
<<"local_host">> =>
{option,string,network_address,
undefined,default},
<<"proxy_host">> =>
{option,string,network_address,
undefined,default},
<<"proxy_port">> =>
{option,integer,port,undefined,default},
<<"sdp_origin">> =>
{option,string,ip_address,undefined,
default},
<<"transport">> =>
{option,string,
{enum,["udp","tcp"]},
undefined,default},
<<"username_to_phone">> =>
{list,
{section,
#{<<"phone">> =>
{option,binary,any,undefined,
default},
<<"username">> =>
{option,binary,any,undefined,
default}},
any,all,any,map,
#Fun<mod_jingle_sip.0.54879970>,#{},
default,when_present},
any,list,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"listen_port">> => 5600,
<<"local_host">> => "localhost",
<<"proxy_host">> => "localhost",
<<"proxy_port">> => 5060,
<<"sdp_origin">> => "127.0.0.1",
<<"transport">> => "udp",
<<"username_to_phone">> => []},
default,when_present},
<<"mod_muc_light">> =>
{section,
#{<<"all_can_configure">> =>
{option,boolean,any,undefined,default},
<<"all_can_invite">> =>
{option,boolean,any,undefined,default},
<<"backend">> =>
{option,atom,
{module,mod_muc_light_db},
undefined,default},
<<"blocking">> =>
{option,boolean,any,undefined,default},
<<"cache_affs">> =>
{section,
#{<<"module">> =>
{option,atom,
{enum,[internal,mod_cache_users]},
undefined,default},
<<"number_of_segments">> =>
{option,integer,positive,undefined,
default},
<<"strategy">> =>
{option,atom,
{enum,[fifo,lru]},
undefined,default},
<<"time_to_live">> =>
{option,int_or_infinity,positive,
undefined,default}},
any,[],any,map,
fun mongoose_user_cache:process_cache_config/1,
#{<<"module">> => internal,
<<"number_of_segments">> => 3,
<<"strategy">> => fifo,
<<"time_to_live">> => 2},
default,when_present},
<<"config_schema">> =>
{list,
{section,
#{<<"field">> =>
{option,binary,non_empty,
undefined,default},
<<"float_value">> =>
{option,float,any,undefined,
default},
<<"integer_value">> =>
{option,integer,any,undefined,
default},
<<"internal_key">> =>
{option,atom,non_empty,undefined,
default},
<<"string_value">> =>
{option,binary,any,undefined,
default}},
any,
[<<"field">>],
any,map,undefined,#{},default,
when_present},
any,list,
fun mod_muc_light:process_config_schema/1,
default},
<<"equal_occupants">> =>
{option,boolean,any,undefined,default},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"legacy_mode">> =>
{option,boolean,any,undefined,default},
<<"max_occupants">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"rooms_in_rosters">> =>
{option,boolean,any,undefined,default},
<<"rooms_per_page">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"rooms_per_user">> =>
{option,int_or_infinity,positive,
undefined,default}},
any,[],any,map,undefined,
#{<<"all_can_configure">> => false,
<<"all_can_invite">> => false,
<<"backend">> => mnesia,
<<"blocking">> => true,
<<"config_schema">> =>
[{<<"roomname">>,<<"Untitled">>,
roomname,binary},
{<<"subject">>,<<>>,subject,binary}],
<<"equal_occupants">> => false,
<<"host">> => {prefix,<<"muclight.">>},
<<"legacy_mode">> => false,
<<"max_occupants">> => infinity,
<<"rooms_in_rosters">> => false,
<<"rooms_per_page">> => 10,
<<"rooms_per_user">> => infinity},
default,when_present},
<<"mod_domain_isolation">> =>
{section,#{},any,[],any,map,undefined,#{},
default,when_present},
<<"mod_shared_roster_ldap">> =>
{section,
#{<<"auth_check">> =>
{option,boolean,any,undefined,default},
<<"base">> =>
{option,binary,any,undefined,default},
<<"deref">> =>
{option,atom,
{enum,[never,always,finding,searching]},
undefined,default},
<<"filter">> =>
{option,binary,any,undefined,default},
<<"gfilter">> =>
{option,binary,any,undefined,default},
<<"group_cache_size">> =>
{option,integer,positive,undefined,
default},
<<"group_cache_validity">> =>
{option,integer,positive,undefined,
default},
<<"groupattr">> =>
{option,binary,any,undefined,default},
<<"groupdesc">> =>
{option,binary,any,undefined,default},
<<"memberattr">> =>
{option,binary,any,undefined,default},
<<"memberattr_format">> =>
{option,binary,any,undefined,default},
<<"memberattr_format_re">> =>
{option,binary,any,undefined,default},
<<"pool_tag">> =>
{option,atom,pool_name,undefined,
default},
<<"rfilter">> =>
{option,binary,any,undefined,default},
<<"ufilter">> =>
{option,binary,any,undefined,default},
<<"user_cache_size">> =>
{option,integer,positive,undefined,
default},
<<"user_cache_validity">> =>
{option,integer,positive,undefined,
default},
<<"userdesc">> =>
{option,binary,any,undefined,default},
<<"useruid">> =>
{option,binary,any,undefined,default}},
any,[],any,map,
#Fun<mod_shared_roster_ldap.0.13941630>,
#{<<"auth_check">> => true,
<<"deref">> => never,
<<"filter">> => <<>>,
<<"gfilter">> => <<>>,
<<"group_cache_size">> => 1000,
<<"group_cache_validity">> => 300,
<<"groupattr">> => <<"cn">>,
<<"memberattr">> => <<"memberUid">>,
<<"memberattr_format">> => <<"%u">>,
<<"memberattr_format_re">> => <<>>,
<<"pool_tag">> => default,
<<"rfilter">> => <<>>,
<<"ufilter">> => <<>>,
<<"user_cache_size">> => 1000,
<<"user_cache_validity">> => 300,
<<"userdesc">> => <<"cn">>,
<<"useruid">> => <<"cn">>},
default,when_present},
<<"mod_pubsub">> =>
{section,
#{<<"access_createnode">> =>
{option,atom,access_rule,undefined,
default},
<<"backend">> =>
{option,atom,
{module,mod_pubsub_db},
undefined,default},
<<"default_node_config">> =>
{section,
#{<<"access_model">> =>
{option,atom,non_empty,undefined,
default},
<<"deliver_notifications">> =>
{option,boolean,any,undefined,
default},
<<"deliver_payloads">> =>
{option,boolean,any,undefined,
default},
<<"max_items">> =>
{option,integer,non_negative,
undefined,default},
<<"max_payload_size">> =>
{option,integer,non_negative,
undefined,default},
<<"node_type">> =>
{option,atom,non_empty,undefined,
default},
<<"notification_type">> =>
{option,atom,non_empty,undefined,
default},
<<"notify_config">> =>
{option,boolean,any,undefined,
default},
<<"notify_delete">> =>
{option,boolean,any,undefined,
default},
<<"notify_retract">> =>
{option,boolean,any,undefined,
default},
<<"persist_items">> =>
{option,boolean,any,undefined,
default},
<<"presence_based_delivery">> =>
{option,boolean,any,undefined,
default},
<<"publish_model">> =>
{option,atom,non_empty,undefined,
default},
<<"purge_offline">> =>
{option,boolean,any,undefined,
default},
<<"roster_groups_allowed">> =>
{list,
{option,binary,non_empty,
undefined,default},
any,list,undefined,default},
<<"send_last_published_item">> =>
{option,atom,non_empty,undefined,
default},
<<"subscribe">> =>
{option,boolean,any,undefined,
default}},
any,[],any,list,undefined,#{},default,
when_present},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"ignore_pep_from_offline">> =>
{option,boolean,any,undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"item_publisher">> =>
{option,boolean,any,undefined,default},
<<"last_item_cache">> =>
{option,atom,
{enum,[mnesia,rdbms,false]},
undefined,default},
<<"max_items_node">> =>
{option,integer,non_negative,undefined,
default},
<<"max_subscriptions_node">> =>
{option,integer,non_negative,undefined,
default},
<<"nodetree">> =>
{option,binary,
{module,nodetree},
#Fun<mod_pubsub.0.81398248>,default},
<<"pep_mapping">> =>
{list,
{section,
#{<<"namespace">> =>
{option,binary,non_empty,
undefined,default},
<<"node">> =>
{option,binary,non_empty,
undefined,default}},
any,all,any,map,
fun mod_pubsub:process_pep_mapping/1,
#{},default,when_present},
any,map,undefined,default},
<<"plugins">> =>
{list,
{option,binary,
{module,node},
undefined,default},
any,list,undefined,default},
<<"sync_broadcast">> =>
{option,boolean,any,undefined,default},
<<"wpool">> =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"call_timeout">> => 5000,
<<"strategy">> => best_worker,
<<"workers">> => 10},
default,always}},
any,[],any,map,undefined,
#{<<"access_createnode">> => all,
<<"backend">> => mnesia,
<<"default_node_config">> => [],
<<"host">> => {prefix,<<"pubsub.">>},
<<"ignore_pep_from_offline">> => true,
<<"iqdisc">> => one_queue,
<<"item_publisher">> => false,
<<"last_item_cache">> => false,
<<"max_items_node">> => 10,
<<"nodetree">> => nodetree_tree,
<<"pep_mapping">> => #{},
<<"plugins">> => [<<"flat">>],
<<"sync_broadcast">> => false},
default,when_present},
<<"mod_http_upload">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_http_upload},
undefined,default},
<<"expiration_time">> =>
{option,integer,positive,undefined,
default},
<<"host">> =>
{option,binary,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"max_file_size">> =>
{option,integer,positive,undefined,
default},
<<"s3">> =>
{section,
#{<<"access_key_id">> =>
{option,binary,any,undefined,
default},
<<"add_acl">> =>
{option,boolean,any,undefined,
default},
<<"bucket_url">> =>
{option,binary,url,undefined,
default},
<<"region">> =>
{option,binary,any,undefined,
default},
<<"secret_access_key">> =>
{option,binary,any,undefined,
default}},
any,
[<<"bucket_url">>,<<"region">>,
<<"access_key_id">>,
<<"secret_access_key">>],
any,map,undefined,
#{<<"add_acl">> => false},
default,when_present},
<<"token_bytes">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"s3">>],
any,map,undefined,
#{<<"backend">> => s3,
<<"expiration_time">> => 60,
<<"host">> => <<"upload.@HOST@">>,
<<"iqdisc">> => one_queue,
<<"max_file_size">> => 10485760,
<<"token_bytes">> => 32},
default,when_present},
<<"mod_offline">> =>
{section,
#{<<"access_max_user_messages">> =>
{option,atom,access_rule,undefined,
default},
<<"backend">> =>
{option,atom,
{module,mod_offline},
undefined,default},
<<"store_groupchat_messages">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"access_max_user_messages">> =>
max_user_offline_messages,
<<"backend">> => mnesia,
<<"store_groupchat_messages">> => false},
default,when_present},
<<"mod_vcard">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_vcard},
undefined,default},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"ldap">> =>
{section,
#{<<"base">> =>
{option,binary,any,undefined,
default},
<<"binary_search_fields">> =>
{list,
{option,binary,non_empty,
undefined,default},
any,list,undefined,default},
<<"deref">> =>
{option,atom,
{enum,
[never,always,finding,searching]},
undefined,default},
<<"filter">> =>
{option,binary,any,undefined,
default},
<<"pool_tag">> =>
{option,atom,pool_name,undefined,
default},
<<"search_fields">> =>
{list,
{section,
#{<<"ldap_field">> =>
{option,binary,non_empty,
undefined,default},
<<"search_field">> =>
{option,binary,non_empty,
undefined,default}},
any,all,any,map,
fun mod_vcard:process_search_spec/1,
#{},default,when_present},
any,list,undefined,default},
<<"search_operator">> =>
{option,atom,
{enum,['or','and']},
undefined,default},
<<"search_reported">> =>
{list,
{section,
#{<<"search_field">> =>
{option,binary,non_empty,
undefined,default},
<<"vcard_field">> =>
{option,binary,non_empty,
undefined,default}},
any,all,any,map,
fun mod_vcard:process_search_reported_spec/1,
#{},default,when_present},
any,list,undefined,default},
<<"uids">> =>
{list,
{section,
#{<<"attr">> =>
{option,binary,any,undefined,
default},
<<"format">> =>
{option,binary,any,undefined,
default}},
any,
[<<"attr">>],
any,map,
fun mongoose_ldap_config:process_uids/1,
#{},default,when_present},
any,list,undefined,default},
<<"vcard_map">> =>
{list,
{section,
#{<<"ldap_field">> =>
{option,binary,non_empty,
undefined,default},
<<"ldap_pattern">> =>
{option,binary,non_empty,
undefined,default},
<<"vcard_field">> =>
{option,binary,non_empty,
undefined,default}},
any,all,any,map,
fun mod_vcard:process_map_spec/1,
#{},default,when_present},
any,list,undefined,default}},
any,[],any,map,undefined,
#{<<"binary_search_fields">> => [],
<<"deref">> => never,
<<"filter">> => <<>>,
<<"pool_tag">> => default,
<<"search_fields">> =>
[{<<"User">>,<<"%u">>},
{<<"Full Name">>,<<"displayName">>},
{<<"Given Name">>,<<"givenName">>},
{<<"Middle Name">>,<<"initials">>},
{<<"Family Name">>,<<"sn">>},
{<<"Nickname">>,<<"%u">>},
{<<"Birthday">>,<<"birthDay">>},
{<<"Country">>,<<"c">>},
{<<"City">>,<<"l">>},
{<<"Email">>,<<"mail">>},
{<<"Organization Name">>,<<"o">>},
{<<"Organization Unit">>,<<"ou">>}],
<<"search_operator">> => 'and',
<<"search_reported">> =>
[{<<"Full Name">>,<<"FN">>},
{<<"Given Name">>,<<"FIRST">>},
{<<"Middle Name">>,<<"MIDDLE">>},
{<<"Family Name">>,<<"LAST">>},
{<<"Nickname">>,<<"NICK">>},
{<<"Birthday">>,<<"BDAY">>},
{<<"Country">>,<<"CTRY">>},
{<<"City">>,<<"LOCALITY">>},
{<<"Email">>,<<"EMAIL">>},
{<<"Organization Name">>,
<<"ORGNAME">>},
{<<"Organization Unit">>,
<<"ORGUNIT">>}],
<<"uids">> => [{<<"uid">>,<<"%u">>}],
<<"vcard_map">> =>
[{<<"NICKNAME">>,<<"%u">>,[]},
{<<"FN">>,<<"%s">>,
[<<"displayName">>]},
{<<"FAMILY">>,<<"%s">>,[<<"sn">>]},
{<<"GIVEN">>,<<"%s">>,
[<<"givenName">>]},
{<<"MIDDLE">>,<<"%s">>,
[<<"initials">>]},
{<<"ORGNAME">>,<<"%s">>,[<<"o">>]},
{<<"ORGUNIT">>,<<"%s">>,[<<"ou">>]},
{<<"CTRY">>,<<"%s">>,[<<"c">>]},
{<<"LOCALITY">>,<<"%s">>,[<<"l">>]},
{<<"STREET">>,<<"%s">>,
[<<"street">>]},
{<<"REGION">>,<<"%s">>,[<<"st">>]},
{<<"PCODE">>,<<"%s">>,
[<<"postalCode">>]},
{<<"TITLE">>,<<"%s">>,
[<<"title">>]},
{<<"URL">>,<<"%s">>,
[<<"labeleduri">>]},
{<<"DESC">>,<<"%s">>,
[<<"description">>]},
{<<"TEL">>,<<"%s">>,
[<<"telephoneNumber">>]},
{<<"EMAIL">>,<<"%s">>,[<<"mail">>]},
{<<"BDAY">>,<<"%s">>,
[<<"birthDay">>]},
{<<"ROLE">>,<<"%s">>,
[<<"employeeType">>]},
{<<"PHOTO">>,<<"%s">>,
[<<"jpegPhoto">>]}]},
default,always},
<<"matches">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"search">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,#Fun<mod_vcard.0.52229309>,
#{<<"backend">> => mnesia,
<<"host">> => {prefix,<<"vjud.">>},
<<"iqdisc">> => parallel,
<<"matches">> => 30,<<"search">> => true},
default,when_present},
<<"mod_blocking">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_privacy},
undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia},
default,when_present},
<<"mod_privacy">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_privacy},
undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia},
default,when_present},
<<"mod_mam">> =>
{section,
#{<<"archive_chat_markers">> =>
{option,boolean,any,undefined,default},
<<"async_writer">> =>
{section,
#{<<"batch_size">> =>
{option,integer,non_negative,
undefined,default},
<<"enabled">> =>
{option,boolean,any,undefined,
default},
<<"flush_interval">> =>
{option,integer,non_negative,
undefined,default},
<<"pool_size">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"batch_size">> => 30,
<<"enabled">> => true,
<<"flush_interval">> => 2000,
<<"pool_size">> => 8},
default,always},
<<"backend">> =>
{option,atom,
{enum,[rdbms,cassandra,elasticsearch]},
undefined,default},
<<"cache">> =>
{section,
#{<<"module">> =>
{option,atom,
{enum,[internal,mod_cache_users]},
undefined,default},
<<"number_of_segments">> =>
{option,integer,positive,undefined,
default},
<<"strategy">> =>
{option,atom,
{enum,[fifo,lru]},
undefined,default},
<<"time_to_live">> =>
{option,int_or_infinity,positive,
undefined,default}},
any,[],any,map,
fun mongoose_user_cache:process_cache_config/1,
#{<<"module">> => internal,
<<"number_of_segments">> => 3,
<<"strategy">> => fifo,
<<"time_to_live">> => 480},
default,always},
<<"cache_users">> =>
{option,boolean,any,undefined,default},
<<"db_jid_format">> =>
{option,atom,module,undefined,default},
<<"db_message_format">> =>
{option,atom,module,undefined,default},
<<"default_result_limit">> =>
{option,integer,non_negative,undefined,
default},
<<"delete_domain_limit">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"enforce_simple_queries">> =>
{option,boolean,any,undefined,default},
<<"extra_fin_element">> =>
{option,atom,module,undefined,default},
<<"extra_lookup_params">> =>
{option,atom,module,undefined,default},
<<"full_text_search">> =>
{option,boolean,any,undefined,default},
<<"is_archivable_message">> =>
{option,atom,module,undefined,default},
<<"max_result_limit">> =>
{option,integer,non_negative,undefined,
default},
<<"message_retraction">> =>
{option,boolean,any,undefined,default},
<<"muc">> =>
{section,
#{<<"archive_chat_markers">> =>
{option,boolean,any,undefined,
default},
<<"async_writer">> =>
{section,
#{<<"batch_size">> =>
{option,integer,non_negative,
undefined,default},
<<"enabled">> =>
{option,boolean,any,undefined,
default},
<<"flush_interval">> =>
{option,integer,non_negative,
undefined,default},
<<"pool_size">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"batch_size">> => 30,
<<"enabled">> => true,
<<"flush_interval">> => 2000,
<<"pool_size">> => 8},
default,when_present},
<<"backend">> =>
{option,atom,
{enum,
[rdbms,cassandra,elasticsearch]},
undefined,default},
<<"cache_users">> =>
{option,boolean,any,undefined,
default},
<<"db_jid_format">> =>
{option,atom,module,undefined,
default},
<<"db_message_format">> =>
{option,atom,module,undefined,
default},
<<"default_result_limit">> =>
{option,integer,non_negative,
undefined,default},
<<"delete_domain_limit">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"enforce_simple_queries">> =>
{option,boolean,any,undefined,
default},
<<"extra_fin_element">> =>
{option,atom,module,undefined,
default},
<<"extra_lookup_params">> =>
{option,atom,module,undefined,
default},
<<"full_text_search">> =>
{option,boolean,any,undefined,
default},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"is_archivable_message">> =>
{option,atom,module,undefined,
default},
<<"max_result_limit">> =>
{option,integer,non_negative,
undefined,default},
<<"message_retraction">> =>
{option,boolean,any,undefined,
default},
<<"no_stanzaid_element">> =>
{option,boolean,any,undefined,
default},
<<"send_message">> =>
{option,atom,module,undefined,
default},
<<"user_prefs_store">> =>
{option,atom,
{enum,[rdbms,cassandra,mnesia]},
undefined,default}},
any,[],any,map,undefined,
#{<<"host">> =>
{prefix,<<"conference.">>}},
default,when_present},
<<"no_stanzaid_element">> =>
{option,boolean,any,undefined,default},
<<"pm">> =>
{section,
#{<<"archive_chat_markers">> =>
{option,boolean,any,undefined,
default},
<<"archive_groupchats">> =>
{option,boolean,any,undefined,
default},
<<"async_writer">> =>
{section,
#{<<"batch_size">> =>
{option,integer,non_negative,
undefined,default},
<<"enabled">> =>
{option,boolean,any,undefined,
default},
<<"flush_interval">> =>
{option,integer,non_negative,
undefined,default},
<<"pool_size">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"batch_size">> => 30,
<<"enabled">> => true,
<<"flush_interval">> => 2000,
<<"pool_size">> => 8},
default,when_present},
<<"backend">> =>
{option,atom,
{enum,
[rdbms,cassandra,elasticsearch]},
undefined,default},
<<"cache_users">> =>
{option,boolean,any,undefined,
default},
<<"db_jid_format">> =>
{option,atom,module,undefined,
default},
<<"db_message_format">> =>
{option,atom,module,undefined,
default},
<<"default_result_limit">> =>
{option,integer,non_negative,
undefined,default},
<<"delete_domain_limit">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"enforce_simple_queries">> =>
{option,boolean,any,undefined,
default},
<<"extra_fin_element">> =>
{option,atom,module,undefined,
default},
<<"extra_lookup_params">> =>
{option,atom,module,undefined,
default},
<<"full_text_search">> =>
{option,boolean,any,undefined,
default},
<<"is_archivable_message">> =>
{option,atom,module,undefined,
default},
<<"max_result_limit">> =>
{option,integer,non_negative,
undefined,default},
<<"message_retraction">> =>
{option,boolean,any,undefined,
default},
<<"no_stanzaid_element">> =>
{option,boolean,any,undefined,
default},
<<"same_mam_id_for_peers">> =>
{option,boolean,any,undefined,
default},
<<"send_message">> =>
{option,atom,module,undefined,
default},
<<"user_prefs_store">> =>
{option,atom,
{enum,[rdbms,cassandra,mnesia]},
undefined,default}},
any,[],any,map,undefined,
#{<<"archive_groupchats">> => false,
<<"same_mam_id_for_peers">> => false},
default,when_present},
<<"send_message">> =>
{option,atom,module,undefined,default},
<<"user_prefs_store">> =>
{option,atom,
{enum,[rdbms,cassandra,mnesia]},
undefined,default}},
any,[],any,map,undefined,
#{<<"archive_chat_markers">> => false,
<<"backend">> => rdbms,
<<"cache_users">> => true,
<<"default_result_limit">> => 50,
<<"enforce_simple_queries">> => false,
<<"full_text_search">> => true,
<<"is_archivable_message">> =>
mod_mam_utils,
<<"max_result_limit">> => 50,
<<"message_retraction">> => true,
<<"no_stanzaid_element">> => false,
<<"send_message">> => mod_mam_utils},
default,when_present},
<<"mod_version">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"os_info">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"iqdisc">> => no_queue,
<<"os_info">> => false},
default,when_present},
<<"mod_ping">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"ping_interval">> =>
{option,integer,positive,
fun timer:seconds/1,default},
<<"ping_req_timeout">> =>
{option,integer,positive,
fun timer:seconds/1,default},
<<"send_pings">> =>
{option,boolean,any,undefined,default},
<<"timeout_action">> =>
{option,atom,
{enum,[none,kill]},
undefined,default}},
any,[],any,map,undefined,
#{<<"iqdisc">> => no_queue,
<<"ping_interval">> => 60000,
<<"ping_req_timeout">> => 32000,
<<"send_pings">> => false,
<<"timeout_action">> => none},
default,when_present},
<<"mod_adhoc">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"report_commands_node">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"iqdisc">> => one_queue,
<<"report_commands_node">> => false},
default,when_present}},
module,[],any,map,undefined,#{},host_config,
when_present},
<<"outgoing_pools">> =>
{section,
#{<<"cassandra">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"auth">> =>
{section,
#{<<"plain">> =>
{section,
#{<<"password">> =>
{option,binary,any,
undefined,default},
<<"username">> =>
{option,binary,any,
undefined,default}},
any,all,any,map,undefined,
#{},default,when_present}},
any,all,any,map,undefined,#{},
default,when_present},
<<"keyspace">> =>
{option,atom,non_empty,
undefined,default},
<<"servers">> =>
{list,
{section,
#{<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"port">> =>
{option,integer,port,
undefined,default}},
any,
[<<"host">>],
any,map,undefined,
#{<<"port">> => 9042},
default,when_present},
unique_non_empty,list,
undefined,default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,
undefined,default},
<<"certfile">> =>
{option,string,filename,
undefined,default},
<<"ciphers">> =>
{option,string,any,
undefined,default},
<<"keyfile">> =>
{option,string,filename,
undefined,default},
<<"password">> =>
{option,string,any,
undefined,default},
<<"server_name_indication">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,
undefined,default},
<<"host">> =>
{option,string,
non_empty,undefined,
default},
<<"protocol">> =>
{option,atom,
{enum,[default,https]},
undefined,default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"protocol">> =>
default},
default,always},
<<"verify_mode">> =>
{option,atom,
{enum,
[peer,selfsigned_peer,
none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,
undefined,default},
any,list,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present}},
any,[],any,map,undefined,
#{<<"keyspace">> => mongooseim,
<<"servers">> =>
[#{port => 9042,
host => "localhost"}]},
default,always},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"strategy">> => best_worker,
<<"workers">> => 20},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"elastic">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"host">> =>
{option,binary,non_empty,
undefined,default},
<<"port">> =>
{option,integer,port,undefined,
default}},
any,[],any,map,undefined,
#{<<"host">> => <<"localhost">>,
<<"port">> => 9200},
default,always},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"http">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"path_prefix">> =>
{option,binary,non_empty,
undefined,default},
<<"request_timeout">> =>
{option,integer,non_negative,
undefined,default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,
undefined,default},
<<"certfile">> =>
{option,string,filename,
undefined,default},
<<"ciphers">> =>
{option,string,any,
undefined,default},
<<"keyfile">> =>
{option,string,filename,
undefined,default},
<<"password">> =>
{option,string,any,
undefined,default},
<<"server_name_indication">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,
undefined,default},
<<"host">> =>
{option,string,
non_empty,undefined,
default},
<<"protocol">> =>
{option,atom,
{enum,[default,https]},
undefined,default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"protocol">> =>
default},
default,always},
<<"verify_mode">> =>
{option,atom,
{enum,
[peer,selfsigned_peer,
none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,
undefined,default},
any,list,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present}},
any,
[<<"host">>],
any,map,undefined,
#{<<"path_prefix">> => <<"/">>,
<<"request_timeout">> => 2000},
default,always},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"ldap">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"connect_interval">> =>
{option,integer,positive,
undefined,default},
<<"password">> =>
{option,binary,any,undefined,
default},
<<"port">> =>
{option,integer,port,undefined,
default},
<<"root_dn">> =>
{option,binary,any,undefined,
default},
<<"servers">> =>
{list,
{option,string,any,undefined,
default},
unique_non_empty,list,
undefined,default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,
undefined,default},
<<"certfile">> =>
{option,string,filename,
undefined,default},
<<"ciphers">> =>
{option,string,any,
undefined,default},
<<"keyfile">> =>
{option,string,filename,
undefined,default},
<<"password">> =>
{option,string,any,
undefined,default},
<<"server_name_indication">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,
undefined,default},
<<"host">> =>
{option,string,
non_empty,undefined,
default},
<<"protocol">> =>
{option,atom,
{enum,[default,https]},
undefined,default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"protocol">> =>
default},
default,always},
<<"verify_mode">> =>
{option,atom,
{enum,
[peer,selfsigned_peer,
none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,
undefined,default},
any,list,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present}},
any,[],any,map,
fun mongoose_config_spec:process_ldap_connection/1,
#{<<"connect_interval">> => 10000,
<<"password">> => <<>>,
<<"root_dn">> => <<>>,
<<"servers">> => ["localhost"]},
default,always},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"rabbit">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"confirms_enabled">> =>
{option,boolean,any,undefined,
default},
<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"max_worker_queue_len">> =>
{option,int_or_infinity,
non_negative,undefined,default},
<<"password">> =>
{option,binary,non_empty,
undefined,default},
<<"port">> =>
{option,integer,port,undefined,
default},
<<"username">> =>
{option,binary,non_empty,
undefined,default}},
any,[],any,map,undefined,
#{<<"confirms_enabled">> => false,
<<"host">> => "localhost",
<<"max_worker_queue_len">> =>
1000,
<<"password">> => <<"guest">>,
<<"port">> => 5672,
<<"username">> => <<"guest">>},
default,always},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"rdbms">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"database">> =>
{option,string,non_empty,
undefined,default},
<<"driver">> =>
{option,atom,
{enum,[odbc,pgsql,mysql]},
undefined,default},
<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"keepalive_interval">> =>
{option,integer,positive,
undefined,default},
<<"max_start_interval">> =>
{option,integer,positive,
undefined,default},
<<"password">> =>
{option,string,non_empty,
undefined,default},
<<"port">> =>
{option,integer,port,undefined,
default},
<<"query_timeout">> =>
{option,integer,non_negative,
undefined,default},
<<"settings">> =>
{option,string,any,undefined,
default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,
undefined,default},
<<"certfile">> =>
{option,string,filename,
undefined,default},
<<"ciphers">> =>
{option,string,any,
undefined,default},
<<"keyfile">> =>
{option,string,filename,
undefined,default},
<<"password">> =>
{option,string,any,
undefined,default},
<<"required">> =>
{option,boolean,any,
undefined,default},
<<"server_name_indication">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,
undefined,default},
<<"host">> =>
{option,string,
non_empty,undefined,
default},
<<"protocol">> =>
{option,atom,
{enum,[default,https]},
undefined,default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"protocol">> =>
default},
default,always},
<<"verify_mode">> =>
{option,atom,
{enum,
[peer,selfsigned_peer,
none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,
undefined,default},
any,list,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present},
<<"username">> =>
{option,string,non_empty,
undefined,default}},
any,
[<<"driver">>],
any,map,
fun mongoose_rdbms:process_options/1,
#{<<"max_start_interval">> => 30,
<<"query_timeout">> => 5000},
default,when_present},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 60000,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"redis">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"database">> =>
{option,integer,non_negative,
undefined,default},
<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"password">> =>
{option,string,any,undefined,
default},
<<"port">> =>
{option,integer,port,undefined,
default}},
any,[],any,map,undefined,
#{<<"database">> => 0,
<<"host">> => "127.0.0.1",
<<"password">> => [],
<<"port">> => 6379},
default,always},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present}},
any,[],any,list,undefined,#{},host_config,
when_present},
<<"s2s">> =>
{section,
#{<<"address">> =>
{list,
{section,
#{<<"host">> =>
{option,binary,non_empty,undefined,
default},
<<"ip_address">> =>
{option,string,ip_address,undefined,
default},
<<"port">> =>
{option,integer,port,undefined,
default}},
any,
[<<"host">>,<<"ip_address">>],
any,map,
fun mongoose_config_spec:process_s2s_address/1,
#{},default,when_present},
any,map,undefined,default},
<<"certfile">> =>
{option,string,filename,undefined,default},
<<"ciphers">> =>
{option,string,any,undefined,default},
<<"default_policy">> =>
{option,atom,
{enum,[allow,deny]},
undefined,default},
<<"dns">> =>
{section,
#{<<"retries">> =>
{option,integer,positive,undefined,
default},
<<"timeout">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"retries">> => 2,<<"timeout">> => 10},
default,always},
<<"host_policy">> =>
{list,
{section,
#{<<"host">> =>
{option,binary,non_empty,undefined,
default},
<<"policy">> =>
{option,atom,
{enum,[allow,deny]},
undefined,default}},
any,all,any,map,
fun mongoose_config_spec:process_s2s_host_policy/1,
#{},default,when_present},
any,map,undefined,default},
<<"max_retry_delay">> =>
{option,integer,positive,undefined,default},
<<"outgoing">> =>
{section,
#{<<"connection_timeout">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"ip_versions">> =>
{list,
{option,integer,
{enum,[4,6]},
undefined,default},
unique_non_empty,list,undefined,
default},
<<"port">> =>
{option,integer,port,undefined,default}},
any,[],any,map,undefined,
#{<<"connection_timeout">> => 10000,
<<"ip_versions">> => [4,6],
<<"port">> => 5269},
default,always},
<<"shared">> =>
{option,binary,non_empty,undefined,default},
<<"use_starttls">> =>
{option,atom,
{enum,
[false,optional,required,
required_trusted]},
undefined,default}},
any,[],any,map,undefined,
#{<<"ciphers">> => "TLSv1.2:TLSv1.3",
<<"default_policy">> => allow,
<<"max_retry_delay">> => 300,
<<"use_starttls">> => false},
host_config,when_present}},
any,[],any,list,undefined,#{},none,when_present},
any,list,undefined,none},
<<"internal_databases">> =>
{section,
#{<<"cets">> =>
{section,
#{<<"backend">> =>
{option,atom,
{enum,[file,rdbms]},
undefined,default},
<<"cluster_name">> =>
{option,atom,non_empty,undefined,default},
<<"node_list_file">> =>
{option,string,filename,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => rdbms,
<<"cluster_name">> => mongooseim},
default,when_present},
<<"mnesia">> =>
{section,#{},any,[],any,map,undefined,#{},
default,when_present}},
any,[],any,map,undefined,#{},global_config,
when_present},
<<"listen">> =>
{section,
#{<<"c2s">> =>
{list,
{section,
#{<<"access">> =>
{option,atom,non_empty,undefined,default},
<<"allowed_auth_methods">> =>
{list,
{option,atom,
{module,ejabberd_auth},
undefined,default},
unique,list,undefined,default},
<<"backlog">> =>
{option,integer,non_negative,undefined,
default},
<<"backwards_compatible_session">> =>
{option,boolean,any,undefined,default},
<<"c2s_state_timeout">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"hibernate_after">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"ip_address">> =>
{option,string,ip_address,undefined,default},
<<"ip_version">> =>
{option,integer,
{enum,[4,6]},
undefined,default},
<<"max_connections">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"max_stanza_size">> =>
{option,int_or_infinity,positive,
fun mongoose_config_spec:process_infinity_as_zero/1,
default},
<<"num_acceptors">> =>
{option,integer,positive,undefined,default},
<<"port">> =>
{option,integer,port,undefined,default},
<<"proto">> =>
{option,atom,{enum,[tcp]},undefined,default},
<<"proxy_protocol">> =>
{option,boolean,any,undefined,default},
<<"reuse_port">> =>
{option,boolean,any,undefined,default},
<<"shaper">> =>
{option,atom,non_empty,undefined,default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,undefined,
default},
<<"certfile">> =>
{option,string,filename,undefined,
default},
<<"ciphers">> =>
{option,string,any,undefined,default},
<<"crl_files">> =>
{list,
{option,string,filename,undefined,
default},
any,list,undefined,default},
<<"dhfile">> =>
{option,string,filename,undefined,
default},
<<"disconnect_on_failure">> =>
{option,boolean,any,undefined,default},
<<"keyfile">> =>
{option,string,filename,undefined,
default},
<<"mode">> =>
{option,atom,
{enum,[tls,starttls,starttls_required]},
undefined,default},
<<"module">> =>
{option,atom,
{enum,[fast_tls,just_tls]},
undefined,default},
<<"password">> =>
{option,string,any,undefined,default},
<<"protocol_options">> =>
{list,
{option,string,non_empty,undefined,
default},
any,list,undefined,default},
<<"verify_mode">> =>
{option,atom,
{enum,[peer,selfsigned_peer,none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,undefined,default},
any,list,undefined,default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"mode">> => starttls,
<<"module">> => fast_tls,
<<"verify_mode">> => peer},
default,when_present}},
any,
[<<"port">>],
any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"access">> => all,<<"backlog">> => 1024,
<<"backwards_compatible_session">> => true,
<<"c2s_state_timeout">> => 5000,
<<"hibernate_after">> => 0,
<<"max_connections">> => infinity,
<<"max_stanza_size">> => 0,
<<"num_acceptors">> => 100,
<<"proto">> => tcp,
<<"proxy_protocol">> => false,
<<"reuse_port">> => false,
<<"shaper">> => none},
default,when_present},
any,list,undefined,none},
<<"http">> =>
{list,
{section,
#{<<"handlers">> =>
{section,
#{default =>
{list,
{section,
#{<<"host">> =>
{option,string,non_empty,
fun mongoose_http_handler:cowboy_host/1,
default},
<<"path">> =>
{option,string,any,undefined,
default}},
any,
[<<"host">>,<<"path">>],
any,map,
fun mongoose_http_handler:process_config/2,
#{},default,when_present},
any,list,undefined,none},
<<"mod_websockets">> =>
{list,
{section,
#{<<"backwards_compatible_session">> =>
{option,boolean,any,undefined,
default},
<<"c2s_state_timeout">> =>
{option,int_or_infinity,
non_negative,undefined,default},
<<"host">> =>
{option,string,non_empty,
fun mongoose_http_handler:cowboy_host/1,
default},
<<"max_stanza_size">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"path">> =>
{option,string,any,undefined,
default},
<<"ping_rate">> =>
{option,integer,positive,
undefined,default},
<<"timeout">> =>
{option,int_or_infinity,
non_negative,undefined,default}},
any,
[<<"host">>,<<"path">>],
any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"backwards_compatible_session">> =>
true,
<<"c2s_state_timeout">> => 5000,
<<"max_stanza_size">> => infinity,
<<"timeout">> => 60000},
default,when_present},
any,list,undefined,none},
<<"mongoose_admin_api">> =>
{list,
{section,
#{<<"handlers">> =>
{list,
{option,atom,
{enum,
[contacts,users,sessions,
messages,stanzas,muc_light,muc,
inbox,domain,metrics]},
undefined,default},
unique,list,undefined,default},
<<"host">> =>
{option,string,non_empty,
fun mongoose_http_handler:cowboy_host/1,
default},
<<"password">> =>
{option,binary,any,undefined,
default},
<<"path">> =>
{option,string,any,undefined,
default},
<<"username">> =>
{option,binary,any,undefined,
default}},
any,
[<<"host">>,<<"path">>],
any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"handlers">> =>
[contacts,users,sessions,messages,
stanzas,muc_light,muc,inbox,
domain,metrics]},
default,when_present},
any,list,undefined,none},
<<"mongoose_client_api">> =>
{list,
{section,
#{<<"docs">> =>
{option,boolean,any,undefined,
default},
<<"handlers">> =>
{list,
{option,atom,
{enum,
[sse,messages,contacts,rooms,
rooms_config,rooms_users,
rooms_messages]},
undefined,default},
unique,list,undefined,default},
<<"host">> =>
{option,string,non_empty,
fun mongoose_http_handler:cowboy_host/1,
default},
<<"path">> =>
{option,string,any,undefined,
default}},
any,
[<<"host">>,<<"path">>],
any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"docs">> => true,
<<"handlers">> =>
[sse,messages,contacts,rooms,
rooms_config,rooms_users,
rooms_messages]},
default,when_present},
any,list,undefined,none},
<<"mongoose_graphql_handler">> =>
{list,
{section,
#{<<"allowed_categories">> =>
{list,
{option,binary,
{enum,
[<<"checkAuth">>,<<"account">>,
<<"domain">>,<<"last">>,
<<"muc">>,<<"muc_light">>,
<<"session">>,<<"stanza">>,
<<"roster">>,<<"vcard">>,
<<"private">>,<<"metric">>,
<<"stat">>,<<"gdpr">>,
<<"mnesia">>,<<"server">>,
<<"inbox">>,<<"http_upload">>,
<<"offline">>,<<"token">>]},
undefined,default},
unique_non_empty,list,undefined,
default},
<<"host">> =>
{option,string,non_empty,
fun mongoose_http_handler:cowboy_host/1,
default},
<<"password">> =>
{option,binary,any,undefined,
default},
<<"path">> =>
{option,string,any,undefined,
default},
<<"schema_endpoint">> =>
{option,atom,
{enum,[admin,domain_admin,user]},
undefined,default},
<<"sse_idle_timeout">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"username">> =>
{option,binary,any,undefined,
default}},
any,
[<<"host">>,<<"path">>,
<<"schema_endpoint">>],
any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"sse_idle_timeout">> => 3600000},
default,when_present},
any,list,undefined,none}},
module,[],any,list,undefined,#{},default,
always},
<<"ip_address">> =>
{option,string,ip_address,undefined,default},
<<"ip_version">> =>
{option,integer,
{enum,[4,6]},
undefined,default},
<<"port">> =>
{option,integer,port,undefined,default},
<<"proto">> =>
{option,atom,{enum,[tcp]},undefined,default},
<<"protocol">> =>
{section,
#{<<"compress">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"compress">> => false},
default,always},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,undefined,
default},
<<"certfile">> =>
{option,string,filename,undefined,
default},
<<"ciphers">> =>
{option,string,any,undefined,default},
<<"dhfile">> =>
{option,string,filename,undefined,
default},
<<"keyfile">> =>
{option,string,filename,undefined,
default},
<<"password">> =>
{option,string,any,undefined,default},
<<"verify_mode">> =>
{option,atom,
{enum,[peer,selfsigned_peer,none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,undefined,default},
any,list,undefined,default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present},
<<"transport">> =>
{section,
#{<<"max_connections">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"num_acceptors">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"max_connections">> => 1024,
<<"num_acceptors">> => 100},
default,always}},
any,
[<<"port">>],
any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"proto">> => tcp},
default,when_present},
any,list,undefined,none},
<<"s2s">> =>
{list,
{section,
#{<<"backlog">> =>
{option,integer,non_negative,undefined,
default},
<<"hibernate_after">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"ip_address">> =>
{option,string,ip_address,undefined,default},
<<"ip_version">> =>
{option,integer,
{enum,[4,6]},
undefined,default},
<<"max_stanza_size">> =>
{option,int_or_infinity,positive,
fun mongoose_config_spec:process_infinity_as_zero/1,
default},
<<"num_acceptors">> =>
{option,integer,positive,undefined,default},
<<"port">> =>
{option,integer,port,undefined,default},
<<"proto">> =>
{option,atom,{enum,[tcp]},undefined,default},
<<"proxy_protocol">> =>
{option,boolean,any,undefined,default},
<<"shaper">> =>
{option,atom,non_empty,undefined,default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,undefined,
default},
<<"certfile">> =>
{option,string,filename,undefined,
default},
<<"ciphers">> =>
{option,string,any,undefined,default},
<<"dhfile">> =>
{option,string,filename,undefined,
default},
<<"protocol_options">> =>
{list,
{option,string,non_empty,undefined,
default},
any,list,undefined,default},
<<"verify_mode">> =>
{option,atom,
{enum,[peer,selfsigned_peer,none]},
undefined,default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,always}},
any,
[<<"port">>],
any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"backlog">> => 1024,
<<"hibernate_after">> => 0,
<<"max_stanza_size">> => 0,
<<"num_acceptors">> => 100,
<<"proto">> => tcp,
<<"proxy_protocol">> => false,
<<"shaper">> => none},
default,when_present},
any,list,undefined,none},
<<"service">> =>
{list,
{section,
#{<<"access">> =>
{option,atom,non_empty,undefined,default},
<<"backlog">> =>
{option,integer,non_negative,undefined,
default},
<<"check_from">> =>
{option,boolean,any,undefined,default},
<<"conflict_behaviour">> =>
{option,atom,
{enum,[kick_old,disconnect]},
undefined,default},
<<"hibernate_after">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"hidden_components">> =>
{option,boolean,any,undefined,default},
<<"ip_address">> =>
{option,string,ip_address,undefined,default},
<<"ip_version">> =>
{option,integer,
{enum,[4,6]},
undefined,default},
<<"max_fsm_queue">> =>
{option,integer,positive,undefined,default},
<<"max_stanza_size">> =>
{option,int_or_infinity,positive,
fun mongoose_config_spec:process_infinity_as_zero/1,
default},
<<"num_acceptors">> =>
{option,integer,positive,undefined,default},
<<"password">> =>
{option,string,non_empty,undefined,default},
<<"port">> =>
{option,integer,port,undefined,default},
<<"proto">> =>
{option,atom,{enum,[tcp]},undefined,default},
<<"proxy_protocol">> =>
{option,boolean,any,undefined,default},
<<"shaper_rule">> =>
{option,atom,non_empty,undefined,default}},
any,
[<<"port">>,<<"password">>],
any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"access">> => all,<<"backlog">> => 1024,
<<"check_from">> => true,
<<"conflict_behaviour">> => disconnect,
<<"hibernate_after">> => 0,
<<"hidden_components">> => false,
<<"max_stanza_size">> => 0,
<<"num_acceptors">> => 100,
<<"proto">> => tcp,
<<"proxy_protocol">> => false,
<<"shaper_rule">> => none},
default,when_present},
any,list,undefined,none}},
any,[],any,list,
fun mongoose_listener_config:verify_unique_listeners/1,
#{},global_config,always},
<<"modules">> =>
{section,
#{<<"mod_time">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"iqdisc">> => one_queue},
default,when_present},
<<"mod_keystore">> =>
{section,
#{<<"keys">> =>
{list,
{section,
#{<<"name">> =>
{option,atom,non_empty,undefined,
default},
<<"path">> =>
{option,string,filename,undefined,
default},
<<"type">> =>
{option,atom,
{enum,[file,ram]},
undefined,default}},
any,
[<<"name">>,<<"type">>],
any,map,fun mod_keystore:process_key/1,#{},
default,when_present},
any,map,undefined,default},
<<"ram_key_size">> =>
{option,integer,non_negative,undefined,
default}},
any,[],any,map,undefined,
#{<<"keys">> => #{},<<"ram_key_size">> => 2048},
default,when_present},
<<"mod_disco">> =>
{section,
#{<<"extra_domains">> =>
{list,
{option,binary,domain,undefined,default},
any,list,undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"server_info">> =>
{list,
{section,
#{<<"modules">> =>
{list,
{option,atom,module,undefined,default},
any,list,undefined,default},
<<"name">> =>
{option,binary,non_empty,undefined,
default},
<<"urls">> =>
{list,
{option,binary,url,undefined,default},
any,list,undefined,default}},
any,
[<<"name">>,<<"urls">>],
any,map,undefined,#{},default,when_present},
any,list,undefined,default},
<<"users_can_see_hidden_services">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"extra_domains">> => [],
<<"iqdisc">> => one_queue,
<<"server_info">> => [],
<<"users_can_see_hidden_services">> => true},
default,when_present},
<<"mod_cache_users">> =>
{section,
#{<<"number_of_segments">> =>
{option,integer,positive,undefined,default},
<<"strategy">> =>
{option,atom,
{enum,[fifo,lru]},
undefined,default},
<<"time_to_live">> =>
{option,int_or_infinity,positive,undefined,
default}},
any,[],any,map,
fun mongoose_user_cache:process_cache_config/1,
#{<<"number_of_segments">> => 3,
<<"strategy">> => fifo,
<<"time_to_live">> => 480},
default,when_present},
<<"mod_auth_token">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_auth_token},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"validity_period">> =>
{section,
#{<<"access">> =>
{section,
#{<<"unit">> =>
{option,atom,
{enum,[days,hours,minutes,seconds]},
undefined,default},
<<"value">> =>
{option,integer,non_negative,
undefined,default}},
any,all,any,map,undefined,#{},default,
when_present},
<<"refresh">> =>
{section,
#{<<"unit">> =>
{option,atom,
{enum,[days,hours,minutes,seconds]},
undefined,default},
<<"value">> =>
{option,integer,non_negative,
undefined,default}},
any,all,any,map,undefined,#{},default,
when_present}},
any,[],any,map,undefined,
#{<<"access">> =>
#{unit => hours,value => 1},
<<"refresh">> =>
#{unit => days,value => 25}},
default,always}},
any,[],any,map,undefined,
#{<<"backend">> => rdbms,
<<"iqdisc">> => no_queue},
default,when_present},
<<"mod_csi">> =>
{section,
#{<<"buffer_max">> =>
{option,int_or_infinity,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"buffer_max">> => 20},
default,when_present},
<<"mod_muc">> =>
{section,
#{<<"access">> =>
{option,atom,access_rule,undefined,default},
<<"access_admin">> =>
{option,atom,access_rule,undefined,default},
<<"access_create">> =>
{option,atom,access_rule,undefined,default},
<<"access_persistent">> =>
{option,atom,access_rule,undefined,default},
<<"backend">> =>
{option,atom,
{module,mod_muc},
undefined,default},
<<"default_room">> =>
{section,
#{<<"affiliations">> =>
{list,
{section,
#{<<"affiliation">> =>
{option,atom,non_empty,undefined,
default},
<<"resource">> =>
{option,binary,any,undefined,
default},
<<"server">> =>
{option,binary,domain,undefined,
default},
<<"user">> =>
{option,binary,non_empty,undefined,
default}},
any,all,any,map,
fun mod_muc:process_room_affiliation/1,
#{},default,when_present},
any,list,undefined,default},
<<"allow_change_subj">> =>
{option,boolean,any,undefined,default},
<<"allow_multiple_sessions">> =>
{option,boolean,any,undefined,default},
<<"allow_private_messages">> =>
{option,boolean,any,undefined,default},
<<"allow_query_users">> =>
{option,boolean,any,undefined,default},
<<"allow_user_invites">> =>
{option,boolean,any,undefined,default},
<<"allow_visitor_nickchange">> =>
{option,boolean,any,undefined,default},
<<"allow_visitor_status">> =>
{option,boolean,any,undefined,default},
<<"anonymous">> =>
{option,boolean,any,undefined,default},
<<"description">> =>
{option,binary,any,undefined,default},
<<"logging">> =>
{option,boolean,any,undefined,default},
<<"max_users">> =>
{option,integer,positive,undefined,
default},
<<"maygetmemberlist">> =>
{list,
{option,atom,non_empty,undefined,
default},
any,list,undefined,default},
<<"members_by_default">> =>
{option,boolean,any,undefined,default},
<<"members_only">> =>
{option,boolean,any,undefined,default},
<<"moderated">> =>
{option,boolean,any,undefined,default},
<<"password">> =>
{option,binary,any,undefined,default},
<<"password_protected">> =>
{option,boolean,any,undefined,default},
<<"persistent">> =>
{option,boolean,any,undefined,default},
<<"public">> =>
{option,boolean,any,undefined,default},
<<"public_list">> =>
{option,boolean,any,undefined,default},
<<"subject">> =>
{option,binary,any,undefined,default},
<<"subject_author">> =>
{option,binary,any,undefined,default},
<<"title">> =>
{option,binary,any,undefined,default}},
any,[],any,map,undefined,
#{<<"affiliations">> => [],
<<"allow_change_subj">> => true,
<<"allow_multiple_sessions">> => false,
<<"allow_private_messages">> => true,
<<"allow_query_users">> => true,
<<"allow_user_invites">> => false,
<<"allow_visitor_nickchange">> => true,
<<"allow_visitor_status">> => true,
<<"anonymous">> => true,
<<"description">> => <<>>,
<<"logging">> => false,
<<"max_users">> => 200,
<<"maygetmemberlist">> => [],
<<"members_by_default">> => true,
<<"members_only">> => false,
<<"moderated">> => true,
<<"password">> => <<>>,
<<"password_protected">> => false,
<<"persistent">> => false,
<<"public">> => true,
<<"public_list">> => true,
<<"subject">> => <<>>,
<<"subject_author">> => <<>>,
<<"title">> => <<>>},
default,when_present},
<<"hibernate_timeout">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"hibernated_room_check_interval">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"hibernated_room_timeout">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"history_size">> =>
{option,integer,non_negative,undefined,
default},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"http_auth_pool">> =>
{option,atom,pool_name,undefined,default},
<<"load_permanent_rooms_at_startup">> =>
{option,boolean,any,undefined,default},
<<"max_room_desc">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"max_room_id">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"max_room_name">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"max_user_conferences">> =>
{option,integer,non_negative,undefined,
default},
<<"max_users">> =>
{option,integer,positive,undefined,default},
<<"max_users_admin_threshold">> =>
{option,integer,positive,undefined,default},
<<"min_message_interval">> =>
{option,integer,non_negative,undefined,
default},
<<"min_presence_interval">> =>
{option,integer,non_negative,undefined,
default},
<<"online_backend">> =>
{option,atom,
{module,mod_muc_online},
undefined,default},
<<"room_shaper">> =>
{option,atom,shaper,undefined,default},
<<"user_message_shaper">> =>
{option,atom,shaper,undefined,default},
<<"user_presence_shaper">> =>
{option,atom,shaper,undefined,default}},
any,[],any,map,undefined,
#{<<"access">> => all,
<<"access_admin">> => none,
<<"access_create">> => all,
<<"access_persistent">> => all,
<<"backend">> => mnesia,
<<"default_room">> =>
#{public => true,description => <<>>,
persistent => false,title => <<>>,
password => <<>>,anonymous => true,
subject => <<>>,allow_change_subj => true,
allow_query_users => true,
allow_private_messages => true,
allow_visitor_status => true,
allow_visitor_nickchange => true,
public_list => true,moderated => true,
members_by_default => true,
members_only => false,
allow_user_invites => false,
allow_multiple_sessions => false,
password_protected => false,
max_users => 200,maygetmemberlist => [],
logging => false,affiliations => [],
subject_author => <<>>},
<<"hibernate_timeout">> => 90000,
<<"hibernated_room_check_interval">> =>
infinity,
<<"hibernated_room_timeout">> => infinity,
<<"history_size">> => 20,
<<"host">> => {prefix,<<"conference.">>},
<<"http_auth_pool">> => none,
<<"load_permanent_rooms_at_startup">> => false,
<<"max_room_desc">> => infinity,
<<"max_room_id">> => infinity,
<<"max_room_name">> => infinity,
<<"max_user_conferences">> => 10,
<<"max_users">> => 200,
<<"max_users_admin_threshold">> => 5,
<<"min_message_interval">> => 0,
<<"min_presence_interval">> => 0,
<<"online_backend">> => mnesia,
<<"room_shaper">> => none,
<<"user_message_shaper">> => none,
<<"user_presence_shaper">> => none},
default,when_present},
<<"mod_muc_log">> =>
{section,
#{<<"access_log">> =>
{option,atom,access_rule,undefined,default},
<<"css_file">> =>
{option,binary,non_empty,undefined,default},
<<"dirname">> =>
{option,atom,
{enum,[room_jid,room_name]},
undefined,default},
<<"dirtype">> =>
{option,atom,
{enum,[subdirs,plain]},
undefined,default},
<<"file_format">> =>
{option,atom,
{enum,[html,plaintext]},
undefined,default},
<<"outdir">> =>
{option,string,dirname,undefined,default},
<<"spam_prevention">> =>
{option,boolean,any,undefined,default},
<<"timezone">> =>
{option,atom,
{enum,[local,universal]},
undefined,default},
<<"top_link">> =>
{section,
#{<<"target">> =>
{option,string,url,undefined,default},
<<"text">> =>
{option,string,non_empty,undefined,
default}},
any,all,any,map,
fun mod_muc_log:process_top_link/1,#{},
default,when_present}},
any,[],any,map,undefined,
#{<<"access_log">> => muc_admin,
<<"css_file">> => false,
<<"dirname">> => room_jid,
<<"dirtype">> => subdirs,
<<"file_format">> => html,
<<"outdir">> => "www/muc",
<<"spam_prevention">> => true,
<<"timezone">> => local,
<<"top_link">> => {"/","Home"}},
default,when_present},
<<"mod_caps">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_caps},
undefined,default},
<<"cache_life_time">> =>
{option,integer,positive,undefined,default},
<<"cache_size">> =>
{option,integer,positive,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"cache_life_time">> => 86400,
<<"cache_size">> => 1000},
default,when_present},
<<"mod_roster">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_roster},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"store_current_id">> =>
{option,boolean,any,undefined,default},
<<"versioning">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"iqdisc">> => one_queue,
<<"store_current_id">> => false,
<<"versioning">> => false},
default,when_present},
<<"mod_extdisco">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"service">> =>
{list,
{section,
#{<<"host">> =>
{option,binary,non_empty,undefined,
default},
<<"password">> =>
{option,binary,non_empty,undefined,
default},
<<"port">> =>
{option,integer,port,undefined,default},
<<"transport">> =>
{option,binary,
{enum,[<<"udp">>,<<"tcp">>]},
undefined,default},
<<"type">> =>
{option,atom,non_empty,undefined,
default},
<<"username">> =>
{option,binary,non_empty,undefined,
default}},
any,
[<<"type">>,<<"host">>],
any,map,undefined,#{},default,when_present},
any,list,undefined,default}},
any,[],any,map,undefined,
#{<<"iqdisc">> => no_queue,<<"service">> => []},
default,when_present},
<<"mod_offline_chatmarkers">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_offline_chatmarkers},
undefined,default},
<<"store_groupchat_messages">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => rdbms,
<<"store_groupchat_messages">> => false},
default,when_present},
<<"mod_private">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_private},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"backend">> => rdbms,
<<"iqdisc">> => one_queue},
default,when_present},
<<"mod_sic">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"iqdisc">> => one_queue},
default,when_present},
<<"mod_carboncopy">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"iqdisc">> => no_queue},
default,when_present},
default =>
{section,#{},any,[],any,map,undefined,#{},
default,when_present},
<<"mod_smart_markers">> =>
{section,
#{<<"async_writer">> =>
{section,
#{<<"pool_size">> =>
{option,integer,non_negative,undefined,
default}},
any,[],any,map,undefined,
#{<<"pool_size">> => 4},
default,always},
<<"backend">> =>
{option,atom,
{enum,[rdbms,rdbms_async]},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"keep_private">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => rdbms,
<<"iqdisc">> => no_queue,
<<"keep_private">> => false},
default,when_present},
<<"mod_global_distrib">> =>
{section,
#{<<"bounce">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,undefined,default},
<<"max_retries">> =>
{option,integer,non_negative,undefined,
default},
<<"resend_after_ms">> =>
{option,integer,non_negative,undefined,
default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"max_retries">> => 4,
<<"resend_after_ms">> => 200},
default,always},
<<"cache">> =>
{section,
#{<<"cache_missed">> =>
{option,boolean,any,undefined,default},
<<"domain_lifetime_seconds">> =>
{option,integer,non_negative,undefined,
default},
<<"jid_lifetime_seconds">> =>
{option,integer,non_negative,undefined,
default},
<<"max_jids">> =>
{option,integer,non_negative,undefined,
default}},
any,[],any,map,undefined,
#{<<"cache_missed">> => true,
<<"domain_lifetime_seconds">> => 600,
<<"jid_lifetime_seconds">> => 5,
<<"max_jids">> => 10000},
default,always},
<<"connections">> =>
{section,
#{<<"advertised_endpoints">> =>
{list,
{section,
#{<<"host">> =>
{option,string,network_address,
undefined,default},
<<"port">> =>
{option,integer,port,undefined,
default}},
any,all,any,map,
fun mod_global_distrib:process_endpoint/1,
#{},default,when_present},
any,list,undefined,default},
<<"connections_per_endpoint">> =>
{option,integer,non_negative,undefined,
default},
<<"disabled_gc_interval">> =>
{option,integer,positive,undefined,
default},
<<"endpoint_refresh_interval">> =>
{option,integer,positive,undefined,
default},
<<"endpoint_refresh_interval_when_empty">> =>
{option,integer,positive,undefined,
default},
<<"endpoints">> =>
{list,
{section,
#{<<"host">> =>
{option,string,network_address,
undefined,default},
<<"port">> =>
{option,integer,port,undefined,
default}},
any,all,any,map,
fun mod_global_distrib:process_endpoint/1,
#{},default,when_present},
any,list,undefined,default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,undefined,
default},
<<"certfile">> =>
{option,string,filename,undefined,
default},
<<"ciphers">> =>
{option,string,any,undefined,default},
<<"dhfile">> =>
{option,string,filename,undefined,
default},
<<"protocol_options">> =>
{list,
{option,string,non_empty,undefined,
default},
any,list,undefined,default},
<<"verify_mode">> =>
{option,atom,
{enum,[peer,selfsigned_peer,none]},
undefined,default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present}},
any,[],any,map,undefined,
#{<<"connections_per_endpoint">> => 1,
<<"disabled_gc_interval">> => 60,
<<"endpoint_refresh_interval">> => 60,
<<"endpoint_refresh_interval_when_empty">> =>
3},
default,always},
<<"global_host">> =>
{option,binary,domain,undefined,default},
<<"hosts_refresh_interval">> =>
{option,integer,non_negative,undefined,
default},
<<"local_host">> =>
{option,binary,domain,undefined,default},
<<"message_ttl">> =>
{option,integer,non_negative,undefined,
default},
<<"redis">> =>
{section,
#{<<"expire_after">> =>
{option,integer,positive,undefined,
default},
<<"pool">> =>
{option,atom,pool_name,undefined,default},
<<"refresh_after">> =>
{option,integer,non_negative,undefined,
default}},
any,[],any,map,undefined,
#{<<"expire_after">> => 120,
<<"pool">> => global_distrib,
<<"refresh_after">> => 60},
default,always}},
any,
[<<"global_host">>,<<"local_host">>],
any,map,fun mod_global_distrib:process_opts/1,
#{<<"hosts_refresh_interval">> => 3000,
<<"message_ttl">> => 4},
default,when_present},
<<"mod_push_service_mongoosepush">> =>
{section,
#{<<"api_version">> =>
{option,binary,
{enum,[<<"v2">>,<<"v3">>]},
undefined,default},
<<"max_http_connections">> =>
{option,integer,non_negative,undefined,
default},
<<"pool_name">> =>
{option,atom,pool_name,undefined,default}},
any,[],any,map,undefined,
#{<<"api_version">> => <<"v3">>,
<<"max_http_connections">> => 100,
<<"pool_name">> => undefined},
default,when_present},
<<"mod_bosh">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_bosh},
undefined,default},
<<"inactivity">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"max_pause">> =>
{option,integer,positive,undefined,default},
<<"max_wait">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"server_acks">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"inactivity">> => 30,<<"max_pause">> => 120,
<<"max_wait">> => infinity,
<<"server_acks">> => false},
default,when_present},
<<"mod_stream_management">> =>
{section,
#{<<"ack">> =>
{option,boolean,any,undefined,default},
<<"ack_freq">> =>
{option,integer,positive,undefined,default},
<<"backend">> =>
{option,atom,
{module,mod_stream_management},
undefined,default},
<<"buffer">> =>
{option,boolean,any,undefined,default},
<<"buffer_max">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"resume_timeout">> =>
{option,integer,positive,undefined,default},
<<"stale_h">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,undefined,default},
<<"geriatric">> =>
{option,integer,positive,undefined,
default},
<<"repeat_after">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"enabled">> => false,
<<"geriatric">> => 3600,
<<"repeat_after">> => 1800},
default,always}},
any,[],any,map,
fun mod_stream_management:process_buffer_and_ack/1,
#{<<"ack">> => true,<<"ack_freq">> => 1,
<<"backend">> => mnesia,<<"buffer">> => true,
<<"buffer_max">> => 100,
<<"resume_timeout">> => 600},
default,when_present},
<<"mod_inbox">> =>
{section,
#{<<"aff_changes">> =>
{option,boolean,any,undefined,default},
<<"async_writer">> =>
{section,
#{<<"pool_size">> =>
{option,integer,non_negative,undefined,
default}},
any,[],any,map,undefined,
#{<<"pool_size">> => 4},
default,always},
<<"backend">> =>
{option,atom,
{enum,[rdbms,rdbms_async]},
undefined,default},
<<"bin_clean_after">> =>
{option,integer,non_negative,
fun timer:hours/1,default},
<<"bin_ttl">> =>
{option,integer,non_negative,undefined,
default},
<<"boxes">> =>
{list,
{option,binary,non_empty,undefined,default},
unique,list,undefined,default},
<<"delete_domain_limit">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"groupchat">> =>
{list,
{option,atom,
{enum,[muc,muclight]},
undefined,default},
any,list,undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"max_result_limit">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"remove_on_kicked">> =>
{option,boolean,any,undefined,default},
<<"reset_markers">> =>
{list,
{option,binary,
{enum,
[<<"received">>,<<"displayed">>,
<<"acknowledged">>]},
undefined,default},
any,list,undefined,default}},
any,[],any,map,
fun mod_inbox:process_inbox_boxes/1,
#{<<"aff_changes">> => true,
<<"backend">> => rdbms,
<<"bin_clean_after">> => 3600000,
<<"bin_ttl">> => 30,<<"boxes">> => [],
<<"delete_domain_limit">> => infinity,
<<"groupchat">> => [muclight],
<<"iqdisc">> => no_queue,
<<"max_result_limit">> => infinity,
<<"remove_on_kicked">> => true,
<<"reset_markers">> => [<<"displayed">>]},
default,when_present},
<<"mod_last">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_last},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"iqdisc">> => one_queue},
default,when_present},
<<"mod_event_pusher">> =>
{section,
#{<<"http">> =>
{section,
#{<<"handlers">> =>
{list,
{section,
#{<<"callback_module">> =>
{option,atom,module,undefined,
default},
<<"path">> =>
{option,binary,any,
fun mod_event_pusher_http:fix_path/1,
default},
<<"pool_name">> =>
{option,atom,pool_name,undefined,
default}},
any,[],any,map,undefined,
#{<<"callback_module">> =>
mod_event_pusher_http_defaults,
<<"path">> => <<>>,
<<"pool_name">> => http_pool},
default,when_present},
unique,list,undefined,default}},
any,[],any,map,undefined,
#{<<"handlers">> => []},
default,when_present},
<<"push">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_event_pusher_push},
undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,
queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"plugin_module">> =>
{option,atom,module,undefined,default},
<<"virtual_pubsub_hosts">> =>
{list,
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
any,list,undefined,default},
<<"wpool">> =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,
next_worker,available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"call_timeout">> => 5000,
<<"strategy">> => available_worker,
<<"workers">> => 10},
default,always}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"iqdisc">> => one_queue,
<<"plugin_module">> =>
mod_event_pusher_push_plugin_defaults,
<<"virtual_pubsub_hosts">> => []},
default,when_present},
<<"rabbit">> =>
{section,
#{<<"chat_msg_exchange">> =>
{section,
#{<<"name">> =>
{option,binary,non_empty,undefined,
default},
<<"recv_topic">> =>
{option,binary,non_empty,undefined,
default},
<<"sent_topic">> =>
{option,binary,non_empty,undefined,
default},
<<"type">> =>
{option,binary,non_empty,undefined,
default}},
any,[],any,map,undefined,
#{<<"name">> => <<"chat_msg">>,
<<"recv_topic">> =>
<<"chat_msg_recv">>,
<<"sent_topic">> =>
<<"chat_msg_sent">>,
<<"type">> => <<"topic">>},
default,always},
<<"groupchat_msg_exchange">> =>
{section,
#{<<"name">> =>
{option,binary,non_empty,undefined,
default},
<<"recv_topic">> =>
{option,binary,non_empty,undefined,
default},
<<"sent_topic">> =>
{option,binary,non_empty,undefined,
default},
<<"type">> =>
{option,binary,non_empty,undefined,
default}},
any,[],any,map,undefined,
#{<<"name">> => <<"groupchat_msg">>,
<<"recv_topic">> =>
<<"groupchat_msg_recv">>,
<<"sent_topic">> =>
<<"groupchat_msg_sent">>,
<<"type">> => <<"topic">>},
default,always},
<<"presence_exchange">> =>
{section,
#{<<"name">> =>
{option,binary,non_empty,undefined,
default},
<<"type">> =>
{option,binary,non_empty,undefined,
default}},
any,[],any,map,undefined,
#{<<"name">> => <<"presence">>,
<<"type">> => <<"topic">>},
default,always}},
any,[],any,map,undefined,#{},default,
when_present},
<<"sns">> =>
{section,
#{<<"access_key_id">> =>
{option,string,any,undefined,default},
<<"account_id">> =>
{option,string,any,undefined,default},
<<"muc_messages_topic">> =>
{option,string,any,undefined,default},
<<"plugin_module">> =>
{option,atom,module,undefined,default},
<<"pm_messages_topic">> =>
{option,string,any,undefined,default},
<<"pool_size">> =>
{option,integer,positive,undefined,
default},
<<"presence_updates_topic">> =>
{option,string,any,undefined,default},
<<"publish_retry_count">> =>
{option,integer,non_negative,undefined,
default},
<<"publish_retry_time_ms">> =>
{option,integer,non_negative,undefined,
default},
<<"region">> =>
{option,string,any,undefined,default},
<<"secret_access_key">> =>
{option,string,any,undefined,default},
<<"sns_host">> =>
{option,string,any,undefined,default}},
any,
[<<"sns_host">>,<<"region">>,
<<"access_key_id">>,
<<"secret_access_key">>,<<"account_id">>],
any,map,undefined,
#{<<"plugin_module">> =>
mod_event_pusher_sns_defaults,
<<"pool_size">> => 100,
<<"publish_retry_count">> => 2,
<<"publish_retry_time_ms">> => 50},
default,when_present}},
any,[],any,map,undefined,#{},default,
when_present},
<<"mod_register">> =>
{section,
#{<<"access">> =>
{option,atom,access_rule,undefined,default},
<<"ip_access">> =>
{list,
{section,
#{<<"address">> =>
{option,string,ip_mask,undefined,
default},
<<"policy">> =>
{option,atom,
{enum,[allow,deny]},
undefined,default}},
any,all,any,map,
fun mod_register:process_ip_access/1,#{},
default,when_present},
any,list,undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"password_strength">> =>
{option,integer,non_negative,undefined,
default},
<<"registration_watchers">> =>
{list,
{option,binary,jid,undefined,default},
any,list,undefined,default},
<<"welcome_message">> =>
{section,
#{<<"body">> =>
{option,string,any,undefined,default},
<<"subject">> =>
{option,string,any,undefined,default}},
any,[],any,map,
fun mod_register:process_welcome_message/1,
#{<<"body">> => [],<<"subject">> => []},
default,when_present}},
any,[],any,map,undefined,
#{<<"access">> => all,<<"ip_access">> => [],
<<"iqdisc">> => one_queue,
<<"password_strength">> => 0,
<<"registration_watchers">> => []},
default,when_present},
<<"mod_jingle_sip">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_jingle_sip},
undefined,default},
<<"listen_port">> =>
{option,integer,port,undefined,default},
<<"local_host">> =>
{option,string,network_address,undefined,
default},
<<"proxy_host">> =>
{option,string,network_address,undefined,
default},
<<"proxy_port">> =>
{option,integer,port,undefined,default},
<<"sdp_origin">> =>
{option,string,ip_address,undefined,default},
<<"transport">> =>
{option,string,
{enum,["udp","tcp"]},
undefined,default},
<<"username_to_phone">> =>
{list,
{section,
#{<<"phone">> =>
{option,binary,any,undefined,default},
<<"username">> =>
{option,binary,any,undefined,default}},
any,all,any,map,
#Fun<mod_jingle_sip.0.54879970>,#{},
default,when_present},
any,list,undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia,
<<"listen_port">> => 5600,
<<"local_host">> => "localhost",
<<"proxy_host">> => "localhost",
<<"proxy_port">> => 5060,
<<"sdp_origin">> => "127.0.0.1",
<<"transport">> => "udp",
<<"username_to_phone">> => []},
default,when_present},
<<"mod_muc_light">> =>
{section,
#{<<"all_can_configure">> =>
{option,boolean,any,undefined,default},
<<"all_can_invite">> =>
{option,boolean,any,undefined,default},
<<"backend">> =>
{option,atom,
{module,mod_muc_light_db},
undefined,default},
<<"blocking">> =>
{option,boolean,any,undefined,default},
<<"cache_affs">> =>
{section,
#{<<"module">> =>
{option,atom,
{enum,[internal,mod_cache_users]},
undefined,default},
<<"number_of_segments">> =>
{option,integer,positive,undefined,
default},
<<"strategy">> =>
{option,atom,
{enum,[fifo,lru]},
undefined,default},
<<"time_to_live">> =>
{option,int_or_infinity,positive,
undefined,default}},
any,[],any,map,
fun mongoose_user_cache:process_cache_config/1,
#{<<"module">> => internal,
<<"number_of_segments">> => 3,
<<"strategy">> => fifo,
<<"time_to_live">> => 2},
default,when_present},
<<"config_schema">> =>
{list,
{section,
#{<<"field">> =>
{option,binary,non_empty,undefined,
default},
<<"float_value">> =>
{option,float,any,undefined,default},
<<"integer_value">> =>
{option,integer,any,undefined,default},
<<"internal_key">> =>
{option,atom,non_empty,undefined,
default},
<<"string_value">> =>
{option,binary,any,undefined,default}},
any,
[<<"field">>],
any,map,undefined,#{},default,when_present},
any,list,
fun mod_muc_light:process_config_schema/1,
default},
<<"equal_occupants">> =>
{option,boolean,any,undefined,default},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"legacy_mode">> =>
{option,boolean,any,undefined,default},
<<"max_occupants">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"rooms_in_rosters">> =>
{option,boolean,any,undefined,default},
<<"rooms_per_page">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"rooms_per_user">> =>
{option,int_or_infinity,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"all_can_configure">> => false,
<<"all_can_invite">> => false,
<<"backend">> => mnesia,
<<"blocking">> => true,
<<"config_schema">> =>
[{<<"roomname">>,<<"Untitled">>,roomname,
binary},
{<<"subject">>,<<>>,subject,binary}],
<<"equal_occupants">> => false,
<<"host">> => {prefix,<<"muclight.">>},
<<"legacy_mode">> => false,
<<"max_occupants">> => infinity,
<<"rooms_in_rosters">> => false,
<<"rooms_per_page">> => 10,
<<"rooms_per_user">> => infinity},
default,when_present},
<<"mod_domain_isolation">> =>
{section,#{},any,[],any,map,undefined,#{},
default,when_present},
<<"mod_shared_roster_ldap">> =>
{section,
#{<<"auth_check">> =>
{option,boolean,any,undefined,default},
<<"base">> =>
{option,binary,any,undefined,default},
<<"deref">> =>
{option,atom,
{enum,[never,always,finding,searching]},
undefined,default},
<<"filter">> =>
{option,binary,any,undefined,default},
<<"gfilter">> =>
{option,binary,any,undefined,default},
<<"group_cache_size">> =>
{option,integer,positive,undefined,default},
<<"group_cache_validity">> =>
{option,integer,positive,undefined,default},
<<"groupattr">> =>
{option,binary,any,undefined,default},
<<"groupdesc">> =>
{option,binary,any,undefined,default},
<<"memberattr">> =>
{option,binary,any,undefined,default},
<<"memberattr_format">> =>
{option,binary,any,undefined,default},
<<"memberattr_format_re">> =>
{option,binary,any,undefined,default},
<<"pool_tag">> =>
{option,atom,pool_name,undefined,default},
<<"rfilter">> =>
{option,binary,any,undefined,default},
<<"ufilter">> =>
{option,binary,any,undefined,default},
<<"user_cache_size">> =>
{option,integer,positive,undefined,default},
<<"user_cache_validity">> =>
{option,integer,positive,undefined,default},
<<"userdesc">> =>
{option,binary,any,undefined,default},
<<"useruid">> =>
{option,binary,any,undefined,default}},
any,[],any,map,
#Fun<mod_shared_roster_ldap.0.13941630>,
#{<<"auth_check">> => true,<<"deref">> => never,
<<"filter">> => <<>>,<<"gfilter">> => <<>>,
<<"group_cache_size">> => 1000,
<<"group_cache_validity">> => 300,
<<"groupattr">> => <<"cn">>,
<<"memberattr">> => <<"memberUid">>,
<<"memberattr_format">> => <<"%u">>,
<<"memberattr_format_re">> => <<>>,
<<"pool_tag">> => default,
<<"rfilter">> => <<>>,<<"ufilter">> => <<>>,
<<"user_cache_size">> => 1000,
<<"user_cache_validity">> => 300,
<<"userdesc">> => <<"cn">>,
<<"useruid">> => <<"cn">>},
default,when_present},
<<"mod_pubsub">> =>
{section,
#{<<"access_createnode">> =>
{option,atom,access_rule,undefined,default},
<<"backend">> =>
{option,atom,
{module,mod_pubsub_db},
undefined,default},
<<"default_node_config">> =>
{section,
#{<<"access_model">> =>
{option,atom,non_empty,undefined,default},
<<"deliver_notifications">> =>
{option,boolean,any,undefined,default},
<<"deliver_payloads">> =>
{option,boolean,any,undefined,default},
<<"max_items">> =>
{option,integer,non_negative,undefined,
default},
<<"max_payload_size">> =>
{option,integer,non_negative,undefined,
default},
<<"node_type">> =>
{option,atom,non_empty,undefined,default},
<<"notification_type">> =>
{option,atom,non_empty,undefined,default},
<<"notify_config">> =>
{option,boolean,any,undefined,default},
<<"notify_delete">> =>
{option,boolean,any,undefined,default},
<<"notify_retract">> =>
{option,boolean,any,undefined,default},
<<"persist_items">> =>
{option,boolean,any,undefined,default},
<<"presence_based_delivery">> =>
{option,boolean,any,undefined,default},
<<"publish_model">> =>
{option,atom,non_empty,undefined,default},
<<"purge_offline">> =>
{option,boolean,any,undefined,default},
<<"roster_groups_allowed">> =>
{list,
{option,binary,non_empty,undefined,
default},
any,list,undefined,default},
<<"send_last_published_item">> =>
{option,atom,non_empty,undefined,default},
<<"subscribe">> =>
{option,boolean,any,undefined,default}},
any,[],any,list,undefined,#{},default,
when_present},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"ignore_pep_from_offline">> =>
{option,boolean,any,undefined,default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"item_publisher">> =>
{option,boolean,any,undefined,default},
<<"last_item_cache">> =>
{option,atom,
{enum,[mnesia,rdbms,false]},
undefined,default},
<<"max_items_node">> =>
{option,integer,non_negative,undefined,
default},
<<"max_subscriptions_node">> =>
{option,integer,non_negative,undefined,
default},
<<"nodetree">> =>
{option,binary,
{module,nodetree},
#Fun<mod_pubsub.0.81398248>,default},
<<"pep_mapping">> =>
{list,
{section,
#{<<"namespace">> =>
{option,binary,non_empty,undefined,
default},
<<"node">> =>
{option,binary,non_empty,undefined,
default}},
any,all,any,map,
fun mod_pubsub:process_pep_mapping/1,#{},
default,when_present},
any,map,undefined,default},
<<"plugins">> =>
{list,
{option,binary,
{module,node},
undefined,default},
any,list,undefined,default},
<<"sync_broadcast">> =>
{option,boolean,any,undefined,default},
<<"wpool">> =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,next_worker,
available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,undefined,
#{<<"call_timeout">> => 5000,
<<"strategy">> => best_worker,
<<"workers">> => 10},
default,always}},
any,[],any,map,undefined,
#{<<"access_createnode">> => all,
<<"backend">> => mnesia,
<<"default_node_config">> => [],
<<"host">> => {prefix,<<"pubsub.">>},
<<"ignore_pep_from_offline">> => true,
<<"iqdisc">> => one_queue,
<<"item_publisher">> => false,
<<"last_item_cache">> => false,
<<"max_items_node">> => 10,
<<"nodetree">> => nodetree_tree,
<<"pep_mapping">> => #{},
<<"plugins">> => [<<"flat">>],
<<"sync_broadcast">> => false},
default,when_present},
<<"mod_http_upload">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_http_upload},
undefined,default},
<<"expiration_time">> =>
{option,integer,positive,undefined,default},
<<"host">> =>
{option,binary,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"max_file_size">> =>
{option,integer,positive,undefined,default},
<<"s3">> =>
{section,
#{<<"access_key_id">> =>
{option,binary,any,undefined,default},
<<"add_acl">> =>
{option,boolean,any,undefined,default},
<<"bucket_url">> =>
{option,binary,url,undefined,default},
<<"region">> =>
{option,binary,any,undefined,default},
<<"secret_access_key">> =>
{option,binary,any,undefined,default}},
any,
[<<"bucket_url">>,<<"region">>,
<<"access_key_id">>,
<<"secret_access_key">>],
any,map,undefined,
#{<<"add_acl">> => false},
default,when_present},
<<"token_bytes">> =>
{option,integer,positive,undefined,default}},
any,
[<<"s3">>],
any,map,undefined,
#{<<"backend">> => s3,
<<"expiration_time">> => 60,
<<"host">> => <<"upload.@HOST@">>,
<<"iqdisc">> => one_queue,
<<"max_file_size">> => 10485760,
<<"token_bytes">> => 32},
default,when_present},
<<"mod_offline">> =>
{section,
#{<<"access_max_user_messages">> =>
{option,atom,access_rule,undefined,default},
<<"backend">> =>
{option,atom,
{module,mod_offline},
undefined,default},
<<"store_groupchat_messages">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"access_max_user_messages">> =>
max_user_offline_messages,
<<"backend">> => mnesia,
<<"store_groupchat_messages">> => false},
default,when_present},
<<"mod_vcard">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_vcard},
undefined,default},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"ldap">> =>
{section,
#{<<"base">> =>
{option,binary,any,undefined,default},
<<"binary_search_fields">> =>
{list,
{option,binary,non_empty,undefined,
default},
any,list,undefined,default},
<<"deref">> =>
{option,atom,
{enum,[never,always,finding,searching]},
undefined,default},
<<"filter">> =>
{option,binary,any,undefined,default},
<<"pool_tag">> =>
{option,atom,pool_name,undefined,default},
<<"search_fields">> =>
{list,
{section,
#{<<"ldap_field">> =>
{option,binary,non_empty,undefined,
default},
<<"search_field">> =>
{option,binary,non_empty,undefined,
default}},
any,all,any,map,
fun mod_vcard:process_search_spec/1,
#{},default,when_present},
any,list,undefined,default},
<<"search_operator">> =>
{option,atom,
{enum,['or','and']},
undefined,default},
<<"search_reported">> =>
{list,
{section,
#{<<"search_field">> =>
{option,binary,non_empty,undefined,
default},
<<"vcard_field">> =>
{option,binary,non_empty,undefined,
default}},
any,all,any,map,
fun mod_vcard:process_search_reported_spec/1,
#{},default,when_present},
any,list,undefined,default},
<<"uids">> =>
{list,
{section,
#{<<"attr">> =>
{option,binary,any,undefined,
default},
<<"format">> =>
{option,binary,any,undefined,
default}},
any,
[<<"attr">>],
any,map,
fun mongoose_ldap_config:process_uids/1,
#{},default,when_present},
any,list,undefined,default},
<<"vcard_map">> =>
{list,
{section,
#{<<"ldap_field">> =>
{option,binary,non_empty,undefined,
default},
<<"ldap_pattern">> =>
{option,binary,non_empty,undefined,
default},
<<"vcard_field">> =>
{option,binary,non_empty,undefined,
default}},
any,all,any,map,
fun mod_vcard:process_map_spec/1,#{},
default,when_present},
any,list,undefined,default}},
any,[],any,map,undefined,
#{<<"binary_search_fields">> => [],
<<"deref">> => never,<<"filter">> => <<>>,
<<"pool_tag">> => default,
<<"search_fields">> =>
[{<<"User">>,<<"%u">>},
{<<"Full Name">>,<<"displayName">>},
{<<"Given Name">>,<<"givenName">>},
{<<"Middle Name">>,<<"initials">>},
{<<"Family Name">>,<<"sn">>},
{<<"Nickname">>,<<"%u">>},
{<<"Birthday">>,<<"birthDay">>},
{<<"Country">>,<<"c">>},
{<<"City">>,<<"l">>},
{<<"Email">>,<<"mail">>},
{<<"Organization Name">>,<<"o">>},
{<<"Organization Unit">>,<<"ou">>}],
<<"search_operator">> => 'and',
<<"search_reported">> =>
[{<<"Full Name">>,<<"FN">>},
{<<"Given Name">>,<<"FIRST">>},
{<<"Middle Name">>,<<"MIDDLE">>},
{<<"Family Name">>,<<"LAST">>},
{<<"Nickname">>,<<"NICK">>},
{<<"Birthday">>,<<"BDAY">>},
{<<"Country">>,<<"CTRY">>},
{<<"City">>,<<"LOCALITY">>},
{<<"Email">>,<<"EMAIL">>},
{<<"Organization Name">>,<<"ORGNAME">>},
{<<"Organization Unit">>,<<"ORGUNIT">>}],
<<"uids">> => [{<<"uid">>,<<"%u">>}],
<<"vcard_map">> =>
[{<<"NICKNAME">>,<<"%u">>,[]},
{<<"FN">>,<<"%s">>,[<<"displayName">>]},
{<<"FAMILY">>,<<"%s">>,[<<"sn">>]},
{<<"GIVEN">>,<<"%s">>,[<<"givenName">>]},
{<<"MIDDLE">>,<<"%s">>,[<<"initials">>]},
{<<"ORGNAME">>,<<"%s">>,[<<"o">>]},
{<<"ORGUNIT">>,<<"%s">>,[<<"ou">>]},
{<<"CTRY">>,<<"%s">>,[<<"c">>]},
{<<"LOCALITY">>,<<"%s">>,[<<"l">>]},
{<<"STREET">>,<<"%s">>,[<<"street">>]},
{<<"REGION">>,<<"%s">>,[<<"st">>]},
{<<"PCODE">>,<<"%s">>,
[<<"postalCode">>]},
{<<"TITLE">>,<<"%s">>,[<<"title">>]},
{<<"URL">>,<<"%s">>,[<<"labeleduri">>]},
{<<"DESC">>,<<"%s">>,
[<<"description">>]},
{<<"TEL">>,<<"%s">>,
[<<"telephoneNumber">>]},
{<<"EMAIL">>,<<"%s">>,[<<"mail">>]},
{<<"BDAY">>,<<"%s">>,[<<"birthDay">>]},
{<<"ROLE">>,<<"%s">>,
[<<"employeeType">>]},
{<<"PHOTO">>,<<"%s">>,
[<<"jpegPhoto">>]}]},
default,always},
<<"matches">> =>
{option,int_or_infinity,non_negative,
undefined,default},
<<"search">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,#Fun<mod_vcard.0.52229309>,
#{<<"backend">> => mnesia,
<<"host">> => {prefix,<<"vjud.">>},
<<"iqdisc">> => parallel,<<"matches">> => 30,
<<"search">> => true},
default,when_present},
<<"mod_blocking">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_privacy},
undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia},
default,when_present},
<<"mod_privacy">> =>
{section,
#{<<"backend">> =>
{option,atom,
{module,mod_privacy},
undefined,default}},
any,[],any,map,undefined,
#{<<"backend">> => mnesia},
default,when_present},
<<"mod_mam">> =>
{section,
#{<<"archive_chat_markers">> =>
{option,boolean,any,undefined,default},
<<"async_writer">> =>
{section,
#{<<"batch_size">> =>
{option,integer,non_negative,undefined,
default},
<<"enabled">> =>
{option,boolean,any,undefined,default},
<<"flush_interval">> =>
{option,integer,non_negative,undefined,
default},
<<"pool_size">> =>
{option,integer,non_negative,undefined,
default}},
any,[],any,map,undefined,
#{<<"batch_size">> => 30,
<<"enabled">> => true,
<<"flush_interval">> => 2000,
<<"pool_size">> => 8},
default,always},
<<"backend">> =>
{option,atom,
{enum,[rdbms,cassandra,elasticsearch]},
undefined,default},
<<"cache">> =>
{section,
#{<<"module">> =>
{option,atom,
{enum,[internal,mod_cache_users]},
undefined,default},
<<"number_of_segments">> =>
{option,integer,positive,undefined,
default},
<<"strategy">> =>
{option,atom,
{enum,[fifo,lru]},
undefined,default},
<<"time_to_live">> =>
{option,int_or_infinity,positive,
undefined,default}},
any,[],any,map,
fun mongoose_user_cache:process_cache_config/1,
#{<<"module">> => internal,
<<"number_of_segments">> => 3,
<<"strategy">> => fifo,
<<"time_to_live">> => 480},
default,always},
<<"cache_users">> =>
{option,boolean,any,undefined,default},
<<"db_jid_format">> =>
{option,atom,module,undefined,default},
<<"db_message_format">> =>
{option,atom,module,undefined,default},
<<"default_result_limit">> =>
{option,integer,non_negative,undefined,
default},
<<"delete_domain_limit">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"enforce_simple_queries">> =>
{option,boolean,any,undefined,default},
<<"extra_fin_element">> =>
{option,atom,module,undefined,default},
<<"extra_lookup_params">> =>
{option,atom,module,undefined,default},
<<"full_text_search">> =>
{option,boolean,any,undefined,default},
<<"is_archivable_message">> =>
{option,atom,module,undefined,default},
<<"max_result_limit">> =>
{option,integer,non_negative,undefined,
default},
<<"message_retraction">> =>
{option,boolean,any,undefined,default},
<<"muc">> =>
{section,
#{<<"archive_chat_markers">> =>
{option,boolean,any,undefined,default},
<<"async_writer">> =>
{section,
#{<<"batch_size">> =>
{option,integer,non_negative,
undefined,default},
<<"enabled">> =>
{option,boolean,any,undefined,
default},
<<"flush_interval">> =>
{option,integer,non_negative,
undefined,default},
<<"pool_size">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"batch_size">> => 30,
<<"enabled">> => true,
<<"flush_interval">> => 2000,
<<"pool_size">> => 8},
default,when_present},
<<"backend">> =>
{option,atom,
{enum,[rdbms,cassandra,elasticsearch]},
undefined,default},
<<"cache_users">> =>
{option,boolean,any,undefined,default},
<<"db_jid_format">> =>
{option,atom,module,undefined,default},
<<"db_message_format">> =>
{option,atom,module,undefined,default},
<<"default_result_limit">> =>
{option,integer,non_negative,undefined,
default},
<<"delete_domain_limit">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"enforce_simple_queries">> =>
{option,boolean,any,undefined,default},
<<"extra_fin_element">> =>
{option,atom,module,undefined,default},
<<"extra_lookup_params">> =>
{option,atom,module,undefined,default},
<<"full_text_search">> =>
{option,boolean,any,undefined,default},
<<"host">> =>
{option,string,subdomain_template,
fun mongoose_subdomain_utils:make_subdomain_pattern/1,
default},
<<"is_archivable_message">> =>
{option,atom,module,undefined,default},
<<"max_result_limit">> =>
{option,integer,non_negative,undefined,
default},
<<"message_retraction">> =>
{option,boolean,any,undefined,default},
<<"no_stanzaid_element">> =>
{option,boolean,any,undefined,default},
<<"send_message">> =>
{option,atom,module,undefined,default},
<<"user_prefs_store">> =>
{option,atom,
{enum,[rdbms,cassandra,mnesia]},
undefined,default}},
any,[],any,map,undefined,
#{<<"host">> => {prefix,<<"conference.">>}},
default,when_present},
<<"no_stanzaid_element">> =>
{option,boolean,any,undefined,default},
<<"pm">> =>
{section,
#{<<"archive_chat_markers">> =>
{option,boolean,any,undefined,default},
<<"archive_groupchats">> =>
{option,boolean,any,undefined,default},
<<"async_writer">> =>
{section,
#{<<"batch_size">> =>
{option,integer,non_negative,
undefined,default},
<<"enabled">> =>
{option,boolean,any,undefined,
default},
<<"flush_interval">> =>
{option,integer,non_negative,
undefined,default},
<<"pool_size">> =>
{option,integer,non_negative,
undefined,default}},
any,[],any,map,undefined,
#{<<"batch_size">> => 30,
<<"enabled">> => true,
<<"flush_interval">> => 2000,
<<"pool_size">> => 8},
default,when_present},
<<"backend">> =>
{option,atom,
{enum,[rdbms,cassandra,elasticsearch]},
undefined,default},
<<"cache_users">> =>
{option,boolean,any,undefined,default},
<<"db_jid_format">> =>
{option,atom,module,undefined,default},
<<"db_message_format">> =>
{option,atom,module,undefined,default},
<<"default_result_limit">> =>
{option,integer,non_negative,undefined,
default},
<<"delete_domain_limit">> =>
{option,int_or_infinity,positive,
undefined,default},
<<"enforce_simple_queries">> =>
{option,boolean,any,undefined,default},
<<"extra_fin_element">> =>
{option,atom,module,undefined,default},
<<"extra_lookup_params">> =>
{option,atom,module,undefined,default},
<<"full_text_search">> =>
{option,boolean,any,undefined,default},
<<"is_archivable_message">> =>
{option,atom,module,undefined,default},
<<"max_result_limit">> =>
{option,integer,non_negative,undefined,
default},
<<"message_retraction">> =>
{option,boolean,any,undefined,default},
<<"no_stanzaid_element">> =>
{option,boolean,any,undefined,default},
<<"same_mam_id_for_peers">> =>
{option,boolean,any,undefined,default},
<<"send_message">> =>
{option,atom,module,undefined,default},
<<"user_prefs_store">> =>
{option,atom,
{enum,[rdbms,cassandra,mnesia]},
undefined,default}},
any,[],any,map,undefined,
#{<<"archive_groupchats">> => false,
<<"same_mam_id_for_peers">> => false},
default,when_present},
<<"send_message">> =>
{option,atom,module,undefined,default},
<<"user_prefs_store">> =>
{option,atom,
{enum,[rdbms,cassandra,mnesia]},
undefined,default}},
any,[],any,map,undefined,
#{<<"archive_chat_markers">> => false,
<<"backend">> => rdbms,
<<"cache_users">> => true,
<<"default_result_limit">> => 50,
<<"enforce_simple_queries">> => false,
<<"full_text_search">> => true,
<<"is_archivable_message">> => mod_mam_utils,
<<"max_result_limit">> => 50,
<<"message_retraction">> => true,
<<"no_stanzaid_element">> => false,
<<"send_message">> => mod_mam_utils},
default,when_present},
<<"mod_version">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"os_info">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"iqdisc">> => no_queue,
<<"os_info">> => false},
default,when_present},
<<"mod_ping">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"ping_interval">> =>
{option,integer,positive,
fun timer:seconds/1,default},
<<"ping_req_timeout">> =>
{option,integer,positive,
fun timer:seconds/1,default},
<<"send_pings">> =>
{option,boolean,any,undefined,default},
<<"timeout_action">> =>
{option,atom,
{enum,[none,kill]},
undefined,default}},
any,[],any,map,undefined,
#{<<"iqdisc">> => no_queue,
<<"ping_interval">> => 60000,
<<"ping_req_timeout">> => 32000,
<<"send_pings">> => false,
<<"timeout_action">> => none},
default,when_present},
<<"mod_adhoc">> =>
{section,
#{<<"iqdisc">> =>
{section,
#{<<"type">> =>
{option,atom,
{enum,
[no_queue,one_queue,parallel,queues]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,
[<<"type">>],
any,map,
fun mongoose_config_spec:process_iqdisc/1,
#{},default,when_present},
<<"report_commands_node">> =>
{option,boolean,any,undefined,default}},
any,[],any,map,undefined,
#{<<"iqdisc">> => one_queue,
<<"report_commands_node">> => false},
default,when_present}},
module,[],any,map,undefined,#{},host_config,always},
<<"outgoing_pools">> =>
{section,
#{<<"cassandra">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"auth">> =>
{section,
#{<<"plain">> =>
{section,
#{<<"password">> =>
{option,binary,any,
undefined,default},
<<"username">> =>
{option,binary,any,
undefined,default}},
any,all,any,map,undefined,#{},
default,when_present}},
any,all,any,map,undefined,#{},
default,when_present},
<<"keyspace">> =>
{option,atom,non_empty,undefined,
default},
<<"servers">> =>
{list,
{section,
#{<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"port">> =>
{option,integer,port,undefined,
default}},
any,
[<<"host">>],
any,map,undefined,
#{<<"port">> => 9042},
default,when_present},
unique_non_empty,list,undefined,
default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,
undefined,default},
<<"certfile">> =>
{option,string,filename,
undefined,default},
<<"ciphers">> =>
{option,string,any,undefined,
default},
<<"keyfile">> =>
{option,string,filename,
undefined,default},
<<"password">> =>
{option,string,any,undefined,
default},
<<"server_name_indication">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,
undefined,default},
<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"protocol">> =>
{option,atom,
{enum,[default,https]},
undefined,default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"protocol">> => default},
default,always},
<<"verify_mode">> =>
{option,atom,
{enum,
[peer,selfsigned_peer,none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,undefined,
default},
any,list,undefined,default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present}},
any,[],any,map,undefined,
#{<<"keyspace">> => mongooseim,
<<"servers">> =>
[#{port => 9042,
host => "localhost"}]},
default,always},
<<"scope">> =>
{option,atom,
{enum,[global,host_type,host]},
undefined,default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,next_worker,
available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"scope">> => global,
<<"strategy">> => best_worker,
<<"workers">> => 20},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"elastic">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"host">> =>
{option,binary,non_empty,undefined,
default},
<<"port">> =>
{option,integer,port,undefined,
default}},
any,[],any,map,undefined,
#{<<"host">> => <<"localhost">>,
<<"port">> => 9200},
default,always},
<<"scope">> =>
{option,atom,
{enum,[global,host_type,host]},
undefined,default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,next_worker,
available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"scope">> => global,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"http">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"host">> =>
{option,string,non_empty,undefined,
default},
<<"path_prefix">> =>
{option,binary,non_empty,undefined,
default},
<<"request_timeout">> =>
{option,integer,non_negative,
undefined,default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,
undefined,default},
<<"certfile">> =>
{option,string,filename,
undefined,default},
<<"ciphers">> =>
{option,string,any,undefined,
default},
<<"keyfile">> =>
{option,string,filename,
undefined,default},
<<"password">> =>
{option,string,any,undefined,
default},
<<"server_name_indication">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,
undefined,default},
<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"protocol">> =>
{option,atom,
{enum,[default,https]},
undefined,default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"protocol">> => default},
default,always},
<<"verify_mode">> =>
{option,atom,
{enum,
[peer,selfsigned_peer,none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,undefined,
default},
any,list,undefined,default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present}},
any,
[<<"host">>],
any,map,undefined,
#{<<"path_prefix">> => <<"/">>,
<<"request_timeout">> => 2000},
default,always},
<<"scope">> =>
{option,atom,
{enum,[global,host_type,host]},
undefined,default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,next_worker,
available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"scope">> => global,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"ldap">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"connect_interval">> =>
{option,integer,positive,undefined,
default},
<<"password">> =>
{option,binary,any,undefined,default},
<<"port">> =>
{option,integer,port,undefined,
default},
<<"root_dn">> =>
{option,binary,any,undefined,default},
<<"servers">> =>
{list,
{option,string,any,undefined,
default},
unique_non_empty,list,undefined,
default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,
undefined,default},
<<"certfile">> =>
{option,string,filename,
undefined,default},
<<"ciphers">> =>
{option,string,any,undefined,
default},
<<"keyfile">> =>
{option,string,filename,
undefined,default},
<<"password">> =>
{option,string,any,undefined,
default},
<<"server_name_indication">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,
undefined,default},
<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"protocol">> =>
{option,atom,
{enum,[default,https]},
undefined,default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"protocol">> => default},
default,always},
<<"verify_mode">> =>
{option,atom,
{enum,
[peer,selfsigned_peer,none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,undefined,
default},
any,list,undefined,default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present}},
any,[],any,map,
fun mongoose_config_spec:process_ldap_connection/1,
#{<<"connect_interval">> => 10000,
<<"password">> => <<>>,
<<"root_dn">> => <<>>,
<<"servers">> => ["localhost"]},
default,always},
<<"scope">> =>
{option,atom,
{enum,[global,host_type,host]},
undefined,default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,next_worker,
available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"scope">> => global,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"rabbit">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"confirms_enabled">> =>
{option,boolean,any,undefined,
default},
<<"host">> =>
{option,string,non_empty,undefined,
default},
<<"max_worker_queue_len">> =>
{option,int_or_infinity,
non_negative,undefined,default},
<<"password">> =>
{option,binary,non_empty,undefined,
default},
<<"port">> =>
{option,integer,port,undefined,
default},
<<"username">> =>
{option,binary,non_empty,undefined,
default}},
any,[],any,map,undefined,
#{<<"confirms_enabled">> => false,
<<"host">> => "localhost",
<<"max_worker_queue_len">> => 1000,
<<"password">> => <<"guest">>,
<<"port">> => 5672,
<<"username">> => <<"guest">>},
default,always},
<<"scope">> =>
{option,atom,
{enum,[global,host_type,host]},
undefined,default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,next_worker,
available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"scope">> => global,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"rdbms">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"database">> =>
{option,string,non_empty,undefined,
default},
<<"driver">> =>
{option,atom,
{enum,[odbc,pgsql,mysql]},
undefined,default},
<<"host">> =>
{option,string,non_empty,undefined,
default},
<<"keepalive_interval">> =>
{option,integer,positive,undefined,
default},
<<"max_start_interval">> =>
{option,integer,positive,undefined,
default},
<<"password">> =>
{option,string,non_empty,undefined,
default},
<<"port">> =>
{option,integer,port,undefined,
default},
<<"query_timeout">> =>
{option,integer,non_negative,
undefined,default},
<<"settings">> =>
{option,string,any,undefined,default},
<<"tls">> =>
{section,
#{<<"cacertfile">> =>
{option,string,filename,
undefined,default},
<<"certfile">> =>
{option,string,filename,
undefined,default},
<<"ciphers">> =>
{option,string,any,undefined,
default},
<<"keyfile">> =>
{option,string,filename,
undefined,default},
<<"password">> =>
{option,string,any,undefined,
default},
<<"required">> =>
{option,boolean,any,undefined,
default},
<<"server_name_indication">> =>
{section,
#{<<"enabled">> =>
{option,boolean,any,
undefined,default},
<<"host">> =>
{option,string,non_empty,
undefined,default},
<<"protocol">> =>
{option,atom,
{enum,[default,https]},
undefined,default}},
any,[],any,map,undefined,
#{<<"enabled">> => true,
<<"protocol">> => default},
default,always},
<<"verify_mode">> =>
{option,atom,
{enum,
[peer,selfsigned_peer,none]},
undefined,default},
<<"versions">> =>
{list,
{option,atom,any,undefined,
default},
any,list,undefined,default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"verify_mode">> => peer},
default,when_present},
<<"username">> =>
{option,string,non_empty,undefined,
default}},
any,
[<<"driver">>],
any,map,
fun mongoose_rdbms:process_options/1,
#{<<"max_start_interval">> => 30,
<<"query_timeout">> => 5000},
default,when_present},
<<"scope">> =>
{option,atom,
{enum,[global,host_type,host]},
undefined,default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,next_worker,
available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 60000,
<<"scope">> => global,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present},
<<"redis">> =>
{section,
#{default =>
{section,
#{<<"call_timeout">> =>
{option,integer,positive,undefined,
default},
<<"connection">> =>
{section,
#{<<"database">> =>
{option,integer,non_negative,
undefined,default},
<<"host">> =>
{option,string,non_empty,undefined,
default},
<<"password">> =>
{option,string,any,undefined,default},
<<"port">> =>
{option,integer,port,undefined,
default}},
any,[],any,map,undefined,
#{<<"database">> => 0,
<<"host">> => "127.0.0.1",
<<"password">> => [],
<<"port">> => 6379},
default,always},
<<"scope">> =>
{option,atom,
{enum,[global,host_type,host]},
undefined,default},
<<"strategy">> =>
{option,atom,
{enum,
[best_worker,random_worker,next_worker,
available_worker,
next_available_worker]},
undefined,default},
<<"workers">> =>
{option,integer,positive,undefined,
default}},
any,[],any,map,
#Fun<mongoose_config_utils.0.103156362>,
#{<<"call_timeout">> => 5000,
<<"scope">> => global,
<<"strategy">> => best_worker,
<<"workers">> => 10},
item,when_present}},
non_empty,[],any,list,undefined,#{},none,
when_present}},
any,[],any,list,undefined,#{},global_config,always},
<<"s2s">> =>
{section,
#{<<"address">> =>
{list,
{section,
#{<<"host">> =>
{option,binary,non_empty,undefined,default},
<<"ip_address">> =>
{option,string,ip_address,undefined,default},
<<"port">> =>
{option,integer,port,undefined,default}},
any,
[<<"host">>,<<"ip_address">>],
any,map,
fun mongoose_config_spec:process_s2s_address/1,
#{},default,when_present},
any,map,undefined,default},
<<"certfile">> =>
{option,string,filename,undefined,default},
<<"ciphers">> =>
{option,string,any,undefined,default},
<<"default_policy">> =>
{option,atom,
{enum,[allow,deny]},
undefined,default},
<<"dns">> =>
{section,
#{<<"retries">> =>
{option,integer,positive,undefined,default},
<<"timeout">> =>
{option,integer,positive,undefined,default}},
any,[],any,map,undefined,
#{<<"retries">> => 2,<<"timeout">> => 10},
default,always},
<<"host_policy">> =>
{list,
{section,
#{<<"host">> =>
{option,binary,non_empty,undefined,default},
<<"policy">> =>
{option,atom,
{enum,[allow,deny]},
undefined,default}},
any,all,any,map,
fun mongoose_config_spec:process_s2s_host_policy/1,
#{},default,when_present},
any,map,undefined,default},
<<"max_retry_delay">> =>
{option,integer,positive,undefined,default},
<<"outgoing">> =>
{section,
#{<<"connection_timeout">> =>
{option,int_or_infinity,positive,undefined,
default},
<<"ip_versions">> =>
{list,
{option,integer,
{enum,[4,6]},
undefined,default},
unique_non_empty,list,undefined,default},
<<"port">> =>
{option,integer,port,undefined,default}},
any,[],any,map,undefined,
#{<<"connection_timeout">> => 10000,
<<"ip_versions">> => [4,6],
<<"port">> => 5269},
default,always},
<<"shared">> =>
{option,binary,non_empty,undefined,default},
<<"use_starttls">> =>
{option,atom,
{enum,
[false,optional,required,required_trusted]},
undefined,default}},
any,[],any,map,undefined,
#{<<"ciphers">> => "TLSv1.2:TLSv1.3",
<<"default_policy">> => allow,
<<"max_retry_delay">> => 300,
<<"use_starttls">> => false},
host_config,always},
<<"services">> =>
{section,
#{<<"service_domain_db">> =>
{section,
#{<<"db_pool">> =>
{option,atom,pool_name,undefined,default},
<<"event_cleaning_interval">> =>
{option,integer,positive,undefined,default},
<<"event_max_age">> =>
{option,integer,positive,undefined,default}},
any,[],any,map,undefined,
#{<<"db_pool">> => global,
<<"event_cleaning_interval">> => 1800,
<<"event_max_age">> => 7200},
default,when_present},
<<"service_mongoose_system_metrics">> =>
{section,
#{<<"initial_report">> =>
{option,integer,non_negative,undefined,
default},
<<"periodic_report">> =>
{option,integer,non_negative,undefined,
default},
<<"report">> =>
{option,boolean,any,undefined,default},
<<"tracking_id">> =>
{section,
#{<<"id">> =>
{option,string,non_empty,undefined,
default},
<<"secret">> =>
{option,string,non_empty,undefined,
default}},
any,all,any,map,undefined,#{},default,
when_present}},
any,[],any,map,undefined,
#{<<"initial_report">> => 300000,
<<"periodic_report">> => 10800000},
default,when_present}},
any,[],any,map,undefined,#{},global_config,always},
<<"shaper">> =>
{section,
#{default =>
{section,
#{<<"max_rate">> =>
{option,integer,positive,undefined,default}},
any,all,any,map,undefined,#{},default,
when_present}},
non_empty,[],any,map,undefined,#{},global_config,
when_present}},
key => <<"instrumentation">>,class => error,
what => toml_processing_failed,
toml_value =>
#{<<"general">> =>
#{<<"default_server_domain">> => <<"example.com">>,
<<"hosts">> => [<<"example.com">>]},
<<"instrumentation">> => #{}},
toml_path => []}]}
in function mongoose_config_parser_toml:process/1 (/home/circleci/project/src/config/mongoose_config_parser_toml.erl, line 77)
in call from config_parser_SUITE:parse/1 (/home/circleci/project/test/config_parser_SUITE.erl, line 3050)
in call from config_parser_SUITE:instrumentation/1 (/home/circleci/project/test/config_parser_SUITE.erl, line 2931)
in call from test_server:ts_tc/3 (test_server.erl, line 1793)
in call from test_server:run_test_case_eval1/6 (test_server.erl, line 1302)
in call from test_server:run_test_case_eval/9 (test_server.erl, line 1234)