@@ -175,87 +175,92 @@ if [ "${RABBITMQ_ERLANG_COOKIE:-}" ]; then
175175 chmod 600 " $cookieFile "
176176fi
177177
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'
190201}
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'
202204}
203- rabbit_string () {
205+ rabbit_set_config () {
206+ local key=" $1 " ; shift
204207 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 "
207229}
208230rabbit_env_config () {
209231 local prefix=" $1 " ; shift
210232
211- local ret=()
212233 local conf
213234 for conf; do
214235 local var=" rabbitmq${prefix: +_$prefix } _$conf "
215236 var=" ${var^^} "
216237
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
218243
219- local rawVal=
244+ local val=" ${! var:- } "
245+ local rawVal=" $val "
220246 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'
233249 ;;
234250
235- * )
236- [ " $val " ] || continue
237- rawVal=" <<$( rabbit_string " $val " ) >>"
238- ;;
251+ vm_memory_high_watermark) continue ;; # handled separately
239252 esac
240- [ " $rawVal " ] || continue
241253
242- ret+=( " { $conf , $rawVal }" )
254+ if [ -n " $rawVal " ]; then
255+ rabbit_set_config " $key " " $rawVal "
256+ else
257+ rabbit_comment_config " $key "
258+ fi
243259 done
244-
245- join $' \n ' " ${ret[@]} "
246260}
247261
248- shouldWriteConfig=" $haveConfig "
249- if [ ! -f /etc/rabbitmq/rabbitmq.config ]; then
250- shouldWriteConfig=1
251- fi
252-
253262if [ " $1 " = ' rabbitmq-server' ] && [ " $shouldWriteConfig " ]; then
254- fullConfig=()
255-
256- rabbitConfig=(
257- " { loopback_users, $( rabbit_array) }"
258- )
263+ rabbit_set_config ' loopback_users.guest' ' false'
259264
260265 # determine whether to set "vm_memory_high_watermark" (based on cgroups)
261266 memTotalKb=
@@ -277,12 +282,14 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
277282 if [ -n " $memLimitB " ]; then
278283 # if we have a cgroup memory limit, let's inform RabbitMQ of what it is (so it can calculate vm_memory_high_watermark properly)
279284 # 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)
281287 fi
288+ # https://www.rabbitmq.com/memory.html#memsup-usage
282289 if [ " ${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:- } " ]; then
283290 # https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
284291 vmMemoryHighWatermark=" $(
285- awk '
292+ echo " $RABBITMQ_VM_MEMORY_HIGH_WATERMARK " | awk '
286293 /^[0-9]*[.][0-9]+$|^[0-9]+([.][0-9]+)?%$/ {
287294 perc = $0;
288295 if (perc ~ /%$/) {
@@ -293,93 +300,64 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
293300 printf "error: invalid percentage for vm_memory_high_watermark: %s (must be > 0%%, <= 100%%)\n", $0 > "/dev/stderr";
294301 exit 1;
295302 }
296- printf "%0.03f\n", perc;
303+ printf "vm_memory_high_watermark.relative %0.03f\n", perc;
297304 next;
298305 }
299306 /^[0-9]+$/ {
300- printf "{ absolute, %s } \n", $0;
307+ printf "vm_memory_high_watermark. absolute %s\n", $0;
301308 next;
302309 }
303310 /^[0-9]+([.][0-9]+)?[a-zA-Z]+$/ {
304- printf "{ absolute, \"%s\" } \n", $0;
311+ printf "vm_memory_high_watermark. absolute %s \n", $0;
305312 next;
306313 }
307314 {
308315 printf "error: unexpected input for vm_memory_high_watermark: %s\n", $0;
309316 exit 1;
310317 }
311- ' <( echo " $RABBITMQ_VM_MEMORY_HIGH_WATERMARK " )
318+ '
312319 ) "
313320 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
316329 fi
317330 fi
318331
319332 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[@]} "
329335 else
330- rabbitConfig+=(
331- " { tcp_listeners, $( rabbit_array 5672) }"
332- " { ssl_listeners, $( rabbit_array) }"
333- )
336+ rabbit_set_config ' listeners.tcp.default' 5672
334337 fi
335338
336- IFS=$' \n '
337- rabbitConfig+=( $( rabbit_env_config ' ' " ${rabbitConfigKeys[@]} " ) )
338- unset IFS
339-
340- fullConfig+=( " { rabbit, $( rabbit_array " ${rabbitConfig[@]} " ) }" )
339+ rabbit_env_config ' ' " ${rabbitConfigKeys[@]} "
341340
342341 # if management plugin is installed, generate config for it
343342 # https://www.rabbitmq.com/management.html#configuration
344343 if [ " $( rabbitmq-plugins list -m -e rabbitmq_management) " ]; then
345- rabbitManagementConfig=()
346-
347344 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[@]} "
357348 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'
362351 fi
363- rabbitManagementConfig+=(
364- " { listener, $( rabbit_array " ${rabbitManagementListenerConfig[@]} " ) }"
365- )
366352
367353 # if definitions file exists, then load it
368354 # https://www.rabbitmq.com/management.html#load-definitions
369355 managementDefinitionsFile=' /etc/rabbitmq/definitions.json'
370- if [ -f " ${ managementDefinitionsFile} " ]; then
356+ if [ -f " $managementDefinitionsFile " ]; then
371357 # 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 "
375359 fi
376-
377- fullConfig+=(
378- " { rabbitmq_management, $( rabbit_array " ${rabbitManagementConfig[@]} " ) }"
379- )
380360 fi
381-
382- echo " $( rabbit_array " ${fullConfig[@]} " ) ." > /etc/rabbitmq/rabbitmq.config
383361fi
384362
385363combinedSsl=' /tmp/combined.pem'
0 commit comments