5 if ! test -d /sys/fs/cgroup ; then
6 echo "Arvbox requires cgroups to be mounted at /sys/fs/cgroup in order to use"
7 echo "Docker-in-Docker. Older operating systems that put cgroups in other"
8 echo "places (such as /cgroup) are not supported."
12 if ! which docker >/dev/null 2>/dev/null ; then
13 echo "Arvbox requires Docker. To install, run the following command as root:"
14 echo "curl -sSL https://get.docker.com/ | sh"
18 if test -z "$ARVBOX_DOCKER" ; then
19 if which greadlink >/dev/null 2>/dev/null ; then
20 ARVBOX_DOCKER=$(greadlink -f $(dirname $0)/../lib/arvbox/docker)
22 ARVBOX_DOCKER=$(readlink -f $(dirname $0)/../lib/arvbox/docker)
26 if test -z "$ARVBOX_CONTAINER" ; then
27 ARVBOX_CONTAINER=arvbox
30 if test -z "$ARVBOX_BASE" ; then
31 ARVBOX_BASE="$HOME/.arvbox"
34 if test -z "$ARVBOX_DATA" ; then
35 ARVBOX_DATA="$ARVBOX_BASE/$ARVBOX_CONTAINER"
38 if test -z "$ARVADOS_ROOT" ; then
39 ARVADOS_ROOT="$ARVBOX_DATA/arvados"
42 if test -z "$ARVADOS_DEV_ROOT" ; then
43 ARVADOS_DEV_ROOT="$ARVBOX_DATA/arvados-dev"
46 if test -z "$SSO_ROOT" ; then
47 SSO_ROOT="$ARVBOX_DATA/sso-devise-omniauth-provider"
50 PG_DATA="$ARVBOX_DATA/postgres"
51 VAR_DATA="$ARVBOX_DATA/var"
52 PASSENGER="$ARVBOX_DATA/passenger"
53 GEMS="$ARVBOX_DATA/gems"
56 docker inspect $ARVBOX_CONTAINER | grep \"IPAddress\" | head -n1 | tr -d ' ":,\n' | cut -c10-
61 OVERRIDE=$(docker exec -i $ARVBOX_CONTAINER cat /var/run/localip_override 2>/dev/null)
64 if test "$CODE" = 0 ; then
72 if test -f ~/.config/arvados/$ARVBOX_CONTAINER.conf ; then
73 sed "s/ARVADOS_API_HOST=.*/ARVADOS_API_HOST=$(gethost):8000/" <$HOME/.config/arvados/$ARVBOX_CONTAINER.conf >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf.tmp
74 mv ~/.config/arvados/$ARVBOX_CONTAINER.conf.tmp ~/.config/arvados/$ARVBOX_CONTAINER.conf
76 mkdir -p $HOME/.config/arvados
77 cat >$HOME/.config/arvados/$ARVBOX_CONTAINER.conf <<EOF
78 ARVADOS_API_HOST=$(gethost):8000
80 ARVADOS_API_HOST_INSECURE=true
86 FF=/tmp/arvbox-fifo-$$
88 docker logs -f $ARVBOX_CONTAINER > $FF &
92 if echo $line | grep "Workbench is running at" >/dev/null ; then
98 if test -n "$localip" ; then
99 echo "export ARVADOS_API_HOST=$localip:8000"
101 echo "export ARVADOS_API_HOST=$(gethost):8000"
106 if docker ps -a | grep -E "$ARVBOX_CONTAINER$" -q ; then
107 echo "Container $ARVBOX_CONTAINER is already running, use stop, restart or rebuild"
111 if echo "$1" | grep '^public' ; then
112 if test -n "$ARVBOX_PUBLISH_IP" ; then
113 localip=$ARVBOX_PUBLISH_IP
115 defaultdev=$(/sbin/ip route|awk '/default/ { print $5 }')
116 localip=$(ip addr show $defaultdev | grep 'inet ' | sed 's/ *inet \(.*\)\/.*/\1/')
119 echo $localip > $iptemp
121 PUBLIC="--volume=$iptemp:/var/run/localip_override
127 --publish=25100:25100
128 --publish=25107:25107
129 --publish=25108:25108
135 if echo "$1" | grep 'demo$' ; then
136 if test -d "$ARVBOX_DATA" ; then
137 echo "It looks like you already have a development container named $ARVBOX_CONTAINER."
138 echo "Set ARVBOX_CONTAINER to set a different name for your demo container"
142 if ! (docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q) ; then
143 docker create -v /var/lib/postgresql -v /var/lib/arvados --name $ARVBOX_CONTAINER-data arvados/arvbox-demo /bin/true
148 --name=$ARVBOX_CONTAINER \
150 --volumes-from $ARVBOX_CONTAINER-data \
156 mkdir -p "$PG_DATA" "$VAR_DATA" "$PASSENGER" "$GEMS"
158 if ! test -d "$ARVADOS_ROOT" ; then
159 git clone https://github.com/curoverse/arvados.git "$ARVADOS_ROOT"
161 if ! test -d "$SSO_ROOT" ; then
162 git clone https://github.com/curoverse/sso-devise-omniauth-provider.git "$SSO_ROOT"
165 if test "$1" = test ; then
168 if ! test -d "$ARVADOS_DEV_ROOT" ; then
169 git clone https://github.com/curoverse/arvados-dev.git "$ARVADOS_DEV_ROOT"
172 mkdir -p $VAR_DATA/test
176 --name=$ARVBOX_CONTAINER \
178 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
179 "--volume=$ARVADOS_DEV_ROOT:/usr/src/arvados-dev:rw" \
180 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
181 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
182 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
183 "--volume=$PASSENGER:/var/lib/passenger:rw" \
184 "--volume=$GEMS:/var/lib/gems:rw" \
186 /usr/local/bin/runsvinit -svdir=/etc/test-service
190 /usr/local/lib/arvbox/runsu.sh \
191 /usr/local/lib/arvbox/waitforpostgres.sh
195 /usr/local/lib/arvbox/runsu.sh \
196 /var/lib/arvbox/service/sso/run-service --only-setup
200 /usr/local/lib/arvbox/runsu.sh \
201 /var/lib/arvbox/service/api/run-service --only-setup
205 /usr/local/lib/arvbox/runsu.sh \
206 /usr/src/arvados-dev/jenkins/run-tests.sh \
207 --temp /var/lib/arvados/test \
208 WORKSPACE=/usr/src/arvados \
209 GEM_HOME=/var/lib/gems \
211 elif echo "$1" | grep 'dev$' ; then
214 --name=$ARVBOX_CONTAINER \
216 "--volume=$ARVADOS_ROOT:/usr/src/arvados:rw" \
217 "--volume=$SSO_ROOT:/usr/src/sso:rw" \
218 "--volume=$PG_DATA:/var/lib/postgresql:rw" \
219 "--volume=$VAR_DATA:/var/lib/arvados:rw" \
220 "--volume=$PASSENGER:/var/lib/passenger:rw" \
221 "--volume=$GEMS:/var/lib/gems:rw" \
226 echo "The Arvados source code is checked out at: $ARVADOS_ROOT"
228 echo "Unknown configuration '$1'"
234 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
235 docker stop $ARVBOX_CONTAINER
238 VOLUMES=--volumes=true
239 if docker ps -a --filter "status=created" | grep -E "$ARVBOX_CONTAINER$" -q ; then
240 docker rm $VOLUMES $ARVBOX_CONTAINER
242 if docker ps -a --filter "status=exited" | grep -E "$ARVBOX_CONTAINER$" -q ; then
243 docker rm $VOLUMES $ARVBOX_CONTAINER
248 if ! test -f "$ARVBOX_DOCKER/Dockerfile.base" ; then
249 echo "Could not find Dockerfile (expected it at $ARVBOX_DOCKER/Dockerfile.base)"
252 docker build -t arvados/arvbox-base -f "$ARVBOX_DOCKER/Dockerfile.base" "$ARVBOX_DOCKER"
253 if test "$1" = localdemo -o "$1" = publicdemo ; then
254 docker build -t arvados/arvbox-demo -f "$ARVBOX_DOCKER/Dockerfile.demo" "$ARVBOX_DOCKER"
256 docker build -t arvados/arvbox-dev -f "$ARVBOX_DOCKER/Dockerfile.dev" "$ARVBOX_DOCKER"
262 localdemo|publicdemo|dev|publicdev|test)
266 echo "Argument to $subcmd must be one of localdemo, publicdemo, dev, publicdev, test"
273 if test -n "$subcmd" ; then
288 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM GEM_HOME=/var/lib/gems /bin/bash
292 exec docker exec -i $ARVBOX_CONTAINER /usr/bin/env GEM_HOME=/var/lib/gems /bin/bash -
321 exec xdg-open http://$(gethost)
325 echo "Selected: $ARVBOX_CONTAINER"
326 if docker ps -a --filter "status=running" | grep -E "$ARVBOX_CONTAINER$" -q ; then
327 echo "Status: running"
328 echo "Container IP: $(getip)"
329 echo "Published host: $(gethost)"
331 echo "Status: not running"
333 if test -d "$ARVBOX_DATA" ; then
334 echo "Data: $ARVBOX_DATA"
335 elif docker ps -a | grep -E "$ARVBOX_CONTAINER-data$" -q ; then
336 echo "Data: $ARVBOX_CONTAINER-data"
344 if test -d "$ARVBOX_DATA" ; then
345 if test "$subcmd" = destroy ; then
346 if test "$1" != -f ; then
347 echo "WARNING! This will delete your entire arvbox ($ARVBOX_DATA)."
348 echo "Use destroy -f if you really mean it."
352 rm -rf "$ARVBOX_DATA"
354 if test "$1" != -f ; then
355 echo "WARNING! This will delete your arvbox data ($ARVBOX_DATA)."
356 echo "Code and downloaded packages will be preserved."
357 echo "Use reset -f if you really mean it."
361 rm -rf "$ARVBOX_DATA/postgres"
362 rm -rf "$ARVBOX_DATA/var"
365 if test "$1" != -f ; then
366 echo "WARNING! This will delete your data container $ARVBOX_CONTAINER-data. Use -f if you really mean it."
370 docker rm "$ARVBOX_CONTAINER-data"
375 if test -n "$1" ; then
376 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM less --follow-name +GF "/etc/service/$1/log/main/current"
378 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM tail $(docker exec -ti $ARVBOX_CONTAINER find -L /etc -path '/etc/service/*/log/main/current' -printf " %p")
383 if test -n "$1" ; then
384 exec docker exec -ti $ARVBOX_CONTAINER cat "$@"
386 echo "Usage: $0 $subcmd <files>"
391 exec docker exec -ti $ARVBOX_CONTAINER /usr/bin/env TERM=$TERM ls "$@"
395 if test -n "$1" -a -n "$2" ; then
396 exec docker exec -ti $ARVBOX_CONTAINER sv "$@"
398 echo "Usage: $0 $subcmd <start|stop|restart> <service>"
399 echo "Available services:"
400 exec docker exec -ti $ARVBOX_CONTAINER ls /etc/service
405 if test -n "$2" ; then
406 cp -r "$ARVBOX_BASE/$1" "$ARVBOX_BASE/$2"
407 echo "Created new arvbox $2"
408 echo "export ARVBOX_CONTAINER=$2"
410 echo "clone <from> <to> clone an arvbox"
411 echo "available arvboxes: $(ls $ARVBOX_BASE)"
416 echo "Arvados-in-a-box http://arvados.org"
418 echo "$(basename $0) (build|start|run|open|shell|ip|stop|rebuild|reset|destroy|log|svrestart)"
420 echo "build <config> build arvbox Docker image"
421 echo "start|run <config> start $ARVBOX_CONTAINER container"
422 echo "open open arvbox workbench in a web browser"
423 echo "shell enter arvbox shell"
424 echo "ip print arvbox docker container ip address"
425 echo "host print arvbox published host"
426 echo "status print some information about current arvbox"
427 echo "stop stop arvbox container"
428 echo "restart <config> stop, then run again"
429 echo "rebuild <config> stop, build arvbox Docker image, run"
430 echo "reset delete arvbox arvados data (be careful!)"
431 echo "destroy delete all arvbox code and data (be careful!)"
432 echo "log <service> tail log of specified service"
433 echo "ls <options> list directories inside arvbox"
434 echo "cat <files> get contents of files inside arvbox"
435 echo "pipe run a bash script piped in from stdin"
436 echo "sv <start|stop|restart> <service> change state of service inside arvbox"
437 echo "clone <from> <to> clone an arvbox"