diff --git a/.github/workflows/run_conf_tests.yaml b/.github/workflows/run_conf_tests.yaml new file mode 100644 index 000000000..9b3201772 --- /dev/null +++ b/.github/workflows/run_conf_tests.yaml @@ -0,0 +1,44 @@ +name: Run Configuration tests + +concurrency: + group: test-${{ github.event_name }}-${{ github.ref }} + cancel-in-progress: true + +on: + push: + branches: + - master + - 'ci/**' + tags: + - v* + - e* + pull_request: + +env: + IS_CI: "yes" + +jobs: + run_conf_tests: + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + profile: + - emqx + - emqx-enterprise + container: "ghcr.io/emqx/emqx-builder/5.0-34:1.13.4-25.1.2-3-ubuntu22.04" + steps: + - uses: AutoModality/action-clean@v1 + - uses: actions/checkout@v3 + with: + path: source + - name: build_package + working-directory: source + run: | + make ${{ matrix.profile }} + - name: run_tests + working-directory: source + env: + PROFILE: ${{ matrix.profile }} + run: | + ./scripts/conf-test/run.sh diff --git a/scripts/conf-test/old-confs/ce-v5.0.24.conf b/scripts/conf-test/old-confs/ce-v5.0.24.conf new file mode 100644 index 000000000..80ce00245 --- /dev/null +++ b/scripts/conf-test/old-confs/ce-v5.0.24.conf @@ -0,0 +1,295 @@ +node { + name = "emqx@127.0.0.1" + cookie = "emqxsecretcookie" + data_dir = "data" +} + +log { + file_handlers.default { + level = warning + file = "log/emqx.log" + } +} + +cluster { + name = emqxcl + discovery_strategy = manual +} + +authentication = [ + { + backend = "built_in_database" + mechanism = "password_based" + password_hash_algorithm {name = "sha256", salt_position = "suffix"} + user_id_type = "username" + } +] +authorization { + cache {enable = true} + deny_action = "ignore" + no_match = "allow" + sources = [ + { + body {username = "${username}"} + connect_timeout = "15s" + enable_pipelining = 100 + headers {"content-type" = "application/json"} + method = "post" + pool_size = 8 + request_timeout = "30s" + ssl {enable = false, verify = "verify_peer"} + type = "http" + url = "http://127.0.0.1:8080" + }, + { + enable = true + path = "etc/acl.conf" + type = "file" + } + ] +} +bridges { + webhook { + test { + connect_timeout = "15s" + enable_pipelining = 100 + headers {"content-type" = "application/json"} + method = "post" + pool_size = 8 + pool_type = "random" + request_timeout = "15s" + resource_opts { + async_inflight_window = 100 + auto_restart_interval = "60s" + health_check_interval = "15s" + max_queue_bytes = "1GB" + query_mode = "async" + request_timeout = "15s" + worker_pool_size = 4 + } + ssl {enable = false, verify = "verify_peer"} + url = "http://127.0.0.1:8080/webhook" + } + } +} +exhook { + servers = [ + { + auto_reconnect = "60s" + enable = false + failed_action = "deny" + name = "test" + pool_size = 16 + request_timeout = "5s" + ssl {enable = false, verify = "verify_peer"} + url = "http://127.0.0.1:8080" + } + ] +} +gateway { + coap { + connection_required = false + enable_stats = true + listeners { + udp { + default { + bind = "5683" + max_conn_rate = 1000 + max_connections = 1024000 + } + } + } + mountpoint = "" + notify_type = "qos" + publish_qos = "coap" + subscribe_qos = "coap" + } +} +listeners { + ssl { + default { + bind = "0.0.0.0:8883" + max_connections = 512000 + ssl_options { + cacertfile = "etc/certs/cacert.pem" + certfile = "etc/certs/cert.pem" + keyfile = "etc/certs/key.pem" + } + } + } + tcp { + default { + acceptors = 16 + bind = "0.0.0.0:1883" + enable_authn = true + enabled = true + limiter { + bytes {rate = "infinity"} + client { + bytes {rate = "infinity"} + messages {rate = "infinity"} + } + messages {rate = "infinity"} + } + max_connections = 5000 + proxy_protocol = false + proxy_protocol_timeout = "3s" + tcp_options { + active_n = 100 + backlog = 1024 + buffer = "4KB" + high_watermark = "1MB" + nodelay = true + reuseaddr = true + send_timeout = "15s" + send_timeout_close = true + } + zone = "default" + } + } + ws { + default { + bind = "0.0.0.0:8083" + max_connections = 1024000 + websocket {mqtt_path = "/mqtt"} + } + } + wss { + default { + bind = "0.0.0.0:8084" + max_connections = 512000 + ssl_options { + cacertfile = "etc/certs/cacert.pem" + certfile = "etc/certs/cert.pem" + keyfile = "etc/certs/key.pem" + } + websocket {mqtt_path = "/mqtt"} + } + } +} +log { + console_handler { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = true + flush_qlen = 8000 + formatter = "text" + level = "warning" + max_depth = 100 + overload_kill { + enable = true + mem_size = "30MB" + qlen = "10000" + restart_after = "5s" + } + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + file_handlers { + default { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = false + file = "log/emqx.log" + flush_qlen = 8000 + formatter = "text" + level = "info" + max_depth = 100 + max_size = "50MB" + overload_kill { + enable = true + mem_size = "30MB" + qlen = 20000 + restart_after = "5s" + } + rotation {count = 10, enable = true} + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + } +} +mqtt { + await_rel_timeout = "300s" + exclusive_subscription = false + idle_timeout = "15s" + ignore_loop_deliver = false + keepalive_backoff = 0.75 + max_awaiting_rel = 100 + max_clientid_len = 65535 + max_inflight = 32 + max_mqueue_len = 1000 + max_packet_size = "10MB" + max_qos_allowed = 2 + max_subscriptions = "infinity" + max_topic_alias = 65535 + max_topic_levels = 128 + mqueue_default_priority = "lowest" + mqueue_priorities = "disabled" + "mqueue_store_qos0" = true + peer_cert_as_clientid = "disabled" + peer_cert_as_username = "disabled" + response_information = "" + retain_available = true + retry_interval = "30s" + server_keepalive = "disabled" + session_expiry_interval = "12h" + shared_subscription = true + strict_mode = false + upgrade_qos = false + use_username_as_clientid = false + wildcard_subscription = true +} +retainer { + backend { + index_specs = [ + [1, 2, 3], + [1, 3], + [2, 3], + [3] + ] + max_retained_messages = 0 + storage_type = "ram" + type = "built_in_database" + } + enable = true + max_payload_size = "10MB" + msg_clear_interval = "0s" + msg_expiry_interval = "0s" + stop_publish_clear_msg = false +} +rule_engine { + ignore_sys_message = true + jq_function_default_timeout = "10s" + rules { + "rule_s56b" { + actions = ["webhook:test"] + description = "" + metadata {created_at = 1683882654432} + sql = "SELECT\n *\nFROM\n \"t/#\"" + } + } +} +sys_topics { + sys_event_messages { + client_connected = true + client_disconnected = true + client_subscribed = true + client_unsubscribed = true + } + sys_heartbeat_interval = "30s" + sys_msg_interval = "1m" +} diff --git a/scripts/conf-test/old-confs/ee-v5.0.0.conf b/scripts/conf-test/old-confs/ee-v5.0.0.conf new file mode 100644 index 000000000..023c0a6ca --- /dev/null +++ b/scripts/conf-test/old-confs/ee-v5.0.0.conf @@ -0,0 +1,374 @@ +node { + name = "emqx@127.0.0.1" + cookie = "emqxsecretcookie" + data_dir = "data" +} + +log { + file_handlers.default { + level = warning + file = "log/emqx.log" + } +} + +cluster { + name = emqxcl + discovery_strategy = manual +} + + +listeners.tcp.default { + bind = "0.0.0.0:1883" + max_connections = 1024000 +} + +listeners.ssl.default { + bind = "0.0.0.0:8883" + max_connections = 512000 + ssl_options { + keyfile = "etc/certs/key.pem" + certfile = "etc/certs/cert.pem" + cacertfile = "etc/certs/cacert.pem" + } +} + +listeners.ws.default { + bind = "0.0.0.0:8083" + max_connections = 1024000 + websocket.mqtt_path = "/mqtt" +} + +listeners.wss.default { + bind = "0.0.0.0:8084" + max_connections = 512000 + websocket.mqtt_path = "/mqtt" + ssl_options { + keyfile = "etc/certs/key.pem" + certfile = "etc/certs/cert.pem" + cacertfile = "etc/certs/cacert.pem" + } +} + +dashboard { + listeners.http { + bind = 18083 + } + default_username = "admin" + default_password = "public" +} + +authentication = [ + { + backend = "built_in_database" + mechanism = "password_based" + password_hash_algorithm {name = "sha256", salt_position = "suffix"} + user_id_type = "username" + } +] +authorization { + cache {enable = true} + deny_action = "ignore" + no_match = "allow" + sources = [ + { + body {username = "${username}"} + connect_timeout = "5s" + enable_pipelining = 100 + headers {"content-type" = "application/json"} + method = "post" + pool_size = 8 + request_timeout = "5s" + ssl {enable = false, verify = "verify_peer"} + type = "http" + url = "http://127.0.0.1:8080" + }, + { + enable = true + path = "etc/acl.conf" + type = "file" + } + ] +} +bridges { + webhook { + default { + connect_timeout = "5s" + enable_pipelining = 100 + headers {"content-type" = "application/json"} + method = "post" + pool_size = 4 + pool_type = "random" + request_timeout = "5s" + resource_opts { + async_inflight_window = 100 + auto_restart_interval = "60s" + health_check_interval = "15s" + max_queue_bytes = "1GB" + query_mode = "async" + request_timeout = "15s" + worker_pool_size = 4 + } + ssl {enable = false, verify = "verify_peer"} + url = "http://127.0.0.1:8080/webhook" + } + } +} +conn_congestion {enable_alarm = true, min_alarm_sustain_duration = "1m"} +exhook { + servers = [ + { + auto_reconnect = "60s" + enable = false + failed_action = "deny" + name = "exhook" + pool_size = 16 + request_timeout = "5s" + ssl {enable = false, verify = "verify_peer"} + url = "http://127.0.0.1:8000" + } + ] +} +flapping_detect { + ban_time = "5m" + enable = false + max_count = 15 + window_time = "1m" +} +force_gc { + bytes = "16MB" + count = 16000 + enable = true +} +force_shutdown { + enable = true + max_heap_size = "32MB" + max_message_queue_len = 1000 +} +gateway { + stomp { + enable_stats = true + frame { + max_body_length = 8192 + max_headers = 10 + max_headers_length = 1024 + } + idle_timeout = "30s" + listeners { + tcp { + default { + bind = "61613" + max_conn_rate = 1000 + max_connections = 1024000 + } + } + } + mountpoint = "" + } +} +limiter { + bytes_in {burst = "1000", rate = "infinity"} + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "1000KB/s" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "1000" + } + internal { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "1000" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + } + connection {burst = 0, rate = "infinity"} + internal {burst = 0, rate = "infinity"} + message_in {burst = 0, rate = "infinity"} + message_routing {burst = 0, rate = "1000"} +} +log { + console_handler { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = true + flush_qlen = 8000 + formatter = "text" + level = "info" + max_depth = 100 + overload_kill { + enable = true + mem_size = "30MB" + qlen = 20000 + restart_after = "5s" + } + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + file_handlers { + default { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = false + file = "log/emqx.log" + flush_qlen = 8000 + formatter = "text" + level = "warning" + max_depth = 100 + max_size = "50MB" + overload_kill { + enable = true + mem_size = "30MB" + qlen = 20000 + restart_after = "5s" + } + rotation {count = 10, enable = true} + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + } +} +mqtt { + await_rel_timeout = "300s" + exclusive_subscription = false + idle_timeout = "15s" + ignore_loop_deliver = false + keepalive_backoff = 0.5 + max_awaiting_rel = 100 + max_clientid_len = 65535 + max_inflight = 32 + max_mqueue_len = 1000 + max_packet_size = "1MB" + max_qos_allowed = 2 + max_subscriptions = "infinity" + max_topic_alias = 65535 + max_topic_levels = 128 + mqueue_default_priority = "lowest" + mqueue_priorities = "disabled" + "mqueue_store_qos0" = true + peer_cert_as_clientid = "disabled" + peer_cert_as_username = "disabled" + response_information = "" + retain_available = true + retry_interval = "30s" + server_keepalive = "disabled" + session_expiry_interval = "2h" + shared_subscription = true + strict_mode = false + upgrade_qos = false + use_username_as_clientid = false + wildcard_subscription = true +} +overload_protection { + backoff_delay = 1 + backoff_gc = false + backoff_hibernation = true + backoff_new_conn = true + enable = false +} +retainer { + backend { + index_specs = [ + [1, 2, 3], + [1, 3], + [2, 3], + [3] + ] + max_retained_messages = 0 + storage_type = "ram" + type = "built_in_database" + } + enable = true + flow_control { + batch_deliver_limiter { + capacity = "infinity" + client { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + initial = "0" + rate = "infinity" + } + batch_deliver_number = 0 + batch_read_number = 0 + } + max_payload_size = "10MB" + msg_clear_interval = "0s" + msg_expiry_interval = "0s" + stop_publish_clear_msg = false +} +rule_engine { + ignore_sys_message = true + jq_function_default_timeout = "10s" + jq_implementation_module = "jq_nif" + rules { + "rule_k9y8" { + actions = ["webhook:default"] + description = "" + metadata {created_at = 1683875156258} + sql = "SELECT\n *\nFROM\n \"t/#\"" + } + } +} +stats {enable = true} +sys_topics { + sys_event_messages { + client_connected = true + client_disconnected = false + client_subscribed = false + client_unsubscribed = false + } + sys_heartbeat_interval = "30s" + sys_msg_interval = "1m" +} diff --git a/scripts/conf-test/old-confs/ee-v5.0.1.conf b/scripts/conf-test/old-confs/ee-v5.0.1.conf new file mode 100644 index 000000000..e60662b95 --- /dev/null +++ b/scripts/conf-test/old-confs/ee-v5.0.1.conf @@ -0,0 +1,375 @@ +node { + name = "emqx@127.0.0.1" + cookie = "emqxsecretcookie" + data_dir = "data" +} + +log { + file_handlers.default { + level = warning + file = "log/emqx.log" + } +} + +cluster { + name = emqxcl + discovery_strategy = manual +} + +dashboard { + listeners.http { + bind = 18083 + } + default_username = "admin" + default_password = "public" +} + + +authentication = [ + { + backend = "built_in_database" + mechanism = "password_based" + password_hash_algorithm {name = "sha256", salt_position = "suffix"} + user_id_type = "username" + } +] +authorization { + cache {enable = true} + deny_action = "ignore" + no_match = "allow" + sources = [ + { + body {username = "${username}"} + connect_timeout = "5s" + enable_pipelining = 100 + headers {"content-type" = "application/json"} + method = "post" + pool_size = 8 + request_timeout = "5s" + ssl {enable = false, verify = "verify_peer"} + type = "http" + url = "http://127.0.0.1:8080" + }, + { + enable = true + path = "etc/acl.conf" + type = "file" + } + ] +} +bridges { + webhook { + test { + connect_timeout = "5s" + enable_pipelining = 100 + headers {"content-type" = "application/json"} + method = "post" + pool_size = 4 + pool_type = "random" + request_timeout = "15s" + resource_opts { + async_inflight_window = 100 + auto_restart_interval = "60s" + health_check_interval = "15s" + max_queue_bytes = "1GB" + query_mode = "async" + request_timeout = "15s" + worker_pool_size = 4 + } + ssl {enable = false, verify = "verify_peer"} + url = "http://127.0.0.1:8080" + } + } +} +gateway { + mqttsn { + broadcast = true + "enable_qos3" = true + enable_stats = true + gateway_id = 1 + idle_timeout = "30s" + listeners { + udp { + default { + bind = "1884" + max_conn_rate = 1000 + max_connections = 1024000 + } + } + } + mountpoint = "" + predefined = [] + } +} +limiter { + bytes_in {burst = "0", rate = "10MB"} + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "100KB" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + internal { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + } + connection {burst = "0", rate = "1000"} + internal {burst = "0", rate = "infinity"} + message_in {burst = "0", rate = "1000"} + message_routing {burst = "0", rate = "infinity"} +} +listeners { + ssl { + default { + bind = "0.0.0.0:8883" + max_connections = 512000 + ssl_options { + cacertfile = "etc/certs/cacert.pem" + certfile = "etc/certs/cert.pem" + keyfile = "etc/certs/key.pem" + } + } + } + tcp { + default { + acceptors = 16 + bind = "0.0.0.0:1883" + enable_authn = true + enabled = true + limiter { + bytes_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + } + connection { + capacity = 1000 + initial = "0" + rate = "1000/s" + } + message_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + message_routing { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + } + max_connections = 2000 + proxy_protocol = false + proxy_protocol_timeout = "3s" + tcp_options { + active_n = 100 + backlog = 1024 + buffer = "4KB" + high_watermark = "1MB" + nodelay = true + reuseaddr = true + send_timeout = "15s" + send_timeout_close = true + } + zone = "default" + } + } + ws { + default { + bind = "0.0.0.0:8083" + max_connections = 1024000 + websocket {mqtt_path = "/mqtt"} + } + } + wss { + default { + bind = "0.0.0.0:8084" + max_connections = 512000 + ssl_options { + cacertfile = "etc/certs/cacert.pem" + certfile = "etc/certs/cert.pem" + keyfile = "etc/certs/key.pem" + } + websocket {mqtt_path = "/mqtt"} + } + } +} +log { + console_handler { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = true + flush_qlen = 8000 + formatter = "text" + level = "info" + max_depth = 100 + overload_kill { + enable = true + mem_size = "30MB" + qlen = 20000 + restart_after = "5s" + } + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + file_handlers { + default { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = false + file = "log/emqx.log" + flush_qlen = 8000 + formatter = "text" + level = "warning" + max_depth = 100 + max_size = "50MB" + overload_kill { + enable = true + mem_size = "30MB" + qlen = 20000 + restart_after = "5s" + } + rotation {count = 10, enable = true} + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + } +} +retainer { + backend { + index_specs = [ + [1, 2, 3], + [1, 3], + [2, 3], + [3] + ] + max_retained_messages = 0 + storage_type = "ram" + type = "built_in_database" + } + enable = true + flow_control { + batch_deliver_limiter { + capacity = "infinity" + client { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + initial = "0" + rate = "infinity" + } + batch_deliver_number = 0 + batch_read_number = 0 + } + max_payload_size = "5MB" + msg_clear_interval = "0s" + msg_expiry_interval = "0s" + stop_publish_clear_msg = false +} +rule_engine { + ignore_sys_message = true + jq_function_default_timeout = "10s" + jq_implementation_module = jq_nif + rules { + "rule_bw1q" { + actions = ["webhook:test"] + description = "" + metadata {created_at = 1683878250142} + sql = "SELECT\n *\nFROM\n \"t/#\"" + } + } +} diff --git a/scripts/conf-test/old-confs/ee-v5.0.2.conf b/scripts/conf-test/old-confs/ee-v5.0.2.conf new file mode 100644 index 000000000..f5f3b1394 --- /dev/null +++ b/scripts/conf-test/old-confs/ee-v5.0.2.conf @@ -0,0 +1,454 @@ +node { + name = "emqx@127.0.0.1" + cookie = "emqxsecretcookie" + data_dir = "data" +} + +log { + file_handlers.default { + level = warning + file = "log/emqx.log" + } +} + +cluster { + name = emqxcl + discovery_strategy = manual +} + +dashboard { + listeners.http { + bind = 18083 + } + default_username = "admin" + default_password = "public" +} + +authentication = [ + { + backend = "built_in_database" + mechanism = "password_based" + password_hash_algorithm {name = "sha256", salt_position = "suffix"} + user_id_type = "username" + } +] +authorization { + cache {enable = true} + deny_action = "ignore" + no_match = "allow" + sources = [ + { + body {username = "${username}"} + connect_timeout = "15s" + enable_pipelining = 100 + headers {"content-type" = "application/json"} + method = "post" + pool_size = 8 + request_timeout = "30s" + ssl {enable = false, verify = "verify_peer"} + type = "http" + url = "http://127.0.0.1:8080" + }, + { + enable = true + path = "etc/acl.conf" + type = "file" + } + ] +} +bridges { + webhook { + tests { + connect_timeout = "15s" + enable_pipelining = 100 + headers {"content-type" = "application/json"} + method = "post" + pool_size = 8 + pool_type = "random" + request_timeout = "15s" + resource_opts { + async_inflight_window = 100 + auto_restart_interval = "60s" + health_check_interval = "15s" + max_queue_bytes = "1GB" + query_mode = "async" + request_timeout = "15s" + worker_pool_size = 4 + } + ssl {enable = false, verify = "verify_peer"} + url = "http://127.0.0.1:8080" + } + } +} +conn_congestion {enable_alarm = true, min_alarm_sustain_duration = "1m"} +exhook { + servers = [ + { + auto_reconnect = "60s" + enable = false + failed_action = "deny" + name = "test" + pool_size = 16 + request_timeout = "5s" + ssl {enable = false, verify = "verify_peer"} + url = "http://127.0.0.1:8080" + } + ] +} +flapping_detect { + ban_time = "5m" + enable = false + max_count = 15 + window_time = "1m" +} +force_gc { + bytes = "16MB" + count = 16000 + enable = true +} +force_shutdown { + enable = true + max_heap_size = "32MB" + max_message_queue_len = 1000 +} +gateway { + coap { + connection_required = false + enable_stats = true + listeners { + udp { + default { + bind = "5683" + max_conn_rate = 1000 + max_connections = 1024000 + } + } + } + mountpoint = "" + notify_type = "qos" + publish_qos = "coap" + subscribe_qos = "coap" + } +} +limiter { + bytes_in {burst = "0", rate = "infinity"} + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + internal { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "500" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "200" + low_watermark = "60" + max_retry_time = "10s" + rate = "100" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + } + connection {burst = "0", rate = "infinity"} + internal {burst = "0", rate = "1000"} + message_in {burst = "0", rate = "10000"} + message_routing {burst = "0", rate = "infinity"} +} +listeners { + ssl { + default { + bind = "0.0.0.0:8883" + max_connections = 512000 + ssl_options { + cacertfile = "etc/certs/cacert.pem" + certfile = "etc/certs/cert.pem" + keyfile = "etc/certs/key.pem" + } + } + } + tcp { + default { + acceptors = 16 + bind = "0.0.0.0:1883" + enable_authn = true + enabled = true + limiter { + bytes_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + } + connection { + capacity = "1000" + initial = "0" + rate = "1000/s" + } + message_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + message_routing { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + } + max_connections = 1024000 + mountpoint = "topic_prefix1/x" + proxy_protocol = false + proxy_protocol_timeout = "3s" + tcp_options { + active_n = 100 + backlog = 1024 + buffer = "4KB" + high_watermark = "1MB" + nodelay = true + reuseaddr = true + send_timeout = "15s" + send_timeout_close = true + } + zone = "default" + } + } + ws { + default { + bind = "0.0.0.0:8083" + max_connections = 1024000 + websocket {mqtt_path = "/mqtt"} + } + } + wss { + default { + bind = "0.0.0.0:8084" + max_connections = 512000 + ssl_options { + cacertfile = "etc/certs/cacert.pem" + certfile = "etc/certs/cert.pem" + keyfile = "etc/certs/key.pem" + } + websocket {mqtt_path = "/mqtt"} + } + } +} +log { + console_handler { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = true + flush_qlen = 8000 + formatter = "text" + level = "info" + max_depth = 100 + overload_kill { + enable = true + mem_size = "30MB" + qlen = "10000" + restart_after = "5s" + } + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + file_handlers { + default { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = true + file = "log/emqx.log" + flush_qlen = 8000 + formatter = "text" + level = "warning" + max_depth = 100 + max_size = "1000MB" + overload_kill { + enable = true + mem_size = "30MB" + qlen = 20000 + restart_after = "5s" + } + rotation {count = 10, enable = true} + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + } +} +mqtt { + await_rel_timeout = "300s" + exclusive_subscription = false + idle_timeout = "15s" + ignore_loop_deliver = false + keepalive_backoff = 0.75 + max_awaiting_rel = 100 + max_clientid_len = 65535 + max_inflight = 8 + max_mqueue_len = 1000 + max_packet_size = "1MB" + max_qos_allowed = 2 + max_subscriptions = "infinity" + max_topic_alias = 1024 + max_topic_levels = 128 + mqueue_default_priority = "lowest" + mqueue_priorities = "disabled" + "mqueue_store_qos0" = true + peer_cert_as_clientid = "disabled" + peer_cert_as_username = "disabled" + response_information = "" + retain_available = true + retry_interval = "30s" + server_keepalive = "disabled" + session_expiry_interval = "2h" + shared_subscription = true + strict_mode = false + upgrade_qos = false + use_username_as_clientid = false + wildcard_subscription = true +} +overload_protection { + backoff_delay = 1 + backoff_gc = false + backoff_hibernation = true + backoff_new_conn = true + enable = false +} +retainer { + backend { + index_specs = [ + [1, 2, 3], + [1, 3], + [2, 3], + [3] + ] + max_retained_messages = 0 + storage_type = "disc" + type = "built_in_database" + } + enable = true + flow_control { + batch_deliver_limiter { + capacity = "infinity" + client { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + initial = "0" + rate = "infinity" + } + batch_deliver_number = 0 + batch_read_number = 0 + } + max_payload_size = "1MB" + msg_clear_interval = "0s" + msg_expiry_interval = "120s" + stop_publish_clear_msg = false +} +rule_engine { + ignore_sys_message = true + jq_function_default_timeout = "10s" + jq_implementation_module = "jq_nif" + rules { + "rule_bx87" { + actions = ["webhook:tests"] + description = "" + metadata {created_at = 1683880400358} + sql = "SELECT\n *\nFROM\n \"t/#\"" + } + } +} +stats {enable = true} +sys_topics { + sys_event_messages { + client_connected = true + client_disconnected = true + client_subscribed = true + client_unsubscribed = true + } + sys_heartbeat_interval = "30s" + sys_msg_interval = "1m" +} diff --git a/scripts/conf-test/old-confs/ee-v5.0.3.conf b/scripts/conf-test/old-confs/ee-v5.0.3.conf new file mode 100644 index 000000000..1981b8d09 --- /dev/null +++ b/scripts/conf-test/old-confs/ee-v5.0.3.conf @@ -0,0 +1,715 @@ +node { + name = "emqx@127.0.0.1" + cookie = "emqxsecretcookie" + data_dir = "data" +} + +cluster { + name = emqxcl + discovery_strategy = manual +} + + +dashboard { + listeners.http { + bind = 18083 + } +} + +authentication = [ + { + backend = "built_in_database" + mechanism = "password_based" + password_hash_algorithm {name = "sha256", salt_position = "suffix"} + user_id_type = "username" + } +] +authorization { + cache { + enable = true + max_size = 32 + ttl = "1m" + } + deny_action = "ignore" + no_match = "allow" + sources = [ + { + body {username = "${username}"} + connect_timeout = "15s" + enable_pipelining = 100 + headers {"content-type" = "application/json"} + method = "post" + pool_size = 8 + request_timeout = "30s" + ssl {enable = false, verify = "verify_peer"} + type = "http" + url = "http://127.0.0.1:8080" + }, + { + enable = true + path = "${EMQX_ETC_DIR}/acl.conf" + type = "file" + } + ] +} +delayed {enable = true, max_delayed_messages = 200} +exhook { + servers = [ + { + auto_reconnect = "60s" + enable = false + failed_action = "deny" + name = "test" + pool_size = 16 + request_timeout = "5s" + ssl {enable = false, verify = "verify_peer"} + url = "http://127.0.0.1:8080" + } + ] +} +gateway { + coap { + connection_required = false + enable_stats = true + listeners { + udp { + default { + bind = "5683" + max_conn_rate = 1000 + max_connections = 1024000 + } + } + } + mountpoint = "" + notify_type = "qos" + publish_qos = "coap" + subscribe_qos = "coap" + } +} +limiter { + bytes_in {burst = "10MB", rate = "10MB/s"} + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "10KB" + low_watermark = "0" + max_retry_time = "10s" + rate = "100KB/s" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "100" + low_watermark = "0" + max_retry_time = "10s" + rate = "100" + } + internal { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "100" + low_watermark = "0" + max_retry_time = "10s" + rate = "100" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "100" + low_watermark = "0" + max_retry_time = "10s" + rate = "100" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "100" + low_watermark = "0" + max_retry_time = "10s" + rate = "100" + } + } + connection {burst = "1000", rate = "1000"} + internal {burst = "1000", rate = "1000"} + message_in {burst = "1000", rate = "1000"} + message_routing {burst = "1000", rate = "1000"} +} +listeners { + ssl { + default { + acceptors = 16 + access_rules = ["allow all"] + bind = "0.0.0.0:8883" + enable_authn = true + enabled = true + limiter { + bytes_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + } + connection { + capacity = "1000" + initial = "0" + rate = "1000/s" + } + message_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + message_routing { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + } + max_connections = 5000000 + mountpoint = "" + proxy_protocol = false + proxy_protocol_timeout = "3s" + ssl_options { + cacertfile = "${EMQX_ETC_DIR}/certs/cacert.pem" + certfile = "${EMQX_ETC_DIR}/certs/cert.pem" + ciphers = [] + client_renegotiation = true + depth = 10 + enable_crl_check = false + fail_if_no_peer_cert = false + gc_after_handshake = false + handshake_timeout = "15s" + hibernate_after = "5s" + honor_cipher_order = true + keyfile = "${EMQX_ETC_DIR}/certs/key.pem" + ocsp { + enable_ocsp_stapling = false + refresh_http_timeout = "15s" + refresh_interval = "5m" + } + reuse_sessions = true + secure_renegotiate = true + verify = "verify_none" + versions = ["tlsv1.3", "tlsv1.2", "tlsv1.1", "tlsv1"] + } + tcp_options { + active_n = 100 + backlog = 1024 + buffer = "4KB" + high_watermark = "1MB" + nodelay = true + reuseaddr = true + send_timeout = "15s" + send_timeout_close = true + } + zone = "default" + } + } + tcp { + default { + acceptors = 16 + access_rules = ["allow all"] + bind = "0.0.0.0:1883" + enable_authn = true + enabled = true + limiter { + bytes_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + } + connection { + capacity = "1000" + initial = "0" + rate = "1000/s" + } + message_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + message_routing { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + } + max_connections = 12222 + mountpoint = "" + proxy_protocol = false + proxy_protocol_timeout = "3s" + tcp_options { + active_n = 100 + backlog = 1024 + buffer = "4KB" + high_watermark = "1MB" + nodelay = true + reuseaddr = true + send_timeout = "15s" + send_timeout_close = true + } + zone = "default" + } + } + ws { + default { + acceptors = 16 + access_rules = ["allow all"] + bind = "0.0.0.0:8083" + enable_authn = true + enabled = true + limiter { + bytes_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + } + connection { + capacity = "1000" + initial = "0" + rate = "1000/s" + } + message_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + message_routing { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + } + max_connections = 5000000 + mountpoint = "" + proxy_protocol = false + proxy_protocol_timeout = "3s" + tcp_options { + active_n = 100 + backlog = 1024 + buffer = "4KB" + high_watermark = "1MB" + nodelay = true + reuseaddr = true + send_timeout = "15s" + send_timeout_close = true + } + websocket { + allow_origin_absence = true + check_origin_enable = false + check_origins = "http://localhost:18083, http://127.0.0.1:18083" + compress = false + deflate_opts { + client_context_takeover = "takeover" + client_max_window_bits = 15 + mem_level = 8 + server_context_takeover = "takeover" + server_max_window_bits = 15 + strategy = "default" + } + fail_if_no_subprotocol = true + idle_timeout = "7200s" + max_frame_size = "infinity" + mqtt_path = "/mqtt" + mqtt_piggyback = "multiple" + proxy_address_header = "x-forwarded-for" + proxy_port_header = "x-forwarded-port" + supported_subprotocols = "mqtt, mqtt-v3, mqtt-v3.1.1, mqtt-v5" + } + zone = "default" + } + } + wss { + default { + acceptors = 16 + access_rules = ["allow all"] + bind = "0.0.0.0:8084" + enable_authn = true + enabled = true + limiter { + bytes_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + client { + bytes_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + connection { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_in { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + message_routing { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + } + connection { + capacity = "1000" + initial = "0" + rate = "1000/s" + } + message_in { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + message_routing { + capacity = "infinity" + initial = "0" + rate = "infinity" + } + } + max_connections = 5000000 + mountpoint = "" + proxy_protocol = false + proxy_protocol_timeout = "3s" + ssl_options { + cacertfile = "${EMQX_ETC_DIR}/certs/cacert.pem" + certfile = "${EMQX_ETC_DIR}/certs/cert.pem" + ciphers = [] + client_renegotiation = true + depth = 10 + fail_if_no_peer_cert = false + handshake_timeout = "15s" + hibernate_after = "5s" + honor_cipher_order = true + keyfile = "${EMQX_ETC_DIR}/certs/key.pem" + reuse_sessions = true + secure_renegotiate = true + verify = "verify_none" + versions = ["tlsv1.3", "tlsv1.2", "tlsv1.1", "tlsv1"] + } + tcp_options { + active_n = 100 + backlog = 1024 + buffer = "4KB" + high_watermark = "1MB" + nodelay = true + reuseaddr = true + send_timeout = "15s" + send_timeout_close = true + } + websocket { + allow_origin_absence = true + check_origin_enable = false + check_origins = "http://localhost:18083, http://127.0.0.1:18083" + compress = false + deflate_opts { + client_context_takeover = "takeover" + client_max_window_bits = 15 + mem_level = 8 + server_context_takeover = "takeover" + server_max_window_bits = 15 + strategy = "default" + } + fail_if_no_subprotocol = true + idle_timeout = "7200s" + max_frame_size = "infinity" + mqtt_path = "/mqtt" + mqtt_piggyback = "multiple" + proxy_address_header = "x-forwarded-for" + proxy_port_header = "x-forwarded-port" + supported_subprotocols = "mqtt, mqtt-v3, mqtt-v3.1.1, mqtt-v5" + } + zone = "default" + } + } +} +log { + console_handler { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = true + flush_qlen = 8000 + formatter = "text" + level = "warning" + max_depth = 100 + overload_kill { + enable = true + mem_size = "30MB" + qlen = "10000" + restart_after = "5s" + } + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + file_handlers { + default { + burst_limit { + enable = true + max_count = 10000 + window_time = "1s" + } + chars_limit = "unlimited" + drop_mode_qlen = 3000 + enable = false + file = "${EMQX_LOG_DIR}/emqx.log" + flush_qlen = 8000 + formatter = "text" + level = "warning" + max_depth = 100 + max_size = "500MB" + overload_kill { + enable = true + mem_size = "30MB" + qlen = 20000 + restart_after = "5s" + } + rotation {count = 10, enable = true} + single_line = true + supervisor_reports = "error" + sync_mode_qlen = 100 + time_offset = "system" + } + } +} +mqtt { + await_rel_timeout = "300s" + exclusive_subscription = false + idle_timeout = "15s" + ignore_loop_deliver = false + keepalive_backoff = 0.75 + max_awaiting_rel = 100 + max_clientid_len = 65535 + max_inflight = 32 + max_mqueue_len = 1000 + max_packet_size = "20MB" + max_qos_allowed = 2 + max_subscriptions = "infinity" + max_topic_alias = 65535 + max_topic_levels = 128 + mqueue_default_priority = "lowest" + mqueue_priorities = "disabled" + "mqueue_store_qos0" = true + peer_cert_as_clientid = "disabled" + peer_cert_as_username = "disabled" + response_information = "" + retain_available = true + retry_interval = "30s" + server_keepalive = "disabled" + session_expiry_interval = "12h" + shared_subscription = true + strict_mode = false + upgrade_qos = false + use_username_as_clientid = false + wildcard_subscription = true +} +retainer { + backend { + index_specs = [ + [1, 2, 3], + [1, 3], + [2, 3], + [3] + ] + max_retained_messages = 0 + storage_type = "disc" + type = "built_in_database" + } + enable = true + flow_control { + batch_deliver_limiter { + capacity = "infinity" + client { + capacity = "infinity" + divisible = false + failure_strategy = "force" + initial = "0" + low_watermark = "0" + max_retry_time = "10s" + rate = "infinity" + } + initial = "0" + rate = "infinity" + } + batch_deliver_number = 0 + batch_read_number = 0 + } + max_payload_size = "20MB" + msg_clear_interval = "0s" + msg_expiry_interval = "0s" + stop_publish_clear_msg = false +} +sys_topics { + sys_event_messages { + client_connected = true + client_disconnected = true + client_subscribed = true + client_unsubscribed = false + } + sys_heartbeat_interval = "30s" + sys_msg_interval = "1m" +} +sysmon { + os { + cpu_check_interval = "60s" + cpu_high_watermark = "80%" + cpu_low_watermark = "60%" + mem_check_interval = "60s" + procmem_high_watermark = "5%" + sysmem_high_watermark = "70%" + } + vm { + busy_dist_port = true + busy_port = true + large_heap = "disabled" + long_gc = "disabled" + long_schedule = "240ms" + process_check_interval = "30s" + process_high_watermark = "80%" + process_low_watermark = "60%" + } +} diff --git a/scripts/conf-test/run.sh b/scripts/conf-test/run.sh new file mode 100755 index 000000000..52bdd5df5 --- /dev/null +++ b/scripts/conf-test/run.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +PROFILE="${PROFILE:-emqx}" +EMQX_ROOT="${EMQX_ROOT:-_build/$PROFILE/rel/emqx}" +EMQX_WAIT_FOR_START="${EMQX_WAIT_FOR_START:-30}" +export EMQX_WAIT_FOR_START + +start_emqx_with_conf() { + echo "Starting $PROFILE with $1" + $EMQX_ROOT/bin/emqx start + $EMQX_ROOT/bin/emqx stop +} + +MINOR_VSN=$(./pkg-vsn.sh "$PROFILE" | cut -d. -f1,2) + +if [ "$PROFILE" = "emqx" ]; then + EDITION="ce" +else + EDITION="ee" +fi + +FILES=$(ls ./scripts/conf-test/old-confs/$EDITION-v"$MINOR_VSN"*) + +cp $EMQX_ROOT/etc/emqx.conf $EMQX_ROOT/etc/emqx.conf.bak +cleanup() { + cp $EMQX_ROOT/etc/emqx.conf.bak $EMQX_ROOT/etc/emqx.conf +} +trap cleanup EXIT + +for file in $FILES; do + cp $file $EMQX_ROOT/etc/emqx.conf + start_emqx_with_conf $file +done