/
commands
executable file
·208 lines (193 loc) · 7.46 KB
/
commands
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#!/usr/bin/env bash
set -o pipefail; [[ $DOKKU_TRACE ]] && set -x
# Check if name is specified
if [[ $1 == rabbitmq:* ]]; then
if [ -z $2 ] && [ $1 != rabbitmq:list ]; then
echo "You must specify an app name"
exit 1
else
APP="$2"
# Check if app exists with the same name
if [[ -d "$DOKKU_ROOT/$APP" ]]; then
APP_EXISTS=true
else
APP_EXISTS=false
fi
fi
if [[ ! -d "$PLUGIN_PATH/link" ]]; then
echo "Link plugin not found... Did you install it from https://github.com/rlaneve/dokku-link?"
exit 1
fi
PLUGIN_NAME="rabbitmq"
PLUGIN_ALIAS="broker"
CONTAINER_NAME="${PLUGIN_NAME}_${APP}"
HOST_DIR="$DOKKU_ROOT/.$PLUGIN_NAME/$APP"
CONTAINER_IMAGE="jlachowski/rabbitmq"
RABBITMQ_PORT=5672
RABBITMQ_ADMIN_PORT=15672
fi
case "$1" in
rabbitmq:create)
# Check if Rabbitmq container is installed
IMAGE=$(docker images | grep "$CONTAINER_IMAGE" | awk '{print $3}')
if [[ -z $IMAGE ]]; then
echo "Rabbitmq image not found... Did you run 'dokku plugins-install' ?"
exit 1
fi
# check for existing container with the same persistent rabbitmq
ID=$(docker ps -a | grep "$CONTAINER_NAME" | awk '{print $1}')
if [[ ! -z "$ID" ]]; then
echo
echo "-----> Container $CONTAINER_NAME already exist. Please use rebuild or delete command"
exit 1
fi
if [[ ! -d "$HOST_DIR" ]]; then
mkdir -p "$HOST_DIR"
fi
# Check if an existing storage volume exists
if [[ -d "$HOST_DIR/volume" ]]; then
echo
echo "-----> Reusing rabbitmq/$APP storage"
else
mkdir -p "$HOST_DIR/volume"
fi
# Generate random password for users
RABBITMQ_PASSWORD=$(< /dev/urandom tr -dc A-Za-z0-9 | head -c 16)
echo $RABBITMQ_PASSWORD > "$HOST_DIR/pwd"
chmod 600 "$HOST_DIR/pwd"
VOLUME="$HOST_DIR/volume:/opt/rabbitmq"
# Stop existing container with the same persistent Rabbitmq
ID=$(docker ps | grep "$CONTAINER_NAME" | awk '{print $1}')
if [[ ! -z "$ID" ]]; then
docker stop $ID > /dev/null
fi
# Launch container
ID=$(docker run -v $VOLUME --name $CONTAINER_NAME -d $CONTAINER_IMAGE /usr/bin/start-rabbitmq.sh $RABBITMQ_PASSWORD)
sleep 1
# Link to a potential existing app
dokku rabbitmq:link $APP $APP
echo
echo "-----> Rabbitmq container created: $CONTAINER_NAME (using $CONTAINER_IMAGE)"
sleep 1
dokku rabbitmq:info $APP
;;
rabbitmq:rebuild)
ID=$(docker ps -a | grep "$CONTAINER_NAME" | awk '{print $1}')
if [[ ! -z "$ID" ]]; then
echo
echo "-----> Stopping & removing $CONTAINER_NAME container"
docker stop $ID > /dev/null
docker rm $ID > /dev/null
fi
dokku rabbitmq:create $APP
;;
rabbitmq:clone)
if $APP_EXISTS; then
# Check argument
if [[ -z $3 ]]; then
echo "You must specify a name for the clone"
exit 1
fi
TARGET_DIR="$DOKKU_ROOT/.$PLUGIN_NAME/$3"
if [[ -d "$TARGET_DIR" ]]; then
echo "Persistent storage for ${PLUGIN_NAME}_$3 already exists"
exit 1
fi
echo
echo "-----> Cloning $PLUGIN_NAME/$APP storage"
#FIXME: fix the access rights issue
#cp -rf "$HOST_DIR" "$TARGET_DIR"
#dokku rabbitmq:rebuild $3 > /dev/null
#echo
#echo "-----> $PLUGIN_NAME/$APP storage cloned to $PLUGIN_NAME/$3"
echo
echo "-----> [Attention]: This command needs access right fix, for now issue following command as root"
echo "cp -rf ${HOST_DIR} ${TARGET_DIR}"
echo
echo "-----> and manualy rebuild ${PLUGIN_NAME}_${3} container"
echo "dokku rabbitmq:rebuild $3"
fi
;;
rabbitmq:delete)
echo
echo "-----> This will permanently remove all the stored data. Are you sure (yes/no)?"
read ANSWER
if [[ $ANSWER == "yes" ]]; then
# Stop the container
ID=$(docker ps -a | grep "$CONTAINER_NAME" | awk '{print $1}')
if [[ ! -z $ID ]]; then
docker stop $ID > /dev/null
docker rm $ID > /dev/null
fi
dokku link:delete "$APP" "$CONTAINER_NAME" "$PLUGIN_ALIAS"
dokku config:unset "$APP" "BROKER_SCHEME" "BROKER_USERNAME" "BROKER_PASSWORD" "BROKER_PATH" "BROKER_HOST" "BROKER_AMQP_PORT" "BROKER_ADMIN_PORT" "BROKER_URL"
# Remove persistent volume
if [[ -d "$HOST_DIR" ]]; then
rm -rf "$HOST_DIR"
echo
echo "-----> Deleted persistent storage for $CONTAINER_NAME"
fi
echo
echo "-----> Deleted RabbitMQ container $CONTAINER_NAME"
fi
;;
rabbitmq:info)
ID=$(docker ps -a | grep "$CONTAINER_NAME" | awk '{print $1}')
IP=$(docker inspect $ID | grep IPAddress | awk '{ print $2 }' | tr -d ',"')
DOCKER_GATEWAY=$(docker inspect $ID | grep Gateway | awk '{ print $2 }' | tr -d ',"')
echo
echo " Host: $IP"
echo " Gateway: $DOCKER_GATEWAY"
echo " Secret AMQP port: $RABBITMQ_PORT"
echo " Secret ADMIN port: $RABBITMQ_ADMIN_PORT"
echo
;;
rabbitmq:link)
if $APP_EXISTS; then
# Check argument
if [[ -z $3 ]]; then
echo "You must specify a container name"
exit 1
fi
CONTAINER_NAME="${PLUGIN_NAME}_$3"
if [[ ! -f "$HOST_DIR/pwd" ]]; then
echo "Rabbitmq is not correctly initialized"
exit 0
fi
ID=$(docker ps -a | grep "$CONTAINER_NAME" | awk '{print $1}')
#IP=$(docker inspect $ID | grep IPAddress | awk '{ print $2 }' | tr -d ',"')
RABBITMQ_PASSWORD=$(cat "$HOST_DIR/pwd")
dokku link:create "$APP" "$CONTAINER_NAME" "$PLUGIN_ALIAS"
# Write BROKER_URL to app's ENV file using dokku command
dokku config:set $APP "BROKER_SCHEME=amqp" "BROKER_USERNAME=admin" "BROKER_PASSWORD=$RABBITMQ_PASSWORD" "BROKER_PATH=//" "BROKER_HOST=\${BROKER_PORT_${RABBITMQ_PORT}_TCP_ADDR}" "BROKER_AMQP_PORT=\${BROKER_PORT_${RABBITMQ_PORT}_TCP_PORT}" "BROKER_ADMIN_PORT=\${BROKER_PORT_${RABBITMQ_ADMIN_PORT}_TCP_PORT}" "BROKER_URL=amqp://\${BROKER_USERNAME}:\${BROKER_PASSWORD}@\${BROKER_PORT_${RABBITMQ_PORT}_TCP_ADDR}:\${BROKER_PORT_${RABBITMQ_ADMIN_PORT}_TCP_PORT}//"
echo
echo "-----> $APP linked to $CONTAINER_NAME container"
fi
;;
rabbitmq:logs)
ID=$(docker ps -a | grep "$CONTAINER_NAME" | awk '{print $1}')
docker logs $ID | tail -n 100
;;
rabbitmq:list)
CONTAINERS=$(ls -1 "$DOKKU_ROOT/.$PLUGIN_NAME/" | awk '{print $1}')
echo "RabbitMQ containers:"
for CONTAINER in $CONTAINERS; do
echo " - $CONTAINER"
done
;;
help)
cat && cat<<EOF
rabbitmq:create <app> Create a RabbitMQ container for <app>
rabbitmq:clone <app> <trg> Clone RabbitMQ container of <app> for <trg>
rabbitmq:rebuild <app> Rebuild RabbitMQ container of <app> (keep persistend data)
rabbitmq:delete <app> Delete specified RabbitMQ container for <app>
rabbitmq:info <app> Display <app> RabbitMQ container informations
rabbitmq:link <app> <rabbit> Link an app to a RabbitMQ container
rabbitmq:list Display list of RabbitMQ containers
rabbitmq:logs <app> Display last logs from <app> RabbitMQ container
EOF
;;
*)
exit $DOKKU_NOT_IMPLEMENTED_EXIT
;;
esac