#!/bin/bash

set -e

export JOB_DIR=/var/vcap/jobs/docker
export LOG_DIR=/var/vcap/sys/log/docker
export RUN_DIR=/var/vcap/sys/run/docker
export STORE_DIR=/var/vcap/store/docker
export TMP_DIR=/var/vcap/sys/tmp/docker
export TMPDIR=$TMP_DIR

for dir in $LOG_DIR $RUN_DIR $STORE_DIR $TMP_DIR; do
  mkdir -p ${dir}
  chown vcap:vcap ${dir}
  chmod 775 ${dir}
done

for package_bin_dir in $(ls -d /var/vcap/packages/*/*bin); do
  export PATH=${package_bin_dir}:$PATH
done

source /var/vcap/packages/docker/ctl_utils.sh
source /var/vcap/jobs/docker/bin/props.sh
export DOCKER_PID_FILE=${DOCKER_PID_DIR}/pid

case $1 in

  start)
    pid_guard ${DOCKER_PID_FILE} docker

    dpkg -i /var/vcap/packages/docker/aufs-tools_20120411-3_amd64.deb

    create_group ${DOCKER_GROUP}
    create_user ${DOCKER_USER} ${DOCKER_GROUP}

    <% if p("inside_container") %>
      touch /.dockerenv
    <% end %>

    # Create docker data store
    if [ ! -d ${DOCKER_STORE_DIR}/docker ]; then
      mkdir -p ${DOCKER_STORE_DIR}/docker
      chown ${DOCKER_USER}:${DOCKER_GROUP} ${DOCKER_STORE_DIR}/docker
      chmod 770 ${DOCKER_STORE_DIR}/docker
    fi

    # Mount cgroupfs hierarchy
    ${JOB_DIR}/bin/cgroupfs-mount

    # Create network bridge
    if [ ! -z ${DOCKER_BRIDGE_NAME} ]; then
        set +e
        ip link delete docker0
        ip link delete ${DOCKER_BRIDGE_NAME}
        /var/vcap/packages/docker/sbin/brctl addbr ${DOCKER_BRIDGE_NAME}
        ip addr add ${DOCKER_BRIDGE_CIDR} dev ${DOCKER_BRIDGE_NAME}
        ip link set dev ${DOCKER_BRIDGE_NAME} up
        set -e
    fi

    exec chpst -u ${DOCKER_USER}:${DOCKER_GROUP} dockerd \
        ${DOCKER_BRIDGE:-} \
        ${DOCKER_DEBUG:-} \
        ${DOCKER_DEFAULT_GATEWAY:-} \
        ${DOCKER_DEFAULT_GATEWAY_V6:-} \
        ${DOCKER_DEFAULT_ULIMITS:-} \
        ${DOCKER_DNS_DOMAINS:-} \
        ${DOCKER_DNS_SERVERS:-} \
        ${DOCKER_EXEC_OPTIONS:-} \
        --group ${DOCKER_GROUP} \
        --graph ${DOCKER_STORE_DIR}/docker \
        --host unix://${DOCKER_PID_DIR}/docker.sock \
        ${DOCKER_ICC:-} \
        ${DOCKER_INSECURE_REGISTRIES:-} \
        ${DOCKER_IPFORWARD:-} \
        ${DOCKER_IPMASQ:-} \
        ${DOCKER_IPTABLES:-} \
        ${DOCKER_IPV6:-} \
        ${DOCKER_LOG_LEVEL:-} \
        ${DOCKER_LABELS:-} \
        ${DOCKER_MTU:-} \
        --pidfile ${DOCKER_PID_FILE} \
        ${DOCKER_REGISTRY_MIRRORS:-} \
        ${DOCKER_STORAGE_DRIVER:-} \
        ${DOCKER_STORAGE_OPTIONS:-} \
        ${DOCKER_SELINUX_ENABLED:-} \
        ${DOCKER_TCP:-} \
        ${DOCKER_TLS_VERIFY_ENABLED:-} \
        ${DOCKER_TLS_CACERT:-} \
        ${DOCKER_TLS_CERT:-} \
        ${DOCKER_TLS_KEY:-} \
        ${DOCKER_USERLAND_PROXY:-} \
        ${DOCKER_CLUSTER_STORE} \
        >>${DOCKER_LOG_DIR}/${OUTPUT_LABEL}.stdout.log \
        2>>${DOCKER_LOG_DIR}/${OUTPUT_LABEL}.stderr.log
    ;;

  stop)
    echo -n "Stopping docker containers: "
    containers="$(chpst -u ${DOCKER_USER}:${DOCKER_GROUP} docker --host unix://${DOCKER_PID_DIR}/docker.sock ps -q)"
    if [[ ! -z $containers ]]; then
      for container in $containers; do
        echo -n "Stopping docker container ${container}... "
        chpst -u ${DOCKER_USER}:${DOCKER_GROUP} docker \
          --host unix://${DOCKER_PID_DIR}/docker.sock stop ${container}
      done
    else
      echo "Nothing to do."
    fi

    echo -n "Stopping docker daemon..."
    kill_and_wait ${DOCKER_PID_FILE}
    ;;

  *)
    echo "Usage: $0 {start|stop}"
    exit 1
    ;;

esac
exit 0
