#!/bin/bash
#
# generate a new docker-compose.yml
#
# Copyright 2019 Luigi Santivetti <luigi.santivetti@gmail.com>

# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:

# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
# ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

if [ "${_APACHE_HAS_MEDIA_}" -eq 1 ]; then
	declare -r compose_has_mount_media="\
      - ${_APACHE_HTML_PHOTOS_D_}:/var/www/html/photos
      - ${_APACHE_HTML_VIDEOS_D_}:/var/www/html/videos"
else
	declare -r compose_has_mount_media=""
fi

if [ "${_GERRIT_HAS_HTTPS_}" -eq 1 ]; then
	declare -r compose_has_secure_store="\
      - ${_GERRIT_DKRC_KEYSTORE_F_}:${_GERRIT_KEYSTORE_}:ro
      - ${_GERRIT_DKRC_SSLIB_F_}:${_GERRIT_SSLIB_}"
else
	declare -r compose_has_secure_store=""
fi

declare -r docker_compose_t="\
version: '${_COMPOSE_API_VERSION_}'
networks:
  frontend:
    driver: bridge
    ipam:
      config:
        - subnet: ${_COMPOSE_SUBNET_FRONTEND_IP_}/${_COMPOSE_SUBNET_BIT_}
  backend:
    driver: bridge
    ipam:
      config:
        - subnet: ${_COMPOSE_SUBNET_BACKEND_IP_}/${_COMPOSE_SUBNET_BIT_}
services:
  ${_GERRIT_DKRC_SERVICE_}:
    image: ${_GERRIT_DKRC_IMAGE_}
    build:
      context: ${_GERRIT_DKRC_CONTEXT_}
      dockerfile: ${_GERRIT_DKRC_DOCKERFILE_}
    container_name: ${_GERRIT_DKRC_CONTAINER_}
    expose:
      - \"${_GERRIT_PROXY_PORT_}\"
      - \"${_GERRIT_SSH_PORT_}\"
    ports:
      - \"${_COMPOSE_HOST_SSH_PORT_}:${_GERRIT_SSH_PORT_}\"
    volumes:
      - ${_GERRIT_DKRC_ROOTFS_}/index:/var/gerrit/index
      - ${_GERRIT_DKRC_ROOTFS_}/cache:/var/gerrit/cache
      - ${_GERRIT_DKRC_ROOTFS_}/git:/var/gerrit/git
      - ${_GERRIT_DKRC_HOOKS_D_}:${_GERRIT_HOOKS_CON_D_}
      - ${_GERRIT_DKRC_ETC_D_}:/var/gerrit/etc
      - ${_GERRIT_LOGS_D_}:/var/gerrit/logs
${compose_has_secure_store}
    environment:
      - CANONICAL_WEB_URL=${_GERRIT_CANON_URL_}
      - LISTEN_URL=${_GERRIT_LISTEN_URL_}
      - HOOKS_REMOTE_ALIAS=${_GERRIT_HOOKS_REMOTE_NAME_}
      - HOOKS_REMOTE_HOST=${_APACHE_DKRC_FRONTEND_IP_}
      - HOOKS_LOG_DIR=${_GERRIT_HOOKS_LOG_CON_D_}
    depends_on:
      - ${_APACHE_DKRC_SERVICE_}
    networks:
      frontend:
        ipv4_address: ${_GERRIT_DKRC_FRONTEND_IP_}
    entrypoint: /bin/bash -c \"/${_GERRIT_DKRC_ENTRYPOINT_} \${GERRIT_ENTRYPOINT_ARGS}\"
  ${_APACHE_DKRC_SERVICE_}:
    environment:
      - HOST_PEPPER=\${_PASSWD_APACHE_HASH_HMAC_PEPPER_}
      - MYSQL_PASSWORD=\${_PASSWD_MYSQL_DB_PASSWORD_}
      - MYSQL_USER=\${_PASSWD_MYSQL_DB_USERNAME_}
    env_file:
      - ${_COMPOSE_ENVIRONMENT_}
    image: ${_APACHE_DKRC_IMAGE_}
    build:
      context: ${_APACHE_DKRC_CONTEXT_}
      dockerfile: ${_APACHE_DKRC_DOCKERFILE_}
    container_name: ${_APACHE_DKRC_CONTAINER_}
    ports:
      - \"${_COMPOSE_HOST_HTTP_PORT_}:${_APACHE_HTTP_PORT_}\"
      - \"${_COMPOSE_HOST_HTTPS_PORT_}:${_APACHE_HTTPS_PORT_}\"
    volumes:
      - ${_APACHE_DKRC_PORTS_F_}:/etc/apache2/ports.conf:ro
      - ${_APACHE_DKRC_CONF_F_}:/etc/apache2/apache2.conf:ro
      - ${_APACHE_DKRC_AVAILABLE_D_}:/etc/apache2/sites-available:ro
      - ${_APACHE_DKRC_ENABLED_D_}:/etc/apache2/sites-enabled:ro
      - ${_MYSQL_ROOTFS_SSL_D_}:${_APACHE_CON_SSL_MYSQL_D_}:ro
      - ${_APACHE_DKRC_CERT_L_}:${_APACHE_CON_SSL_D_}:ro
      - ${_APACHE_EXT_AUTH_F_}:${_APACHE_CON_EXT_AUTH_F_}:ro
      - ${_APACHE_DKRC_LOG_D_}:/var/log/apache2
      - ${_APACHE_DKRC_WWW_D_}:/var/www
${compose_has_mount_media}
    depends_on:
      - ${_MYSQL_DKRC_SERVICE_}
    networks:
      frontend:
        ipv4_address: ${_APACHE_DKRC_FRONTEND_IP_}
      backend:
        ipv4_address: ${_APACHE_DKRC_BACKEND_IP_}
  ${_MYSQL_DKRC_SERVICE_}:
    environment:
      - MYSQL_ROOT_PASSWORD=\${_PASSWD_MYSQL_DB_PASSWORD_ROOT_}
      - MYSQL_PASSWORD=\${_PASSWD_MYSQL_DB_PASSWORD_}
      - MYSQL_USER=\${_PASSWD_MYSQL_DB_USERNAME_}
    env_file:
      - ${_COMPOSE_ENVIRONMENT_}
    image: ${_MYSQL_DKRC_IMAGE_}
    build:
      context: ${_MYSQL_DKRC_CONTEXT_}
      dockerfile: ${_MYSQL_DKRC_DOCKERFILE_}
    container_name: ${_MYSQL_DKRC_CONTAINER_}
    restart: always
    networks:
      backend:
        ipv4_address: ${_MYSQL_DKRC_BACKEND_IP_}
    expose:
      - \"${_MYSQL_DB_PORT_}\"
    volumes:
      - ${_MYSQL_ROOTFS_SSL_D_}:${_MYSQL_CON_SSL_D_}
      - ${_MYSQL_INITDB_F_}:/docker-entrypoint-initdb.d/initdb.sql
      - ${_MYSQL_MYCONF_F_}:/etc/mysql/my.cnf:ro
      - ${_MYSQL_MYSQL_D_}:/var/lib/mysql
      - ${_MYSQL_LOG_D_}:${_MYSQL_CON_LOG_D_}"

declare -r environment_t="\
MYSQL_DATABASE=${_MYSQL_DB_NAME_}
MYSQL_HOSTNAME=${_MYSQL_DKRC_BACKEND_IP_}
MYSQL_SSL_CAPATH=${_APACHE_CON_SSL_MYSQL_D_}
MYSQL_SSL_CERT=${_APACHE_CON_SSL_MYSQL_CERT_F_}
MYSQL_SSL_KEY=${_APACHE_CON_SSL_MYSQL_KEY_F_}
MYSQL_SSL_CA=${_APACHE_CON_SSL_MYSQL_CA_F_}
HOST_NAME=${_APACHE_SERVER_NAME_}"

declare -r compose_cli_bang_t="\
#!/bin/bash

if (return 0 2>/dev/null); then
	echo \"You must run this script\" >&2
	return 1
fi

function __help
{
	cat <<EOF; exit 0
`printf \"\\033[1m%s\\033[0m\\n\" \"NAME\"`

  \${BASH_SOURCE[0]//.\//} - docker-compose CLI for ${host_name}

`printf \"\\033[1m%s\\033[0m\\n\" \"USAGE\"`

  \$ \${BASH_SOURCE[0]} [ OPTION ] [ ARGS ... ]

`printf \"\\033[1m%s\\033[0m\\n\" \"ENVIRONMENT\"`

  PASSWD_F                    path to file containing runtime credentials

`printf \"\\033[1m%s\\033[0m\\n\" \"OPTION\"`

      --start [init]          start instance. If \\\`init\\\` is passed,
                              then do entrypoint.sh initialization steps
                              and run in the foreground not as a daemon
      --stop                  stop instance
  -pc|--prune-containers      delete all services container
  -pn|--prune-networks        delete all services network
  -ps|--prune-system          delete all images, containers, cache,
                              networks and volumes
  -bs|--build-services        build all services and networks
   -h|--help                  show this help

`printf \"\\033[1m%s\\033[0m\\n\" \"END\"`
EOF
}

function source_passwd_file
{
	if [ ! -f \"\${PASSWD_F}\" ]; then
		echo \"error: PASSWD file not found\" >&2
		exit 1
	fi

	if ! source \"\${PASSWD_F}\"; then
		echo \"error: PASSWD file not sourced\" >&2
		exit 1
	fi
}

function __dkrc_start
{
	local -i error

	source_passwd_file
	pushd \"${instance_d}\" >/dev/null || exit 1

	if sudo systemctl is-active --quiet service apache2.service; then
		echo \"warning: shutting down apache2.service\" >&2
		sudo systemctl stop apache2.service
	fi

	case \"\$1\" in
		init )
			GERRIT_ENTRYPOINT_ARGS=init \\
				_PASSWD_APACHE_HASH_HMAC_PEPPER_=\${_PASSWD_APACHE_HASH_HMAC_PEPPER_} \\
				_PASSWD_MYSQL_DB_USERNAME_=\${_PASSWD_MYSQL_DB_USERNAME_} \\
				_PASSWD_MYSQL_DB_PASSWORD_=\${_PASSWD_MYSQL_DB_PASSWORD_} \\
				_PASSWD_MYSQL_DB_PASSWORD_ROOT_=\${_PASSWD_MYSQL_DB_PASSWORD_ROOT_} \\
				sudo -E docker-compose up ;;
		*     )
			[ -z \"\$1\" ] || echo \"warning: input ignored: \$1\" >&2

			_PASSWD_APACHE_HASH_HMAC_PEPPER_=\${_PASSWD_APACHE_HASH_HMAC_PEPPER_} \\
				_PASSWD_MYSQL_DB_USERNAME_=\${_PASSWD_MYSQL_DB_USERNAME_} \\
				_PASSWD_MYSQL_DB_PASSWORD_=\${_PASSWD_MYSQL_DB_PASSWORD_} \\
				_PASSWD_MYSQL_DB_PASSWORD_ROOT_=\${_PASSWD_MYSQL_DB_PASSWORD_ROOT_} \\
				sudo -E docker-compose up -d ;;
	esac

	error=\"\$?\"
	popd >/dev/null

	return \$error
}

function __dkrc_stop
{
	sudo docker stop \$(sudo docker ps -a -q)
}

function __dkrc_prune_containers
{
	sudo docker rm \$(sudo docker ps -a -q)
}

function __dkrc_prune_networks
{
	sudo docker network prune -f
}

function __dkrc_prune_system
{
	sudo docker system prune --all
}

function __dkrc_build_services
{
	local -i error

	source_passwd_file
	pushd \"${instance_d}\" >/dev/null || exit 1

	_PASSWD_APACHE_HASH_HMAC_PEPPER_=\${_PASSWD_APACHE_HASH_HMAC_PEPPER_} \\
		_PASSWD_MYSQL_DB_USERNAME_=\${_PASSWD_MYSQL_DB_USERNAME_} \\
		_PASSWD_MYSQL_DB_PASSWORD_=\${_PASSWD_MYSQL_DB_PASSWORD_} \\
		_PASSWD_MYSQL_DB_PASSWORD_ROOT_=\${_PASSWD_MYSQL_DB_PASSWORD_ROOT_} \\
		sudo -E docker-compose build --force-rm --no-cache \$@
	error=\"\$?\"
	popd >/dev/null

	return \$error
}

case \"\$1\" in
      --start            ) __dkrc_start \"\$2\"              ;;
      --stop             ) __dkrc_stop                    ;;
  -pc|--prune-containers ) __dkrc_prune_containers        ;;
  -pn|--prune-networks   ) __dkrc_prune_networks          ;;
  -ps|--prune-system     ) __dkrc_prune_system            ;;
  -bs|--build-services   ) __dkrc_build_services \"\${@:2}\" ;;
   -h|--help             ) __help                         ;;
esac"
