summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--additional.config99
-rwxr-xr-xcuttlefishbin0 -> 430208 bytes
-rw-r--r--rabbitmq.conf.d/ldap.conf138
-rw-r--r--rabbitmq.conf.d/rabbitmq.conf810
-rw-r--r--schema/rabbitmq.config.schema941
-rw-r--r--schema/rabbitmq.ldap.schema151
-rw-r--r--schema/rabbitmq.management.schema107
-rw-r--r--schema/rabbitmq.mqtt.schema142
-rw-r--r--schema/rabbitmq.stomp.schema90
9 files changed, 2478 insertions, 0 deletions
diff --git a/additional.config b/additional.config
new file mode 100644
index 0000000000..46b020c680
--- /dev/null
+++ b/additional.config
@@ -0,0 +1,99 @@
+[
+
+
+ %% ----------------------------------------------------------------------------
+ %% RabbitMQ Shovel Plugin
+ %%
+ %% See http://www.rabbitmq.com/shovel.html for details
+ %% ----------------------------------------------------------------------------
+
+ {rabbitmq_shovel,
+ [{shovels,
+ [%% A named shovel worker.
+ %% {my_first_shovel,
+ %% [
+
+ %% List the source broker(s) from which to consume.
+ %%
+ %% {sources,
+ %% [%% URI(s) and pre-declarations for all source broker(s).
+ %% {brokers, ["amqp://user:password@host.domain/my_vhost"]},
+ %% {declarations, []}
+ %% ]},
+
+ %% List the destination broker(s) to publish to.
+ %% {destinations,
+ %% [%% A singular version of the 'brokers' element.
+ %% {broker, "amqp://"},
+ %% {declarations, []}
+ %% ]},
+
+ %% Name of the queue to shovel messages from.
+ %%
+ %% {queue, <<"your-queue-name-goes-here">>},
+
+ %% Optional prefetch count.
+ %%
+ %% {prefetch_count, 10},
+
+ %% when to acknowledge messages:
+ %% - no_ack: never (auto)
+ %% - on_publish: after each message is republished
+ %% - on_confirm: when the destination broker confirms receipt
+ %%
+ %% {ack_mode, on_confirm},
+
+ %% Overwrite fields of the outbound basic.publish.
+ %%
+ %% {publish_fields, [{exchange, <<"my_exchange">>},
+ %% {routing_key, <<"from_shovel">>}]},
+
+ %% Static list of basic.properties to set on re-publication.
+ %%
+ %% {publish_properties, [{delivery_mode, 2}]},
+
+ %% The number of seconds to wait before attempting to
+ %% reconnect in the event of a connection failure.
+ %%
+ %% {reconnect_delay, 2.5}
+
+ %% ]} %% End of my_first_shovel
+ ]}
+ %% Rather than specifying some values per-shovel, you can specify
+ %% them for all shovels here.
+ %%
+ %% {defaults, [{prefetch_count, 0},
+ %% {ack_mode, on_confirm},
+ %% {publish_fields, []},
+ %% {publish_properties, [{delivery_mode, 2}]},
+ %% {reconnect_delay, 2.5}]}
+ ]},
+
+ {rabbitmq_auth_backend_ldap, [
+% %%
+% %% Authorisation
+% %% =============
+% %%
+
+% %% The LDAP plugin can perform a variety of queries against your
+% %% LDAP server to determine questions of authorisation. See
+% %% http://www.rabbitmq.com/ldap.html#authorisation for more
+% %% information.
+
+% %% Set the query to use when determining vhost access
+% %%
+% %% {vhost_access_query, {in_group,
+% %% "ou=${vhost}-users,ou=vhosts,dc=example,dc=com"}},
+
+% %% Set the query to use when determining resource (e.g., queue) access
+% %%
+% %% {resource_access_query, {constant, true}},
+
+% %% Set queries to determine which tags a user has
+% %%
+% %% {tag_queries, []}
+ ]}
+].
+
+
+
diff --git a/cuttlefish b/cuttlefish
new file mode 100755
index 0000000000..90b47bc2fb
--- /dev/null
+++ b/cuttlefish
Binary files differ
diff --git a/rabbitmq.conf.d/ldap.conf b/rabbitmq.conf.d/ldap.conf
new file mode 100644
index 0000000000..2f51cbb409
--- /dev/null
+++ b/rabbitmq.conf.d/ldap.conf
@@ -0,0 +1,138 @@
+# ## ----------------------------------------------------------------------------
+# ## RabbitMQ LDAP Plugin
+# ##
+# ## See http://www.rabbitmq.com/ldap.html for details.
+# ##
+# ## ----------------------------------------------------------------------------
+
+
+# =======================================
+# LDAP section
+# =======================================
+
+# Should be defined in additional.conf maybe?
+
+# {rabbitmq_auth_backend_ldap,
+# [##
+# ## Connecting to the LDAP server(s)
+# ## ================================
+# ##
+
+# ## Specify servers to bind to. You *must* set this in order for the plugin
+# ## to work properly.
+# ##
+# ## {servers, ["your-server-name-goes-here"]},
+
+ldap.servers.myserver = your-server-name-goes-here
+
+# ## Connect to the LDAP server using SSL
+# ##
+# ## {use_ssl, false},
+
+ldap.use_ssl = false
+
+# ## Specify the LDAP port to connect to
+# ##
+# ## {port, 389},
+
+ldap.port = 389
+
+# ## LDAP connection timeout, in milliseconds or 'infinity'
+# ##
+# ## {timeout, infinity},
+
+ldap.timeout = infinity
+
+# Or number
+# ldap.timeout = 500
+
+# ## Enable logging of LDAP queries.
+# ## One of
+# ## - false (no logging is performed)
+# ## - true (verbose logging of the logic used by the plugin)
+# ## - network (as true, but additionally logs LDAP network traffic)
+# ##
+# ## Defaults to false.
+# ##
+# ## {log, false},
+
+ldap.log = false
+
+# Also can be true or network
+# ldap.log = true
+# ldap.log = network
+
+# ##
+# ## Authentication
+# ## ==============
+# ##
+
+# ## Pattern to convert the username given through AMQP to a DN before
+# ## binding
+# ##
+# ## {user_dn_pattern, "cn=${username},ou=People,dc=example,dc=com"},
+
+ldap.user_dn_pattern = cn=${username},ou=People,dc=example,dc=com
+
+# ## Alternatively, you can convert a username to a Distinguished
+# ## Name via an LDAP lookup after binding. See the documentation for
+# ## full details.
+
+# ## When converting a username to a dn via a lookup, set these to
+# ## the name of the attribute that represents the user name, and the
+# ## base DN for the lookup query.
+# ##
+# ## {dn_lookup_attribute, "userPrincipalName"},
+# ## {dn_lookup_base, "DC=gopivotal,DC=com"},
+
+ldap.dn_lookup_attribute = userPrincipalName
+ldap.dn_lookup_base = DC=gopivotal,DC=com
+
+# ## Controls how to bind for authorisation queries and also to
+# ## retrieve the details of users logging in without presenting a
+# ## password (e.g., SASL EXTERNAL).
+# ## One of
+# ## - as_user (to bind as the authenticated user - requires a password)
+# ## - anon (to bind anonymously)
+# ## - {UserDN, Password} (to bind with a specified user name and password)
+# ##
+# ## Defaults to 'as_user'.
+# ##
+# ## {other_bind, as_user},
+
+ldap.other_bind = as_user
+
+# Or can be more complex:
+# ldap.other_bind.user_dn = User
+# ldap.other_bind.password = Password
+# If user_dn and password defined - other options is ignored.
+
+# -----------------------------
+# Too complex section of LDAP
+# -----------------------------
+
+# ##
+# ## Authorisation
+# ## =============
+# ##
+
+# ## The LDAP plugin can perform a variety of queries against your
+# ## LDAP server to determine questions of authorisation. See
+# ## http://www.rabbitmq.com/ldap.html#authorisation for more
+# ## information.
+
+# ## Set the query to use when determining vhost access
+# ##
+# ## {vhost_access_query, {in_group,
+# ## "ou=${vhost}-users,ou=vhosts,dc=example,dc=com"}},
+
+# ## Set the query to use when determining resource (e.g., queue) access
+# ##
+# ## {resource_access_query, {constant, true}},
+
+# ## Set queries to determine which tags a user has
+# ##
+# ## {tag_queries, []}
+# ]},
+# -----------------------------
+
diff --git a/rabbitmq.conf.d/rabbitmq.conf b/rabbitmq.conf.d/rabbitmq.conf
new file mode 100644
index 0000000000..243353e77c
--- /dev/null
+++ b/rabbitmq.conf.d/rabbitmq.conf
@@ -0,0 +1,810 @@
+# [
+# {rabbit,
+# [##
+ ## Network Connectivity
+ ## ====================
+ ##
+ ## By default, RabbitMQ will listen on all interfaces, using
+ ## the standard (reserved) AMQP port.
+ ##
+ ## {tcp_listeners, [5672]},
+ ## To listen on a specific interface, provide a tuple of {IpAddress, Port}.
+ ## For example, to listen only on localhost for both IPv4 and IPv6:
+ ##
+ ## {tcp_listeners, [{"127.0.0.1", 5672},
+ ## {"::1", 5672}]},
+# Define with port
+listener.tcp.default = 5672
+
+# Define with IP
+# listener.tcp.local = 127.0.0.1:5672
+
+# Define for IPv6
+# listener.tcp.local_v6 = ::1:5672
+
+
+ ## SSL listeners are configured in the same fashion as TCP listeners,
+ ## including the option to control the choice of interface.
+ ##
+ ## {ssl_listeners, [5671]},
+
+# SSL listeners are same
+listener.ssl.default = 5672
+
+
+ ## Number of Erlang processes that will accept connections for the TCP
+ ## and SSL listeners.
+ ##
+ ## {num_tcp_acceptors, 10},
+ ## {num_ssl_acceptors, 1},
+
+num_acceptors.tcp = 10
+num_acceptors.ssl = 1
+
+
+ ## Maximum time for AMQP 0-8/0-9/0-9-1 handshake (after socket connection
+ ## and SSL handshake), in milliseconds.
+ ##
+ ## {handshake_timeout, 10000},
+
+handshake_timeout = 10000
+
+ ## Set to 'true' to perform reverse DNS lookups when accepting a
+ ## connection. Hostnames will then be shown instead of IP addresses
+ ## in rabbitmqctl and the management plugin.
+ ##
+ ## {reverse_dns_lookups, true},
+reverse_dns_lookups = true
+
+ # ##
+ # ## Security / AAA
+ # ## ==============
+ # ##
+
+ # ## The default "guest" user is only permitted to access the server
+ # ## via a loopback interface (e.g. localhost).
+ # ## {loopback_users, [<<"guest">>]},
+ # ##
+ # ## Uncomment the following line if you want to allow access to the
+ # ## guest user from anywhere on the network.
+ # ## {loopback_users, []},
+
+# Duplicate 'guest', because cutterfish doesn't support collections
+
+loopback_user.guest = guest
+
+ ## Configuring SSL.
+ ## See http://www.rabbitmq.com/ssl.html for full documentation.
+ ##
+ ## {ssl_options, [{cacertfile, "/path/to/testca/cacert.pem"},
+ ## {certfile, "/path/to/server/cert.pem"},
+ ## {keyfile, "/path/to/server/key.pem"},
+ ## {verify, verify_peer},
+ ## {fail_if_no_peer_cert, false}]},
+
+ssl_option.verify = verify_peer
+ssl_option.fail_if_no_peer_cert = false
+ssl_option.cacertfile = /path/to/testca/cacert.pem
+ssl_option.certfile = /path/to/server/cert.pem
+ssl_option.keyfile = /path/to/server/key.pem
+
+ ## Choose the available SASL mechanism(s) to expose.
+ ## The two default (built in) mechanisms are 'PLAIN' and
+ ## 'AMQPLAIN'. Additional mechanisms can be added via
+ ## plugins.
+ ##
+ ## See http://www.rabbitmq.com/authentication.html for more details.
+ ##
+ ## {auth_mechanisms, ['PLAIN', 'AMQPLAIN']},
+
+ ## Select an authentication database to use. RabbitMQ comes bundled
+ ## with a built-in auth-database, based on mnesia.
+ ##
+ ## {auth_backends, [rabbit_auth_backend_internal]},
+
+ ## Configurations supporting the rabbitmq_auth_mechanism_ssl and
+ ## rabbitmq_auth_backend_ldap plugins.
+ ##
+ ## NB: These options require that the relevant plugin is enabled.
+ ## See http://www.rabbitmq.com/plugins.html for further details.
+
+ ## The RabbitMQ-auth-mechanism-ssl plugin makes it possible to
+ ## authenticate a user based on the client's SSL certificate.
+ ##
+ ## To use auth-mechanism-ssl, add to or replace the auth_mechanisms
+ ## list with the entry 'EXTERNAL'.
+ ##
+ ## {auth_mechanisms, ['EXTERNAL']},
+
+ ## The rabbitmq_auth_backend_ldap plugin allows the broker to
+ ## perform authentication and authorisation by deferring to an
+ ## external LDAP server.
+ ##
+ ## For more information about configuring the LDAP backend, see
+ ## http://www.rabbitmq.com/ldap.html.
+ ##
+ ## Enable the LDAP auth backend by adding to or replacing the
+ ## auth_backends entry:
+ ##
+ ## {auth_backends, [rabbit_auth_backend_ldap]},
+
+auth_mechanism.external = EXTERNAL
+auth_backend.internal = rabbit_auth_backend_internal
+
+# Add another backend
+# auth_backend.http = rabbit_auth_backend_http
+
+
+ ## This pertains to both the rabbitmq_auth_mechanism_ssl plugin and
+ ## STOMP ssl_cert_login configurations. See the rabbitmq_stomp
+ ## configuration section later in this file and the README in
+ ## https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl for further
+ ## details.
+ ##
+ ## To use the SSL cert's CN instead of its DN as the username
+ ##
+ ## {ssl_cert_login_from, common_name},
+
+ ## SSL handshake timeout, in milliseconds.
+ ##
+ ## {ssl_handshake_timeout, 5000},
+
+ssl_cert_login_from = common_name
+ssl_handshake_timeout = 5000
+
+
+ ## Password hashing implementation. Will only affect newly
+ ## created users. To recalculate hash for an existing user
+ ## it's necessary to update her password.
+ ##
+ ## When importing definitions exported from versions earlier
+ ## than 3.6.0, it is possible to go back to MD5 (only do this
+ ## as a temporary measure!) by setting this to rabbit_password_hashing_md5.
+ ##
+ ## To use SHA-512, set to rabbit_password_hashing_sha512.
+ ##
+ ## {password_hashing_module, rabbit_password_hashing_sha256},
+
+password_hashing_module = rabbit_password_hashing_sha256
+
+ ##
+ ## Default User / VHost
+ ## ====================
+ ##
+
+ ## On first start RabbitMQ will create a vhost and a user. These
+ ## config items control what gets created. See
+ ## http://www.rabbitmq.com/access-control.html for further
+ ## information about vhosts and access control.
+ ##
+ ## {default_vhost, <<"/">>},
+ ## {default_user, <<"guest">>},
+ ## {default_pass, <<"guest">>},
+ ## {default_permissions, [<<".*">>, <<".*">>, <<".*">>]},
+
+default_vhost = /
+default_user = guest
+default_pass = guest
+
+default_permissions.configure = .*
+default_permissions.read = .*
+default_permissions.write = .*
+
+ ## Tags for default user
+ ##
+ ## For more details about tags, see the documentation for the
+ ## Management Plugin at http://www.rabbitmq.com/management.html.
+ ##
+ ## {default_user_tags, [administrator]},
+
+default_user_tags.administrator = true
+
+ ##
+ ## Additional network and protocol related configuration
+ ## =====================================================
+ ##
+
+ ## Set the default AMQP heartbeat delay (in seconds).
+ ##
+ ## {heartbeat, 600},
+
+ ## Set the max permissible size of an AMQP frame (in bytes).
+ ##
+ ## {frame_max, 131072},
+
+ ## Set the max frame size the server will accept before connection
+ ## tuning occurs
+ ##
+ ## {initial_frame_max, 4096},
+
+ ## Set the max permissible number of channels per connection.
+ ## 0 means "no limit".
+ ##
+ ## {channel_max, 128},
+
+heartbeat = 600
+frame_max = 131072
+initial_frame_max = 4096
+channel_max = 128
+
+ ## Customising Socket Options.
+ ##
+ ## See (http://www.erlang.org/doc/man/inet.html#setopts-2) for
+ ## further documentation.
+ ##
+ ## {tcp_listen_options, [{backlog, 128},
+ ## {nodelay, true},
+ ## {exit_on_close, false}]},
+
+tcp_listen_option.backlog = 128
+tcp_listen_option.nodelay = true
+tcp_listen_option.exit_on_close = false
+
+ ##
+ ## Resource Limits & Flow Control
+ ## ==============================
+ ##
+ ## See http://www.rabbitmq.com/memory.html for full details.
+
+ ## Memory-based Flow Control threshold.
+ ##
+ ## {vm_memory_high_watermark, 0.4},
+
+ ## Alternatively, we can set a limit (in bytes) of RAM used by the node.
+ ##
+ ## {vm_memory_high_watermark, {absolute, 1073741824}},
+ ##
+ ## Or you can set absolute value using memory units (with RabbitMQ 3.6.0+).
+ ##
+ ## {vm_memory_high_watermark, {absolute, "1024M"}},
+ ##
+ ## Supported units suffixes:
+ ##
+ ## k, kiB: kibibytes (2^10 bytes)
+ ## M, MiB: mebibytes (2^20)
+ ## G, GiB: gibibytes (2^30)
+ ## kB: kilobytes (10^3)
+ ## MB: megabytes (10^6)
+ ## GB: gigabytes (10^9)
+
+# Relative watermark
+vm_memory_high_watermark.relative = 0.4
+
+# Or absolute watermark.
+# Ignored if relative is defined!
+# vm_memory_high_watermark.absolute = 1024M
+
+ ## Fraction of the high watermark limit at which queues start to
+ ## page message out to disc in order to free up memory.
+ ##
+ ## Values greater than 0.9 can be dangerous and should be used carefully.
+ ##
+ ## {vm_memory_high_watermark_paging_ratio, 0.5},
+
+vm_memory_high_watermark_paging_ratio = 0.5
+
+ ## Interval (in milliseconds) at which we perform the check of the memory
+ ## levels against the watermarks.
+ ##
+ ## {memory_monitor_interval, 2500},
+
+memory_monitor_interval = 2500
+
+ ## Set disk free limit (in bytes). Once free disk space reaches this
+ ## lower bound, a disk alarm will be set - see the documentation
+ ## listed above for more details.
+ ##
+ ## {disk_free_limit, 50000000},
+ ##
+ ## Or you can set it using memory units (same as in vm_memory_high_watermark)
+ ## with RabbitMQ 3.6.0+.
+ ## {disk_free_limit, "50MB"},
+ ## {disk_free_limit, "50000kB"},
+ ## {disk_free_limit, "2GB"},
+
+ ## Alternatively, we can set a limit relative to total available RAM.
+ ##
+ ## Values lower than 1.0 can be dangerous and should be used carefully.
+ ## {disk_free_limit, {mem_relative, 2.0}},
+
+# Mem relative disk limit
+disk_free_limit.relative = 2.0
+
+# Absolute disk limit
+# Ignored if relative defined
+disk_free_limit.absolute = 50MB
+
+
+ ##
+ ## Clustering
+ ## =====================
+ ##
+
+ ## How to respond to cluster partitions.
+ ## See http://www.rabbitmq.com/partitions.html for further details.
+ ##
+ ## {cluster_partition_handling, ignore},
+
+cluster_partition_handling = ignore
+
+ ## Mirror sync batch size, in messages. Increasing this will speed
+ ## up syncing but total batch size in bytes must not exceed 2 GiB.
+ ## Available in RabbitMQ 3.6.0 or later.
+ ##
+ ## {mirroring_sync_batch_size, 4096},
+
+mirroring_sync_batch_size = 4096
+
+ ## Make clustering happen *automatically* at startup - only applied
+ ## to nodes that have just been reset or started for the first time.
+ ## See http://www.rabbitmq.com/clustering.html#auto-config for
+ ## further details.
+ ##
+ ## {cluster_nodes, {['rabbit@my.host.com'], disc}},
+
+cluster_nodes.disk.rabbit = rabbit@my.host.com
+
+# Can define multiple
+# cluster_nodes.disk.hare = hare@my.host.com
+
+# Ram nodes
+# Should not be defined together with disk nodes
+# cluster_nodes.ram.rabbit = rabbit@my.host.com
+
+ ## Interval (in milliseconds) at which we send keepalive messages
+ ## to other cluster members. Note that this is not the same thing
+ ## as net_ticktime; missed keepalive messages will not cause nodes
+ ## to be considered down.
+ ##
+ ## {cluster_keepalive_interval, 10000},
+
+cluster_keepalive_interval = 10000
+
+ ##
+ ## Statistics Collection
+ ## =====================
+ ##
+
+ ## Set (internal) statistics collection granularity.
+ ##
+ ## {collect_statistics, none},
+
+# Cna be none, coarse or fine
+collect_statistics = none
+
+ ## Statistics collection interval (in milliseconds). Increasing
+ ## this will reduce the load on management database.
+ ##
+ ## {collect_statistics_interval, 5000},
+
+collect_statistics_interval = 5000
+
+ ##
+ ## Misc/Advanced Options
+ ## =====================
+ ##
+ ## NB: Change these only if you understand what you are doing!
+ ##
+
+ ## Explicitly enable/disable hipe compilation.
+ ##
+ ## {hipe_compile, true},
+
+hipe_compile = true
+
+ ## Timeout used when waiting for Mnesia tables in a cluster to
+ ## become available.
+ ##
+ ## {mnesia_table_loading_timeout, 30000},
+
+mnesia_table_loading_timeout = 30000
+
+
+ ## Size in bytes below which to embed messages in the queue index. See
+ ## http://www.rabbitmq.com/persistence-conf.html
+ ##
+ ## {queue_index_embed_msgs_below, 4096}
+
+queue_index_embed_msgs_below = 4096
+
+ # ]},
+
+ # ## ----------------------------------------------------------------------------
+ # ## Advanced Erlang Networking/Clustering Options.
+ # ##
+ # ## See http://www.rabbitmq.com/clustering.html for details
+ # ## ----------------------------------------------------------------------------
+ # {kernel,
+ # [## Sets the net_kernel tick time.
+ # ## Please see http://erlang.org/doc/man/kernel_app.html and
+ # ## http://www.rabbitmq.com/nettick.html for further details.
+ # ##
+ # ## {net_ticktime, 60}
+ # ]},
+
+# ======================================
+# Kernel section
+# ======================================
+
+kernel.net_ticktime = 60
+
+ # ## ----------------------------------------------------------------------------
+ # ## RabbitMQ Management Plugin
+ # ##
+ # ## See http://www.rabbitmq.com/management.html for details
+ # ## ----------------------------------------------------------------------------
+
+ # {rabbitmq_management,
+ # [## Pre-Load schema definitions from the following JSON file. See
+ ## http://www.rabbitmq.com/management.html#load-definitions
+ ##
+ ## {load_definitions, "/path/to/schema.json"},
+
+# =======================================
+# Management section
+# =======================================
+
+management.load_definitions = /path/to/schema.json
+
+ ## Log all requests to the management HTTP API to a file.
+ ##
+ ## {http_log_dir, "/path/to/access.log"},
+
+management.http_log_dir = /path/to/access.log
+
+ ## Change the port on which the HTTP listener listens,
+ ## specifying an interface for the web server to bind to.
+ ## Also set the listener to use SSL and provide SSL options.
+ ##
+ ## {listener, [{port, 12345},
+ ## {ip, "127.0.0.1"},
+ ## {ssl, true},
+ ## {ssl_opts, [{cacertfile, "/path/to/cacert.pem"},
+ ## {certfile, "/path/to/cert.pem"},
+ ## {keyfile, "/path/to/key.pem"}]}]},
+
+
+# Maybe use IP type like in tcp_listener?
+management.listener.port = 12345
+management.listener.ip = 127.0.0.1
+management.listener.ssl = true
+
+management.listener.ssl_opts.cacertfile = /path/to/cacert.pem
+management.listener.ssl_opts.certfile = /path/to/cert.pem
+management.listener.ssl_opts.keyfile = /path/to/key.pem
+
+ ## One of 'basic', 'detailed' or 'none'. See
+ ## http://www.rabbitmq.com/management.html#fine-stats for more details.
+ ## {rates_mode, basic},
+
+management.rates_mode = basic
+
+ ## Configure how long aggregated data (such as message rates and queue
+ ## lengths) is retained. Please read the plugin's documentation in
+ ## http://www.rabbitmq.com/management.html#configuration for more
+ ## details.
+ ##
+ ## {sample_retention_policies,
+ ## [{global, [{60, 5}, {3600, 60}, {86400, 1200}]},
+ ## {basic, [{60, 5}, {3600, 60}]},
+ ## {detailed, [{10, 5}]}]}
+# ]},
+
+# Some funny syntax
+management.sample_retention_policies.global.60 = 5
+management.sample_retention_policies.global.3600 = 60
+management.sample_retention_policies.global.86400 = 1200
+
+management.sample_retention_policies.basic.60 = 5
+management.sample_retention_policies.basic.3600 = 60
+
+management.sample_retention_policies.detailed.10 = 5
+
+
+# Shovel is too complex for sysctl syntax. Should be defined in additinal.conf
+
+# ## ----------------------------------------------------------------------------
+# ## RabbitMQ Shovel Plugin
+# ##
+# ## See http://www.rabbitmq.com/shovel.html for details
+# ## ----------------------------------------------------------------------------
+
+# {rabbitmq_shovel,
+# [{shovels,
+# [## A named shovel worker.
+# ## {my_first_shovel,
+# ## [
+
+# ## List the source broker(s) from which to consume.
+# ##
+# ## {sources,
+# ## [## URI(s) and pre-declarations for all source broker(s).
+# ## {brokers, ["amqp://user:password@host.domain/my_vhost"]},
+# ## {declarations, []}
+# ## ]},
+
+# ## List the destination broker(s) to publish to.
+# ## {destinations,
+# ## [## A singular version of the 'brokers' element.
+# ## {broker, "amqp://"},
+# ## {declarations, []}
+# ## ]},
+
+# ## Name of the queue to shovel messages from.
+# ##
+# ## {queue, <<"your-queue-name-goes-here">>},
+
+# ## Optional prefetch count.
+# ##
+# ## {prefetch_count, 10},
+
+# ## when to acknowledge messages:
+# ## - no_ack: never (auto)
+# ## - on_publish: after each message is republished
+# ## - on_confirm: when the destination broker confirms receipt
+# ##
+# ## {ack_mode, on_confirm},
+
+# ## Overwrite fields of the outbound basic.publish.
+# ##
+# ## {publish_fields, [{exchange, <<"my_exchange">>},
+# ## {routing_key, <<"from_shovel">>}]},
+
+# ## Static list of basic.properties to set on re-publication.
+# ##
+# ## {publish_properties, [{delivery_mode, 2}]},
+
+# ## The number of seconds to wait before attempting to
+# ## reconnect in the event of a connection failure.
+# ##
+# ## {reconnect_delay, 2.5}
+
+# ## ]} ## End of my_first_shovel
+# ]}
+# ## Rather than specifying some values per-shovel, you can specify
+# ## them for all shovels here.
+# ##
+# ## {defaults, [{prefetch_count, 0},
+# ## {ack_mode, on_confirm},
+# ## {publish_fields, []},
+# ## {publish_properties, [{delivery_mode, 2}]},
+# ## {reconnect_delay, 2.5}]}
+# ]},
+
+# ## ----------------------------------------------------------------------------
+# ## RabbitMQ Stomp Adapter
+# ##
+# ## See http://www.rabbitmq.com/stomp.html for details
+# ## ----------------------------------------------------------------------------
+
+# =======================================
+# STOMP section
+# =======================================
+
+# {rabbitmq_stomp,
+# [## Network Configuration - the format is generally the same as for the broker
+
+# ## Listen only on localhost (ipv4 & ipv6) on a specific port.
+# ## {tcp_listeners, [{"127.0.0.1", 61613},
+# ## {"::1", 61613}]},
+
+# Same as tcp_listener
+stomp.listener.tcp.default = 61613
+
+stomp.listener.ssl.default = 61614
+
+# ## Number of Erlang processes that will accept connections for the TCP
+# ## and SSL listeners.
+# ##
+# ## {num_tcp_acceptors, 10},
+# ## {num_ssl_acceptors, 1},
+
+stomp.num_acceptors.tcp = 10
+stomp.num_acceptors.ssl = 1
+
+# ## Additional SSL options
+
+# ## Extract a name from the client's certificate when using SSL.
+# ##
+# ## {ssl_cert_login, true},
+
+stomp.ssl_cert_login = true
+
+# ## Set a default user name and password. This is used as the default login
+# ## whenever a CONNECT frame omits the login and passcode headers.
+# ##
+# ## Please note that setting this will allow clients to connect without
+# ## authenticating!
+# ##
+# ## {default_user, [{login, "guest"},
+# ## {passcode, "guest"}]},
+
+# Same syntax as AMQP
+stomp.default_user = guest
+stomp.default_pass = guest
+
+# ## If a default user is configured, or you have configured use SSL client
+# ## certificate based authentication, you can choose to allow clients to
+# ## omit the CONNECT frame entirely. If set to true, the client is
+# ## automatically connected as the default user or user supplied in the
+# ## SSL certificate whenever the first frame sent on a session is not a
+# ## CONNECT frame.
+# ##
+# ## {implicit_connect, true}
+# ]},
+
+stomp.implicit_connect = true
+
+# ## ----------------------------------------------------------------------------
+# ## RabbitMQ MQTT Adapter
+# ##
+# ## See https://github.com/rabbitmq/rabbitmq-mqtt/blob/stable/README.md
+# ## for details
+# ## ----------------------------------------------------------------------------
+
+# =======================================
+# MQTT section
+# =======================================
+
+# {rabbitmq_mqtt,
+# [## Set the default user name and password. Will be used as the default login
+# ## if a connecting client provides no other login details.
+# ##
+# ## Please note that setting this will allow clients to connect without
+# ## authenticating!
+# ##
+# ## {default_user, <<"guest">>},
+# ## {default_pass, <<"guest">>},
+
+mqtt.default_user = guest
+mqtt.default_pass = guest
+
+# ## Enable anonymous access. If this is set to false, clients MUST provide
+# ## login information in order to connect. See the default_user/default_pass
+# ## configuration elements for managing logins without authentication.
+# ##
+# ## {allow_anonymous, true},
+
+mqtt.allow_anonymous = true
+
+# ## If you have multiple chosts, specify the one to which the
+# ## adapter connects.
+# ##
+# ## {vhost, <<"/">>},
+
+mqtt.vhost = /
+
+# ## Specify the exchange to which messages from MQTT clients are published.
+# ##
+# ## {exchange, <<"amq.topic">>},
+
+mqtt.exchange = amq.topic
+
+# ## Specify TTL (time to live) to control the lifetime of non-clean sessions.
+# ##
+# ## {subscription_ttl, 1800000},
+mqtt.subscription_ttl = 1800000
+
+# ## Set the prefetch count (governing the maximum number of unacknowledged
+# ## messages that will be delivered).
+# ##
+# ## {prefetch, 10},
+mqtt.prefetch = 10
+
+# ## TCP/SSL Configuration (as per the broker configuration).
+# ##
+# ## {tcp_listeners, [1883]},
+# ## {ssl_listeners, []},
+
+# Same as amqp tcp_listener
+mqtt.listener.tcp.default = 1883
+
+# Same as amqp ssl_listener
+mqtt.listener.ssl.default = 1884
+
+# ## Number of Erlang processes that will accept connections for the TCP
+# ## and SSL listeners.
+# ##
+# ## {num_tcp_acceptors, 10},
+# ## {num_ssl_acceptors, 1},
+
+mqtt.num_acceptors.tcp = 10
+mqtt.num_acceptors.ssl = 1
+
+# ## TCP/Socket options (as per the broker configuration).
+# ##
+# ## {tcp_listen_options, [{backlog, 128},
+# ## {nodelay, true}]}
+# ]},
+
+mqtt.tcp_listen_option.backlog = 128
+mqtt.tcp_listen_option.nodelay = true
+
+# ## ----------------------------------------------------------------------------
+# ## RabbitMQ AMQP 1.0 Support
+# ##
+# ## See https://github.com/rabbitmq/rabbitmq-amqp1.0/blob/stable/README.md
+# ## for details
+# ## ----------------------------------------------------------------------------
+
+# =======================================
+# AMQP_1 section
+# =======================================
+
+
+# {rabbitmq_amqp1_0,
+# [## Connections that are not authenticated with SASL will connect as this
+# ## account. See the README for more information.
+# ##
+# ## Please note that setting this will allow clients to connect without
+# ## authenticating!
+# ##
+# ## {default_user, "guest"},
+
+amqp1.default_user = guest
+
+# ## Enable protocol strict mode. See the README for more information.
+# ##
+# ## {protocol_strict_mode, false}
+# ]},
+
+amqp1.protocol_strict_mode = false
+
+# ## Lager controls logging.
+# ## See https://github.com/basho/lager for more documentation
+# {lager, [
+# ##
+# ## Log direcrory, taken from the RABBITMQ_LOG_BASE env variable by default.
+# ## {log_root, "/var/log/rabbitmq"},
+# ##
+# ## All log messages go to the default "sink" configured with
+# ## the `handlers` parameter. By default, it has a single
+# ## lager_file_backend handler writing messages to "$nodename.log"
+# ## (ie. the value of $RABBIT_LOGS).
+# ## {handlers, [
+# ## {lager_file_backend, [{file, "rabbit.log"},
+# ## {level, info},
+# ## {date, ""},
+# ## {size, 0}]}
+# ## ]},
+# ##
+# ## Extra sinks are used in RabbitMQ to categorize messages. By
+# ## default, those extra sinks are configured to forward messages
+# ## to the default sink (see above). "rabbit_log_lager_event"
+# ## is the default category where all RabbitMQ messages without
+# ## a category go. Messages in the "channel" category go to the
+# ## "rabbit_channel_lager_event" Lager extra sink, and so on.
+# ## {extra_sinks, [
+# ## {rabbit_log_lager_event, [{handlers, [
+# ## {lager_forwarder_backend,
+# ## [lager_event, info]}]}]},
+# ## {rabbit_channel_lager_event, [{handlers, [
+# ## {lager_forwarder_backend,
+# ## [lager_event, info]}]}]},
+# ## {rabbit_conection_lager_event, [{handlers, [
+# ## {lager_forwarder_backend,
+# ## [lager_event, info]}]}]},
+# ## {rabbit_mirroring_lager_event, [{handlers, [
+# ## {lager_forwarder_backend,
+# ## [lager_event, info]}]}]}
+# ## ]}
+# ]}
+# ].
+
+log.dir = /var/log/rabbitmq
+
+log.console = false
+log.console.level = info
+
+log.file = rabbit.log
+log.file.level = info
+
+log.file.rotation.date = ""
+log.file.rotation.size = 0
+
+
+# Possible:
+log.syslog = false
+log.syslog.identity = rabbitmq
+log.syslog.level = info
+log.syslog.facility = daemon \ No newline at end of file
diff --git a/schema/rabbitmq.config.schema b/schema/rabbitmq.config.schema
new file mode 100644
index 0000000000..ee040d6ae6
--- /dev/null
+++ b/schema/rabbitmq.config.schema
@@ -0,0 +1,941 @@
+%% -*- mode: erlang -*-
+%% ----------------------------------------------------------------------------
+%% RabbitMQ Sample Configuration File.
+%%
+%% See http://www.rabbitmq.com/configure.html for details.
+%% ----------------------------------------------------------------------------
+% [
+% {rabbit,
+% [%%
+ %% Network Connectivity
+ %% ====================
+ %%
+
+ %% By default, RabbitMQ will listen on all interfaces, using
+ %% the standard (reserved) AMQP port.
+ %%
+ %% {tcp_listeners, [5672]},
+ %% To listen on a specific interface, provide a tuple of {IpAddress, Port}.
+ %% For example, to listen only on localhost for both IPv4 and IPv6:
+ %%
+ %% {tcp_listeners, [{"127.0.0.1", 5672},
+ %% {"::1", 5672}]},
+
+{mapping, "listener.tcp.$name", "rabbit.tcp_listeners",[
+ {default, 5672},
+ {datatype, [integer, ip]},
+ {include_default, "all"}
+]}.
+
+{translation, "rabbit.tcp_listeners",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("listener.tcp", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+ %% SSL listeners are configured in the same fashion as TCP listeners,
+ %% including the option to control the choice of interface.
+ %%
+ %% {ssl_listeners, [5671]},
+
+{mapping, "listener.ssl.$name", "rabbit.ssl_listeners",[
+ {default, 5672},
+ {datatype, [integer, ip]},
+ {include_default, "all"}
+]}.
+
+{translation, "rabbit.ssl_listeners",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("listener.ssl", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+ %% Number of Erlang processes that will accept connections for the TCP
+ %% and SSL listeners.
+ %%
+ %% {num_tcp_acceptors, 10},
+ %% {num_ssl_acceptors, 1},
+
+{mapping, "num_acceptors.ssl", "rabbit.num_ssl_acceptors", [
+ {default, 1},
+ {datatype, integer}
+]}.
+
+{mapping, "num_acceptors.tcp", "rabbit.num_tcp_acceptors", [
+ {default, 10},
+ {datatype, integer}
+]}.
+
+
+ %% Maximum time for AMQP 0-8/0-9/0-9-1 handshake (after socket connection
+ %% and SSL handshake), in milliseconds.
+ %%
+ %% {handshake_timeout, 10000},
+
+{mapping, "handshake_timeout", "rabbit.handshake_timeout", [
+ {default, 10000},
+ {datatype, integer}
+]}.
+
+ %% Set to 'true' to perform reverse DNS lookups when accepting a
+ %% connection. Hostnames will then be shown instead of IP addresses
+ %% in rabbitmqctl and the management plugin.
+ %%
+ %% {reverse_dns_lookups, true},
+
+{mapping, "reverse_dns_lookups", "rabbit.reverse_dns_lookups", [
+ {default, true},
+ {datatype, {enum, [true, false]}}
+]}.
+
+{mapping, "erlang.K", "vm_args.+K", [
+ {default, "true"},
+ {level, advanced}
+]}.
+
+ %%
+ %% Security / AAA
+ %% ==============
+ %%
+
+ %% The default "guest" user is only permitted to access the server
+ %% via a loopback interface (e.g. localhost).
+ %% {loopback_users, [<<"guest">>]},
+ %%
+ %% Uncomment the following line if you want to allow access to the
+ %% guest user from anywhere on the network.
+ %% {loopback_users, []},
+
+{mapping, "loopback_user.$user", "rabbit.loopback_users", [
+ {default, <<"guest">>},
+ {datatype, string},
+ {include_default, "guest"}
+]}.
+
+{translation, "rabbit.loopback_users",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("loopback_user", Conf),
+ [ list_to_binary(V) || {_, V} <- Settings ]
+end}.
+
+ %% Configuring SSL.
+ %% See http://www.rabbitmq.com/ssl.html for full documentation.
+ %%
+ %% {ssl_options, [{cacertfile, "/path/to/testca/cacert.pem"},
+ %% {certfile, "/path/to/server/cert.pem"},
+ %% {keyfile, "/path/to/server/key.pem"},
+ %% {verify, verify_peer},
+ %% {fail_if_no_peer_cert, false}]},
+
+{mapping, "ssl_option.verify", "rabbit.ssl_options", [
+ {datatype, {enum, [verify_peer, verify_none]}}]}.
+
+{mapping, "ssl_option.fail_if_no_peer_cert", "rabbit.ssl_options.fail_if_no_peer_cert", [
+ {datatype, {enum, [true, false]}}]}.
+
+{mapping, "ssl_option.cacertfile", "rabbit.ssl_options.cacertfile",
+ [{datatype, string}, {validators, ["file_accessible"]}]}.
+
+{mapping, "ssl_option.certfile", "rabbit.ssl_options.certfile",
+ [{datatype, string}, {validators, ["file_accessible"]}]}.
+
+{mapping, "ssl_option.cacerts.$name", "rabbit.ssl_options.cacerts",
+ [{datatype, string}]}.
+
+{translation, "rabbit.ssl_options.cacerts",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("ssl_option.cacerts", Conf),
+ [ list_to_binary(V) || {_, V} <- Settings ]
+end}.
+
+{mapping, "ssl_option.cert", "rabbit.ssl_options.cert",
+ [{datatype, string}]}.
+
+{translation, "rabbit.ssl_options.cert",
+fun(Conf) ->
+ list_to_binary(cuttlefish:conf_get("ssl_option.cert", Conf))
+end}.
+
+{mapping, "ssl_option.client_renegotiation", "rabbit.ssl_options.client_renegotiation",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "ssl_option.crl_check", "rabbit.ssl_options.crl_check",
+ [{datatype, [{enum, [true, false, peer, best_effort]}]}]}.
+
+{mapping, "ssl_option.depth", "rabbit.ssl_options.depth",
+ [{datatype, integer}, {validators, ["byte"]}]}.
+
+{mapping, "ssl_option.dh", "rabbit.ssl_options.dh",
+ [{datatype, string}]}.
+
+{translation, "rabbit.ssl_options.dh",
+fun(Conf) ->
+ list_to_binary(cuttlefish:conf_get("ssl_option.dh", Conf))
+end}.
+
+{mapping, "ssl_option.dhfile", "rabbit.ssl_options.dhfile",
+ [{datatype, string}, {validators, ["file_accessible"]}]}.
+
+{mapping, "ssl_option.honor_cipher_order", "rabbit.ssl_options.honor_cipher_order",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "ssl_option.key.RSAPrivateKey", "rabbit.ssl_options.key",
+ [{datatype, string}]}.
+
+{mapping, "ssl_option.key.DSAPrivateKey", "rabbit.ssl_options.key",
+ [{datatype, string}]}.
+
+{mapping, "ssl_option.key.PrivateKeyInfo", "rabbit.ssl_options.key",
+ [{datatype, string}]}.
+
+{translation, "rabbit.ssl_options.key",
+fun(Conf) ->
+ case cuttlefish_variable:filter_by_prefix("ssl_option.key", Conf) of
+ [{[_,_,Key], Val}|_] -> {list_to_atom(Key), list_to_binary(Val)};
+ _ -> undefined
+ end
+end}.
+
+{mapping, "ssl_option.keyfile", "rabbit.ssl_options.keyfile",
+ [{datatype, string}, {validators, ["file_accessible"]}]}.
+
+{mapping, "ssl_option.log_alert", "rabbit.ssl_options.log_alert",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "ssl_option.password", "rabbit.ssl_options.password",
+ [{datatype, string}]}.
+
+{mapping, "ssl_option.psk_identity", "rabbit.ssl_options.psk_identity",
+ [{datatype, string}]}.
+
+{mapping, "ssl_option.reuse_sessions", "rabbit.ssl_options.reuse_sessions",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "ssl_option.secure_renegotiate", "rabbit.ssl_options.secure_renegotiate",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "ssl_option.versions.$version", "rabbit.ssl_options.versions",
+ [{datatype, atom}]}.
+
+{translation, "rabbit.ssl_options.versions",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("ssl_option.cacerts", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+ %% Choose the available SASL mechanism(s) to expose.
+ %% The two default (built in) mechanisms are 'PLAIN' and
+ %% 'AMQPLAIN'. Additional mechanisms can be added via
+ %% plugins.
+ %%
+ %% See http://www.rabbitmq.com/authentication.html for more details.
+ %%
+ %% {auth_mechanisms, ['PLAIN', 'AMQPLAIN']},
+
+ %% Select an authentication database to use. RabbitMQ comes bundled
+ %% with a built-in auth-database, based on mnesia.
+ %%
+ %% {auth_backends, [rabbit_auth_backend_internal]},
+
+ %% Configurations supporting the rabbitmq_auth_mechanism_ssl and
+ %% rabbitmq_auth_backend_ldap plugins.
+ %%
+ %% NB: These options require that the relevant plugin is enabled.
+ %% See http://www.rabbitmq.com/plugins.html for further details.
+
+ %% The RabbitMQ-auth-mechanism-ssl plugin makes it possible to
+ %% authenticate a user based on the client's SSL certificate.
+ %%
+ %% To use auth-mechanism-ssl, add to or replace the auth_mechanisms
+ %% list with the entry 'EXTERNAL'.
+ %%
+ %% {auth_mechanisms, ['EXTERNAL']},
+
+ %% The rabbitmq_auth_backend_ldap plugin allows the broker to
+ %% perform authentication and authorisation by deferring to an
+ %% external LDAP server.
+ %%
+ %% For more information about configuring the LDAP backend, see
+ %% http://www.rabbitmq.com/ldap.html.
+ %%
+ %% Enable the LDAP auth backend by adding to or replacing the
+ %% auth_backends entry:
+ %%
+ %% {auth_backends, [rabbit_auth_backend_ldap]},
+
+{mapping, "auth_mechanism.$name", "rabbit.auth_mechanisms", [
+ {datatype, atom}]}.
+
+{translation, "rabbit.auth_mechanisms",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("auth_mechanism", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+{mapping, "auth_backend.$name", "rabbit.auth_backends", [
+ {datatype, atom}
+]}.
+
+{translation, "rabbit.auth_backends",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("auth_backend", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+ %% This pertains to both the rabbitmq_auth_mechanism_ssl plugin and
+ %% STOMP ssl_cert_login configurations. See the rabbitmq_stomp
+ %% configuration section later in this file and the README in
+ %% https://github.com/rabbitmq/rabbitmq-auth-mechanism-ssl for further
+ %% details.
+ %%
+ %% To use the SSL cert's CN instead of its DN as the username
+ %%
+ %% {ssl_cert_login_from, common_name},
+
+ %% SSL handshake timeout, in milliseconds.
+ %%
+ %% {ssl_handshake_timeout, 5000},
+
+{mapping, "ssl_cert_login_from", "rabbit.ssl_cert_login_from", [
+ {datatype, {enum, [distinguished_name, common_name]}}
+]}.
+
+{mapping, "ssl_handshake_timeout", "rabbit.ssl_handshake_timeout", [
+ {datatype, integer}
+]}.
+
+ %% Password hashing implementation. Will only affect newly
+ %% created users. To recalculate hash for an existing user
+ %% it's necessary to update her password.
+ %%
+ %% When importing definitions exported from versions earlier
+ %% than 3.6.0, it is possible to go back to MD5 (only do this
+ %% as a temporary measure!) by setting this to rabbit_password_hashing_md5.
+ %%
+ %% To use SHA-512, set to rabbit_password_hashing_sha512.
+ %%
+ %% {password_hashing_module, rabbit_password_hashing_sha256},
+
+{mapping, "password_hashing_module", "rabbit.password_hashing_module", [
+ {datatype, atom}
+]}.
+
+ %%
+ %% Default User / VHost
+ %% ====================
+ %%
+
+ %% On first start RabbitMQ will create a vhost and a user. These
+ %% config items control what gets created. See
+ %% http://www.rabbitmq.com/access-control.html for further
+ %% information about vhosts and access control.
+ %%
+ %% {default_vhost, <<"/">>},
+ %% {default_user, <<"guest">>},
+ %% {default_pass, <<"guest">>},
+ %% {default_permissions, [<<".*">>, <<".*">>, <<".*">>]},
+
+{mapping, "default_vhost", "rabbit.default_vhost", [
+ {datatype, string}
+]}.
+
+{translation, "rabbit.default_vhost",
+fun(Conf) ->
+ list_to_binary(cuttlefish:conf_get("default_vhost", Conf))
+end}.
+
+{mapping, "default_user", "rabbit.default_user", [
+ {datatype, string}
+]}.
+
+{translation, "rabbit.default_user",
+fun(Conf) ->
+ list_to_binary(cuttlefish:conf_get("default_user", Conf))
+end}.
+
+{mapping, "default_pass", "rabbit.default_pass", [
+ {datatype, string}
+]}.
+
+{translation, "rabbit.default_pass",
+fun(Conf) ->
+ list_to_binary(cuttlefish:conf_get("default_pass", Conf))
+end}.
+
+{mapping, "default_permissions.configure", "rabbit.default_permissions", [
+ {default, ".*"},
+ {datatype, string}
+]}.
+
+{mapping, "default_permissions.read", "rabbit.default_permissions", [
+ {default, ".*"},
+ {datatype, string}
+]}.
+
+{mapping, "default_permissions.write", "rabbit.default_permissions", [
+ {default, ".*"},
+ {datatype, string}
+]}.
+
+{translation, "rabbit.default_permissions",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("default_permissions", Conf),
+ Configure = proplists:get_value(["default_permissions", "configure"], Settings),
+ Read = proplists:get_value(["default_permissions", "read"], Settings),
+ Write = proplists:get_value(["default_permissions", "write"], Settings),
+ [list_to_binary(Configure), list_to_binary(Read), list_to_binary(Write)]
+end}.
+
+ %% Tags for default user
+ %%
+ %% For more details about tags, see the documentation for the
+ %% Management Plugin at http://www.rabbitmq.com/management.html.
+ %%
+ %% {default_user_tags, [administrator]},
+
+{mapping, "default_user_tags.$tag", "rabbit.default_user_tags",
+ [{datatype, {enum, [true, false]}}]}.
+
+{translation, "rabbit.default_user_tags",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("default_user_tags", Conf),
+ [ list_to_atom(Key) || {[_,Key], Val} <- Settings, Val == true ]
+end}.
+
+ %%
+ %% Additional network and protocol related configuration
+ %% =====================================================
+ %%
+
+ %% Set the default AMQP heartbeat delay (in seconds).
+ %%
+ %% {heartbeat, 600},
+
+ %% Set the max permissible size of an AMQP frame (in bytes).
+ %%
+ %% {frame_max, 131072},
+
+ %% Set the max frame size the server will accept before connection
+ %% tuning occurs
+ %%
+ %% {initial_frame_max, 4096},
+
+ %% Set the max permissible number of channels per connection.
+ %% 0 means "no limit".
+ %%
+ %% {channel_max, 128},
+
+{mapping, "heartbeat", "rabbit.heartbeat", [{datatype, integer}]}.
+{mapping, "frame_max", "rabbit.frame_max", [{datatype, bytesize}]}.
+{mapping, "initial_frame_max", "rabbit.initial_frame_max", [{datatype, bytesize}]}.
+{mapping, "channel_max", "rabbit.channel_max", [{datatype, integer}]}.
+
+ %% Customising Socket Options.
+ %%
+ %% See (http://www.erlang.org/doc/man/inet.html#setopts-2) for
+ %% further documentation.
+ %%
+ %% {tcp_listen_options, [{backlog, 128},
+ %% {nodelay, true},
+ %% {exit_on_close, false}]},
+
+{mapping, "tcp_listen_option.backlog", "rabbit.tcp_listen_options.backlog", [
+ {datatype, integer}
+]}.
+
+{mapping, "tcp_listen_option.nodelay", "rabbit.tcp_listen_options.nodelay", [
+ {datatype, {enum, [true, false]}}
+]}.
+
+{mapping, "tcp_listen_option.buffer", "rabbit.tcp_listen_options.buffer",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.delay_send", "rabbit.tcp_listen_options.delay_send",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "tcp_listen_option.dontroute", "rabbit.tcp_listen_options.dontroute",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "tcp_listen_option.exit_on_close", "rabbit.tcp_listen_options.exit_on_close",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "tcp_listen_option.fd", "rabbit.tcp_listen_options.fd",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.high_msgq_watermark", "rabbit.tcp_listen_options.high_msgq_watermark",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.high_watermark", "rabbit.tcp_listen_options.high_watermark",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.keepalive", "rabbit.tcp_listen_options.keepalive",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "tcp_listen_option.low_msgq_watermark", "rabbit.tcp_listen_options.low_msgq_watermark",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.low_watermark", "rabbit.tcp_listen_options.low_watermark",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.port", "rabbit.tcp_listen_options.port",
+ [{datatype, integer}, {validators, ["port"]}]}.
+
+{mapping, "tcp_listen_option.priority", "rabbit.tcp_listen_options.priority",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.recbuf", "rabbit.tcp_listen_options.recbuf",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.send_timeout", "rabbit.tcp_listen_options.send_timeout",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.send_timeout_close", "rabbit.tcp_listen_options.send_timeout_close",
+ [{datatype, {enum, [true, false]}}]}.
+
+{mapping, "tcp_listen_option.sndbuf", "rabbit.tcp_listen_options.sndbuf",
+ [{datatype, integer}]}.
+
+{mapping, "tcp_listen_option.tos", "rabbit.tcp_listen_options.tos",
+ [{datatype, integer}]}.
+
+
+ %%
+ %% Resource Limits & Flow Control
+ %% ==============================
+ %%
+ %% See http://www.rabbitmq.com/memory.html for full details.
+
+ %% Memory-based Flow Control threshold.
+ %%
+ %% {vm_memory_high_watermark, 0.4},
+
+ %% Alternatively, we can set a limit (in bytes) of RAM used by the node.
+ %%
+ %% {vm_memory_high_watermark, {absolute, 1073741824}},
+ %%
+ %% Or you can set absolute value using memory units (with RabbitMQ 3.6.0+).
+ %%
+ %% {vm_memory_high_watermark, {absolute, "1024M"}},
+ %%
+ %% Supported units suffixes:
+ %%
+ %% k, kiB: kibibytes (2^10 bytes)
+ %% M, MiB: mebibytes (2^20)
+ %% G, GiB: gibibytes (2^30)
+ %% kB: kilobytes (10^3)
+ %% MB: megabytes (10^6)
+ %% GB: gigabytes (10^9)
+
+{mapping, "vm_memory_high_watermark.relative", "rabbit.vm_memory_high_watermark", [
+ {default, 0.4},
+ {datatype, float}]}.
+
+{mapping, "vm_memory_high_watermark.absolute", "rabbit.vm_memory_high_watermark", [
+ {datatype, [integer, string]}]}.
+
+
+{translation, "rabbit.vm_memory_high_watermark",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("vm_memory_high_watermark", Conf),
+ Absolute = proplists:get_value(["vm_memory_high_watermark", "absolute"], Settings),
+ Relative = proplists:get_value(["vm_memory_high_watermark", "relative"], Settings),
+ case {Absolute, Relative} of
+ {undefined, undefined} -> cuttlefish:invalid("No vm watermark defined");
+ {_, undefined} -> {absolute, Absolute};
+ _ -> Relative
+ end
+end}.
+
+ %% Fraction of the high watermark limit at which queues start to
+ %% page message out to disc in order to free up memory.
+ %%
+ %% Values greater than 0.9 can be dangerous and should be used carefully.
+ %%
+ %% {vm_memory_high_watermark_paging_ratio, 0.5},
+
+{mapping, "vm_memory_high_watermark_paging_ratio",
+ "rabbit.vm_memory_high_watermark_paging_ratio",
+ [{datatype, float}, {validators, ["less_than_1"]}]}.
+
+ %% Interval (in milliseconds) at which we perform the check of the memory
+ %% levels against the watermarks.
+ %%
+ %% {memory_monitor_interval, 2500},
+
+{mapping, "memory_monitor_interval", "rabbit.memory_monitor_interval",
+ [{datatype, integer}]}.
+
+ %% Set disk free limit (in bytes). Once free disk space reaches this
+ %% lower bound, a disk alarm will be set - see the documentation
+ %% listed above for more details.
+ %%
+ %% {disk_free_limit, 50000000},
+ %%
+ %% Or you can set it using memory units (same as in vm_memory_high_watermark)
+ %% with RabbitMQ 3.6.0+.
+ %% {disk_free_limit, "50MB"},
+ %% {disk_free_limit, "50000kB"},
+ %% {disk_free_limit, "2GB"},
+
+ %% Alternatively, we can set a limit relative to total available RAM.
+ %%
+ %% Values lower than 1.0 can be dangerous and should be used carefully.
+ %% {disk_free_limit, {mem_relative, 2.0}},
+
+{mapping, "disk_free_limit.relative", "rabbit.disk_free_limit", [
+ {default, 0.4},
+ {datatype, float},
+ {validators, ["less_than_1"]}]}.
+
+{mapping, "disk_free_limit.absolute", "rabbit.disk_free_limit", [
+ {datatype, [integer, string]}]}.
+
+
+{translation, "rabbit.disk_free_limit",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("disk_free_limit", Conf),
+ Absolute = proplists:get_value(["disk_free_limit", "absolute"], Settings),
+ Relative = proplists:get_value(["disk_free_limit", "relative"], Settings),
+ case {Absolute, Relative} of
+ {undefined, undefined} -> cuttlefish:invalid("No disk limit defined");
+ {_, undefined} -> Absolute;
+ _ -> {mem_relative, Relative}
+ end
+end}.
+
+ %%
+ %% Clustering
+ %% =====================
+ %%
+
+ %% How to respond to cluster partitions.
+ %% See http://www.rabbitmq.com/partitions.html for further details.
+ %%
+ %% {cluster_partition_handling, ignore},
+
+{mapping, "cluster_partition_handling", "rabbit.cluster_partition_handling",
+ [{datatype, {enum, [ignore, pause_minority, autoheal, pause_if_all_down]}}]}.
+
+{mapping, "cluster_partition_handling.pause_if_all_down.recover",
+ "rabbit.cluster_partition_handling",
+ [{datatype, {enum, [ignore, autoheal]}}]}.
+
+{mapping, "cluster_partition_handling.pause_if_all_down.node.$name",
+ "rabbit.cluster_partition_handling",
+ [{datatype, atom}]}.
+
+{translation, "rabbit.cluster_partition_handling",
+fun(Conf) ->
+ case cuttlefish:get_value("cluster_partition_handling", Conf) of
+ pause_if_all_down ->
+ PauseIfAllDownNodes = cuttlefish_variable:filter_by_prefix(
+ "cluster_partition_handling.pause_if_all_down.node",
+ Conf),
+ case PauseIfAllDownNodes of
+ [] ->
+ cuttlefish:invalid("Nodes required for pause_if_all_down");
+ _ ->
+ Nodes = [ V || {K,V} <- PauseIfAllDownNodes ],
+ PauseIfAllDownRecover = cuttlefish:get_value(
+ "cluster_partition_handling.pause_if_all_down.recover",
+ Conf),
+ case PauseIfAllDownRecover of
+ Recover when Recover == ignore; Recover == autoheal ->
+ {pause_if_all_down, Nodes, Recover};
+ Invalid ->
+ cuttlefish:invalid("Recover strategy required for pause_if_all_down")
+ end
+ end;
+ Other -> Other
+ end
+end}.
+
+ %% Mirror sync batch size, in messages. Increasing this will speed
+ %% up syncing but total batch size in bytes must not exceed 2 GiB.
+ %% Available in RabbitMQ 3.6.0 or later.
+ %%
+ %% {mirroring_sync_batch_size, 4096},
+
+{mapping, "mirroring_sync_batch_size", "rabbit.mirroring_sync_batch_size",
+ [{datatype, bytesize}, {validators, ["size_less_than_2G"]}]}.
+
+ %% Make clustering happen *automatically* at startup - only applied
+ %% to nodes that have just been reset or started for the first time.
+ %% See http://www.rabbitmq.com/clustering.html#auto-config for
+ %% further details.
+ %%
+ %% {cluster_nodes, {['rabbit@my.host.com'], disc}},
+
+{mapping, "cluster_nodes.disk.$node", "rabbit.cluster_nodes",
+ [{datatype, atom}]}.
+
+{mapping, "cluster_nodes.ram.$node", "rabbit.cluster_nodes",
+ [{datatype, atom}]}.
+
+{translation, "rabbit.cluster_nodes",
+fun(Conf) ->
+ DiskNodes = [ V || {_, V} <- cuttlefish_variable:filter_by_prefix("cluster_nodes.disk", Conf)],
+ RamNodes = [ V || {_, V} <- cuttlefish_variable:filter_by_prefix("cluster_nodes.ram", Conf)],
+
+ case {DiskNodes, RamNodes} of
+ {_, []} -> {DiskNodes, disk};
+ {[], _} -> {RamNodes, ram}
+ end
+end}.
+
+
+ %% Interval (in milliseconds) at which we send keepalive messages
+ %% to other cluster members. Note that this is not the same thing
+ %% as net_ticktime; missed keepalive messages will not cause nodes
+ %% to be considered down.
+ %%
+ %% {cluster_keepalive_interval, 10000},
+
+{mapping, "cluster_keepalive_interval", "rabbit.cluster_keepalive_interval",
+ [{datatype, integer}]}.
+
+ %%
+ %% Statistics Collection
+ %% =====================
+ %%
+
+ %% Set (internal) statistics collection granularity.
+ %%
+ %% {collect_statistics, none},
+
+{mapping, "collect_statistics", "rabbit.collect_statistics",
+ [{datatype, {enum, [none, coarse, fine]}}]}.
+
+ %% Statistics collection interval (in milliseconds). Increasing
+ %% this will reduce the load on management database.
+ %%
+ %% {collect_statistics_interval, 5000},
+
+{mapping, "collect_statistics_interval", "rabbit.collect_statistics_interval",
+ [{datatype, integer}]}.
+ %%
+ %% Misc/Advanced Options
+ %% =====================
+ %%
+ %% NB: Change these only if you understand what you are doing!
+ %%
+
+ %% Explicitly enable/disable hipe compilation.
+ %%
+ %% {hipe_compile, true},
+
+{mapping, "hipe_compile", "rabbit.hipe_compile",
+ [{datatype, {enum, [true, false]}}]}.
+
+ %% Timeout used when waiting for Mnesia tables in a cluster to
+ %% become available.
+ %%
+ %% {mnesia_table_loading_timeout, 30000},
+
+{mapping, "mnesia_table_loading_timeout", "rabbit.mnesia_table_loading_timeout",
+ [{datatype, integer}]}.
+
+ %% Size in bytes below which to embed messages in the queue index. See
+ %% http://www.rabbitmq.com/persistence-conf.html
+ %%
+ %% {queue_index_embed_msgs_below, 4096}
+
+{mapping, "queue_index_embed_msgs_below", "rabbit.queue_index_embed_msgs_below",
+ [{datatype, bytesize}]}.
+
+ % ]},
+
+ % %% ----------------------------------------------------------------------------
+ % %% Advanced Erlang Networking/Clustering Options.
+ % %%
+ % %% See http://www.rabbitmq.com/clustering.html for details
+ % %% ----------------------------------------------------------------------------
+ % {kernel,
+ % [%% Sets the net_kernel tick time.
+ % %% Please see http://erlang.org/doc/man/kernel_app.html and
+ % %% http://www.rabbitmq.com/nettick.html for further details.
+ % %%
+ % %% {net_ticktime, 60}
+ % ]},
+ {mapping, "kernel.net_ticktime", "kernel.net_ticktime",
+ [{datatype, integer}]}.
+
+% %% ----------------------------------------------------------------------------
+% %% RabbitMQ AMQP 1.0 Support
+% %%
+% %% See https://github.com/rabbitmq/rabbitmq-amqp1.0/blob/stable/README.md
+% %% for details
+% %% ----------------------------------------------------------------------------
+
+% {rabbitmq_amqp1_0,
+% [%% Connections that are not authenticated with SASL will connect as this
+% %% account. See the README for more information.
+% %%
+% %% Please note that setting this will allow clients to connect without
+% %% authenticating!
+% %%
+% %% {default_user, "guest"},
+{mapping, "amqp1.default_user", "rabbitmq_amqp1_0.default_user",
+ [{datatype, string}]}.
+% %% Enable protocol strict mode. See the README for more information.
+% %%
+% %% {protocol_strict_mode, false}
+% ]},
+{mapping, "amqp1.protocol_strict_mode", "rabbitmq_amqp1_0.protocol_strict_mode",
+ [{datatype, {enum, [true, false]}}]}.
+
+
+
+% %% Lager controls logging.
+% %% See https://github.com/basho/lager for more documentation
+% {lager, [
+% %%
+% %% Log direcrory, taken from the RABBITMQ_LOG_BASE env variable by default.
+% %% {log_root, "/var/log/rabbitmq"},
+% %%
+% %% All log messages go to the default "sink" configured with
+% %% the `handlers` parameter. By default, it has a single
+% %% lager_file_backend handler writing messages to "$nodename.log"
+% %% (ie. the value of $RABBIT_LOGS).
+% %% {handlers, [
+% %% {lager_file_backend, [{file, "rabbit.log"},
+% %% {level, info},
+% %% {date, ""},
+% %% {size, 0}]}
+% %% ]},
+% %%
+% %% Extra sinks are used in RabbitMQ to categorize messages. By
+% %% default, those extra sinks are configured to forward messages
+% %% to the default sink (see above). "rabbit_log_lager_event"
+% %% is the default category where all RabbitMQ messages without
+% %% a category go. Messages in the "channel" category go to the
+% %% "rabbit_channel_lager_event" Lager extra sink, and so on.
+% %% {extra_sinks, [
+% %% {rabbit_log_lager_event, [{handlers, [
+% %% {lager_forwarder_backend,
+% %% [lager_event, info]}]}]},
+% %% {rabbit_channel_lager_event, [{handlers, [
+% %% {lager_forwarder_backend,
+% %% [lager_event, info]}]}]},
+% %% {rabbit_conection_lager_event, [{handlers, [
+% %% {lager_forwarder_backend,
+% %% [lager_event, info]}]}]},
+% %% {rabbit_mirroring_lager_event, [{handlers, [
+% %% {lager_forwarder_backend,
+% %% [lager_event, info]}]}]}
+% %% ]}
+% ]}
+% ].
+
+
+{mapping, "log.dir", "lager.log_root", [{datatype, string}]}.
+{mapping, "log.console", "lager.handlers", [
+ {datatype, {enum, [true, false]}},
+ {default, false},
+ {validators, ["dir_writable"]}
+]}.
+
+{mapping, "log.syslog", "lager.handlers", [
+ {datatype, {enum, [true, false]}},
+ {default, false}
+]}.
+{mapping, "log.file", "lager.handlers", [
+ {datatype, [{enum, [false]}, string]},
+ {default, "rabbitmq.log"}
+]}.
+
+{mapping, "log.file.level", "lager.handlers", [
+ {datatype, {enum, [debug, info, warning, error]}},
+ {default, info}
+]}.
+{mapping, "log.$handler.level", "lager.handlers", [
+ {datatype, {enum, [debug, info, warning, error]}},
+ {default, info}
+]}.
+{mapping, "log.file.rotation.date", "lager.handlers", [
+ {datatype, string},
+ {default, ""}
+]}.
+{mapping, "log.file.rotation.size", "lager.handlers", [
+ {datatype, integer},
+ {default, 0}
+]}.
+{mapping, "log.file.rotation.count", "lager.handlers", [
+ {datatype, integer},
+ {default, 10}
+]}.
+
+{mapping, "log.syslog.identity", "lager.handlers", [
+ {datatype, string}
+]}.
+{mapping, "log.syslog.facility", "lager.handlers", [
+ {datatype, atom}
+]}.
+
+{translation, "lager.handlers",
+fun(Conf) ->
+ ConsoleHandler = case cuttlefish:conf_get("log.console", Conf) of
+ true ->
+ ConsoleLevel = cuttlefish:conf_get("log.console.level", Conf),
+ [{lager_console_backend, ConsoleLevel}];
+ false -> []
+ end,
+ FileHandler = case cuttlefish:conf_get("log.file", Conf) of
+ false -> [];
+ File ->
+ FileLevel = cuttlefish:conf_get("log.file.level", Conf),
+ RotationDate = cuttlefish:conf_get("log.file.rotation.date", Conf),
+ RotationSize = cuttlefish:conf_get("log.file.rotation.size", Conf),
+ RotationCount = cuttlefish:conf_get("log.file.rotation.count", Conf),
+ [{lager_file_backend, [{file, File},
+ {level, FileLevel},
+ {date, RotationDate},
+ {size, RotationSize},
+ {count, RotationCount}]}]
+ end,
+ SyslogHandler = case cuttlefish:conf_get("log.syslog", Conf) of
+ false -> [];
+ true ->
+ SyslogLevel = cuttlefish:conf_get("log.syslog.level", Conf),
+ Identity = cuttlefish:conf_get("log.syslog.identity", Conf),
+ Facility = cuttlefish:conf_get("log.syslog.facility", Conf),
+ [{lager_syslog_backend, [Identity, Facility, SyslogLevel]}]
+ end,
+ ConsoleHandler ++ FileHandler ++ SyslogHandler
+end}.
+
+
+{validator, "size_less_than_2G", "Byte size should be less than 2G and greater than 0",
+fun(Size) when is_integer(Size) ->
+ Size > 0 andalso Size < 2147483648
+end}.
+
+{validator, "less_than_1", "Flooat is not beetween 0 and 1",
+fun(Float) when is_float(Float) ->
+ Float > 0 andalso Float < 1
+end}.
+
+{validator, "port", "Invalid port number",
+fun(Port) when is_integer(Port) ->
+ Port > 0 andalso Port < 65535
+end}.
+
+{validator, "byte", "Integer is not 0<i<255",
+fun(Int) when is_integer(Int) ->
+ Int > 0 andalso Int < 255
+end}.
+
+{validator, "dir_writable", "Cannot create file in dir",
+fun(Dir) ->
+ TestFile = filename:join(Dir, "test_file"),
+ file:delete(TestFile),
+ Res = ok == file:write_file(TestFile, <<"test">>),
+ file:delete(TestFile),
+ Res
+end}.
+
+{validator, "file_accessible", "file doesnt exist",
+fun(File) ->
+ ReadFile = file:read_file_info(File),
+ element(1, ReadFile) == ok
+end}.
diff --git a/schema/rabbitmq.ldap.schema b/schema/rabbitmq.ldap.schema
new file mode 100644
index 0000000000..3de77e7353
--- /dev/null
+++ b/schema/rabbitmq.ldap.schema
@@ -0,0 +1,151 @@
+% %% ----------------------------------------------------------------------------
+% %% RabbitMQ LDAP Plugin
+% %%
+% %% See http://www.rabbitmq.com/ldap.html for details.
+% %%
+% %% ----------------------------------------------------------------------------
+
+% {rabbitmq_auth_backend_ldap,
+% [%%
+% %% Connecting to the LDAP server(s)
+% %% ================================
+% %%
+
+% %% Specify servers to bind to. You *must* set this in order for the plugin
+% %% to work properly.
+% %%
+% %% {servers, ["your-server-name-goes-here"]},
+
+{mapping, "ldap.servers.$server", "rabbitmq_auth_backend_ldap.servers",
+ [{datatype, string}]}.
+
+{translation, "rabbitmq_auth_backend_ldap.servers",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("ldap.servers", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+% %% Connect to the LDAP server using SSL
+% %%
+% %% {use_ssl, false},
+
+{mapping, "ldap.use_ssl", "rabbitmq_auth_backend_ldap.use_ssl",
+ [{datatype, {enum, [true, false]}}]}.
+
+% %% Specify the LDAP port to connect to
+% %%
+% %% {port, 389},
+
+{mapping, "ldap.port", "rabbitmq_auth_backend_ldap.port",
+ [{datatype, integer}]}.
+
+% %% LDAP connection timeout, in milliseconds or 'infinity'
+% %%
+% %% {timeout, infinity},
+
+{mapping, "ldap.timeout", "rabbitmq_auth_backend_ldap.timeout",
+ [{datatype, [integer, {atom, infinity}]}]}.
+
+% %% Enable logging of LDAP queries.
+% %% One of
+% %% - false (no logging is performed)
+% %% - true (verbose logging of the logic used by the plugin)
+% %% - network (as true, but additionally logs LDAP network traffic)
+% %%
+% %% Defaults to false.
+% %%
+% %% {log, false},
+
+{mapping, "ldap.log", "rabbitmq_auth_backend_ldap.log",
+ [{datatype, {enum, [true, false, network]}}]}.
+
+% %%
+% %% Authentication
+% %% ==============
+% %%
+
+% %% Pattern to convert the username given through AMQP to a DN before
+% %% binding
+% %%
+% %% {user_dn_pattern, "cn=${username},ou=People,dc=example,dc=com"},
+
+{mapping, "ldap.user_dn_pattern", "rabbitmq_auth_backend_ldap.user_dn_pattern",
+ [{datatype, string}]}.
+
+% %% Alternatively, you can convert a username to a Distinguished
+% %% Name via an LDAP lookup after binding. See the documentation for
+% %% full details.
+
+% %% When converting a username to a dn via a lookup, set these to
+% %% the name of the attribute that represents the user name, and the
+% %% base DN for the lookup query.
+% %%
+% %% {dn_lookup_attribute, "userPrincipalName"},
+% %% {dn_lookup_base, "DC=gopivotal,DC=com"},
+
+{mapping, "ldap.dn_lookup_attribute", "rabbitmq_auth_backend_ldap.dn_lookup_attribute",
+ [{datatype, string}]}.
+
+{mapping, "ldap.dn_lookup_base", "rabbitmq_auth_backend_ldap.dn_lookup_base",
+ [{datatype, string}]}.
+
+% %% Controls how to bind for authorisation queries and also to
+% %% retrieve the details of users logging in without presenting a
+% %% password (e.g., SASL EXTERNAL).
+% %% One of
+% %% - as_user (to bind as the authenticated user - requires a password)
+% %% - anon (to bind anonymously)
+% %% - {UserDN, Password} (to bind with a specified user name and password)
+% %%
+% %% Defaults to 'as_user'.
+% %%
+% %% {other_bind, as_user},
+
+{mapping, "ldap.other_bind", "rabbitmq_auth_backend_ldap.other_bind",
+ [{datatype, {enum, [as_user, anon]}}]}.
+
+{mapping, "ldap.other_bind.user_dn", "rabbitmq_auth_backend_ldap.other_bind",
+ [{datatype, string}]}.
+
+{mapping, "ldap.other_bind.password", "rabbitmq_auth_backend_ldap.other_bind",
+ [{datatype, string}]}.
+
+{translation, "rabbitmq_auth_backend_ldap.other_bind",
+fun(Conf) ->
+ case cuttlefish:conf_get("ldap.other_bind", Conf) of
+ as_user -> as_user;
+ anon -> anon;
+ _ ->
+ User = cuttlefish:conf_get("ldap.other_bind.user_dn", Conf),
+ Pass = cuttlefish:conf_get("ldap.other_bind.password", Conf),
+ case {User, Pass} of
+ {undefined, _} -> as_user;
+ {_, undefined} -> as_user;
+ _ -> {User, Pass}
+ end
+ end
+end}.
+
+% %%
+% %% Authorisation
+% %% =============
+% %%
+
+% %% The LDAP plugin can perform a variety of queries against your
+% %% LDAP server to determine questions of authorisation. See
+% %% http://www.rabbitmq.com/ldap.html#authorisation for more
+% %% information.
+
+% %% Set the query to use when determining vhost access
+% %%
+% %% {vhost_access_query, {in_group,
+% %% "ou=${vhost}-users,ou=vhosts,dc=example,dc=com"}},
+
+% %% Set the query to use when determining resource (e.g., queue) access
+% %%
+% %% {resource_access_query, {constant, true}},
+
+% %% Set queries to determine which tags a user has
+% %%
+% %% {tag_queries, []}
+% ]},
diff --git a/schema/rabbitmq.management.schema b/schema/rabbitmq.management.schema
new file mode 100644
index 0000000000..4c19e8643c
--- /dev/null
+++ b/schema/rabbitmq.management.schema
@@ -0,0 +1,107 @@
+ % %% ----------------------------------------------------------------------------
+ % %% RabbitMQ Management Plugin
+ % %%
+ % %% See http://www.rabbitmq.com/management.html for details
+ % %% ----------------------------------------------------------------------------
+
+ % {rabbitmq_management,
+ % [%% Pre-Load schema definitions from the following JSON file. See
+ %% http://www.rabbitmq.com/management.html#load-definitions
+ %%
+ %% {load_definitions, "/path/to/schema.json"},
+{mapping, "management.load_definitions", "rabbitmq_management.load_definitions",
+ [{datatype, string},
+ {validators, ["file_accessible"]}]}.
+
+ %% Log all requests to the management HTTP API to a file.
+ %%
+ %% {http_log_dir, "/path/to/access.log"},
+
+{mapping, "management.http_log_dir", "rabbitmq_management.http_log_dir",
+ [{datatype, string},
+ {validators, ["file_accessible"]}]}.
+
+
+ %% Change the port on which the HTTP listener listens,
+ %% specifying an interface for the web server to bind to.
+ %% Also set the listener to use SSL and provide SSL options.
+ %%
+ %% {listener, [{port, 12345},
+ %% {ip, "127.0.0.1"},
+ %% {ssl, true},
+ %% {ssl_opts, [{cacertfile, "/path/to/cacert.pem"},
+ %% {certfile, "/path/to/cert.pem"},
+ %% {keyfile, "/path/to/key.pem"}]}]},
+
+{mapping, "management.listener.ssl_opts.cacertfile", "rabbitmq_management.listener.ssl_opts.cacertfile",
+ [{datatype, string},
+ {validators, ["file_accessible"]}]}.
+
+{mapping, "management.listener.ssl_opts.certfile", "rabbitmq_management.listener.ssl_opts.certfile",
+ [{datatype, string},
+ {validators, ["file_accessible"]}]}.
+
+{mapping, "management.listener.ssl_opts.keyfile", "rabbitmq_management.listener.ssl_opts.keyfile",
+ [{datatype, string},
+ {validators, ["file_accessible"]}]}.
+
+{mapping, "management.listener.ssl_opts.$option", "rabbitmq_management.listener.ssl_opts.$option",
+ [{datatype, atom}]}.
+
+{mapping, "management.listener.port", "rabbitmq_management.listener.port",
+ [{datatype, integer}]}.
+
+{mapping, "management.listener.ip", "rabbitmq_management.listener.ip",
+ [{datatype, string},
+ {validators, ["is_ip"]}]}.
+
+{mapping, "management.listener.ssl", "rabbitmq_management.listener.ssl",
+ [{datatype, {enum, [true, false]}}]}.
+
+ %% One of 'basic', 'detailed' or 'none'. See
+ %% http://www.rabbitmq.com/management.html#fine-stats for more details.
+ %% {rates_mode, basic},
+{mapping, "management.rates_mode", "rabbitmq_management.rates_mode",
+ [{datatype, {enum, [basic, detailed, none]}}]}.
+
+ %% Configure how long aggregated data (such as message rates and queue
+ %% lengths) is retained. Please read the plugin's documentation in
+ %% http://www.rabbitmq.com/management.html#configuration for more
+ %% details.
+ %%
+ %% {sample_retention_policies,
+ %% [{global, [{60, 5}, {3600, 60}, {86400, 1200}]},
+ %% {basic, [{60, 5}, {3600, 60}]},
+ %% {detailed, [{10, 5}]}]}
+% ]},
+
+{mapping, "management.sample_retention_policies.$section.$interval",
+ "rabbitmq_management.sample_retention_policies",
+ [{datatype, integer}]}.
+
+{translation, "rabbitmq_management.sample_retention_policies",
+fun(Conf) ->
+ Global = cuttlefish_variable:filter_by_prefix("management.sample_retention_policies.global", Conf),
+ Basic = cuttlefish_variable:filter_by_prefix("management.sample_retention_policies.basic", Conf),
+ Detailed = cuttlefish_variable:filter_by_prefix("management.sample_retention_policies.detailed", Conf),
+ TranslatePolicy = fun(Section) ->
+ [ {list_to_integer(Key), Val} || {[_,_,_,Key], Val} <- Section ]
+ end,
+ [{global, TranslatePolicy(Global)},
+ {basic, TranslatePolicy(Basic)},
+ {detailed, TranslatePolicy(Detailed)}]
+end}.
+
+
+
+{validator, "file_accessible", "file exists",
+fun(File) ->
+ ReadFile = file:read_file_info(File),
+ element(1, ReadFile) == ok
+end}.
+
+{validator, "is_ip", "String is ip",
+fun(IpStr) ->
+ Res = inet:parse_address(IpStr),
+ element(1, Res) == ok
+end}. \ No newline at end of file
diff --git a/schema/rabbitmq.mqtt.schema b/schema/rabbitmq.mqtt.schema
new file mode 100644
index 0000000000..5cc972fc5c
--- /dev/null
+++ b/schema/rabbitmq.mqtt.schema
@@ -0,0 +1,142 @@
+% %% ----------------------------------------------------------------------------
+% %% RabbitMQ MQTT Adapter
+% %%
+% %% See https://github.com/rabbitmq/rabbitmq-mqtt/blob/stable/README.md
+% %% for details
+% %% ----------------------------------------------------------------------------
+
+% {rabbitmq_mqtt,
+% [%% Set the default user name and password. Will be used as the default login
+% %% if a connecting client provides no other login details.
+% %%
+% %% Please note that setting this will allow clients to connect without
+% %% authenticating!
+% %%
+% %% {default_user, <<"guest">>},
+% %% {default_pass, <<"guest">>},
+
+{mapping, "mqtt.default_user", "rabbitmq_mqtt.default_user", [
+ {datatype, string}
+]}.
+
+{mapping, "mqtt.default_pass", "rabbitmq_mqtt.default_pass", [
+ {datatype, string}
+]}.
+
+{translation, "rabbitmq_mqtt.default_user",
+fun(Conf) ->
+ list_to_binary(cuttlefish:conf_get("mqtt.default_user", Conf))
+end}.
+
+{translation, "rabbitmq_mqtt.default_pass",
+fun(Conf) ->
+ list_to_binary(cuttlefish:conf_get("mqtt.default_pass", Conf))
+end}.
+
+% %% Enable anonymous access. If this is set to false, clients MUST provide
+% %% login information in order to connect. See the default_user/default_pass
+% %% configuration elements for managing logins without authentication.
+% %%
+% %% {allow_anonymous, true},
+
+{mapping, "mqtt.allow_anonymous", "rabbitmq_mqtt.allow_anonymous",
+ [{datatype, {enum, [true, false]}}]}.
+
+% %% If you have multiple chosts, specify the one to which the
+% %% adapter connects.
+% %%
+% %% {vhost, <<"/">>},
+
+{mapping, "mqtt.vhost", "rabbitmq_mqtt.vhost", [{datatype, string}]}.
+
+{translation, "rabbitmq_mqtt.vhost",
+fun(Conf) ->
+ list_to_binary(cuttlefish:conf_get("mqtt.vhost", Conf))
+end}.
+
+% %% Specify the exchange to which messages from MQTT clients are published.
+% %%
+% %% {exchange, <<"amq.topic">>},
+
+{mapping, "mqtt.exchange", "rabbitmq_mqtt.exchange", [{datatype, string}]}.
+
+{translation, "rabbitmq_mqtt.exchange",
+fun(Conf) ->
+ list_to_binary(cuttlefish:conf_get("mqtt.exchange", Conf))
+end}.
+
+% %% Specify TTL (time to live) to control the lifetime of non-clean sessions.
+% %%
+% %% {subscription_ttl, 1800000},
+{mapping, "mqtt.subscription_ttl", "rabbitmq_mqtt.subscription_ttl",
+ [{datatype, integer}]}.
+
+% %% Set the prefetch count (governing the maximum number of unacknowledged
+% %% messages that will be delivered).
+% %%
+% %% {prefetch, 10},
+{mapping, "mqtt.prefetch", "rabbitmq_mqtt.prefetch",
+ [{datatype, integer}]}.
+
+% %% TCP/SSL Configuration (as per the broker configuration).
+% %%
+% %% {tcp_listeners, [1883]},
+% %% {ssl_listeners, []},
+
+{mapping, "mqtt.listener.tcp.$name", "rabbitmq_mqtt.tcp_listeners",[
+ {default, 1883},
+ {datatype, [integer, ip]},
+ {include_default, "all"}
+]}.
+
+{translation, "rabbitmq_mqtt.tcp_listeners",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("mqtt.listener.tcp", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+{mapping, "mqtt.listener.ssl.$name", "rabbitmq_mqtt.ssl_listeners",[
+ {default, 1884},
+ {datatype, [integer, ip]},
+ {include_default, "all"}
+]}.
+
+{translation, "rabbitmq_mqtt.ssl_listeners",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("mqtt.listener.ssl", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+% %% Number of Erlang processes that will accept connections for the TCP
+% %% and SSL listeners.
+% %%
+% %% {num_tcp_acceptors, 10},
+% %% {num_ssl_acceptors, 1},
+
+{mapping, "mqtt.num_acceptors.ssl", "rabbitmq_mqtt.num_ssl_acceptors", [
+ {default, 1},
+ {datatype, integer}
+]}.
+
+{mapping, "mqtt.num_acceptors.tcp", "rabbitmq_mqtt.num_tcp_acceptors", [
+ {default, 10},
+ {datatype, integer}
+]}.
+
+
+% %% TCP/Socket options (as per the broker configuration).
+% %%
+% %% {tcp_listen_options, [{backlog, 128},
+% %% {nodelay, true}]}
+% ]},
+
+{mapping, "mqtt.tcp_listen_option.$option", "rabbitmq_mqtt.tcp_listen_options", [
+ {datatype, [integer, {enum, [true, false]}]}
+]}.
+
+{translation, "rabbitmq_mqtt.tcp_listen_options",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("mqtt.tcp_listen_option", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
diff --git a/schema/rabbitmq.stomp.schema b/schema/rabbitmq.stomp.schema
new file mode 100644
index 0000000000..5b40a9661a
--- /dev/null
+++ b/schema/rabbitmq.stomp.schema
@@ -0,0 +1,90 @@
+% %% ----------------------------------------------------------------------------
+% %% RabbitMQ Stomp Adapter
+% %%
+% %% See http://www.rabbitmq.com/stomp.html for details
+% %% ----------------------------------------------------------------------------
+
+% {rabbitmq_stomp,
+% [%% Network Configuration - the format is generally the same as for the broker
+
+% %% Listen only on localhost (ipv4 & ipv6) on a specific port.
+% %% {tcp_listeners, [{"127.0.0.1", 61613},
+% %% {"::1", 61613}]},
+
+{mapping, "stomp.listener.tcp.$name", "rabbitmq_stomp.tcp_listeners",[
+ {default, 61613},
+ {datatype, [integer, ip]},
+ {include_default, "all"}
+]}.
+
+{translation, "rabbitmq_stomp.tcp_listeners",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("stomp.listener.tcp", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+{mapping, "stomp.listener.ssl.$name", "rabbitmq_stomp.ssl_listeners",[
+ {default, 61614},
+ {datatype, [integer, ip]},
+ {include_default, "all"}
+]}.
+
+{translation, "rabbitmq_stomp.ssl_listeners",
+fun(Conf) ->
+ Settings = cuttlefish_variable:filter_by_prefix("stomp.listener.ssl", Conf),
+ [ V || {_, V} <- Settings ]
+end}.
+
+% %% Number of Erlang processes that will accept connections for the TCP
+% %% and SSL listeners.
+% %%
+% %% {num_tcp_acceptors, 10},
+% %% {num_ssl_acceptors, 1},
+
+{mapping, "stomp.num_acceptors.ssl", "rabbitmq_stomp.num_ssl_acceptors", [
+ {default, 1},
+ {datatype, integer}
+]}.
+
+{mapping, "stomp.num_acceptors.tcp", "rabbitmq_stomp.num_tcp_acceptors", [
+ {default, 10},
+ {datatype, integer}
+]}.
+
+% %% Additional SSL options
+
+% %% Extract a name from the client's certificate when using SSL.
+% %%
+% %% {ssl_cert_login, true},
+
+{mapping, "stomp.ssl_cert_login", "rabbitmq_stomp.ssl_cert_login",
+ [{datatype, {enum, [true, false]}}]}.
+
+% %% Set a default user name and password. This is used as the default login
+% %% whenever a CONNECT frame omits the login and passcode headers.
+% %%
+% %% Please note that setting this will allow clients to connect without
+% %% authenticating!
+% %%
+% %% {default_user, [{login, "guest"},
+% %% {passcode, "guest"}]},
+
+{mapping, "stomp.default_user", "rabbitmq_stomp.default_user.login", [
+ {datatype, string}
+]}.
+
+{mapping, "stomp.default_pass", "rabbitmq_stomp.default_user.passcode", [
+ {datatype, string}
+]}.
+
+% %% If a default user is configured, or you have configured use SSL client
+% %% certificate based authentication, you can choose to allow clients to
+% %% omit the CONNECT frame entirely. If set to true, the client is
+% %% automatically connected as the default user or user supplied in the
+% %% SSL certificate whenever the first frame sent on a session is not a
+% %% CONNECT frame.
+% %%
+% %% {implicit_connect, true}
+% ]},
+{mapping, "stomp.implicit_connect", "rabbitmq_stomp.implicit_connect",
+ [{datatype, {enum, [true, false]}}]}.