#!/bin/bash version=0.10 program=${0##*/} progdir=${0%/*} if [ "$progdir" = "$program" ]; then progdir="."; fi if [ "$progdir" = "." ]; then progdir="$PWD"; fi parent=$(dirname $progdir) if [ "$parent" = "." ]; then parent="$PWD"; fi # ---------------------------------------------------------------------- function usage() { cat < COPYRIGHT Copyright (c) 2015 IETF Trust and the persons identified as authors of the code. All rights reserved. License 'Simplified BSD', as specified in http://opensource.org/licenses/BSD-3-Clause. EOF } # ---------------------------------------------------------------------- function die() { echo -e "\n$program: error: $*" > /dev/stderr exit 1 } function note() { if [ -n "$VERBOSE" ]; then echo -e "$*"; fi } # ---------------------------------------------------------------------- function version() { echo -e "$program $version" } # ---------------------------------------------------------------------- trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; exit 1' ERR # ---------------------------------------------------------------------- # Option parsing # Options shortopts=dhi:m:Mr:t:vVu: longopts=download-data,help,ietfdb-url=,mysqldata=,no-mysqldir,docker-repo=,tag=,verbose,version,user=, # Default values TAG=$(basename $(svn info $parent | grep ^URL | awk '{print $2}')) REPO="levkowetz/datatracker" NOMYMAP="" if [ "$(uname)" = "Linux" ]; then args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@") if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi eval set -- "$args" sed="sed -r" else # Darwin, BSDs args=$(getopt -o$shortopts $SV $*) if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi set -- $args sed="sed -E" fi while true ; do case "$1" in -d| --download-data) DOWNLOAD=1;; # Download and set up the database files -h| --help) usage; exit;; # Show this help, then exit -i| --ietfdb-url) URL=$2; shift;; # Use an alternative database tarball URL -m| --mysqldir) MYSQLDIR=$2; shift;; # Set the desired location for MySQL's database files -M| --no-mysqldir) NOMYMAP=1;; # Don't map the mysql dir to an external dir -r| --docker-repo) REPO=$2; shift;; # Use the given docker repository, instead of the default -t| --tag) TAG=$2; shift;; # Use this docker image tag, instead of the svn branch name -u| --user) WHO=$2; shift;; # Run the container as the specified user -v| --verbose) VERBOSE=1;; # Be more talkative -V| --version) version; exit;; # Show program version, then exit --) shift; break;; *) die "Internal error, inconsistent option specification: '$1'";; esac shift done # ---------------------------------------------------------------------- # The program itself if [ "$(uname)" != "Linux" ]; then if [ -n "$(type -p boot2docker)" ]; then machine=$(type -p boot2docker) up=up env=shellinit elif [ -n "$(type -p docker-machine)" ]; then machine=$(type -p docker-machine) up=start env="env default" else die "Could not find boot2docker or docker-machine -- you need to set one of those before running this script." fi fi if [ $($machine status) != "running" ]; then echo "The docker VM doesn't seem to be running; will attempt to start it by doing '$$ $machine $up':" $machine $up || die "Failed taking up the Docker VM" fi if [ ! -f ~/.docker-info ]; then $machine $env 2>/dev/null | grep DOCKER_ > ~/.docker-info fi . ~/.docker-info echo "" echo "Starting a docker container for '$TAG'." docker ps | grep -q $REPO:$TAG && die \ "It seems that another docker container is already running the image '$REPO:$TAG' -- but only one MySQL instance can bind to the database files at a time. Quitting." [ -n "$WHO" ] || WHO=$(whoami) [ -n "$MYSQLDIR" ] || MYSQLDIR=$parent/data/mysql [ -n "$URL"] || URL=https://www.ietf.org/lib/dt/sprint/ietf_utf8.bin.tar.bz2 if [ -n "$DOWNLOAD" ]; then ( cd $(dirname $MYSQLDIR) wget -N $URL && tar xjf ietf_utf8.bin.tar.bz2 && chmod -R go+rwX mysql ) [ -d "$MYSQLDIR" ] || die "The download seems to have failed; still no $MYSQLDIR. Giving up." else [ -d "$MYSQLDIR" ] || die "Expected $MYSQLDIR to exist, but it\ndidn't. Use '$program -d' to download and unpack the database." fi if ! docker images $REPO | grep -q $TAG; then echo "Fetching a docker image for your docker container ..." if ! docker pull $REPO:$TAG; then docker pull $REPO:latest || die "Failed to pull down the '$REPO:latest' docker image" id=$(docker images $REPO | grep latest | awk '{print $3}') echo "Tagging $REPO:latest as $REPO:$TAG for use as environment for this branch." docker tag $id $REPO:$TAG fi fi if [ -n "$NOMYMAP" ]; then docker run -ti -p 8000:8000 -v $HOME:/home/$WHO -e USER=$WHO -e DATADIR=${parent#$HOME/}/data -e CWD=${PWD#$HOME/} -e TAG=$TAG $REPO:$TAG else docker run -ti -p 8000:8000 -v $HOME:/home/$WHO -v $MYSQLDIR:/var/lib/mysql -e USER=$WHO -e DATADIR=${parent#$HOME/}/data -e CWD=${PWD#$HOME/} -e TAG=$TAG $REPO:$TAG fi echo "" echo "Committing changes in the container to an image:" latest=$(docker ps -lq) docker commit $latest $REPO:$TAG echo "" echo "Cleaning up containers and images" docker rm $latest docker images -f dangling=true -q | xargs docker rmi -f