@@ -175,87 +175,92 @@ if [ "${RABBITMQ_ERLANG_COOKIE:-}" ]; then
175
175
chmod 600 " $cookieFile "
176
176
fi
177
177
178
- # prints "$2$1$3$1...$N"
179
- join () {
180
- local sep=" $1 " ; shift
181
- local out; printf -v out " ${sep//%/%% } %s" " $@ "
182
- echo " ${out# $sep } "
183
- }
184
- indent () {
185
- if [ " $# " -gt 0 ]; then
186
- echo " $@ "
187
- else
188
- cat
189
- fi | sed ' s/^/\t/g'
178
+ configBase=" ${RABBITMQ_CONFIG_FILE:-/ etc/ rabbitmq/ rabbitmq} "
179
+ oldConfigFile=" $configBase .config"
180
+ newConfigFile=" $configBase .conf"
181
+
182
+ shouldWriteConfig=" $haveConfig "
183
+ if [ -n " $shouldWriteConfig " ] && [ -f " $oldConfigFile " ]; then
184
+ {
185
+ echo " error: Docker configuration environment variables specified, but old-style (Erlang syntax) configuration file '$oldConfigFile ' exists"
186
+ echo " Suggested fixes: (choose one)"
187
+ echo " - remove '$oldConfigFile '"
188
+ echo " - remove any Docker-specific 'RABBITMQ_...' environment variables"
189
+ echo " - convert '$oldConfigFile ' to the newer sysctl format ('$newConfigFile '); see https://www.rabbitmq.com/configure.html#config-file"
190
+ } >&2
191
+ exit 1
192
+ fi
193
+ if [ -z " $shouldWriteConfig " ] && [ ! -f " $oldConfigFile " ] && [ ! -f " $newConfigFile " ]; then
194
+ # no config files, we should write one
195
+ shouldWriteConfig=1
196
+ fi
197
+
198
+ # http://stackoverflow.com/a/2705678/433558
199
+ sed_escape_lhs () {
200
+ echo " $@ " | sed -e ' s/[]\/$*.^|[]/\\&/g'
190
201
}
191
- rabbit_array () {
192
- echo -n ' ['
193
- case " $# " in
194
- 0) echo -n ' ' ;;
195
- 1) echo -n " $1 " ;;
196
- * )
197
- local vals=" $( join $' ,\n ' " $@ " ) "
198
- echo
199
- indent " $vals "
200
- esac
201
- echo -n ' ]'
202
+ sed_escape_rhs () {
203
+ echo " $@ " | sed -e ' s/[\/&]/\\&/g'
202
204
}
203
- rabbit_string () {
205
+ rabbit_set_config () {
206
+ local key=" $1 " ; shift
204
207
local val=" $1 " ; shift
205
- # fire up erlang directly to have it do the proper escaping for us
206
- erl -noinput -eval ' io:format("~p\n", init:get_plain_arguments()), init:stop().' -- " $val "
208
+
209
+ [ -e " $newConfigFile " ] || touch " $newConfigFile "
210
+
211
+ local sedKey=" $( sed_escape_lhs " $key " ) "
212
+ local sedVal=" $( sed_escape_rhs " $val " ) "
213
+ sed -ri \
214
+ " s/^[[:space:]]*(${sedKey} [[:space:]]*=[[:space:]]*)\S.*\$ /\1${sedVal} /" \
215
+ " $newConfigFile "
216
+ if ! grep -qE " ^${sedKey} [[:space:]]*=" " $newConfigFile " ; then
217
+ echo " $key = $val " >> " $newConfigFile "
218
+ fi
219
+ }
220
+ rabbit_comment_config () {
221
+ local key=" $1 " ; shift
222
+
223
+ [ -e " $newConfigFile " ] || touch " $newConfigFile "
224
+
225
+ local sedKey=" $( sed_escape_lhs " $key " ) "
226
+ sed -ri \
227
+ " s/^[[:space:]]*#?[[:space:]]*(${sedKey} [[:space:]]*=[[:space:]]*\S.*)\$ /# \1/" \
228
+ " $newConfigFile "
207
229
}
208
230
rabbit_env_config () {
209
231
local prefix=" $1 " ; shift
210
232
211
- local ret=()
212
233
local conf
213
234
for conf; do
214
235
local var=" rabbitmq${prefix: +_$prefix } _$conf "
215
236
var=" ${var^^} "
216
237
217
- local val=" ${! var:- } "
238
+ local key=" $conf "
239
+ case " $prefix " in
240
+ ssl) key=" ssl_options.$key " ;;
241
+ management_ssl) key=" management.listener.ssl_opts.$key " ;;
242
+ esac
218
243
219
- local rawVal=
244
+ local val=" ${! var:- } "
245
+ local rawVal=" $val "
220
246
case " $conf " in
221
- verify|fail_if_no_peer_cert|depth)
222
- [ " $val " ] || continue
223
- rawVal=" $val "
224
- ;;
225
-
226
- hipe_compile)
227
- [ " $val " ] && rawVal=' true' || rawVal=' false'
228
- ;;
229
-
230
- cacertfile|certfile|keyfile)
231
- [ " $val " ] || continue
232
- rawVal=" $( rabbit_string " $val " ) "
247
+ verify|fail_if_no_peer_cert|depth|hipe_compile)
248
+ [ -n " $val " ] && rawVal=' true' || rawVal=' false'
233
249
;;
234
250
235
- * )
236
- [ " $val " ] || continue
237
- rawVal=" <<$( rabbit_string " $val " ) >>"
238
- ;;
251
+ vm_memory_high_watermark) continue ;; # handled separately
239
252
esac
240
- [ " $rawVal " ] || continue
241
253
242
- ret+=( " { $conf , $rawVal }" )
254
+ if [ -n " $rawVal " ]; then
255
+ rabbit_set_config " $key " " $rawVal "
256
+ else
257
+ rabbit_comment_config " $key "
258
+ fi
243
259
done
244
-
245
- join $' \n ' " ${ret[@]} "
246
260
}
247
261
248
- shouldWriteConfig=" $haveConfig "
249
- if [ ! -f /etc/rabbitmq/rabbitmq.config ]; then
250
- shouldWriteConfig=1
251
- fi
252
-
253
262
if [ " $1 " = ' rabbitmq-server' ] && [ " $shouldWriteConfig " ]; then
254
- fullConfig=()
255
-
256
- rabbitConfig=(
257
- " { loopback_users, $( rabbit_array) }"
258
- )
263
+ rabbit_set_config ' loopback_users.guest' ' false'
259
264
260
265
# determine whether to set "vm_memory_high_watermark" (based on cgroups)
261
266
memTotalKb=
@@ -277,12 +282,14 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
277
282
if [ -n " $memLimitB " ]; then
278
283
# if we have a cgroup memory limit, let's inform RabbitMQ of what it is (so it can calculate vm_memory_high_watermark properly)
279
284
# https://github.com/rabbitmq/rabbitmq-server/pull/1234
280
- rabbitConfig+=( " { total_memory_available_override_value, $memLimitB }" )
285
+ :# TODO rabbit_set_config 'total_memory_available_override_value' "$memLimitB"
286
+ # TODO https://github.com/rabbitmq/rabbitmq-server/issues/1445 (missing in 3.7.0)
281
287
fi
288
+ # https://www.rabbitmq.com/memory.html#memsup-usage
282
289
if [ " ${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:- } " ]; then
283
290
# https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
284
291
vmMemoryHighWatermark=" $(
285
- awk '
292
+ echo " $RABBITMQ_VM_MEMORY_HIGH_WATERMARK " | awk '
286
293
/^[0-9]*[.][0-9]+$|^[0-9]+([.][0-9]+)?%$/ {
287
294
perc = $0;
288
295
if (perc ~ /%$/) {
@@ -293,93 +300,64 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
293
300
printf "error: invalid percentage for vm_memory_high_watermark: %s (must be > 0%%, <= 100%%)\n", $0 > "/dev/stderr";
294
301
exit 1;
295
302
}
296
- printf "%0.03f\n", perc;
303
+ printf "vm_memory_high_watermark.relative %0.03f\n", perc;
297
304
next;
298
305
}
299
306
/^[0-9]+$/ {
300
- printf "{ absolute, %s } \n", $0;
307
+ printf "vm_memory_high_watermark. absolute %s\n", $0;
301
308
next;
302
309
}
303
310
/^[0-9]+([.][0-9]+)?[a-zA-Z]+$/ {
304
- printf "{ absolute, \"%s\" } \n", $0;
311
+ printf "vm_memory_high_watermark. absolute %s \n", $0;
305
312
next;
306
313
}
307
314
{
308
315
printf "error: unexpected input for vm_memory_high_watermark: %s\n", $0;
309
316
exit 1;
310
317
}
311
- ' <( echo " $RABBITMQ_VM_MEMORY_HIGH_WATERMARK " )
318
+ '
312
319
) "
313
320
if [ " $vmMemoryHighWatermark " ]; then
314
- # https://www.rabbitmq.com/memory.html#memsup-usage
315
- rabbitConfig+=( " { vm_memory_high_watermark, $vmMemoryHighWatermark }" )
321
+ vmMemoryHighWatermarkKey=" ${vmMemoryHighWatermark%% * } "
322
+ vmMemoryHighWatermarkVal=" ${vmMemoryHighWatermark# $vmMemoryHighWatermarkKey } "
323
+ rabbit_set_config " $vmMemoryHighWatermarkKey " " $vmMemoryHighWatermarkVal "
324
+ case " $vmMemoryHighWatermarkKey " in
325
+ # make sure we only set one or the other
326
+ ' vm_memory_high_watermark.absolute' ) rabbit_comment_config ' vm_memory_high_watermark.relative' ;;
327
+ ' vm_memory_high_watermark.relative' ) rabbit_comment_config ' vm_memory_high_watermark.absolute' ;;
328
+ esac
316
329
fi
317
330
fi
318
331
319
332
if [ " $haveSslConfig " ]; then
320
- IFS=$' \n '
321
- rabbitSslOptions=( $( rabbit_env_config ' ssl' " ${sslConfigKeys[@]} " ) )
322
- unset IFS
323
-
324
- rabbitConfig+=(
325
- " { tcp_listeners, $( rabbit_array) }"
326
- " { ssl_listeners, $( rabbit_array 5671) }"
327
- " { ssl_options, $( rabbit_array " ${rabbitSslOptions[@]} " ) }"
328
- )
333
+ rabbit_set_config ' listeners.ssl.default' 5671
334
+ rabbit_env_config ' ssl' " ${sslConfigKeys[@]} "
329
335
else
330
- rabbitConfig+=(
331
- " { tcp_listeners, $( rabbit_array 5672) }"
332
- " { ssl_listeners, $( rabbit_array) }"
333
- )
336
+ rabbit_set_config ' listeners.tcp.default' 5672
334
337
fi
335
338
336
- IFS=$' \n '
337
- rabbitConfig+=( $( rabbit_env_config ' ' " ${rabbitConfigKeys[@]} " ) )
338
- unset IFS
339
-
340
- fullConfig+=( " { rabbit, $( rabbit_array " ${rabbitConfig[@]} " ) }" )
339
+ rabbit_env_config ' ' " ${rabbitConfigKeys[@]} "
341
340
342
341
# if management plugin is installed, generate config for it
343
342
# https://www.rabbitmq.com/management.html#configuration
344
343
if [ " $( rabbitmq-plugins list -m -e rabbitmq_management) " ]; then
345
- rabbitManagementConfig=()
346
-
347
344
if [ " $haveManagementSslConfig " ]; then
348
- IFS=$' \n '
349
- rabbitManagementSslOptions=( $( rabbit_env_config ' management_ssl' " ${sslConfigKeys[@]} " ) )
350
- unset IFS
351
-
352
- rabbitManagementListenerConfig+=(
353
- ' { port, 15671 }'
354
- ' { ssl, true }'
355
- " { ssl_opts, $( rabbit_array " ${rabbitManagementSslOptions[@]} " ) }"
356
- )
345
+ rabbit_set_config ' management.listener.port' 15671
346
+ rabbit_set_config ' management.listener.ssl' ' true'
347
+ rabbit_env_config ' management_ssl' " ${sslConfigKeys[@]} "
357
348
else
358
- rabbitManagementListenerConfig+=(
359
- ' { port, 15672 }'
360
- ' { ssl, false }'
361
- )
349
+ rabbit_set_config ' management.listener.port' 15672
350
+ rabbit_set_config ' management.listener.ssl' ' false'
362
351
fi
363
- rabbitManagementConfig+=(
364
- " { listener, $( rabbit_array " ${rabbitManagementListenerConfig[@]} " ) }"
365
- )
366
352
367
353
# if definitions file exists, then load it
368
354
# https://www.rabbitmq.com/management.html#load-definitions
369
355
managementDefinitionsFile=' /etc/rabbitmq/definitions.json'
370
- if [ -f " ${ managementDefinitionsFile} " ]; then
356
+ if [ -f " $managementDefinitionsFile " ]; then
371
357
# see also https://github.com/docker-library/rabbitmq/pull/112#issuecomment-271485550
372
- rabbitManagementConfig+=(
373
- " { load_definitions, \" $managementDefinitionsFile \" }"
374
- )
358
+ rabbit_set_config ' management.load_definitions' " $managementDefinitionsFile "
375
359
fi
376
-
377
- fullConfig+=(
378
- " { rabbitmq_management, $( rabbit_array " ${rabbitManagementConfig[@]} " ) }"
379
- )
380
360
fi
381
-
382
- echo " $( rabbit_array " ${fullConfig[@]} " ) ." > /etc/rabbitmq/rabbitmq.config
383
361
fi
384
362
385
363
combinedSsl=' /tmp/combined.pem'
0 commit comments