#!/bin/sh

function gitlab_service_start_workhorse
{
   GITLAB_FQDN="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   if [ -f "${GITLAB_FQDN_CONF_APACHE}" ]; then
      GITLAB_FQDN_DOCUMENT_ROOT="$(sed -e '{ /DocumentRoot/!d; s%.*\ /%/%; s%/.[^/]*$%% }' ${GITLAB_FQDN_CONF_APACHE})"
      GITLAB_FQDN_CONF_PATH="${GITLAB_FQDN_DOCUMENT_ROOT}/config"
      # ToDo
      # create a system.conf file to store ENV variable
      GITLAB_FQDN_ENV="production"
      GITLAB_FQDN_CONF_GITLAB="${GITLAB_FQDN_CONF_PATH}/gitlab.yml"
      if [ -f "${GITLAB_FQDN_CONF_GITLAB}" ]; then
         GITLAB_FQDN_USER=$(sed -e "{ /^${GITLAB_FQDN_ENV}:/,/^[^\ ]/!d; /^\ \ gitlab:/,/^\ \ [^\ ]/!d; /user:/!d; s/.*:\ // }" ${GITLAB_FQDN_CONF_GITLAB})
         cd ${GITLAB_FQDN_DOCUMENT_ROOT}
         GITLAB_FQDN_UNICORN_CONF="${GITLAB_FQDN_CONF_PATH}/unicorn.rb"
         GITLAB_FQDN_WORKHORSE_LISTEN_PORT=$(sed -e '{ /[0-9][0-9\.]*:[0-9]*/!d; s%.[^0-9]*\([0-9\.:]*\).*%\1%g; /[0-9][0-9\.]*:[0-9]*/!d; 1,2!d }' ${GITLAB_FQDN_CONF_APACHE})
         GITLAB_FQDN_WORKHORSE_BACKEND_PORT=$(sed -e '{ /[0-9][0-9\.:]*:[0-9]*/!d; s%listen\ "\(.[^"]*\)".*%\1%; 1,2!d }' ${GITLAB_FQDN_UNICORN_CONF})
         GITLAB_FQDN_WORKHORSE_ATUH_SOCKET=$(sed -e "{ /^listen/!d; /\//!d; s/.*\"\(.[^\"]*\)\".*/\1/ }" ${GITLAB_FQDN_UNICORN_CONF})
         GITLAB_FQDN_WORKHORSE_LOG="${GITLAB_FQDN_DOCUMENT_ROOT}/log/workhorse.log"
         options="-listenUmask 0 -listenNetwork tcp -listenAddr ${GITLAB_FQDN_WORKHORSE_LISTEN_PORT}"
         options="${options} -authBackend http://${GITLAB_FQDN_WORKHORSE_BACKEND_PORT} -authSocket ${GITLAB_FQDN_WORKHORSE_ATUH_SOCKET}"
         options="${options} -documentRoot ${GITLAB_FQDN_DOCUMENT_ROOT}/public >> ${GITLAB_FQDN_WORKHORSE_LOG} 2>&1"
         exec /usr/bin/sudo -u ${GITLAB_FQDN_USER} /usr/sbin/gitlab-workhorse ${options}
#
# -secretPath /home/git/gitlab/.gitlab_workhorse_secret
      fi
   fi
}

function gitlab_service_stop_workhorse
{
   GITLAB_FQDN="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   if [ -f "${GITLAB_FQDN_CONF_APACHE}" ]; then
      GITLAB_FQDN_DOCUMENT_ROOT="$(sed -e '{ /DocumentRoot/!d; s%.*\ /%/%; s%/.[^/]*$%% }' ${GITLAB_FQDN_CONF_APACHE})"
      GITLAB_FQDN_CONF_PATH="${GITLAB_FQDN_DOCUMENT_ROOT}/config"
      # ToDo
      # create a system.conf file to store ENV variable
      GITLAB_FQDN_ENV="production"
      GITLAB_FQDN_CONF_GITLAB="${GITLAB_FQDN_CONF_PATH}/gitlab.yml"
      if [ -f "${GITLAB_FQDN_CONF_GITLAB}" ]; then
         GITLAB_FQDN_USER=$(sed -e "{ /^${GITLAB_FQDN_ENV}:/,/^[^\ ]/!d; /^\ \ gitlab:/,/^\ \ [^\ ]/!d; /user:/!d; s/.*:\ // }" ${GITLAB_FQDN_CONF_GITLAB})
         GITLAB_WORKHORSE_PIDS=$(ps --forest -o pid -g $(ps -ax -o pid,cmd | sed -e "{ /sudo.*workhorse.*${GITLAB_FQDN_PATH}/!d; /sed/d; s%\ .*%% }") | sed -e '/PID/d')
         if [ -n "${GITLAB_WORKHORSE_PIDS}" ]; then
            kill -TERM ${GITLAB_WORKHORSE_PIDS} >/dev/null 2>&1
         fi
      fi
   fi
}

function gitlab_service_start_sidekiq
{
   GITLAB_FQDN="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   if [ -f "${GITLAB_FQDN_CONF_APACHE}" ]; then
      GITLAB_FQDN_DOCUMENT_ROOT="$(sed -e '{ /DocumentRoot/!d; s%.*\ /%/%; s%/.[^/]*$%% }' ${GITLAB_FQDN_CONF_APACHE})"
      GITLAB_FQDN_CONF_PATH="${GITLAB_FQDN_DOCUMENT_ROOT}/config"
      # ToDo
      # create a system.conf file to store ENV variable
      GITLAB_FQDN_ENV="production"
      GITLAB_FQDN_CONF_GITLAB="${GITLAB_FQDN_CONF_PATH}/gitlab.yml"
      if [ -f "${GITLAB_FQDN_CONF_GITLAB}" ]; then
         GITLAB_FQDN_USER=$(sed -e "{ /^${GITLAB_FQDN_ENV}:/,/^[^\ ]/!d; /^\ \ gitlab:/,/^\ \ [^\ ]/!d; /user:/!d; s/.*:\ // }" ${GITLAB_FQDN_CONF_GITLAB})
         cd ${GITLAB_FQDN_DOCUMENT_ROOT}
         GITLAB_SIDEKIQ_PID="${GITLAB_FQDN_DOCUMENT_ROOT}/tmp/pids/sidekiq.pid"
         GITLAB_SIDEKIQ_LOG="${GITLAB_FQDN_DOCUMENT_ROOT}/log/sidekiq.log"
         options="-q archive_repo -q post_receive -q mailers -q system_hook -q incoming_email -q project_web_hook -q gitlab_shell -q common -q default -e ${GITLAB_FQDN_ENV} -P ${GITLAB_SIDEKIQ_PID} -L ${GITLAB_SIDEKIQ_LOG} >> ${GITLAB_SIDEKIQ_LOG} 2>&1"
         exec /usr/bin/sudo -u ${GITLAB_FQDN_USER} /usr/bin/bundle.ruby2.3 exec "sidekiq ${options}"
      fi
   fi
}

function gitlab_service_stop_sidekiq
{
   GITLAB_FQDN="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   if [ -f "${GITLAB_FQDN_CONF_APACHE}" ]; then
      GITLAB_FQDN_DOCUMENT_ROOT="$(sed -e '{ /DocumentRoot/!d; s%.*\ /%/%; s%/.[^/]*$%% }' ${GITLAB_FQDN_CONF_APACHE})"
      GITLAB_FQDN_CONF_PATH="${GITLAB_FQDN_DOCUMENT_ROOT}/config"
      # ToDo
      # create a system.conf file to store ENV variable
      GITLAB_FQDN_ENV="production"
      GITLAB_FQDN_CONF_GITLAB="${GITLAB_FQDN_CONF_PATH}/gitlab.yml"
      if [ -f "${GITLAB_FQDN_CONF_GITLAB}" ]; then
         GITLAB_FQDN_USER=$(sed -e "{ /^${GITLAB_FQDN_ENV}:/,/^[^\ ]/!d; /^\ \ gitlab:/,/^\ \ [^\ ]/!d; /user:/!d; s/.*:\ // }" ${GITLAB_FQDN_CONF_GITLAB})
         GITLAB_SIDEKIQ_PIDS=$(ps --forest -o pid -g $(ps -ax -o pid,cmd | sed -e "{ /sudo.*sidekiq.*${GITLAB_FQDN_PATH}/!d; /sed/d; s%\ .*%% }") | sed -e '/PID/d')
         if [ -n "${GITLAB_SIDEKIQ_PIDS}" ]; then
            kill -TERM ${GITLAB_SIDEKIQ_PIDS} >/dev/null 2>&1
         fi
      fi
   fi
}

function gitlab_service_start_unicorn
{
   GITLAB_FQDN="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   if [ -f "${GITLAB_FQDN_CONF_APACHE}" ]; then
      GITLAB_FQDN_DOCUMENT_ROOT="$(sed -e '{ /DocumentRoot/!d; s%.*\ /%/%; s%/.[^/]*$%% }' ${GITLAB_FQDN_CONF_APACHE})"
      GITLAB_FQDN_CONF_PATH="${GITLAB_FQDN_DOCUMENT_ROOT}/config"
      # ToDo
      # create a system.conf file to store ENV variable
      GITLAB_FQDN_ENV="production"
      GITLAB_FQDN_CONF_GITLAB="${GITLAB_FQDN_CONF_PATH}/gitlab.yml"
      if [ -f "${GITLAB_FQDN_CONF_GITLAB}" ]; then
         GITLAB_FQDN_USER=$(sed -e "{ /^${GITLAB_FQDN_ENV}:/,/^[^\ ]/!d; /^\ \ gitlab:/,/^\ \ [^\ ]/!d; /user:/!d; s/.*:\ // }" ${GITLAB_FQDN_CONF_GITLAB})
         cd ${GITLAB_FQDN_DOCUMENT_ROOT}
         GITLAB_FQDN_UNICORN_CONF="${GITLAB_FQDN_CONF_PATH}/unicorn.rb"
         options="-c ${GITLAB_FQDN_UNICORN_CONF} -E ${GITLAB_FQDN_ENV}"
         exec /usr/bin/sudo -u ${GITLAB_FQDN_USER} /usr/bin/bundle.ruby2.3 exec "unicorn_rails.ruby2.3 ${options}"
      fi
   fi
}

function gitlab_service_stop_unicorn
{
   GITLAB_FQDN="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   if [ -f "${GITLAB_FQDN_CONF_APACHE}" ]; then
      GITLAB_FQDN_DOCUMENT_ROOT="$(sed -e '{ /DocumentRoot/!d; s%.*\ /%/%; s%/.[^/]*$%% }' ${GITLAB_FQDN_CONF_APACHE})"
      GITLAB_FQDN_CONF_PATH="${GITLAB_FQDN_DOCUMENT_ROOT}/config"
      # ToDo
      # create a system.conf file to store ENV variable
      GITLAB_FQDN_ENV="production"
      GITLAB_FQDN_CONF_GITLAB="${GITLAB_FQDN_CONF_PATH}/gitlab.yml"
      if [ -f "${GITLAB_FQDN_CONF_GITLAB}" ]; then
         GITLAB_FQDN_USER=$(sed -e "{ /^${GITLAB_FQDN_ENV}:/,/^[^\ ]/!d; /^\ \ gitlab:/,/^\ \ [^\ ]/!d; /user:/!d; s/.*:\ // }" ${GITLAB_FQDN_CONF_GITLAB})
         GITLAB_SIDEKIQ_PIDS=$(ps --forest -o pid -g $(ps -ax -o pid,cmd | sed -e "{ /sudo.*unicorn.*${GITLAB_FQDN_PATH}/!d; /sed/d; s%\ .*%% }") | sed -e '/PID/d')
         if [ -n "${GITLAB_SIDEKIQ_PIDS}" ]; then
            kill -TERM ${GITLAB_SIDEKIQ_PIDS} >/dev/null 2>&1
         fi
      fi
   fi
}

function gitlab_service_start
{
   service=${1}
   shift
   case "${service}" in
      sidekiq|unicorn|workhorse|help)
         gitlab_service_start_${service} ${*}
         ;;
      *)
         gitlab_unknown service start ${service} ${*}
         ;;
   esac
}

function gitlab_service_stop
{
   service=${1}
   shift
   case "${service}" in
      sidekiq|unicorn|workhorse|help)
         gitlab_service_stop_${service} ${*}
         ;;
      *)
         gitlab_unknown service stop ${service} ${*}
         ;;
   esac
}

function gitlab_service
{
   action=${1}
   shift
   case "${action}" in
      start|stop|help)
         gitlab_service_${action} ${*}
         ;;
      *)
         gitlab_unknown service ${action} ${*}
         ;;
   esac
}

function gitlab_setup
{
   GITLAB_FQDN_URL="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN_URL//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   GITLAB_FQDN_USER="gitlab"
   GITLAB_FQDN_ROOT_USER=""
   GITLAB_FQDN_ROOT_EMAIL=""
   GITLAB_FQDN_ENV="production"
   GITLAB_FQDN_BACKGROUND_PORT="127.0.0.1:44544"
   GITLAB_FQDN_LISTEN_PORT="127.0.0.1:44600"

   shift
   while [ -n "${1}" ]; do
      case "${1}" in
         -u)
            GITLAB_FQDN_USER="${2}"
            shift 2
            ;;
         -Au)
            GITLAB_FQDN_ROOT_USER="${2}"
            shift 2
            ;;
         -Ae)
            GITLAB_FQDN_ROOT_EMAIL="${2}"
            shift 2
            ;;
         -Ap)
            GITLAB_FQDN_ROOT_PASSWORD="${2}"
            shift 2
            ;;
         -Bp)
            GITLAB_FQDN_BACKGROUND_PORT="${2}"
            shift 2
            ;;
         -Lp)
            GITLAB_FQDN_LISTEN_PORT="${2}"
            shift 2
            ;;
         *)
            :
            ;;
      esac
   done

   GITLAB_FQDN_ROOT="/home/${GITLAB_FQDN_USER}/.gitlab/${GITLAB_FQDN_PATH}"
   GITLAB_FQDN_WORKING_DIR="${GITLAB_FQDN_ROOT}/gitlab"
   GITLAB_FQDN_UNICORN_CONFIG="${GITLAB_FQDN_WORKING_DIR}/config/unicorn.rb"
   GITLAB_FQDN_GITLAB_CONFIG="${GITLAB_FQDN_WORKING_DIR}/config/gitlab.yml"
   GITLAB_FQDN_HTTPD_CONFIG="${GITLAB_FQDN_WORKING_DIR}/config/httpd.conf"
   GITLAB_FQDN_ADMIN_CONFIG="${GITLAB_FQDN_WORKING_DIR}/db/fixtures/production/001_admin.rb"

   mkdir -p ${GITLAB_FQDN_ROOT}
   cd ${GITLAB_FQDN_ROOT}
   cp /usr/share/gitlab/* .
   tar xjf gitlab.tar.bz2 && rm gitlab.tar.bz2
   tar xjf shell.tar.bz2 && rm shell.tar.bz2
   mkdir builds repositories satellites shared
   cd ${GITLAB_FQDN_WORKING_DIR}
   chmod -R g+w log tmp

   cp ${GITLAB_FQDN_WORKING_DIR}/public/503.html{,.save}
   cp ${GITLAB_FQDN_WORKING_DIR}/public/{deploy,503}.html

   GITLAB_TEMPLATE_URL="$(sed -e '{ /production:/,/host:/!d; /host:/!d; s%.*\ %% }' ${GITLAB_FQDN_GITLAB_CONFIG})"
   GITLAB_TEMPLATE_USER="$(sed -e '{ /production:/,/user:/!d; /user:/!d; s%.*\ %% }' ${GITLAB_FQDN_GITLAB_CONFIG})"
   GITLAB_TEMPLATE_WORKING_DIR="$(sed -e '{ /working_directory/!d; s%.[^"]*"\(.[^"]*\)".*%\1% }' ${GITLAB_FQDN_UNICORN_CONFIG})"
   GITLAB_TEMPLATE_ROOT="${GITLAB_TEMPLATE_WORKING_DIR%/*}"
   GITLAB_TEMPLATE_BACKGROUND_PORT="$(sed -e '{ /listen.*"[0-9\.:]*"/!d; s%.[^"]*"\(.[^"]*\)".*%\1% }' ${GITLAB_FQDN_UNICORN_CONFIG})"
   GITLAB_TEMPLATE_LISTEN_PORT="$(sed -e '{ /ProxyPassReverse/!d; /[0-9][0-9\.:]*/!d; s%.*\/%% }' ${GITLAB_FQDN_HTTPD_CONFIG})"

   for config_file in $(find -type f -exec grep -l "${GITLAB_TEMPLATE_ROOT}" '{}' \;); do
      sed -i "{
         s%localhost%127.0.0.1%g;
         s%${GITLAB_TEMPLATE_BACKGROUND_PORT}%${GITLAB_FQDN_BACKGROUND_PORT}%g;
         s%${GITLAB_TEMPLATE_LISTEN_PORT}%${GITLAB_FQDN_LISTEN_PORT}%g;
         s%${GITLAB_TEMPLATE_WORKING_DIR}%${GITLAB_FQDN_WORKING_DIR}%g;
         s%${GITLAB_TEMPLATE_ROOT}%${GITLAB_FQDN_ROOT}%g;
         s%${GITLAB_TEMPLATE_URL}%${GITLAB_FQDN_URL}%g;
         s%user: ${GITLAB_TEMPLATE_USER}%user: ${GITLAB_FQDN_USER}%g;
      }" ${config_file}
   done

   cp ${GITLAB_FQDN_WORKING_DIR}/config/httpd.conf ${GITLAB_FQDN_CONF_APACHE}

   GITLAB_TEMPLATE_APACHE_MODULES="$(sed -e '{ /^APACHE_MODULES/!d; s%"$%%; s%.*"%% }' /etc/sysconfig/apache2)"
   GITLAB_FQDN_APACHE_MODULES="${GITLAB_TEMPLATE_APACHE_MODULES}"
   if [ "${GITLAB_TEMPLATE_APACHE_MODULES}" == "${GITLAB_TEMPLATE_APACHE_MODULES//mod_rewrite/}" ]; then
       GITLAB_FQDN_APACHE_MODULES="mod_rewrite ${GITLAB_FQDN_APACHE_MODULES}"
   fi
   if [ "${GITLAB_TEMPLATE_APACHE_MODULES}" == "${GITLAB_TEMPLATE_APACHE_MODULES//mod_proxy_http/}" ]; then
       GITLAB_FQDN_APACHE_MODULES="mod_proxy_http ${GITLAB_FQDN_APACHE_MODULES}"
   fi
   if [ "${GITLAB_TEMPLATE_APACHE_MODULES}" == "${GITLAB_TEMPLATE_APACHE_MODULES//mod_proxy/}" ]; then
       GITLAB_FQDN_APACHE_MODULES="mod_proxy ${GITLAB_FQDN_APACHE_MODULES}"
   fi
   sed -i "s%^APACHE_MODULES.*%APACHE_MODULES=\"${GITLAB_FQDN_APACHE_MODULES}\"%" /etc/sysconfig/apache2
   systemctl restart apache2 >/dev/null 2>&1

   if [ ! -e /var/run/postgresql/.s.PGSQL*.lock ]; then
      systemctl start postgresql > /dev/null 2>&1
      systemctl enable postgresql > /dev/null 2>&1
   fi
   sed -e "{ s%# username%username%g; s%gitlabhq%${GITLAB_FQDN_PATH}%g; s%\(username:\)\ .*%\1 ${GITLAB_FQDN_USER}%g }" ${GITLAB_FQDN_WORKING_DIR}/config/database.yml.postgresql > ${GITLAB_FQDN_WORKING_DIR}/config/database.yml
   sudo -u postgres psql -d template1 -c "CREATE USER ${GITLAB_FQDN_USER} CREATEDB;" > /dev/null 2>&1
   sudo -u postgres psql -d template1 -c "CREATE DATABASE ${GITLAB_FQDN_PATH}_${GITLAB_FQDN_ENV} OWNER ${GITLAB_FQDN_USER};" > /dev/null 2>&1
   sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;" > /dev/null 2>&1

   groupadd gitlab > /dev/null 2>&1
   chown -R ${GITLAB_FQDN_USER}.gitlab /home/${GITLAB_FQDN_USER}/.gitlab
   usermod -aG redis ${GITLAB_FQDN_USER} > /dev/null 2>&1
   usermod -aG gitlab redis > /dev/null 2>&1
   usermod -aG gitlab ${GITLAB_FQDN_USER} > /dev/null 2>&1

   cp ${GITLAB_FQDN_WORKING_DIR}/config/redis.conf /etc/redis/${GITLAB_FQDN_PATH}.conf
   chown root.redis /etc/redis/${GITLAB_FQDN_PATH}.conf
   systemctl start redis@${GITLAB_FQDN_PATH} >/dev/null 2>&1

   if [ -z "${GITLAB_FQDN_ROOT_USER}" ]; then
      GITLAB_FQDN_ROOT_USER=${GITLAB_FQDN_USER}
   fi
   if [ -z "${GITLAB_FQDN_ROOT_EMAIL}" ]; then
      GITLAB_FQDN_ROOT_EMAIL="${GITLAB_FQDN_USER}@${GITLAB_FQDN_URL}"
   fi

   sed -i "{ s%username: 'root'%username: '${GITLAB_FQDN_ROOT_USER}'%; s%admin@example.com%${GITLAB_FQDN_ROOT_EMAIL}% }" ${GITLAB_FQDN_ADMIN_CONFIG}

   option=""
   if [ -n "${GITLAB_FQDN_ROOT_PASSWORD}" ]; then
      option="GITLAB_ROOT_PASSWORD=${GITLAB_FQDN_ROOT_PASSWORD}"
   fi
   git config --global core.autocrlf input
   sudo -u ${GITLAB_FQDN_USER} sh -c "echo yes | rake gitlab:setup RAILS_ENV=${GITLAB_FQDN_ENV} ${option}" > /dev/null 2>&1
   sudo -u ${GITLAB_FQDN_USER} sh -c "rake assets:precompile RAILS_ENV=${GITLAB_FQDN_ENV}" > /dev/null 2>&1

   systemctl start gitlab-ce-sidekiq@${GITLAB_FQDN_PATH} >/dev/null 2>&1
   systemctl start gitlab-ce-unicorn@${GITLAB_FQDN_PATH} >/dev/null 2>&1
   systemctl start gitlab-workhorse@${GITLAB_FQDN_PATH} >/dev/null 2>&1
   systemctl enable gitlab-ce-sidekiq@${GITLAB_FQDN_PATH} >/dev/null 2>&1
   systemctl enable gitlab-ce-unicorn@${GITLAB_FQDN_PATH} >/dev/null 2>&1
   systemctl enable gitlab-workhorse@${GITLAB_FQDN_PATH} >/dev/null 2>&1
   systemctl enable redis@${GITLAB_FQDN_PATH} >/dev/null 2>&1
   mv ${GITLAB_FQDN_WORKING_DIR}/public/503.html{.save,}
}

function gitlab_purge
{
   GITLAB_FQDN="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   if [ -f "${GITLAB_FQDN_CONF_APACHE}" ]; then
      GITLAB_FQDN_DOCUMENT_ROOT="$(sed -e '{ /DocumentRoot/!d; s%.*\ /%/%; s%/.[^/]*$%% }' ${GITLAB_FQDN_CONF_APACHE})"
      GITLAB_FQDN_CONF_PATH="${GITLAB_FQDN_DOCUMENT_ROOT}/config"

      GITLAB_FQDN_DB_FILE="${GITLAB_FQDN_CONF_PATH}/database.yml"
      GITLAB_FQDN_DB="$(sed -e "{ /production:/,/database/!d; /database/!d; s%.*:\ *%% }" ${GITLAB_FQDN_DB_FILE})"
      GITLAB_FQDN_DB_USER="$(sed -e "{ /production:/,/username/!d; /username/!d; s%.*:\ *%% }" ${GITLAB_FQDN_DB_FILE})"

      systemctl stop gitlab-workhorse@${GITLAB_FQDN_PATH} >/dev/null 2>&1
      systemctl stop gitlab-ce-unicorn@${GITLAB_FQDN_PATH} >/dev/null 2>&1
      systemctl stop gitlab-ce-sidekiq@${GITLAB_FQDN_PATH} >/dev/null 2>&1
      systemctl stop redis@${GITLAB_FQDN_PATH} >/dev/null 2>&1

      systemctl disable gitlab-workhorse@${GITLAB_FQDN_PATH} >/dev/null 2>&1
      systemctl disable gitlab-ce-unicorn@${GITLAB_FQDN_PATH} >/dev/null 2>&1
      systemctl disable gitlab-ce-sidekiq@${GITLAB_FQDN_PATH} >/dev/null 2>&1
      systemctl disable redis@${GITLAB_FQDN_PATH} >/dev/null 2>&1

      sudo -u postgres psql -d template1 -c "DROP DATABASE ${GITLAB_FQDN_DB};" >/dev/null 2>&1
      sudo -u postgres psql -d template1 -c "DROP USER ${GITLAB_FQDN_DB_USER};" >/dev/null 2>&1
      GITLAB_FQDN_DOCUMENT_ROOT="${GITLAB_FQDN_DOCUMENT_ROOT%/*}"
      rm -R ${GITLAB_FQDN_DOCUMENT_ROOT}
      rm /etc/redis/${GITLAB_FQDN_PATH}.conf
      rm /etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf
      systemctl restart apache2 >/dev/null 2>&1
   fi
}

function gitlab_save
{
   GITLAB_FQDN="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   if [ -f "${GITLAB_FQDN_CONF_APACHE}" ]; then
      GITLAB_FQDN_DOCUMENT_ROOT="$(sed -e '{ /DocumentRoot/!d; s%.*\ /%/%; s%/.[^/]*$%% }' ${GITLAB_FQDN_CONF_APACHE})"
      GITLAB_FQDN_CONF_PATH="${GITLAB_FQDN_DOCUMENT_ROOT}/config"

      GITLAB_FQDN_DB_FILE="${GITLAB_FQDN_CONF_PATH}/database.yml"
      GITLAB_FQDN_DB="$(sed -e "{ /production:/,/database/!d; /database/!d; s%.*:\ *%% }" ${GITLAB_FQDN_DB_FILE})"
      GITLAB_FQDN_DB_USER="$(sed -e "{ /production:/,/username/!d; /username/!d; s%.*:\ *%% }" ${GITLAB_FQDN_DB_FILE})"
      if [ -z "${2}" ]; then
         GITLAB_FQDN_ARCHIVE_FILE="${GITLAB_FQDN_DB}-$(date +%Y%m%d)"
         GITLAB_FQDN_ARCHIVE_DIR="${GITLAB_FQDN_DOCUMENT_ROOT}/../../../"
      else
         GITLAB_FQDN_ARCHIVE_FILE="${2##*/}"
         GITLAB_FQDN_ARCHIVE_DIR="${2%/*}"
      fi
      if [ "${GITLAB_FQDN_ARCHIVE}" == "${GITLAB_FQDN_ARCHIVE_DIR}" ]; then
         GITLAB_FQDN_ARCHIVE_DIR="${GITLAB_FQDN_DOCUME}"
      fi
      GITLAB_FQDN_ARCHIVE="${GITLAB_FQDN_ARCHIVE}.gitlab"
      cd ${GITLAB_FQDN_DOCUMENT_ROOT}
      cd ..
      sudo -u ${GITLAB_FQDN_DB_USER} pg_dump ${GITLAB_FQDN_DB} > ${GITLAB_FQDN_DB}.db
      tar cfj ${GITLAB_FQDN_ARCHIVE_FILE} ${GITLAB_FQDN_DB}.db builds repositories satellites shared
      rm ${GITLAB_FQDN_DB}.db
      mv ${GITLAB_FQDN_ARCHIVE_FILE} ${GITLAB_FQDN_ARCHIVE_DIR}
   fi
}

function gitlab_restore
{
   GITLAB_FQDN="${1}"
   GITLAB_FQDN_PATH="${GITLAB_FQDN//\./_}"
   GITLAB_FQDN_CONF_APACHE="/etc/apache2/vhosts.d/${GITLAB_FQDN_PATH}.conf"

   if [ -f "${GITLAB_FQDN_CONF_APACHE}" ]; then
      GITLAB_FQDN_DOCUMENT_ROOT="$(sed -e '{ /DocumentRoot/!d; s%.*\ /%/%; s%/.[^/]*$%% }' ${GITLAB_FQDN_CONF_APACHE})"
      GITLAB_FQDN_CONF_PATH="${GITLAB_FQDN_DOCUMENT_ROOT}/config"

      GITLAB_FQDN_DB_FILE="${GITLAB_FQDN_CONF_PATH}/database.yml"
      GITLAB_FQDN_DB="$(sed -e "{ /production:/,/database/!d; /database/!d; s%.*:\ *%% }" ${GITLAB_FQDN_DB_FILE})"
      GITLAB_FQDN_DB_USER="$(sed -e "{ /production:/,/username/!d; /username/!d; s%.*:\ *%% }" ${GITLAB_FQDN_DB_FILE})"

      GITLAB_FQDN_ARCHIVE_FILE="${2}"
      if [ -n "${GITLAB_FQDN_ARCHIVE_FILE}" ]; then      
         if [ "/" != "${GITLAB_FQDN_ARCHIVE_FILE:0:1}" ]; then
            GITLAB_FQDN_ARCHIVE_FILE="${PWD}/${GITLAB_FQDN_ARCHIVE_FILE}"
         fi
         cd ${GITLAB_FQDN_DOCUMENT_ROOT}
         cd ..
         cp ${GITLAB_FQDN_ARCHIVE_FILE} .
         tar xfj ${GITLAB_FQDN_ARCHIVE_FILE}
         sudo -u ${GITLAB_FQDN_DB_USER} sh -c "cat ${GITLAB_FQDN_DB}.db | psql ${GITLAB_FQDN_DB}" >/dev/null 2>&1
         rm ${GITLAB_FQDN_DB}.db
      fi
   fi
}

function gitlab_help
{
   echo "[actions]:"
   echo "   help                      : show this help."
   echo "   service                   : start or stop a defined service."
   echo "      start <service> <fqdn> :"
   echo "      stop  <service> <fqdn> :"
   echo "   setup   <fqdn>            : setup a FQDN (Full Qualified Domain Name)."
   echo "      -u  <user>             : define a user to handle the FQDN (default: gitlab)."
   echo "      -Au <admin_user>       : define alternative administrator user (default: gitlab)."
   echo "      -Ae <admin_email>      : define email for administrator account."
   echo "      -Ap <admin_passwd>     : define password for administrator account."
   echo "      -Bp <ip:port>          : define background port (default: 127.0.0.1:44544)."
   echo "      -Lp <ip:port>          : define listen port (default: 127.0.0.1:44600)."
   echo "   purge   <fqdn>            : remove a FQDN (Full Qualified Domain Name) completly."
   echo "   save    <fqdn> [<file>]   : save database and repositories in an archivefile, default: FQDN-date in user directory."
   echo "   restore <fqdn>  <file>    : restore database and repositories from an archivefile."
   exit 0
}

function gitlab_unknown
{
   echo "UNKNOWN"
}

function gitlab_main
{
   action="${1}"
   shift
   case "${action}" in
      setup|purge|service|save|restore|help)
         gitlab_${action} ${*}
         ;;
      *)
         gitlab_unknown ${action} ${*}
         ;;
   esac
}

gitlab_main ${*}

