Sean Dague | e263c82 | 2014-12-05 14:25:28 -0500 | [diff] [blame] | 1 | #!/bin/bash |
| 2 | # |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 3 | # lib/rpc_backend |
Sean Dague | 37eca48 | 2015-06-16 07:19:22 -0400 | [diff] [blame] | 4 | # Interface for installing RabbitMQ on the system |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 5 | |
| 6 | # Dependencies: |
Adam Spiers | 6a5aa7c | 2013-10-24 11:27:02 +0100 | [diff] [blame] | 7 | # |
| 8 | # - ``functions`` file |
Abhishek Chanda | d5b74c6 | 2014-12-12 02:15:55 +0530 | [diff] [blame] | 9 | # - ``RABBIT_{HOST|PASSWORD|USERID}`` must be defined when RabbitMQ is used |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 10 | |
| 11 | # ``stack.sh`` calls the entry points in this order: |
| 12 | # |
Adam Spiers | 6a5aa7c | 2013-10-24 11:27:02 +0100 | [diff] [blame] | 13 | # - check_rpc_backend |
| 14 | # - install_rpc_backend |
| 15 | # - restart_rpc_backend |
Sean Dague | 37eca48 | 2015-06-16 07:19:22 -0400 | [diff] [blame] | 16 | # - iniset_rpc_backend (stable interface) |
| 17 | # |
| 18 | # Note: if implementing an out of tree plugin for an RPC backend, you |
| 19 | # should install all services through normal plugin methods, then |
| 20 | # redefine ``iniset_rpc_backend`` in your code. That's the one portion |
| 21 | # of this file which is a standard interface. |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 22 | |
| 23 | # Save trace setting |
Ian Wienand | 523f488 | 2015-10-13 11:03:03 +1100 | [diff] [blame] | 24 | _XTRACE_RPC_BACKEND=$(set +o | grep xtrace) |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 25 | set +o xtrace |
| 26 | |
melanie witt | 0bf2550 | 2016-08-30 22:14:04 +0000 | [diff] [blame] | 27 | RABBIT_USERID=${RABBIT_USERID:-stackrabbit} |
Pawel Koniszewski | 20eb274 | 2016-12-21 13:27:09 +0100 | [diff] [blame] | 28 | if is_service_enabled rabbit; then |
| 29 | RABBIT_HOST=${RABBIT_HOST:-$SERVICE_HOST} |
| 30 | fi |
melanie witt | 0bf2550 | 2016-08-30 22:14:04 +0000 | [diff] [blame] | 31 | |
Dean Troyer | cc6b443 | 2013-04-08 15:38:03 -0500 | [diff] [blame] | 32 | # Functions |
| 33 | # --------- |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 34 | |
Dean Troyer | 995eb92 | 2013-03-07 16:11:40 -0600 | [diff] [blame] | 35 | # clean up after rpc backend - eradicate all traces so changing backends |
| 36 | # produces a clean switch |
| 37 | function cleanup_rpc_backend { |
| 38 | if is_service_enabled rabbit; then |
| 39 | # Obliterate rabbitmq-server |
| 40 | uninstall_package rabbitmq-server |
Sean Dague | 9a413ab | 2015-02-04 12:44:18 -0500 | [diff] [blame] | 41 | # in case it's not actually running, /bin/true at the end |
| 42 | sudo killall epmd || sudo killall -9 epmd || /bin/true |
Dean Troyer | 995eb92 | 2013-03-07 16:11:40 -0600 | [diff] [blame] | 43 | if is_ubuntu; then |
| 44 | # And the Erlang runtime too |
Sahid Orentino Ferdjaoui | e964827 | 2014-02-23 18:55:51 +0100 | [diff] [blame] | 45 | apt_get purge -y erlang* |
Dean Troyer | 995eb92 | 2013-03-07 16:11:40 -0600 | [diff] [blame] | 46 | fi |
Kenneth Giusti | 7e58c06 | 2014-07-23 16:44:37 -0400 | [diff] [blame] | 47 | fi |
Dean Troyer | 995eb92 | 2013-03-07 16:11:40 -0600 | [diff] [blame] | 48 | } |
| 49 | |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 50 | # install rpc backend |
Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 51 | function install_rpc_backend { |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 52 | if is_service_enabled rabbit; then |
| 53 | # Install rabbitmq-server |
Ian Wienand | 7ccf4e0 | 2014-07-23 14:24:11 +1000 | [diff] [blame] | 54 | install_package rabbitmq-server |
Dirk Mueller | 4404f68 | 2018-03-02 00:37:58 +0100 | [diff] [blame] | 55 | if is_suse; then |
| 56 | install_package rabbitmq-server-plugins |
| 57 | # the default systemd socket activation only listens on the loopback interface |
| 58 | # which causes rabbitmq to try to start its own epmd |
| 59 | sudo mkdir -p /etc/systemd/system/epmd.socket.d |
| 60 | cat <<EOF | sudo tee /etc/systemd/system/epmd.socket.d/ports.conf >/dev/null |
| 61 | [Socket] |
| 62 | ListenStream= |
| 63 | ListenStream=[::]:4369 |
| 64 | EOF |
| 65 | sudo systemctl daemon-reload |
| 66 | sudo systemctl restart epmd.socket epmd.service |
| 67 | fi |
| 68 | if is_fedora || is_suse; then |
Jan Gutter | 97096e0 | 2019-07-26 17:46:44 +0200 | [diff] [blame] | 69 | # NOTE(jangutter): If rabbitmq is not running (as in a fresh |
| 70 | # install) then rabbit_setuser triggers epmd@0.0.0.0.socket with |
| 71 | # socket activation. This fails the first time and does not get |
| 72 | # cleared. It is benign, but the workaround is to start rabbitmq a |
| 73 | # bit earlier for RPM based distros. |
| 74 | sudo systemctl --now enable rabbitmq-server |
Kyle Mestery | 7563326 | 2016-01-07 16:46:37 -0600 | [diff] [blame] | 75 | fi |
Zhang Jinnan | 4d8c03a | 2015-08-20 10:00:20 -0400 | [diff] [blame] | 76 | fi |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 77 | } |
| 78 | |
| 79 | # restart the rpc backend |
Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 80 | function restart_rpc_backend { |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 81 | if is_service_enabled rabbit; then |
| 82 | # Start rabbitmq-server |
| 83 | echo_summary "Starting RabbitMQ" |
Ben Nemec | ec5918f | 2014-01-30 16:07:23 +0000 | [diff] [blame] | 84 | # NOTE(bnemec): Retry initial rabbitmq configuration to deal with |
| 85 | # the fact that sometimes it fails to start properly. |
Ian Wienand | 64b56a5 | 2014-12-16 09:53:36 +1100 | [diff] [blame] | 86 | # Reference: https://bugzilla.redhat.com/show_bug.cgi?id=1144100 |
Atsushi SAKAI | fe7b56c | 2015-11-13 17:06:16 +0900 | [diff] [blame] | 87 | # NOTE(tonyb): Extend the original retry logic to only restart rabbitmq |
Tony Breeds | 6bc905c | 2015-05-15 12:51:43 +1000 | [diff] [blame] | 88 | # every second time around the loop. |
| 89 | # See: https://bugs.launchpad.net/devstack/+bug/1449056 for details on |
| 90 | # why this is needed. This can bee seen on vivid and Debian unstable |
| 91 | # (May 2015) |
| 92 | # TODO(tonyb): Remove this when Debian and Ubuntu have a fixed systemd |
| 93 | # service file. |
Dean Troyer | 3ef23bc | 2014-07-25 14:56:22 -0500 | [diff] [blame] | 94 | local i |
Tony Breeds | 6bc905c | 2015-05-15 12:51:43 +1000 | [diff] [blame] | 95 | for i in `seq 20`; do |
Ian Wienand | 64b56a5 | 2014-12-16 09:53:36 +1100 | [diff] [blame] | 96 | local rc=0 |
| 97 | |
Tony Breeds | 6bc905c | 2015-05-15 12:51:43 +1000 | [diff] [blame] | 98 | [[ $i -eq "20" ]] && die $LINENO "Failed to set rabbitmq password" |
Ian Wienand | 64b56a5 | 2014-12-16 09:53:36 +1100 | [diff] [blame] | 99 | |
Tony Breeds | 6bc905c | 2015-05-15 12:51:43 +1000 | [diff] [blame] | 100 | if [[ $(( i % 2 )) == "0" ]] ; then |
| 101 | restart_service rabbitmq-server |
| 102 | fi |
Ian Wienand | 64b56a5 | 2014-12-16 09:53:36 +1100 | [diff] [blame] | 103 | |
| 104 | rabbit_setuser "$RABBIT_USERID" "$RABBIT_PASSWORD" || rc=$? |
| 105 | if [ $rc -ne 0 ]; then |
| 106 | continue |
| 107 | fi |
| 108 | |
Ben Nemec | ec5918f | 2014-01-30 16:07:23 +0000 | [diff] [blame] | 109 | # change the rabbit password since the default is "guest" |
Ian Wienand | 64b56a5 | 2014-12-16 09:53:36 +1100 | [diff] [blame] | 110 | sudo rabbitmqctl change_password \ |
| 111 | $RABBIT_USERID $RABBIT_PASSWORD || rc=$? |
| 112 | if [ $rc -ne 0 ]; then |
| 113 | continue; |
| 114 | fi |
| 115 | |
| 116 | break |
Ben Nemec | ec5918f | 2014-01-30 16:07:23 +0000 | [diff] [blame] | 117 | done |
Jens Harbott | 81f67fd | 2017-08-29 09:52:58 +0000 | [diff] [blame] | 118 | # NOTE(frickler): Remove the default guest user |
| 119 | sudo rabbitmqctl delete_user guest || true |
Dan Smith | 6f0205b | 2017-02-22 05:59:30 -0800 | [diff] [blame] | 120 | fi |
| 121 | } |
| 122 | |
| 123 | # adds a vhost to the rpc backend |
| 124 | function rpc_backend_add_vhost { |
| 125 | local vhost="$1" |
| 126 | if is_service_enabled rabbit; then |
| 127 | if [ -z `sudo rabbitmqctl list_vhosts | grep $vhost` ]; then |
| 128 | sudo rabbitmqctl add_vhost $vhost |
| 129 | sudo rabbitmqctl set_permissions -p $vhost $RABBIT_USERID ".*" ".*" ".*" |
Kieran Spear | fb2a3ae | 2013-03-11 23:55:49 +0000 | [diff] [blame] | 130 | fi |
Dan Smith | 6f0205b | 2017-02-22 05:59:30 -0800 | [diff] [blame] | 131 | else |
| 132 | echo 'RPC backend does not support vhosts' |
| 133 | return 1 |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 134 | fi |
| 135 | } |
| 136 | |
Kenneth Giusti | b645904 | 2017-08-04 18:08:37 -0400 | [diff] [blame] | 137 | # Returns the address of the RPC backend in URL format. |
gordon chung | b6197e6 | 2015-02-12 15:33:35 -0500 | [diff] [blame] | 138 | function get_transport_url { |
Mehdi Abaakouk | 6176ae6 | 2016-05-18 12:10:08 +0200 | [diff] [blame] | 139 | local virtual_host=$1 |
Sean Dague | 37eca48 | 2015-06-16 07:19:22 -0400 | [diff] [blame] | 140 | if is_service_enabled rabbit || { [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; }; then |
Mehdi Abaakouk | 6176ae6 | 2016-05-18 12:10:08 +0200 | [diff] [blame] | 141 | echo "rabbit://$RABBIT_USERID:$RABBIT_PASSWORD@$RABBIT_HOST:5672/$virtual_host" |
gordon chung | b6197e6 | 2015-02-12 15:33:35 -0500 | [diff] [blame] | 142 | fi |
| 143 | } |
| 144 | |
Kenneth Giusti | b645904 | 2017-08-04 18:08:37 -0400 | [diff] [blame] | 145 | # Returns the address of the Notification backend in URL format. This |
| 146 | # should be used to set the transport_url option in the |
| 147 | # oslo_messaging_notifications group. |
Thomas Herve | 26e431d | 2017-04-13 14:27:35 +0200 | [diff] [blame] | 148 | function get_notification_url { |
| 149 | local virtual_host=$1 |
| 150 | if is_service_enabled rabbit || { [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; }; then |
| 151 | echo "rabbit://$RABBIT_USERID:$RABBIT_PASSWORD@$RABBIT_HOST:5672/$virtual_host" |
| 152 | fi |
| 153 | } |
| 154 | |
Atsushi SAKAI | fe7b56c | 2015-11-13 17:06:16 +0900 | [diff] [blame] | 155 | # iniset configuration |
Ian Wienand | aee18c7 | 2014-02-21 15:35:08 +1100 | [diff] [blame] | 156 | function iniset_rpc_backend { |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 157 | local package=$1 |
| 158 | local file=$2 |
Brant Knudson | 2dd110c | 2015-03-14 12:39:14 -0500 | [diff] [blame] | 159 | local section=${3:-DEFAULT} |
Mehdi Abaakouk | 6176ae6 | 2016-05-18 12:10:08 +0200 | [diff] [blame] | 160 | local virtual_host=$4 |
Sean Dague | 37eca48 | 2015-06-16 07:19:22 -0400 | [diff] [blame] | 161 | if is_service_enabled rabbit || { [ -n "$RABBIT_HOST" ] && [ -n "$RABBIT_PASSWORD" ]; }; then |
Mehdi Abaakouk | 6176ae6 | 2016-05-18 12:10:08 +0200 | [diff] [blame] | 162 | iniset $file $section transport_url $(get_transport_url "$virtual_host") |
Mehdi Abaakouk | 7cf7a8f | 2015-04-09 11:46:56 +0200 | [diff] [blame] | 163 | if [ -n "$RABBIT_HEARTBEAT_TIMEOUT_THRESHOLD" ]; then |
| 164 | iniset $file oslo_messaging_rabbit heartbeat_timeout_threshold $RABBIT_HEARTBEAT_TIMEOUT_THRESHOLD |
| 165 | fi |
| 166 | if [ -n "$RABBIT_HEARTBEAT_RATE" ]; then |
| 167 | iniset $file oslo_messaging_rabbit heartbeat_rate $RABBIT_HEARTBEAT_RATE |
| 168 | fi |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 169 | fi |
| 170 | } |
| 171 | |
Abhishek Chanda | d5b74c6 | 2014-12-12 02:15:55 +0530 | [diff] [blame] | 172 | function rabbit_setuser { |
| 173 | local user="$1" pass="$2" found="" out="" |
| 174 | out=$(sudo rabbitmqctl list_users) || |
| 175 | { echo "failed to list users" 1>&2; return 1; } |
| 176 | found=$(echo "$out" | awk '$1 == user { print $1 }' "user=$user") |
| 177 | if [ "$found" = "$user" ]; then |
| 178 | sudo rabbitmqctl change_password "$user" "$pass" || |
| 179 | { echo "failed changing pass for '$user'" 1>&2; return 1; } |
| 180 | else |
| 181 | sudo rabbitmqctl add_user "$user" "$pass" || |
| 182 | { echo "failed changing pass for $user"; return 1; } |
| 183 | fi |
| 184 | sudo rabbitmqctl set_permissions "$user" ".*" ".*" ".*" |
| 185 | } |
| 186 | |
Akihiro MOTOKI | b0f1c38 | 2013-01-13 17:58:12 +0900 | [diff] [blame] | 187 | # Restore xtrace |
Ian Wienand | 523f488 | 2015-10-13 11:03:03 +1100 | [diff] [blame] | 188 | $_XTRACE_RPC_BACKEND |
Sean Dague | 584d90e | 2013-03-29 14:34:53 -0400 | [diff] [blame] | 189 | |
Adam Spiers | 6a5aa7c | 2013-10-24 11:27:02 +0100 | [diff] [blame] | 190 | # Tell emacs to use shell-script-mode |
| 191 | ## Local variables: |
| 192 | ## mode: shell-script |
| 193 | ## End: |