#!/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_REMOTE_RSAID=${_GERRIT_SSH_RSA_ID_F_}
      - 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"
