@@ -175,88 +175,91 @@ 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 } "
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'
183201}
184- indent () {
185- if [ " $# " -gt 0 ]; then
186- echo " $@ "
187- else
188- cat
189- fi | sed ' s/^/\t/g'
202+ sed_escape_rhs () {
203+ echo " $@ " | sed -e ' s/[\/&]/\\&/g'
190204}
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- }
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 "
247+ verify|fail_if_no_peer_cert|depth|hipe_compile)
248+ [ -n " $val " ] && rawVal=' true' || rawVal=' false'
224249 ;;
225250
226- hipe_compile)
227- [ " $val " ] && rawVal=' true' || rawVal=' false'
228- ;;
229-
230- cacertfile|certfile|keyfile)
231- [ " $val " ] || continue
232- rawVal=" $( rabbit_string " $val " ) "
233- ;;
234-
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- )
259-
260263 # determine whether to set "vm_memory_high_watermark" (based on cgroups)
261264 memTotalKb=
262265 if [ -r /proc/meminfo ]; then
@@ -277,12 +280,14 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
277280 if [ -n " $memLimitB " ]; then
278281 # if we have a cgroup memory limit, let's inform RabbitMQ of what it is (so it can calculate vm_memory_high_watermark properly)
279282 # https://github.com/rabbitmq/rabbitmq-server/pull/1234
280- rabbitConfig+=( " { total_memory_available_override_value, $memLimitB }" )
283+ :# TODO rabbit_set_config 'total_memory_available_override_value' "$memLimitB"
284+ # TODO https://github.com/rabbitmq/rabbitmq-server/issues/1445 (missing in 3.7.0)
281285 fi
286+ # https://www.rabbitmq.com/memory.html#memsup-usage
282287 if [ " ${RABBITMQ_VM_MEMORY_HIGH_WATERMARK:- } " ]; then
283288 # https://github.com/docker-library/rabbitmq/pull/105#issuecomment-242165822
284289 vmMemoryHighWatermark=" $(
285- awk '
290+ echo " $RABBITMQ_VM_MEMORY_HIGH_WATERMARK " | awk '
286291 /^[0-9]*[.][0-9]+$|^[0-9]+([.][0-9]+)?%$/ {
287292 perc = $0;
288293 if (perc ~ /%$/) {
@@ -293,93 +298,64 @@ if [ "$1" = 'rabbitmq-server' ] && [ "$shouldWriteConfig" ]; then
293298 printf "error: invalid percentage for vm_memory_high_watermark: %s (must be > 0%%, <= 100%%)\n", $0 > "/dev/stderr";
294299 exit 1;
295300 }
296- printf "%0.03f\n", perc;
301+ printf "vm_memory_high_watermark.relative %0.03f\n", perc;
297302 next;
298303 }
299304 /^[0-9]+$/ {
300- printf "{ absolute, %s } \n", $0;
305+ printf "vm_memory_high_watermark. absolute %s\n", $0;
301306 next;
302307 }
303308 /^[0-9]+([.][0-9]+)?[a-zA-Z]+$/ {
304- printf "{ absolute, \"%s\" } \n", $0;
309+ printf "vm_memory_high_watermark. absolute %s \n", $0;
305310 next;
306311 }
307312 {
308313 printf "error: unexpected input for vm_memory_high_watermark: %s\n", $0;
309314 exit 1;
310315 }
311- ' <( echo " $RABBITMQ_VM_MEMORY_HIGH_WATERMARK " )
316+ '
312317 ) "
313318 if [ " $vmMemoryHighWatermark " ]; then
314- # https://www.rabbitmq.com/memory.html#memsup-usage
315- rabbitConfig+=( " { vm_memory_high_watermark, $vmMemoryHighWatermark }" )
319+ vmMemoryHighWatermarkKey=" ${vmMemoryHighWatermark%% * } "
320+ vmMemoryHighWatermarkVal=" ${vmMemoryHighWatermark# $vmMemoryHighWatermarkKey } "
321+ rabbit_set_config " $vmMemoryHighWatermarkKey " " $vmMemoryHighWatermarkVal "
322+ case " $vmMemoryHighWatermarkKey " in
323+ # make sure we only set one or the other
324+ ' vm_memory_high_watermark.absolute' ) rabbit_comment_config ' vm_memory_high_watermark.relative' ;;
325+ ' vm_memory_high_watermark.relative' ) rabbit_comment_config ' vm_memory_high_watermark.absolute' ;;
326+ esac
316327 fi
317328 fi
318329
319330 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- )
331+ rabbit_set_config ' listeners.ssl.default' 5671
332+ rabbit_env_config ' ssl' " ${sslConfigKeys[@]} "
329333 else
330- rabbitConfig+=(
331- " { tcp_listeners, $( rabbit_array 5672) }"
332- " { ssl_listeners, $( rabbit_array) }"
333- )
334+ rabbit_set_config ' listeners.tcp.default' 5672
334335 fi
335336
336- IFS=$' \n '
337- rabbitConfig+=( $( rabbit_env_config ' ' " ${rabbitConfigKeys[@]} " ) )
338- unset IFS
339-
340- fullConfig+=( " { rabbit, $( rabbit_array " ${rabbitConfig[@]} " ) }" )
337+ rabbit_env_config ' ' " ${rabbitConfigKeys[@]} "
341338
342339 # if management plugin is installed, generate config for it
343340 # https://www.rabbitmq.com/management.html#configuration
344341 if [ " $( rabbitmq-plugins list -m -e rabbitmq_management) " ]; then
345- rabbitManagementConfig=()
346-
347342 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- )
343+ rabbit_set_config ' management.listener.port' 15671
344+ rabbit_set_config ' management.listener.ssl' ' true'
345+ rabbit_env_config ' management_ssl' " ${sslConfigKeys[@]} "
357346 else
358- rabbitManagementListenerConfig+=(
359- ' { port, 15672 }'
360- ' { ssl, false }'
361- )
347+ rabbit_set_config ' management.listener.port' 15672
348+ rabbit_set_config ' management.listener.ssl' ' false'
362349 fi
363- rabbitManagementConfig+=(
364- " { listener, $( rabbit_array " ${rabbitManagementListenerConfig[@]} " ) }"
365- )
366350
367351 # if definitions file exists, then load it
368352 # https://www.rabbitmq.com/management.html#load-definitions
369353 managementDefinitionsFile=' /etc/rabbitmq/definitions.json'
370- if [ -f " ${ managementDefinitionsFile} " ]; then
354+ if [ -f " $managementDefinitionsFile " ]; then
371355 # see also https://github.com/docker-library/rabbitmq/pull/112#issuecomment-271485550
372- rabbitManagementConfig+=(
373- " { load_definitions, \" $managementDefinitionsFile \" }"
374- )
356+ rabbit_set_config ' management.load_definitions' " $managementDefinitionsFile "
375357 fi
376-
377- fullConfig+=(
378- " { rabbitmq_management, $( rabbit_array " ${rabbitManagementConfig[@]} " ) }"
379- )
380358 fi
381-
382- echo " $( rabbit_array " ${fullConfig[@]} " ) ." > /etc/rabbitmq/rabbitmq.config
383359fi
384360
385361combinedSsl=' /tmp/combined.pem'
0 commit comments