Merge pull request #358 from soulshake/no-env-in-bootstrapped-image
[discourse_docker.git] / launcher
CommitLineData
ace450bd 1#!/bin/bash
7e738616 2
5cb39519 3usage () {
c2d3ee4a 4 echo "Usage: launcher COMMAND CONFIG [--skip-prereqs] [--docker-args STRING]"
5cb39519
JA
5 echo "Commands:"
6 echo " start: Start/initialize a container"
7 echo " stop: Stop a running container"
8 echo " restart: Restart a container"
9 echo " destroy: Stop and remove a container"
4a5acf8c 10 echo " enter: Open a shell to run commands inside the container"
c2d3ee4a 11 echo " logs: View the Docker logs for a container"
5cb39519
JA
12 echo " bootstrap: Bootstrap a container for the config based on a template"
13 echo " rebuild: Rebuild a container (destroy old, bootstrap, start new)"
14 echo " cleanup: Remove all containers that have stopped for > 24 hours"
15 echo
16 echo "Options:"
1f656469 17 echo " --skip-prereqs Don't check launcher prerequisites"
1f656469 18 echo " --docker-args Extra arguments to pass when running docker"
cad2919f 19 echo " --skip-mac-address Don't assign a mac address"
5cb39519
JA
20 exit 1
21}
22
7e738616
S
23command=$1
24config=$2
65573a0e 25user_args=""
87c4f221 26
1f656469 27while [ ${#} -gt 0 ]; do
65573a0e 28 case "${1}" in
19e3a6c0
S
29 --debug)
30 DEBUG="1"
31 ;;
1f656469 32 --skip-prereqs)
4f36bb43 33 SKIP_PREREQS="1"
1f656469 34 ;;
cad2919f
GXT
35 --skip-mac-address)
36 SKIP_MAC_ADDRESS="1"
37 ;;
1f656469
GXT
38 --docker-args)
39 user_args="$2"
40 shift
41 ;;
1f656469
GXT
42 esac
43
44 shift 1
45done
55d17203 46
87756d6d
EH
47# Docker doesn't like uppercase characters, spaces or special characters, catch it now before we build everything out and then find out
48re='[A-Z/ !@#$%^&*()+~`=]'
49if [[ $config =~ $re ]];
50 then
8877f99e 51 echo
87756d6d
EH
52 echo "ERROR: Config name must not contain upper case characters, spaces or special characters. Correct config name and rerun $0."
53 echo
54 exit 1
55fi
56
7936ebaa 57cd "$(dirname "$0")"
55d17203 58
a28dd1dc
JA
59docker_min_version='1.8.0'
60docker_rec_version='1.8.0'
6828238a
JP
61git_min_version='1.8.0'
62git_rec_version='1.8.0'
60668406 63
8dea575c 64config_file=containers/"$config".yml
5201a40c 65cidbootstrap=cids/"$config"_bootstrap.cid
5efded6a 66local_discourse=local_discourse
e7696e0d 67image=discourse/base:2.0.20170531
4807b1b8 68docker_path=`which docker.io || which docker`
6828238a 69git_path=`which git`
8877f99e 70
e0fd1f5b
TB
71if [ "${SUPERVISED}" = "true" ]; then
72 restart_policy="--restart=no"
73 attach_on_start="-a"
74 attach_on_run="-a stdout -a stderr"
75else
76 attach_on_run="-d"
77fi
78
f2a3edee
AY
79if [ -n "$DOCKER_HOST" ]; then
80 docker_ip=`sed -e 's/^tcp:\/\/\(.*\):.*$/\1/' <<< "$DOCKER_HOST"`
81elif [ -x "$(which ip 2>/dev/null)" ]; then
813fef38 82 docker_ip=`ip addr show docker0 | \
03bb0735
LG
83 grep 'inet ' | \
84 awk '{ split($2,a,"/"); print a[1] }';`
85else
813fef38 86 docker_ip=`ifconfig | \
03bb0735
LG
87 grep -B1 "inet addr" | \
88 awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' | \
89 grep docker0 | \
90 awk -F: '{ print $3 }';`
91fi
80c11be3 92
60668406
DP
93compare_version() {
94 declare -a ver_a
95 declare -a ver_b
96 IFS=. read -a ver_a <<< "$1"
97 IFS=. read -a ver_b <<< "$2"
98
99 while [[ -n $ver_a ]]; do
100 if (( ver_a > ver_b )); then
101 return 0
102 elif (( ver_b > ver_a )); then
103 return 1
104 else
105 unset ver_a[0]
106 ver_a=("${ver_a[@]}")
107 unset ver_b[0]
108 ver_b=("${ver_b[@]}")
109 fi
110 done
111 return 1 # They are equal
112}
113
665468eb
JA
114
115install_docker() {
c2d3ee4a 116 echo "Docker is not installed, you will need to install Docker in order to run Launcher"
bf6d49b5 117 echo "See https://docs.docker.com/installation/"
665468eb
JA
118 exit 1
119}
120
87c4f221 121check_prereqs() {
794e44d5
GXT
122
123 if [ -z $docker_path ]; then
665468eb
JA
124 install_docker
125 fi
a3e18d95 126
e741295a 127 # 1. docker daemon running?
30835a52
S
128 # we send stderr to /dev/null cause we don't care about warnings,
129 # it usually complains about swap which does not matter
130 test=`$docker_path info 2> /dev/null`
e741295a
MB
131 if [[ $? -ne 0 ]] ; then
132 echo "Cannot connect to the docker daemon - verify it is running and you have access"
133 exit 1
134 fi
135
90287f8e 136 # 2. running an approved storage driver?
7644adb7 137 if ! $docker_path info 2> /dev/null | egrep -q '^Storage Driver: (aufs|btrfs|zfs|overlay|overlay2)$'; then
90287f8e 138 echo "Your Docker installation is not using a supported storage driver. If we were to proceed you may have a broken install."
7644adb7 139 echo "aufs is the recommended storage driver, although zfs/btrfs/overlay and overlay2 may work as well."
90287f8e
MP
140 echo "Other storage drivers are known to be problematic."
141 echo "You can tell what filesystem you are using by running \"docker info\" and looking at the 'Storage Driver' line."
5dfdf9a3 142 echo
90287f8e
MP
143 echo "If you wish to continue anyway using your existing unsupported storage driver,"
144 echo "read the source code of launcher and figure out how to bypass this check."
48f22d14 145 exit 1
a3e18d95
S
146 fi
147
60668406
DP
148 # 3. running recommended docker version
149 test=($($docker_path --version)) # Get docker version string
150 test=${test[2]//,/} # Get version alone and strip comma if exists
a3e18d95 151
87c4f221 152 # At least minimum docker version
cf00fce0 153 if compare_version "${docker_min_version}" "${test}"; then
60668406 154 echo "ERROR: Docker version ${test} not supported, please upgrade to at least ${docker_min_version}, or recommended ${docker_rec_version}"
a3e18d95
S
155 exit 1
156 fi
157
87c4f221 158 # Recommend newer docker version
60668406
DP
159 if compare_version "${docker_rec_version}" "${test}"; then
160 echo "WARNING: Docker version ${test} deprecated, recommend upgrade to ${docker_rec_version} or newer."
161 fi
162
405948ee
S
163 # 4. discourse docker image is downloaded
164 test=`$docker_path images | awk '{print $1 ":" $2 }' | grep "$image"`
165
166 if [ -z "$test" ]; then
167 echo
168 echo "WARNING: We are about to start downloading the Discourse base image"
169 echo "This process may take anywhere between a few minutes to an hour, depending on your network speed"
170 echo
171 echo "Please be patient"
172 echo
405948ee 173 fi
405948ee 174
6828238a
JP
175 # 5. running recommended git version
176 test=($($git_path --version)) # Get git version string
177 test=${test[2]//,/} # Get version alone and strip comma if exists
178
179 # At least minimum version
180 if compare_version "${git_min_version}" "${test}"; then
181 echo "ERROR: Git version ${test} not supported, please upgrade to at least ${git_min_version}, or recommended ${git_rec_version}"
182 exit 1
183 fi
184
185 # Recommend best version
186 if compare_version "${git_rec_version}" "${test}"; then
187 echo "WARNING: Git version ${test} deprecated, recommend upgrade to ${git_rec_version} or newer."
188 fi
189
190 # 6. able to attach stderr / out / tty
e02c1511 191 test=`$docker_path run $user_args -i --rm -a stdout -a stderr $image echo working`
a3e18d95
S
192 if [[ "$test" =~ "working" ]] ; then : ; else
193 echo "Your Docker installation is not working correctly"
194 echo
195 echo "See: https://meta.discourse.org/t/docker-error-on-bootstrap/13657/18?u=sam"
196 exit 1
197 fi
4770834b 198
6e784be6
MP
199}
200
6828238a 201
1f656469 202if [ -z "$SKIP_PREREQS" ] ; then
87c4f221 203 check_prereqs
55d17203 204fi
a3e18d95 205
60f9f04c
S
206host_run() {
207 read -r -d '' env_ruby << 'RUBY'
208 require 'yaml'
209
210 input = STDIN.readlines.join
211 yaml = YAML.load(input)
212
213 if host_run = yaml['host_run']
214 params = yaml['params'] || {}
215 host_run.each do |run|
216 params.each do |k,v|
217 run = run.gsub("$#{k}", v)
218 end
219 STDOUT.write "#{run}--SEP--"
220 end
221 end
222RUBY
223
e02c1511 224 host_run=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e "$env_ruby"`
60f9f04c
S
225
226 while [ "$host_run" ] ; do
227 iter=${host_run%%--SEP--*}
228 echo
229 echo "Host run: $iter"
230 $iter || exit 1
231 echo
232 host_run="${host_run#*--SEP--}"
233 done
234}
235
236
d90671f3 237set_volumes() {
e02c1511 238 volumes=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
d90671f3
SS
239 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['volumes'].map{|v| '-v ' << v['volume']['host'] << ':' << v['volume']['guest'] << ' '}.join"`
240}
241
41daa523 242set_links() {
e02c1511 243 links=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
41daa523 244 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['links'].map{|l| '--link ' << l['link']['name'] << ':' << l['link']['alias'] << ' '}.join"`
245}
246
06310c73
GXT
247find_templates() {
248 local templates=`cat $1 | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
7f77c274
SS
249 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['templates']"`
250
06310c73
GXT
251 local arrTemplates=${templates// / }
252
2ec550f7 253 if [ ! -z "$templates" ]; then
06310c73
GXT
254 for template in "${arrTemplates[@]}"
255 do
256 local nested_templates=$(find_templates $template)
257
258 if [ ! -z "$nested_templates" ]; then
259 templates="$templates $nested_templates"
260 fi
261 done
262
263 echo $templates
264 else
265 echo ""
266 fi
267}
268
269set_template_info() {
270 templates=$(find_templates $config_file)
271
7f77c274
SS
272 arrTemplates=(${templates// / })
273 config_data=$(cat $config_file)
274
275 input="hack: true"
276
7f77c274
SS
277 for template in "${arrTemplates[@]}"
278 do
279 [ ! -z $template ] && {
280 input="$input _FILE_SEPERATOR_ $(cat $template)"
281 }
282 done
283
284 # we always want our config file last so it takes priority
285 input="$input _FILE_SEPERATOR_ $config_data"
286
287 read -r -d '' env_ruby << 'RUBY'
288 require 'yaml'
289
290 input=STDIN.readlines.join
3cb3d9c4
S
291 # default to UTF-8 for the dbs sake
292 env = {'LANG' => 'en_US.UTF-8'}
7f77c274
SS
293 input.split('_FILE_SEPERATOR_').each do |yml|
294 yml.strip!
295 begin
296 env.merge!(YAML.load(yml)['env'] || {})
f3824347 297 rescue Psych::SyntaxError => e
298 puts e
299 puts "*ERROR."
7f77c274
SS
300 rescue => e
301 puts yml
302 p e
303 end
304 end
4b563ee8 305 puts env.map{|k,v| "-e\n#{k}=#{v}" }.join("\n")
7f77c274
SS
306RUBY
307
e02c1511 308 raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$env_ruby"`
4b563ee8
SS
309
310 env=()
f3824347 311 ok=1
4b563ee8 312 while read i; do
f3824347 313 if [ "$i" == "*ERROR." ]; then
314 ok=0
315 elif [ -n "$i" ]; then
16f2d250
S
316 env[${#env[@]}]=$i
317 fi
4b563ee8
SS
318 done <<< "$raw"
319
f3824347 320 if [ "$ok" -ne 1 ]; then
321 echo "${env[@]}"
c2d3ee4a 322 echo "YAML syntax error. Please check your containers/*.yml config files."
f3824347 323 exit 1
324 fi
762d9bbf
MP
325
326 read -r -d '' labels_ruby << 'RUBY'
327 require 'yaml'
328
329 input=STDIN.readlines.join
330 # default to UTF-8 for the dbs sake
331 labels = {}
332 input.split('_FILE_SEPERATOR_').each do |yml|
333 yml.strip!
334 begin
335 labels.merge!(YAML.load(yml)['labels'] || {})
336 rescue Psych::SyntaxError => e
337 puts e
338 puts "*ERROR."
339 rescue => e
340 puts yml
341 p e
342 end
343 end
344 puts labels.map{|k,v| "-l\n#{k}=#{v}" }.join("\n")
345RUBY
346
347 raw=`exec echo "$input" | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e "$labels_ruby"`
348
349 labels=()
350 ok=1
351 while read i; do
352 if [ "$i" == "*ERROR." ]; then
353 ok=0
354 elif [ -n "$i" ]; then
355 labels[${#labels[@]}]=$i
356 fi
357 done <<< "$raw"
358
359 if [ "$ok" -ne 1 ]; then
360 echo "${labels[@]}"
361 echo "YAML syntax error. Please check your containers/*.yml config files."
362 exit 1
363 fi
7f77c274
SS
364}
365
665468eb 366if [ -z $docker_path ]; then
52388b87 367 install_docker
665468eb 368fi
52388b87 369
de869404 370[ "$command" == "cleanup" ] && {
c692f743
L
371 echo
372 echo "The following command will"
373 echo "- Delete all docker images for old containers"
374 echo "- Delete all stopped and orphan containers"
375 echo
376 read -p "Are you sure (Y/n): " -n 1 -r && echo
377 if [[ $REPLY =~ ^[Yy]$ || ! $REPLY ]]
378 then
30835a52 379 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
29a35d1b 380 echo "Starting Cleanup (bytes free $space)"
30835a52 381
29a35d1b 382 STATE_DIR=./.gc-state scripts/docker-gc
30835a52 383
29a35d1b
S
384 space=$(df /var/lib/docker | awk '{ print $4 }' | grep -v Available)
385 echo "Finished Cleanup (bytes free $space)"
30835a52 386
c692f743 387 else
30835a52 388 exit 1
c692f743 389 fi
a8b66f98
L
390 exit 0
391}
5f803fb4 392
65573a0e
GXT
393if [ -z "$command" -a -z "$config" ]; then
394 usage
395fi
396
397if [ ! "$command" == "setup" ]; then
398 if [[ ! -e $config_file ]]; then
7e738616 399 echo "Config file was not found, ensure $config_file exists"
5dfdf9a3 400 echo
71680b16 401 echo "Available configs ( `cd containers && ls -dm *.yml | tr -s '\n' ' ' | awk '{ gsub(/\.yml/, ""); print }'`)"
7e738616 402 exit 1
65573a0e 403 fi
7e738616
S
404fi
405
e2ed1fb6
S
406docker_version=($($docker_path --version))
407docker_version=${test[2]//,/}
69545efd 408restart_policy=${restart_policy:---restart=always}
e2ed1fb6 409
30835a52 410set_existing_container(){
295e8f19 411 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
337a89aa
S
412}
413
665468eb 414run_stop() {
337a89aa 415
30835a52 416 set_existing_container
60f9f04c 417
30835a52 418 if [ ! -z $existing ]
337a89aa 419 then
30835a52
S
420 (
421 set -x
422 $docker_path stop -t 10 $config
423 )
337a89aa 424 else
30835a52
S
425 echo "$config was not started !"
426 exit 1
427 fi
428}
337a89aa 429
8877f99e
S
430set_run_image() {
431 run_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
432 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['run_image']"`
433
434 if [ -z "$run_image" ]; then
435 run_image="$local_discourse/$config"
436 fi
437}
438
439set_boot_command() {
440 boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
441 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['boot_command']"`
442
443 if [ -z "$boot_command" ]; then
444
445 no_boot_command=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
446 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['no_boot_command']"`
447
448 if [ -z "$no_boot_command" ]; then
449 boot_command="/sbin/boot"
450 fi
451 fi
452}
453
665468eb 454run_start() {
337a89aa 455
295e8f19
S
456 existing=`$docker_path ps | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
457 echo $existing
30835a52
S
458 if [ ! -z $existing ]
459 then
460 echo "Nothing to do, your container has already started!"
eac33309 461 exit 0
30835a52
S
462 fi
463
295e8f19 464 existing=`$docker_path ps -a | awk '{ print $1, $(NF) }' | grep " $config$" | awk '{ print $1 }'`
30835a52
S
465 if [ ! -z $existing ]
466 then
467 echo "starting up existing container"
468 (
469 set -x
470 $docker_path start $config
471 )
472 exit 0
473 fi
474
475 host_run
1f656469 476
afec9a51
GXT
477 ports=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
478 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['expose'].map{|p| \"-p #{p}\"}.join(' ')"`
479
8b617e6e
PG
480 docker_args=`cat $config_file | $docker_path run $user_args --rm -i -a stdout -a stdin $image ruby -e \
481 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['docker_args']"`
482
30835a52
S
483 set_template_info
484 set_volumes
485 set_links
8877f99e
S
486 set_run_image
487 set_boot_command
30835a52 488
c6dd6f9d
FB
489 # get hostname and settings from container configuration
490 for envar in "${env[@]}"
491 do
492 if [[ $envar == DOCKER_USE_HOSTNAME* ]] || [[ $envar == DISCOURSE_HOSTNAME* ]]
493 then
494 # use as environment variable
495 eval $envar
496 fi
497 done
498
30835a52 499 (
c834fdd1 500 hostname=`hostname -s`
c6dd6f9d
FB
501 # overwrite hostname
502 if [ "$DOCKER_USE_HOSTNAME" = "true" ]
503 then
504 hostname=$DISCOURSE_HOSTNAME
505 else
506 hostname=$hostname-$config
507 fi
508
a0606001
S
509 # we got to normalize so we only have allowed strings, this is more comprehensive but lets see how bash does first
510 # hostname=`$docker_path run $user_args --rm $image ruby -e 'print ARGV[0].gsub(/[^a-zA-Z-]/, "-")' $hostname`
511 # docker added more hostname rules
fd2e7637 512 hostname=${hostname//_/-}
a0606001 513
cad2919f
GXT
514
515 if [ -z "$SKIP_MAC_ADDRESS" ] ; then
516 mac_address="--mac-address $($docker_path run $user_args -i --rm -a stdout -a stderr $image /bin/sh -c "echo $hostname | md5sum | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/'")"
517 fi
d2a86ee1 518
30835a52 519 set -x
e00fca6e 520 $docker_path run $links $attach_on_run $restart_policy "${env[@]}" "${labels[@]}" -h "$hostname" \
bf268008 521 -e DOCKER_HOST_IP="$docker_ip" --name $config -t $ports $volumes $mac_address $docker_args $user_args \
d2a86ee1 522 $run_image $boot_command
30835a52
S
523
524 )
525 exit 0
337a89aa
S
526
527}
528
ec8f8b83 529
665468eb 530run_bootstrap() {
794e44d5 531
5dfdf9a3 532 # I got no frigging clue what this does, ask Sam Saffron. It RUNS STUFF ON THE HOST I GUESS?
60f9f04c
S
533 host_run
534
680dd4ea
S
535 # Is the image available?
536 # If not, pull it here so the user is aware what's happening.
4807b1b8 537 $docker_path history $image >/dev/null 2>&1 || $docker_path pull $image
88126eba 538
680dd4ea 539 set_template_info
93149421 540
e02c1511 541 base_image=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 542 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['base_image']"`
93149421 543
e02c1511 544 update_pups=`cat $config_file | $docker_path run $user_args --rm -i -a stdin -a stdout $image ruby -e \
680dd4ea 545 "require 'yaml'; puts YAML.load(STDIN.readlines.join)['update_pups']"`
b9c7b50e 546
680dd4ea
S
547 if [[ ! X"" = X"$base_image" ]]; then
548 image=$base_image
549 fi
b9c7b50e 550
680dd4ea 551 set_volumes
41daa523 552 set_links
b9c7b50e 553
680dd4ea 554 rm -f $cidbootstrap
d90671f3 555
c219fcb9 556 envs=$(echo "${env[@]}" | awk '{gsub("-e ", "");print}')
680dd4ea
S
557 run_command="cd /pups &&"
558 if [[ ! "false" = $update_pups ]]; then
559 run_command="$run_command git pull &&"
560 fi
c219fcb9 561 run_command="$run_command $envs /pups/bin/pups --stdin"
2162f1d4 562
680dd4ea 563 echo $run_command
b9c7b50e 564
b4ab14c2 565 unset ERR
c219fcb9 566 (exec echo "$input" | $docker_path run $user_args $links -e DOCKER_HOST_IP="$docker_ip" --cidfile $cidbootstrap -i -a stdin -a stdout -a stderr $volumes $image \
b4ab14c2
S
567 /bin/bash -c "$run_command") || ERR=$?
568
569 unset FAILED
570 # magic exit code that indicates a retry
571 if [[ "$ERR" == 77 ]]; then
382c8e40
S
572 $docker_path rm `cat $cidbootstrap`
573 rm $cidbootstrap
b4ab14c2 574 exit 77
382c8e40 575 elif [[ "$ERR" > 0 ]]; then
b4ab14c2
S
576 FAILED=TRUE
577 fi
19e3a6c0
S
578
579 if [[ $FAILED = "TRUE" ]]; then
580 if [[ ! -z "$DEBUG" ]]; then
581 $docker_path commit `cat $cidbootstrap` $local_discourse/$config-debug || echo 'FAILED TO COMMIT'
582 echo "** DEBUG ** Maintaining image for diagnostics $local_discourse/$config-debug"
583 fi
88126eba 584
19e3a6c0
S
585 $docker_path rm `cat $cidbootstrap`
586 rm $cidbootstrap
587 echo "** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one"
588 exit 1
589 fi
9fb5f2d3 590
680dd4ea 591 sleep 5
2162f1d4 592
4807b1b8
MB
593 $docker_path commit `cat $cidbootstrap` $local_discourse/$config || echo 'FAILED TO COMMIT'
594 $docker_path rm `cat $cidbootstrap` && rm $cidbootstrap
680dd4ea 595}
9fb5f2d3 596
8877f99e
S
597
598
680dd4ea
S
599case "$command" in
600 bootstrap)
680dd4ea 601 run_bootstrap
2dd2e330 602 echo "Successfully bootstrapped, to startup use ./launcher start $config"
4b3aebe1 603 exit 0
5f803fb4 604 ;;
1acce9e4 605
2fc6ff36 606 enter)
0c456e8c 607 exec $docker_path exec -it $config /bin/bash --login
2fc6ff36
S
608 ;;
609
5f803fb4 610 stop)
337a89aa
S
611 run_stop
612 exit 0
5f803fb4 613 ;;
7e738616 614
5f803fb4 615 logs)
7e738616 616
30835a52
S
617 $docker_path logs $config
618 exit 0
5f803fb4 619 ;;
7e738616 620
337a89aa
S
621 restart)
622 run_stop
623 run_start
624 exit 0
625 ;;
80c11be3 626
337a89aa
S
627 start)
628 run_start
629 exit 0
5f803fb4 630 ;;
7e738616 631
680dd4ea 632 rebuild)
4b6456ef 633 if [ "$(git symbolic-ref --short HEAD)" == "master" ]; then
c2d3ee4a 634 echo "Ensuring launcher is up to date"
098533cb
S
635
636 git remote update
637
638 LOCAL=$(git rev-parse @)
639 REMOTE=$(git rev-parse @{u})
640 BASE=$(git merge-base @ @{u})
641
642 if [ $LOCAL = $REMOTE ]; then
c2d3ee4a 643 echo "Launcher is up-to-date"
098533cb
S
644
645 elif [ $LOCAL = $BASE ]; then
c2d3ee4a 646 echo "Updating Launcher"
098533cb 647 git pull || (echo 'failed to update' && exit 1)
88ee2e35 648
8100fab0
PD
649 for (( i=${#BASH_ARGV[@]}-1,j=0; i>=0,j<${#BASH_ARGV[@]}; i--,j++ ))
650 do
651 args[$j]=${BASH_ARGV[$i]}
652 done
653 exec /bin/bash $0 "${args[@]}" # $@ is empty, because of shift at the beginning. Use BASH_ARGV instead.
098533cb
S
654
655 elif [ $REMOTE = $BASE ]; then
c2d3ee4a 656 echo "Your version of Launcher is ahead of origin"
098533cb
S
657
658 else
c2d3ee4a 659 echo "Launcher has diverged source, this is only expected in Dev mode"
098533cb
S
660 fi
661
4b6456ef 662 fi
30835a52
S
663
664 set_existing_container
665
666 if [ ! -z $existing ]
680dd4ea
S
667 then
668 echo "Stopping old container"
30835a52
S
669 (
670 set -x
671 $docker_path stop -t 10 $config
672 )
680dd4ea
S
673 fi
674
675 run_bootstrap
676
30835a52 677 if [ ! -z $existing ]
680dd4ea 678 then
30835a52
S
679 echo "Removing old container"
680 (
681 set -x
682 $docker_path rm $config
683 )
680dd4ea
S
684 fi
685
686 run_start
687 exit 0
688 ;;
689
7e738616 690
5f803fb4 691 destroy)
30835a52
S
692 (set -x; $docker_path stop -t 10 $config && $docker_path rm $config) || (echo "$config was not found" && exit 0)
693 exit 0
5f803fb4
SS
694 ;;
695esac
7e738616 696
5f803fb4 697usage