Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
bootstrap.sh 42.82 KiB
#! /bin/bash
#############################
# This bootstrap script sets up some build tools and the installs the packages
#   - geoserver
#   - httpd
#   - neo4j
#   - neo4j-spatial
#   - postgresql
#   - postgis
#   - pgRouting
#   - osmosis
#   - osm2pgrouting
# into a centos6 environment (fedora 20 might also work, but is untested).
#
# It can be used in the context of a Vagrantfile to configure a vagrant box and all
# the installations can be configured using global variables (some packages are only
# installed if their installed flag is set to "true")
#
# Some data (from the road network of innsbruck) is also downloaded (from osm) and
# imported into the installed databases (neo4j and postgresql)
# After various installations the installed services are started as well
############################

if [ -f "/var/vagrant_provision" ]; then
	exit 0
fi

if [ "$EUID" -ne "0" ]; then
	echo '- The bootstrap script must be run as root!'
	exit 1
fi

############################
# Variable definitions     #
############################

IMPORT_OSMDATA=true
IMPORT_OSMDATA_CACHED=true
IMPORT_SCHEDULES=true
INSTALL_GEOSERVER=false
INSTALL_HTTPD=true
INSTALL_ISOCHRONE_LOCAL=false # installs isochrone from vagrant start directory (eclipse project)
INSTALL_ISOCHRONE_RELEASE=true # installs latest isochrone release from nexus repository
INSTALL_ISOCHRONE_SNAPSHOT=true # installs latest isochrone snapshot from nexus repository
INSTALL_NEO4J=false
INSTALL_NEO4J_SPATIAL=false
INSTALL_PGROUTING=true
INSTALL_POSTGIS=true
INSTALL_POSTGRES=true
INSTALL_POSTGRES_ADMIN=true
INSTALL_PROJECT_CANIGET2=false # installs caniget2 sample project
INSTALL_PROJECT_PSIPROBE=true

############################
# Ext. argument handling   #
############################

IS_LOCAL_TEST_DEPLOY=false # will prevent install of projects if set to true
PG_DB_NAME="isochrone"
PG_DB_USER="@db_username@"
PG_DB_PASSWORD="@db_password@"

if [ ${PG_DB_USER:0:1} == "@" ]; then
	PG_DB_USER=$1
fi
if [ ${PG_DB_PASSWORD:0:1} == "@" ]; then
	PG_DB_PASSWORD=$2
fi

if [ -n "$3" ]; then
	if [ "$3" = "true" ]; then
		IS_LOCAL_TEST_DEPLOY=true
	fi
fi

############################
# General configuration    #
############################

CACHE_DIR_LOCAL="/tmp/vagrant-cache"
CACHE_DIR_REMOTE="http://www.krismer.de/files/PhD"
DEPLOY_DIR="/opt"
DOWNLOAD_DIR="$CACHE_DIR_LOCAL/wget"
SHARED_CONF_DIR="/setup/conf"
SHARED_IMG_DIR="/setup/img"
WORKING_DIR=`pwd`

############################
# Components configuration #
############################

#Armadillo from epel is too new for postgis (version 4 instead of 3), so use hard-coded file here
ARMADILLO_FILE="armadillo-3.800.2-1.el6.x86_64.rpm"
ARMADILLO_URL="$CACHE_DIR_REMOTE/armadillo-3.800.2-1.el6.x86_64.rpm"
GEOSERVER_VERSION="2.5.2"
GEOSERVER_FILE="geoserver-$GEOSERVER_VERSION-war.zip"
GEOSERVER_DOWNLOAD_URL="http://sourceforge.net/projects/geoserver/files/GeoServer/$GEOSERVER_VERSION/$GEOSERVER_FILE"
GEOSERVER_SHELL_VERSION="0.2-SNAPSHOT"
GEOSERVER_SHELL_FILE="gs-shell-$GEOSERVER_SHELL_VERSION-app.zip"
JAVA_VERSION="8u11"
JAVA_FILE_32="jdk-$JAVA_VERSION-linux-i586.rpm"
JAVA_FILE_64="jdk-$JAVA_VERSION-linux-x64.rpm"
JAVA_CRYPTO_FILE="jce_policy-8.zip"
MAVEN_VERSION="3.2.2"
MAVEN_FILE="apache-maven-$MAVEN_VERSION-bin.zip"
MAVEN_DOWNLOAD_URL="http://tweedo.com/mirror/apache/maven/maven-3/$MAVEN_VERSION/binaries/$MAVEN_FILE"
NEO4J_DB_USER="neo4j"
NEO4J_VERSION="2.1.3"
NEO4J_FILE="neo4j-community-$NEO4J_VERSION-unix.tar.gz"
NEO4J_DOWNLOAD_URL="http://dist.neo4j.org/$NEO4J_FILE"
NEO4J_SERVICE_NAME="neo4j-service"
NEO4J_SPATIAL_GIT_URL="https://github.com/neo4j/spatial.git"
NEO4J_SPATIAL_VERSION="0.13-neo4j-2.1"
NEO4J_SPATIAL_PLUGIN_DOWNLOAD_URL="http://dist.neo4j.org.s3.amazonaws.com/spatial/neo4j-spatial-$NEO4J_SPATIAL_VERSION-server-plugin.zip"
NEXUS_ARTIFACT_NAME="isochrone-web"
NEXUS_BASE_URL_DBIS="http://138.232.66.78/nexus"
NEXUS_BASE_URL_KRISMER="https://server.krismer.de/nexus"
NEXUS_BASE_URL="$NEXUS_BASE_URL_DBIS"
NEXUS_PUBLIC_REPO="isochrone"
#NEXUS_BASE_URL="$NEXUS_BASE_URL_KRISMER"
#NEXUS_PUBLIC_REPO="public"
NEXUS_RELEASE_ISOCHRONE="$NEXUS_BASE_URL/service/local/artifact/maven/content?r=$NEXUS_PUBLIC_REPO&g=at.uibk.dbis&a=$NEXUS_ARTIFACT_NAME&v=RELEASE&p=war"
#NEXUS_RELEASE_ISOCHRONE="$NEXUS_BASE_URL/service/local/artifact/maven/content?r=$NEXUS_PUBLIC_REPO&g=at.uibk.dbis&a=$NEXUS_ARTIFACT_NAME&v=0.2.2&p=war"
NEXUS_RELEASE_CANIGET2="https://server.krismer.de/nexus/service/local/artifact/maven/content?r=public&g=de.krismer&a=CanIGet2&v=0.1&p=war"
NEXUS_SNAPSHOT_ISOCHRONE="$NEXUS_BASE_URL/service/local/artifact/maven/content?r=$NEXUS_PUBLIC_REPO&g=at.uibk.dbis&a=$NEXUS_ARTIFACT_NAME&v=LATEST&p=war"
NEXUS_YUM_REPO="http://www.krismer.de/files/krismer.repo"
#OSM_BBOX_BZ="top=46.5200 left=11.3000 bottom=46.4500 right=11.3873"
#OSM_BBOX_IBK="top=47.3592 left=11.3020 bottom=47.2108 right=11.4554"
OSM_BBOX_BZ="${SHARED_CONF_DIR}/poly_bz.poly"
OSM_BBOX_IBK="${SHARED_CONF_DIR}/poly_ibk.poly"
OSM_BBOX_IT="${SHARED_CONF_DIR}/poly_it.poly"
OSM_BBOX_SF="${SHARED_CONF_DIR}/poly_sf.poly"
OSM_BBOX_ST="${SHARED_CONF_DIR}/poly_st.poly"
OSM_DOWNLOAD_MIRROR="http://download.geofabrik.de"
OSM_FILE_AUSTRIA="europe/austria-140301.osm.pbf"
OSM_FILE_ITALY="europe/italy-140301.osm.pbf"
OSM_FILE_CALIFORNIA="north-america/us/california-140301.osm.pbf"
OSM_FILE_BZ_FILTERED="bozen-140301-filtered.osm"
OSM_FILE_IBK_FILTERED="innsbruck-140301-filtered.osm"
OSM_FILE_IT_FILTERED="italy-140301-filtered.osm"
OSM_FILE_SF_FILTERED="sanfrancisco-140301-filtered.osm"
OSM_FILE_ST_FILTERED="southtyrol-140301-filtered.osm"
OSM_KEYS="aerialway,highway,public_transport,railway,route"
OSM2PGROUTING_GIT_URL="https://github.com/pgRouting/osm2pgrouting.git"
OSM2PGROUTING_VERSION="v2.0.0"
OSM2PGROUTING_MAPPING_CONF="$DEPLOY_DIR/osm2pgrouting/mapconfig.xml"
OSMOSIS_VERSION="0.43.1"
OSMOSIS_FILE="osmosis-$OSMOSIS_VERSION.zip"
OSMOSIS_DOWNLOAD_URL="http://bretth.dev.openstreetmap.org/osmosis-build/$OSMOSIS_FILE"
POSTGIS_GIT_URL="https://github.com/postgis/postgis.git"
POSTGIS_VERSION="auto"      # activate to install from repository
#POSTGIS_VERSION="2.1.3"    # activate to install from source
POSTGRESQL_DATA_DIR="/var/lib/pgsql/data"
POSTGRESQL_SERVICE_NAME="postgresql"
POSTGRESQL_SHORT_VERSION=""
POSTGRESQL_VERSION=""
PGROUTING_GIT_URL="https://github.com/pgRouting/pgrouting.git"
PGROUTING_VERSION="auto"      # activate to install from repository
#PGROUTING_VERSION="2.0.0"    # activate to install from source
REPO_ELGIS="none"
REPO_EPEL="none"
REPO_POSTGRESQL=""            # will be set later (depending on architecture)
REPO_POSTGRESQL_32="auto"
REPO_POSTGRESQL_64="auto"
REPO_RPMFORGE=""              # will be set later (depending on architecture)
REPO_RPMFORGE_32="http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.i686.rpm"
REPO_RPMFORGE_64="http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm"
REPO_RPMFORGE_CONFIG="/etc/yum.repos.d/rpmforge.repo"
SELINUX_CONFIG="/etc/selinux/config"
TABLE_PREFIX_BZ="bz_"
TABLE_PREFIX_IBK="ibk_"
TABLE_PREFIX_IT="it_"
TABLE_PREFIX_SF="sf_"
TABLE_PREFIX_ST="st_"
TEMPLATE_PSIPROBE_VERSION="2.3.3"
TEMPLATE_PSIPROBE_FILE="probe-$TEMPLATE_PSIPROBE_VERSION.zip"
TEMPLATE_PSIPROBE_DOWNLOAD_URL="https://psi-probe.googlecode.com/files/$TEMPLATE_PSIPROBE_FILE"
TEMPLATE_DIR_ISOCHRONE="/vagrant"
TOMCAT_VERSION="8.0.9"
TOMCAT_FILE="apache-tomcat-$TOMCAT_VERSION.tar.gz"
TOMCAT_DOWNLOAD_URL="http://tweedo.com/mirror/apache/tomcat/tomcat-8/v$TOMCAT_VERSION/bin/$TOMCAT_FILE"
TOMCAT_MEMORY_OPTS="-Xmx2048m -Xms512m"
TOMCAT_NAME="tomcat"
TOMCAT_USER="tomcat"
TOMCAT_WEBAPP_DIR="$DEPLOY_DIR/$TOMCAT_NAME/webapps"
TOPOLOGY_TOLERANCE=0.0005

############################
# OS check & configuration #
############################

IS_64_BIT=false
if [ "x86_64" == $(uname -m) ]; then
	IS_64_BIT=true
fi

DISTRI_FILE="/etc/redhat-release"
if [ ! -f "$DISTRI_FILE" ]; then
	DISTRI_FILE="/etc/issue"
fi

DISTRI_NAME=$(cat "$DISTRI_FILE" | head -n 1)
DISTRI_SUPPORTED=false
DISTRI_TYPE="Fedora 20"
DISTRI=$(printf "$DISTRI_NAME" | cut -d " " -f 1)
if [ "$DISTRI" == "CentOS" ]; then
	if printf "$DISTRI_NAME" | egrep -q " 6." ; then
		DISTRI_TYPE="CentOS 6"
		POSTGRESQL_SHORT_VERSION="93"
		POSTGRESQL_VERSION="9.3"
		REPO_ELGIS="http://elgis.argeo.org/repos/6/elgis-release-6-6_0.noarch.rpm"
		REPO_EPEL="http://fedora.aau.at/epel/6/i386/epel-release-6-8.noarch.rpm"
		REPO_POSTGRESQL_32="http://yum.postgresql.org/$POSTGRESQL_VERSION/redhat/rhel-6-i386/pgdg-centos$POSTGRESQL_SHORT_VERSION-$POSTGRESQL_VERSION-1.noarch.rpm"
		REPO_POSTGRESQL_64="http://yum.postgresql.org/$POSTGRESQL_VERSION/redhat/rhel-6-x86_64/pgdg-centos$POSTGRESQL_SHORT_VERSION-$POSTGRESQL_VERSION-1.noarch.rpm"
		DISTRI_SUPPORTED=true
	elif printf "$DISTRI_NAME" | egrep -q " 7." ; then
		DISTRI_TYPE="CentOS 7"
		POSTGRESQL_SHORT_VERSION="94"
		POSTGRESQL_VERSION="9.4"
		REPO_EPEL="http://fedora.aau.at/epel/beta/7/x86_64/epel-release-7-0.2.noarch.rpm"
		REPO_POSTGRESQL_64="http://yum.postgresql.org/$POSTGRESQL_VERSION/redhat/rhel-7-x86_64/pgdg-centos$POSTGRESQL_SHORT_VERSION-$POSTGRESQL_VERSION-1.noarch.rpm"
		REPO_RPMFORGE_64="http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm"
		# Activate centos 7 as soon as hdf5 is available as dependency for postgis (using epel); remember to update documentation of this file at the very top
#		DISTRI_SUPPORTED=$IS_64_BIT
	fi
elif [ "$DISTRI" == "Fedora"]; then
	if echo $DISTRI_NAME | egrep -q " 20 (Heisenbug)" ; then
		DISTRI_SUPPORTED=true
	fi
fi

if ! $DISTRI_SUPPORTED; then
	echo "Unsupported OS. Only CentOS 6, CentOS 7 (64bit) and Fedora 20 are supported!"
	exit 1;
fi

############################
# Calculated configuration #
############################

INSTALL_JAVA=false
INSTALL_MAVEN=false
INSTALL_TOMCAT=false

if $IS_LOCAL_TEST_DEPLOY; then
	# Some projects will never be installed when in local deploy mode (like latest release/snapshot from nexus)
	INSTALL_PROJECT_CANIGET2=false
	INSTALL_PROJECT_PSIPROBE=false
	INSTALL_ISOCHRONE_LOCAL=false
	INSTALL_ISOCHRONE_RELEASE=false
	INSTALL_ISOCHRONE_SNAPSHOT=false
else
	# Some projects will only be installed when in local deploy mode (like pgRouting that can be used for performance comparisons)
	INSTALL_PGROUTING=false
fi
if $INSTALL_GEOSERVER || $INSTALL_PROJECT_CANIGET2 || $INSTALL_ISOCHRONE_LOCAL || $INSTALL_ISOCHRONE_RELEASE || $INSTALL_ISOCHRONE_SNAPSHOT || $INSTALL_PROJECT_PSIPROBE; then
	INSTALL_TOMCAT=true
fi
if $INSTALL_NEO4J_SPATIAL; then
	INSTALL_MAVEN=$IMPORT_OSMDATA || $IMPORT_OSMDATA_CACHED
fi
if $INSTALL_TOMCAT || $INSTALL_GEOSERVER || $INSTALL_NEO4J || $INSTALL_NEO4J_SPATIAL || $IMPORT_OSMDATA || $IMPORT_OSMDATA_CACHED; then
	INSTALL_JAVA=true
fi
if $INSTALL_PGROUTING; then
	INSTALL_POSTGIS=true
fi
if $INSTALL_POSTGRES_ADMIN || $INSALL_POSTGIS; then
	INSTALL_POSTGRES=true
fi

if [ ! $POSTGRESQL_VERSION == "" ]; then
	POSTGRESQL_DATA_DIR="/var/lib/pgsql/$POSTGRESQL_VERSION/data"
	POSTGRESQL_SERVICE_NAME="postgresql-$POSTGRESQL_VERSION"
fi
POSTGRESQL_GLOB_CONF="$POSTGRESQL_DATA_DIR/postgresql.conf"
POSTGRESQL_HBA_CONF="$POSTGRESQL_DATA_DIR/pg_hba.conf"
POSTGRESQL_PKG_NAME="postgresql$POSTGRESQL_SHORT_VERSION"

if $IS_64_BIT; then
	REPO_POSTGRESQL="$REPO_POSTGRESQL_64"
	REPO_RPMFORGE="$REPO_RPMFORGE_64"
	JAVA_FILE="$JAVA_FILE_64"
else
	REPO_POSTGRESQL="$REPO_POSTGRESQL_32"
	REPO_RPMFORGE="$REPO_RPMFORGE_32"
	JAVA_FILE="$JAVA_FILE_32"
fi

############################
# Function definitions     #
############################

fn_download()
{
	local FILE="$1"
	local URL="$2"

	if wget --no-check-certificate -q -O /dev/null "$URL"; then
		wget --no-check-certificate -q -O "$FILE" "$URL"
	fi
}

# "wget -N" does not work with "-O" option... so we use a workaround here
fn_download_newer()
{
	local FILE="$1"
	local URL="$2"

	if [ ! -f "$FILE" ]; then
		if wget --no-check-certificate -q -O /dev/null "$URL"; then
			wget --no-check-certificate -q -O "$FILE" "$URL"
		fi
	fi
}

fn_import_data()
{
	local NAME="$1"
	local OSM_FILE="$2"
	local OSM_FILE_FILTERED="$3"
	local BOUNDING="$4"
	local SQL_EXPORT_FILE="$5"
	local TABLE_PREFIX="$6"

	local VALID_SQL_EXPORT=false
	if $INSTALL_POSTGIS && $IMPORT_SCHEDULES; then
		if [ -n "$SQL_EXPORT_FILE" ]; then
			VALID_SQL_EXPORT=true
		fi
	fi

	echo "Importing data for region of $NAME"
	if ! $VALID_SQL_EXPORT && ! $INSTALL_PGROUTING && ! $INSTALL_NEO4J_SPATIAL; then
		echo "  - skipping import"
		return 1
	fi

	if $IMPORT_OSMDATA_CACHED; then
		echo "  - downloading cached OpenStreetMap file"
		fn_download_newer $DOWNLOAD_DIR/$OSM_FILE_FILTERED $CACHE_DIR_REMOTE/$OSM_FILE_FILTERED
		cp $DOWNLOAD_DIR/$OSM_FILE_FILTERED $DEPLOY_DIR/$OSM_FILE_FILTERED >> /dev/null 2>&1
	fi

	if [ ! -f $DEPLOY_DIR/$OSM_FILE_FILTERED ]; then
		echo "  - downloading OpenStreetMap file (no cached file found)"
		OSM_FILENAME=$DOWNLOAD_DIR/${OSM_FILE##*/}
		fn_download_newer $OSM_FILENAME $OSM_DOWNLOAD_MIRROR/$OSM_FILE

		echo "  - filtering OpenStreetMap data"
		if [[ "$BOUNDING" == *.poly ]]; then
			$DEPLOY_DIR/osmosis/bin/osmosis --read-pbf file="$OSM_FILENAME" --bounding-polygon file="$BOUNDING" --way-key keyList="$OSM_KEYS" --used-node --write-xml file="$DEPLOY_DIR/$OSM_FILE_FILTERED" >> "initialize_osmData_$NAME.log" 2>&1
		else
			$DEPLOY_DIR/osmosis/bin/osmosis --read-pbf file="$OSM_FILENAME" --bounding-box $BOUNDING --way-key keyList="$OSM_KEYS" --used-node --write-xml file="$DEPLOY_DIR/$OSM_FILE_FILTERED" >> "initialize_osmData_$NAME.log" 2>&1
		fi
	fi

	if $VALID_SQL_EXPORT; then
		echo "  - downloading sql export"
		fn_download_newer $DOWNLOAD_DIR/$SQL_EXPORT_FILE $CACHE_DIR_REMOTE/$SQL_EXPORT_FILE
		cp $DOWNLOAD_DIR/$SQL_EXPORT_FILE $DEPLOY_DIR/$SQL_EXPORT_FILE >> /dev/null 2>&1

		echo "  - importing sql export into postgis database"
		gunzip -c $DEPLOY_DIR/$SQL_EXPORT_FILE | PGPASSWORD="$PG_DB_PASSWORD" psql -U "$PG_DB_USER" -h localhost "$PG_DB_NAME" >> "$WORKING_DIR/import_schedule_$NAME.log" 2>&1

		echo "  - fixing table permissions"
		tables=`PGPASSWORD="$PG_DB_PASSWORD" psql -qAt -U "$PG_DB_USER" -h localhost -c "SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tableowner = 'postgres';" "$PG_DB_NAME"`
		for tbl in $tables ; do
			PGPASSWORD="$PG_DB_PASSWORD" psql -qAt -U "$PG_DB_USER" -h localhost -c "ALTER TABLE $tbl OWNER TO $PG_DB_USER" "$PG_DB_NAME";
		done
	fi

	if $INSTALL_PGROUTING; then
		echo "  - importing filtered OpenStreetMap data into pgRouting"
		$DEPLOY_DIR/osm2pgrouting/build/osm2pgrouting -file "$DEPLOY_DIR/$OSM_FILE_FILTERED" -conf "$OSM2PGROUTING_MAPPING_CONF" -dbname $PG_DB_NAME -user $PG_DB_USER -passwd $PG_DB_PASSWORD -clean -prefixtables $TABLE_PREFIX >> "import_osm2pgrouting_$NAME.log" 2>&1

		echo "  - creating pgRouting topology"
		PGPASSWORD="$PG_DB_PASSWORD" psql -U "$PG_DB_USER" -h localhost -d "$PG_DB_NAME" -c "SELECT pgr_createTopology('${TABLE_PREFIX}ways', $TOPOLOGY_TOLERANCE, 'the_geom', 'gid');" >> "$WORKING_DIR/setup_database_$NAME.log" 2>&1
	fi

	if $INSTALL_NEO4J_SPATIAL; then
		echo "  - importing filtered OpenStreetMap data into neo4j-spatial"
		cd $DEPLOY_DIR/neo4j-spatial
		mvn exec:java -Dexec.mainClass=org.neo4j.gis.spatial.osm.OSMImporter -Dexec.args="$DEPLOY_DIR/neo4j/data/graph.db $DEPLOY_DIR/$OSM_FILE_FILTERED" >> $WORKING_DIR/import_osm2neo4j.log 2>&1
		cd $WORKING_DIR
	fi

	return 0
}

fn_service_start()
{
	local SERVICE_NAME="$1"

	touch "service_start_$SERVICE_NAME.log" 2>&1
	if [ "$DISTRI_TYPE" == "CentOS 6" ]; then
		service $SERVICE_NAME start >> "service_start_$SERVICE_NAME.log" 2>&1
		chkconfig $SERVICE_NAME on "service_start_$SERVICE_NAME.log" 2>&1
	else
		systemctl start $SERVICE_NAME >> "service_start_$SERVICE_NAME.log" 2>&1
		systemctl enable $SERVICE_NAME >> "service_start_$SERVICE_NAME.log" 2>&1
	fi

	sleep 2
}

fn_service_stop()
{
	local SERVICE_NAME="$1"

	touch "service_stop_$SERVICE_NAME.log" 2>&1
	if [ "$DISTRI_TYPE" == "CentOS 6" ]; then
		service $SERVICE_NAME stop >> "service_stop_$SERVICE_NAME.log" 2>&1
		chkconfig $SERVICE_NAME off "service_stop_$SERVICE_NAME.log" 2>&1
	else
		systemctl stop $SERVICE_NAME >> "service_stop_$SERVICE_NAME.log" 2>&1
		systemctl disable $SERVICE_NAME >> "service_stop_$SERVICE_NAME.log" 2>&1
	fi

	sleep 2
}

START=$(date +%s)

echo ""
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo " Performing basic system preparations:"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

############################
# Basic preparations       #
############################

cd $WORKING_DIR
mkdir -p $DOWNLOAD_DIR

echo "Configuring timezone"
cp /usr/share/zoneinfo/Europe/Vienna /etc/localtime >> setup_timezone.log 2>&1

echo "Installing utils (gcc, git, ...)"
yum -y install gcc gcc-c++ git gzip iptables-services nano nmap sed tar unzip wget >> install_utils.log 2>&1

############################
# Security preparations    #
############################

echo "Stopping Firewall and SELinux"
if [ "$DISTRI_TYPE" == "CentOS 6" ]; then
	fn_service_stop "iptables"
	fn_service_stop "ip6tables"
else
	fn_service_stop "firewalld"
fi

if [ $(getenforce) == "Enforcing" ]; then
	setenforce 0 >> stop_selinux.log 2>&1
fi
sed -i 's/SELINUX=enabled/SELINUX=disabled/' $SELINUX_CONFIG

############################
# Repository preparations  #
############################

if [ ! $REPO_ELGIS == "none" ]; then
	# Postgresql 9.4 needs never version of gdal which is not part of epel yet (so we install elgis repo)
	if [ $POSTGRESQL_SHORT_VERSION \> "93" ]; then
		echo "Installing elgis repository"
		fn_download $DOWNLOAD_DIR/elgis-repo.rpm $REPO_ELGIS
		yum -y localinstall $DOWNLOAD_DIR/elgis-repo.rpm >> install_elgis_repo.log 2>&1
		echo "  - enabled"
	fi
fi

if [ ! $REPO_EPEL == "none" ]; then
	# Epel Repository is needed for dependencies (gdal!) of postgresql/postgis/pgRouting
	echo "Installing epel repository"
	fn_download $DOWNLOAD_DIR/epel-repo.rpm $REPO_EPEL
	yum -y localinstall $DOWNLOAD_DIR/epel-repo.rpm >> install_epel_repo.log 2>&1
	echo "  - enabled"
fi

if $INSTALL_POSTGRES; then
	if [ "$DISTRI" == "CentOS" ]; then
		REPO_CONFIG="/etc/yum.repos.d/CentOS-Base.repo"
		sed -i 's/\[base\]/\[base\]\nexclude=postgresql\*/' $REPO_CONFIG
		sed -i 's/\[updates\]/\[updates\]\nexclude=postgresql\*/' $REPO_CONFIG
	fi

	echo "Installing $POSTGRESQL_SERVICE_NAME repository"
	fn_download $DOWNLOAD_DIR/postgresql-repo.rpm $REPO_POSTGRESQL
	yum -y localinstall $DOWNLOAD_DIR/postgresql-repo.rpm >> install_postgresql_repo.log 2>&1
	echo "  - enabled"
fi

# RpmForge is deactivated by default and has to be explicitly activated when using yum
echo "Installing rpmForge repository"
fn_download_newer $DOWNLOAD_DIR/rpmforge-repo.rpm $REPO_RPMFORGE
yum -y localinstall $DOWNLOAD_DIR/rpmforge-repo.rpm >> install_rpmforge_repo.log 2>&1
echo "  - disabled"
sed -i 's/enabled = 1/enabled = 0/' $REPO_RPMFORGE_CONFIG

############################
# Starting boostrap        #
############################

echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo " Bootstrapping the VM:"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo "Operating system $DISTRI_NAME"
echo "  - osType: $DISTRI_TYPE"
if [ "$DISTRI_TYPE" == "Fedora 20" ]; then
	echo "  - using untested operating system!!"
fi
if $IS_LOCAL_TEST_DEPLOY; then echo "Starting in local test deploy mode"; fi
echo "Installing software:"
if $INSTALL_HTTPD; then echo "  - apache webserver"; fi
if $INSTALL_MAVEN; then echo "  - apache maven $MAVEN_VERSION"; fi
if $INSTALL_JAVA; then echo "  - java $JAVA_VERSION"; fi
if $INSTALL_NEO4J; then echo "  - neo4j $NEO4J_VERSION"; fi
if $INSTALL_NEO4J_SPATIAL; then echo "  - neo4j-spatial $NEO4J_SPATIAL_VERSION"; fi
if $INSTALL_POSTGRES; then echo "  - postgresql $POSTGRESQL_VERSION"; fi
if $INSTALL_POSTGIS; then echo "  - postgis 2"; fi
if $INSTALL_PGROUTING; then echo "  - pgRouting $PGROUTING_VERSION"; fi
if $INSTALL_TOMCAT; then echo "  - tomcat $TOMCAT_VERSION"; fi
if $INSTALL_GEOSERVER; then echo "  - geoserver $GEOSERVER_VERSION"; fi
if $INSTALL_POSTGRES_ADMIN; then echo "  - phpPgAdmin"; fi
if $IMPORT_OSMDATA; then echo "  - osmosis $OSMOSIS_VERSION"; fi
if $IMPORT_OSMDATA_CACHED; then echo "Importing cached data from OSM (if possible)"; elif $IMPORT_OSMDATA; then echo "Importing data from OSM"; fi
if $IMPORT_SCHEDULES; then echo "Importing schedules"; fi
if $INSTALL_PROJECT_CANIGET2; then echo "Importing project \"CanIGet2\""; fi
if $INSTALL_ISOCHRONE_LOCAL; then echo "Importing project \"isochrone (local testing)\""; fi
if $INSTALL_ISOCHRONE_RELEASE; then echo "Importing project \"isochrone (release)\""; fi
if $INSTALL_ISOCHRONE_SNAPSHOT; then echo "Importing project \"isochrone (testing)\""; fi
if $INSTALL_PROJECT_PSIPROBE; then echo "Importing project \"psi-probe\""; fi
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo " Performing installations:"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

echo "Installing cmake"
yum -y --enablerepo=rpmforge-extras install cmake >> install_cmake.log 2>&1

if $INSTALL_HTTPD; then
	echo "Installing httpd server"
	yum -y install httpd >> install_httpd.log 2>&1
fi

if $INSTALL_POSTGRES; then
	echo "Installing $POSTGRESQL_SERVICE_NAME"
	yum -y install $POSTGRESQL_PKG_NAME $POSTGRESQL_PKG_NAME-contrib $POSTGRESQL_PKG_NAME-server >> install_postgresql.log 2>&1

	echo "  - exporting postgresql options"
	echo "export PostgreSQL_ROOT=/usr/pgsql-$POSTGRESQL_VERSION" >> /etc/profile.d/postgresql.sh
	source /etc/profile.d/postgresql.sh
fi

if $INSTALL_POSTGIS; then
	fn_download_newer $DOWNLOAD_DIR/$ARMADILLO_FILE "$ARMADILLO_URL"
	yum -y localinstall $DOWNLOAD_DIR/$ARMADILLO_FILE >> install_armadillo.log 2>&1

	if [ "$POSTGIS_VERSION" == "auto" ]; then
		echo "Installing postgis (from repository)"
		yum -y install postgis2_$POSTGRESQL_SHORT_VERSION >> install_postgis.log 2>&1
	else
		echo "Installing postgis dependencies"
		yum -y install gdal-devel geos-devel json-c-devel libxml2-devel proj-devel >> install_postgis_deps.log 2>&1

		echo "Installing postgis $POSTGIS_VERSION (from source)"
		git clone -q "$POSTGIS_GIT_URL" $DEPLOY_DIR/postgis-$POSTGIS_VERSION
		ln -sf $DEPLOY_DIR/postgis-$POSTGIS_VERSION $DEPLOY_DIR/postgis
		cd $DEPLOY_DIR/postgis
		git checkout -q $POSTGIS_VERSION >> /dev/null 2>&1
		./configure >> $WORKING_DIR/install_postgis.log 2>&1
		make >> $WORKING_DIR/install_postgis.log 2>&1
		make install >> $WORKING_DIR/install_postgis.log 2>&1
		cd $WORKING_DIR
	fi
fi

if $INSTALL_POSTGRES_ADMIN; then
	echo "Installing phpPgAdmin"
	yum -y install phpPgAdmin >> install_phpPgAdmin.log 2>&1
fi

if $INSTALL_PGROUTING; then
	if [ "$PGROUTING_VERSION" == "auto" ]; then
		echo "Installing pgRouting (from repository)"
		yum -y install pgrouting_$POSTGRESQL_SHORT_VERSION >> install_pgRouting.log 2>&1
	else
		echo "Installing pgRouting dependencies"
		yum -y install boost-devel $POSTGRESQL_PKG_NAME-devel $POSTGRESQL_PKG_NAME-libs postgis2_$POSTGRESQL_SHORT_VERSION-devel >> install_pgRouting_deps.log 2>&1

#		echo "Installing CGAL 4.3"
#		fn_download_newer $DOWNLOAD_DIR/CGAL-4.3.zip https://gforge.inria.fr/frs/download.php/32996/CGAL-4.3.zip
#		cp $DOWNLOAD_DIR/CGAL-4.3.zip $DEPLOY_DIR/CGAL-4.3.zip
#		unzip -o -d $DEPLOY_DIR $DEPLOY_DIR/CGAL-4.3.zip >> install_cgal.log 2>&1
#		cd $DEPLOY_DIR/CGAL-4.3
#		cmake . >> install_cgal.log 2>&1
#		make >> install_cgal.log 2>&1
#		make install >> install_cgal.log 2>&1
#		cd $WORKING_DIR

		echo "Installing pgRouting $PGROUTING_VERSION (from source)"
		git clone -q "$PGROUTING_GIT_URL" $DEPLOY_DIR/pgRouting-$PGROUTING_VERSION
		ln -sf $DEPLOY_DIR/pgRouting-$PGROUTING_VERSION $DEPLOY_DIR/pgRouting
		cd $DEPLOY_DIR/pgRouting
		git checkout -q pgrouting-$PGROUTING_VERSION >> /dev/null 2>&1
		mkdir build
		cd build
		cmake -DWITH_DD=OFF -DBoost_DIR:PATH=/usr/lib64/boost -DPOSTGRESQL_EXECUTABLE:FILEPATH="$PostgreSQL_ROOT"/bin/postgres -DPOSTGRESQL_PG_CONFIG:FILEPATH="$PostgreSQL_ROOT"/bin/pg_config .. >> $WORKING_DIR/install_pgRouting.log 2>&1
		make >> $WORKING_DIR/install_pgRouting.log 2>&1
		make install >> $WORKING_DIR/install_pgRouting.log 2>&1
		cd $WORKING_DIR
	fi
fi

if $INSTALL_JAVA; then
	echo "Installing java (oracle jdk-$JAVA_VERSION)"
	fn_download_newer $DOWNLOAD_DIR/$JAVA_FILE $CACHE_DIR_REMOTE/$JAVA_FILE
	yum -y localinstall $DOWNLOAD_DIR/$JAVA_FILE >> install_java.log 2>&1
	ln -sf /usr/java/latest $DEPLOY_DIR/jdk >> setup_java.log 2>&1
	ln -sf /usr/java/latest/jre $DEPLOY_DIR/jre >> setup_java.log 2>&1

	echo "  - setting alternatives for java"
	alternatives --install /usr/bin/java java $DEPLOY_DIR/jre/bin/java 200000 >> setup_java.log 2>&1
	alternatives --install /usr/bin/javaws javaws $DEPLOY_DIR/jre/bin/javaws 200000 >> setup_java.log 2>&1
	alternatives --set java $DEPLOY_DIR/jre/bin/java >> setup_java.log 2>&1
	alternatives --install /usr/bin/javac javac $DEPLOY_DIR/jdk/bin/javac 200000 >> setup_java.log 2>&1
	alternatives --install /usr/bin/jar jar $DEPLOY_DIR/jdk/bin/jar 200000 >> setup_java.log 2>&1

	echo "  - exporting java options"
	echo "export JAVA_HOME=$DEPLOY_DIR/jre" >> /etc/profile.d/java.sh
	echo "export PATH=\${JAVA_HOME}/bin:\${PATH}" >> /etc/profile.d/java.sh
	source /etc/profile.d/java.sh

	echo "  - installing strong cryptographie"
	fn_download_newer $DOWNLOAD_DIR/$JAVA_CRYPTO_FILE $CACHE_DIR_REMOTE/$JAVA_CRYPTO_FILE
	unzip -j -u $DOWNLOAD_DIR/$JAVA_CRYPTO_FILE -d $DEPLOY_DIR/jre/lib/security >> setup_java.log 2>&1
fi

if $INSTALL_TOMCAT; then
	echo "Installing $TOMCAT_NAME $TOMCAT_VERSION servlet container"
#	yum -y install $TOMCAT_NAME $TOMCAT_NAME-webapps $TOMCAT_NAME-admin-webapps >> install_tomcat.log 2>&1
#	ln -sf /usr/share/$TOMCAT_NAME $DEPLOY_DIR/$TOMCAT_NAME

	fn_download_newer $DOWNLOAD_DIR/$TOMCAT_FILE $TOMCAT_DOWNLOAD_URL
	cp $DOWNLOAD_DIR/$TOMCAT_FILE $DEPLOY_DIR/$TOMCAT_FILE
	tar -xvzf $DEPLOY_DIR/$TOMCAT_FILE -C $DEPLOY_DIR >> install_tomcat.log 2>&1
	rm -f $DEPLOY_DIR/$TOMCAT_FILE >> install_tomcat.log 2>&1
	ln -sf $DEPLOY_DIR/apache-tomcat-$TOMCAT_VERSION $DEPLOY_DIR/$TOMCAT_NAME >> install_tomcat.log 2>&1

	echo "  - exporting catalina options"
	if $INSTALL_GEOSERVER; then
		echo "export CATALINA_OPTS=\"-Djava.awt.headless=true $TOMCAT_MEMORY_OPTS -DGEOSERVER_DATA_DIR=$DEPLOY_DIR/geoserver/data\"" >> /etc/profile.d/catalina.sh
	else
		echo "export CATALINA_OPTS=\"-Djava.awt.headless=true $TOMCAT_MEMORY_OPTS\"" >> /etc/profile.d/catalina.sh
	fi
	source /etc/profile.d/catalina.sh
fi

if $INSTALL_GEOSERVER; then
	echo "Installing geoserver $GEOSERVER_VERSION"
	fn_download_newer $DOWNLOAD_DIR/$GEOSERVER_FILE $GEOSERVER_DOWNLOAD_URL
	unzip -o -d $TOMCAT_WEBAPP_DIR $DOWNLOAD_DIR/$GEOSERVER_FILE geoserver.war >> install_geoserver.log 2>&1

	echo "  - copying web archive into tomcat"
	mkdir -p $TOMCAT_WEBAPP_DIR/geoserver
	unzip -o -d $TOMCAT_WEBAPP_DIR/geoserver $TOMCAT_WEBAPP_DIR/geoserver.war  >> install_geoserver.log 2>&1
	rm -f $TOMCAT_WEBAPP_DIR/geoserver.war >> install_geoserver.log 2>&1

	echo "  - creating geoserver data directory"
#	mkdir -p $DEPLOY_DIR/geoserver >> install_geoserver.log 2>&1
#	mv $TOMCAT_WEBAPP_DIR/geoserver/data $DEPLOY_DIR/geoserver >> install_geoserver.log 2>&1
	mkdir -p $DEPLOY_DIR/geoserver/data >> install_geoserver.log 2>&1

	echo "Installing geoserver-shell $GEOSERVER_SHELL_VERSION"
	fn_download_newer $DOWNLOAD_DIR/$GEOSERVER_SHELL_FILE $CACHE_DIR_REMOTE/$GEOSERVER_SHELL_FILE
	unzip $DOWNLOAD_DIR/$GEOSERVER_SHELL_FILE -d $DEPLOY_DIR >> install_geoserver_shell.log 2>&1
	ln -sf $DEPLOY_DIR/gs-shell-0.2-SNAPSHOT $DEPLOY_DIR/gs-shell
	make >> install_geoserver_shell.log 2>&1
	make install >> install_geoserver_shell.log 2>&1
fi

if $INSTALL_ISOCHRONE_LOCAL; then
	echo "Installing template project \"isochrone (local testing)\""
	echo "  - creating war using gradle from $TEMPLATE_DIR_ISOCHRONE"

	$TEMPLATE_DIR_ISOCHRONE/gradlew -b $TEMPLATE_DIR_ISOCHRONE/build.gradle -c $TEMPLATE_DIR_ISOCHRONE/settings.gradle clean war >> install_isochrone_local.log 2>&1
	unzip -o -d $TOMCAT_WEBAPP_DIR/localTesting $TEMPLATE_DIR_ISOCHRONE/build/libs/isochrone-*.war >> install_isochrone_local.log 2>&1
fi

if $INSTALL_ISOCHRONE_RELEASE; then
	echo "Installing template project \"isochrone (release)\""
	echo "  - artifact: $NEXUS_RELEASE_ISOCHRONE"

	# we do not save this file in download dir (we do not want caching for isochrone.war)
	fn_download $DOWNLOAD_DIR/isochrone.war $NEXUS_RELEASE_ISOCHRONE
	cp $DOWNLOAD_DIR/isochrone.war $TOMCAT_WEBAPP_DIR/isochrone.war
	unzip -o -d $TOMCAT_WEBAPP_DIR/isochrone $TOMCAT_WEBAPP_DIR/isochrone.war >> install_isochrone_release.log 2>&1
	rm -f $TOMCAT_WEBAPP_DIR/isochrone.war >> install_isochrone_release.log 2>&1
fi

if $INSTALL_ISOCHRONE_SNAPSHOT; then
	echo "Installing template project \"isochrone (testing)\""
	echo "  - artifact: $NEXUS_SNAPSHOT_ISOCHRONE"

	# we do not save this file in download dir (we do not want caching for testing.war)
	fn_download $DOWNLOAD_DIR/testing.war $NEXUS_SNAPSHOT_ISOCHRONE
	cp $DOWNLOAD_DIR/testing.war $TOMCAT_WEBAPP_DIR/testing.war
	unzip -o -d $TOMCAT_WEBAPP_DIR/testing $TOMCAT_WEBAPP_DIR/testing.war >> install_isochrone_snapshot.log 2>&1
	rm -f $TOMCAT_WEBAPP_DIR/testing.war >> install_isochrone_snapshot.log 2>&1
fi

if $INSTALL_PROJECT_CANIGET2; then
	echo "Installing template project \"CanIGet2\""
	echo "  - artifact: $NEXUS_RELEASE_CANIGET2"

	fn_download_newer $DOWNLOAD_DIR/caniget2.war $NEXUS_RELEASE_CANIGET2
	cp $DOWNLOAD_DIR/caniget2.war $TOMCAT_WEBAPP_DIR
	unzip -o -d $TOMCAT_WEBAPP_DIR/caniget2 $TOMCAT_WEBAPP_DIR/caniget2.war >> install_caniget2.log 2>&1
	rm -f $TOMCAT_WEBAPP_DIR/caniget2.war >> install_caniget2.log 2>&1
fi

if $INSTALL_PROJECT_PSIPROBE; then
	echo "Installing template project \"psi-probe\" version $TEMPLATE_PSIPROBE_VERSION"
	echo "  - artifact: $TEMPLATE_PSIPROBE_DOWNLOAD_URL"

	fn_download_newer $DOWNLOAD_DIR/$TEMPLATE_PSIPROBE_FILE "$TEMPLATE_PSIPROBE_DOWNLOAD_URL"
	unzip $DOWNLOAD_DIR/$TEMPLATE_PSIPROBE_FILE probe.war -d $TOMCAT_WEBAPP_DIR
	unzip -o -d $TOMCAT_WEBAPP_DIR/psiprobe $TOMCAT_WEBAPP_DIR/probe.war >> install_psiprobe.log 2>&1
	rm -f $TOMCAT_WEBAPP_DIR/probe.war >> install_psiprobe.log 2>&1
fi

if $INSTALL_MAVEN; then
	echo "Installing maven $MAVEN_VERSION"
	mkdir -p $CACHE_DIR_LOCAL/maven
	fn_download_newer $DOWNLOAD_DIR/$MAVEN_FILE "$MAVEN_DOWNLOAD_URL"
	unzip -o $DOWNLOAD_DIR/$MAVEN_FILE -d $DEPLOY_DIR >> install_maven.log 2>&1
	ln -sf $DEPLOY_DIR/apache-maven-$MAVEN_VERSION $DEPLOY_DIR/apache-maven

	echo "  - exporting maven options"
	echo "export M2_HOME=$DEPLOY_DIR/apache-maven" >> /etc/profile.d/maven.sh
	echo "export PATH=\${M2_HOME}/bin:\${PATH}" >> /etc/profile.d/maven.sh
	source /etc/profile.d/maven.sh

	echo "  - configuring maven to use vagrant-cache plugin"
#	yum -y install xmlstarlet >> install_xmlstarlet.log
#	xmlstarlet edit --inplace --subnode "/_:settings" -t elem -n "localRepository" -v "$CACHE_DIR_LOCAL/maven" $DEPLOY_DIR/apache-maven/conf/settings.xml
	cp $SHARED_CONF_DIR/maven-settings.xml $DEPLOY_DIR/apache-maven/conf/settings.xml
fi

if $INSTALL_NEO4J; then
	echo "Installing neo4j dependencies"
	yum install -y lsof >> install_neo4j_deps.log 2>&1

	echo "Installing neo4j $NEO4J_VERSION"
	fn_download_newer $DOWNLOAD_DIR/$NEO4J_FILE "$NEO4J_DOWNLOAD_URL"
	tar -xvzf $DOWNLOAD_DIR/$NEO4J_FILE -C $DEPLOY_DIR >> install_neo4j.log 2>&1
	ln -sf $DEPLOY_DIR/neo4j-community-$NEO4J_VERSION $DEPLOY_DIR/neo4j

	echo "  - enabling neo4j network access"
	echo "org.neo4j.server.webserver.address=0.0.0.0" >> $DEPLOY_DIR/neo4j/conf/neo4j-server.properties
fi

if $INSTALL_NEO4J_SPATIAL; then
	echo "Installing neo4j-spatial $NEO4J_SPATIAL_VERSION"
	git clone -q "$NEO4J_SPATIAL_GIT_URL" $DEPLOY_DIR/neo4j-spatial-$NEO4J_SPATIAL_VERSION
	ln -sf $DEPLOY_DIR/neo4j-spatial-$NEO4J_SPATIAL_VERSION $DEPLOY_DIR/neo4j-spatial
	cd $DEPLOY_DIR/neo4j-spatial
	git checkout -q $NEO4J_SPATIAL_VERSION >> /dev/null 2>&1

	if $INSTALL_GEOSERVER; then
		if $IMPORT_OSMDATA || $IMPORT_OSMDATA_CACHED; then
			# We need to compile the source when importing data, so that the main class gets compiled
			echo "  - copying neo4j-spatial into geoserver (from source)"
			mvn clean install -DskipTests >> $WORKING_DIR/install_neo4j_spatial.log 2>&1
			unzip -o $DEPLOY_DIR/neo4j-spatial/target/*server-plugin.zip -d $TOMCAT_WEBAPP_DIR/geoserver/WEB-INF/lib >> $WORKING_DIR/install_neo4j_spatial_plugin.log 2>&1
		else
			echo "  - copying neo4j-spatial into geoserver (from binary)"
			fn_download_newer $DOWNLOAD_DIR/neo4j-spatial-$NEO4J_SPATIAL_VERSION-server-plugin.zip "$NEO4J_SPATIAL_PLUGIN_DOWNLOAD_URL"
			unzip -o $DOWNLOAD_DIR/neo4j-spatial-$NEO4J_SPATIAL_VERSION-server-plugin.zip -d $TOMCAT_WEBAPP_DIR/geoserver/WEB-INF/lib >> $WORKING_DIR/install_neo4j_spatial_plugin.log 2>&1
		fi
	fi
	cd $WORKING_DIR
fi

if $IMPORT_OSMDATA; then
	echo "Installing osmosis $OSMOSIS_VERSION"
	fn_download_newer $DOWNLOAD_DIR/$OSMOSIS_FILE "$OSMOSIS_DOWNLOAD_URL"
	mkdir -p $DEPLOY_DIR/osmosis-$OSMOSIS_VERSION
	unzip -o $DOWNLOAD_DIR/$OSMOSIS_FILE -d $DEPLOY_DIR/osmosis-$OSMOSIS_VERSION >> install_osmosis.log 2>&1
	ln -sf $DEPLOY_DIR/osmosis-* $DEPLOY_DIR/osmosis
	chmod a+x $DEPLOY_DIR/osmosis/bin/osmosis
fi

if ( $IMPORT_OSMDATA || $IMPORT_OSMDATA_CACHED ) && $INSTALL_PGROUTING; then
	echo "Installing osm2pgrouting dependencies"
	yum install -y expat-devel boost-devel >> install_osm2pgrouting_deps.log 2>&1

	echo "Installing osm2pgrouting $OSM2PGROUTING_VERSION"
	git clone -q "$OSM2PGROUTING_GIT_URL" $DEPLOY_DIR/osm2pgrouting-$OSM2PGROUTING_VERSION
	ln -sf $DEPLOY_DIR/osm2pgrouting-$OSM2PGROUTING_VERSION $DEPLOY_DIR/osm2pgrouting

	cd $DEPLOY_DIR/osm2pgrouting
	git checkout -q $OSM2PGROUTING_VERSION >> /dev/null 2>&1
	cmake -H. -Bbuild >> $WORKING_DIR/install_osm2pgrouting.log 2>&1
	cd build/
	make >> $WORKING_DIR/install_osm2pgrouting.log 2>&1
	make install >> $WORKING_DIR/install_osm2pgrouting.log 2>&1
	cd $WORKING_DIR
fi

echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo " Installations performed!"
echo " Preparing services:"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

if $INSTALL_POSTGRES; then
	echo "Initializing postgresql database"
	if [ -f "$PostgreSQL_ROOT/bin/postgresql$POSTGRESQL_SHORT_VERSION-setup" ]; then
		rm -rf $POSTGRESQL_DATA_DIR
		$PostgreSQL_ROOT/bin/postgresql$POSTGRESQL_SHORT_VERSION-setup initdb >> initialize_postgresql.log 2>&1
	else
		service $POSTGRESQL_SERVICE_NAME initdb >> initialize_postgresql.log 2>&1
	fi
	sleep 2

	echo "Configuring and starting postgresql-server"
	cp $SHARED_CONF_DIR/pg_hba.conf $POSTGRESQL_HBA_CONF
	echo "listen_addresses = '*'" >> $POSTGRESQL_GLOB_CONF
	echo "port = 5432" >> $POSTGRESQL_GLOB_CONF
	echo "log_hostname = off" >> $POSTGRESQL_GLOB_CONF
fi

if $INSTALL_POSTGRES_ADMIN; then
	echo "Configuring phpPgAdmin"
	cp $SHARED_CONF_DIR/phpPgAdmin.conf /etc/httpd/conf.d/phpPgAdmin.conf
	sed -i 's/\$conf\['\''servers'\''\]\[0\]\['\''host'\''\] = '\'''\''/\$conf\['\''servers'\''\]\[0\]\['\''host'\''\] = '\''localhost'\''/' /usr/share/phpPgAdmin/conf/config.inc.php
fi

if $INSTALL_NEO4J; then
	echo "Initializing neo4j database"
	$DEPLOY_DIR/neo4j/bin/neo4j -h -u $NEO4J_DB_USER install >> initialize_neo4j.log 2>&1

	echo "  - setting max open file limit for neo4j user"
	echo "$NEO4J_DB_USER    soft    nofile    40000" >> /etc/security/limits.conf
	echo "$NEO4J_DB_USER    hard    nofile    40000" >> /etc/security/limits.conf
	echo "session    required    pam_limits.so" >> /etc/pam.d/su
	ulimit -n 40000
fi

if $INSTALL_TOMCAT; then
	echo "Configuring tomcat users"
	groupadd -g 521 $TOMCAT_USER >> install_tomcat.log 2>&1
	useradd -u 521 -g 521 -c "Tomcat Service Account" -d $DEPLOY_DIR/apache-tomcat-$TOMCAT_VERSION $TOMCAT_USER >> install_tomcat.log 2>&1
	chown -R $TOMCAT_USER:$TOMCAT_USER $DEPLOY_DIR/apache-tomcat-$TOMCAT_VERSION >> install_tomcat.log 2>&1
	chown -R $TOMCAT_USER:$TOMCAT_USER $DEPLOY_DIR/$TOMCAT_NAME >> install_tomcat.log 2>&1

	cp $SHARED_CONF_DIR/tomcat-users.xml $DEPLOY_DIR/$TOMCAT_NAME/conf/tomcat-users.xml
	sed -i "s/password=\"admin\"/password=\"$PG_DB_PASSWORD\"/" $DEPLOY_DIR/$TOMCAT_NAME/conf/tomcat-users.xml

	echo "Configuring tomcat default web.xml (enabling CORS filer)"
	cp -f $SHARED_CONF_DIR/tomcat_web.xml $DEPLOY_DIR/$TOMCAT_NAME/conf/web.xml

	echo "Configuring tomcat permissions"
	if $INSTALL_GEOSERVER; then
		chown -R $TOMCAT_USER:$TOMCAT_USER $TOMCAT_WEBAPP_DIR/geoserver
		chown -R $TOMCAT_USER:$TOMCAT_USER $DEPLOY_DIR/geoserver
	fi

	echo "Configuring tomcat startup script"
	cp $SHARED_CONF_DIR/tomcat_startscript.sh /etc/init.d/$TOMCAT_NAME >> install_tomcat.log 2>&1
	chmod 755 /etc/init.d/$TOMCAT_NAME >> install_tomcat.log 2>&1

	echo "Configuring tomcat webapps (removing unnecessary ones)"
	rm -rf "$TOMCAT_WEBAPP_DIR/docs"
	rm -rf "$TOMCAT_WEBAPP_DIR/examples"
	rm -rf "$TOMCAT_WEBAPP_DIR/host-manager"
fi

if $INSTALL_POSTGIS && $INSTALL_GEOSERVER; then
	echo "Configuring geoserver epsg projections"
	mkdir -p $DEPLOY_DIR/geoserver/data/user_projections
	echo "82344=`grep ^[^//,^#] /setup/conf/srid_82344_wkt.txt | paste -sd "" | sed 's/ \+ / /g'`" >> $DEPLOY_DIR/geoserver/data/user_projections/epsg.properties
	chown -R $TOMCAT_USER:$TOMCAT_USER $DEPLOY_DIR/geoserver/data/user_projections
fi

echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo " Services prepared!"
echo " Starting services:"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

if $INSTALL_HTTPD; then
	fn_service_start "httpd"
fi
if $INSTALL_POSTGRES; then
	fn_service_start "$POSTGRESQL_SERVICE_NAME"
fi
if $INSTALL_NEO4J; then
	fn_service_start "$NEO4J_SERVICE_NAME"
fi
if $INSTALL_TOMCAT; then
	fn_service_start "$TOMCAT_NAME"
fi

if $INSTALL_POSTGRES; then
	echo "Creating postgresql database $PG_DB_NAME"
	sudo -u "postgres" psql -d template1 -c "CREATE DATABASE \"$PG_DB_NAME\";" >> $WORKING_DIR/setup_database.log 2>&1
	sudo -u "postgres" psql -d "$PG_DB_NAME" -c "CREATE USER \"$PG_DB_USER\" WITH PASSWORD '$PG_DB_PASSWORD';" >> $WORKING_DIR/setup_database.log 2>&1
	sudo -u "postgres" psql -d "$PG_DB_NAME" -c "ALTER DATABASE \"$PG_DB_NAME\" OWNER TO \"$PG_DB_USER\";" >> $WORKING_DIR/setup_database.log 2>&1
	sudo -u "postgres" psql -d "$PG_DB_NAME" -c "GRANT ALL PRIVILEGES ON DATABASE \"$PG_DB_NAME\" TO \"$PG_DB_USER\";" >> $WORKING_DIR/setup_database.log 2>&1
	sudo -u "postgres" psql -d "$PG_DB_NAME" -c "ALTER SCHEMA public OWNER TO \"$PG_DB_USER\";" >> $WORKING_DIR/setup_database.log 2>&1
	sudo -u "postgres" psql -d "$PG_DB_NAME" -c "ALTER ROLE \"$PG_DB_USER\" SUPERUSER;" >> $WORKING_DIR/setup_database.log 2>&1
fi

if $INSTALL_POSTGIS; then
	PGPASSWORD="$PG_DB_PASSWORD" psql -U "$PG_DB_USER" -h localhost -d "$PG_DB_NAME" -c "CREATE EXTENSION postgis;" >> $WORKING_DIR/setup_database.log 2>&1
	PGPASSWORD="$PG_DB_PASSWORD" psql -U "$PG_DB_USER" -h localhost -d "$PG_DB_NAME" -f $SHARED_CONF_DIR/pg_procedures.sql >> $WORKING_DIR/setup_database.log 2>&1
	PGPASSWORD="$PG_DB_PASSWORD" psql -U "$PG_DB_USER" -h localhost -d "$PG_DB_NAME" -f $SHARED_CONF_DIR/srid_82344_insert.sql >> $WORKING_DIR/setup_database.log 2>&1
fi

if $INSTALL_PGROUTING; then
	PGPASSWORD="$PG_DB_PASSWORD" psql -U "$PG_DB_USER" -h localhost -d "$PG_DB_NAME" -c "CREATE EXTENSION pgRouting;" >> $WORKING_DIR/setup_database.log 2>&1
fi

echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo " Services started!"
if $IMPORT_OSMDATA || $IMPORT_OSMDATA_CACHED; then
	echo " Importing data:"
	echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"

	fn_import_data "Bolzen" "$OSM_FILE_ITALY" "$OSM_FILE_BZ_FILTERED" "$OSM_BBOX_BZ" "bz_export.sql.gz" "$TABLE_PREFIX_BZ"
	fn_import_data "Innsbruck" "$OSM_FILE_AUSTRIA" "$OSM_FILE_IBK_FILTERED" "$OSM_BBOX_IBK" "" "$TABLE_PREFIX_IBK"
	if ! $IS_LOCAL_TEST_DEPLOY; then
#		fn_import_data "Italy" "$OSM_FILE_ITALY" "$OSM_FILE_IT_FILTERED" "$OSM_BBOX_IT" "it_export.sql.gz" $TABLE_PREFIX_IT
		fn_import_data "San Francisco" "$OSM_FILE_CALIFORNIA" "$OSM_FILE_SF_FILTERED" "$OSM_BBOX_SF" "sf_export.sql.gz" $TABLE_PREFIX_SF
#		fn_import_data "Alto Adige" "$OSM_FILE_ITALY" "$OSM_FILE_ST_FILTERED" "$OSM_BBOX_ST" "st_export.sql.gz" $TABLE_PREFIX_ST
	fi

	if $INSTALL_GEOSERVER; then
		if $INSTALL_NEO4J_SPATIAL; then
			echo "Configuring neo4j data permissions for geoserver"
			chown -R $TOMCAT_USER:$TOMCAT_USER $DEPLOY_DIR/neo4j/data/graph.db
		fi

		echo "Configuring geoserver $GEOSERVER_VERSION using geoserver-shell $GEOSERVER_SHELL_VERSION"
		sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_ws.gs >> setup_geoserver_workspace.log 2>&1
		sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_styles.gs >> setup_geoserver_styles.log 2>&1
		cp $SHARED_IMG_DIR/* $DEPLOY_DIR/geoserver/data/styles >> setup_geoserver_styles.log 2>&1

		if $INSTALL_NEO4J_SPATIAL; then
			sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_neo4j_ds.gs >> setup_geoserver_neo4j.log 2>&1
			sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_neo4j_ft_bz.gs >> setup_geoserver_neo4j.log 2>&1
			sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_neo4j_ft_ibk.gs >> setup_geoserver_neo4j.log 2>&1
			if ! $IS_LOCAL_TEST_DEPLOY; then
#				sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_neo4j_ft_it.gs >> setup_geoserver_neo4j.log 2>&1
				sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_neo4j_ft_sf.gs >> setup_geoserver_neo4j.log 2>&1
#				sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_neo4j_ft_st.gs >> setup_geoserver_neo4j.log 2>&1
				sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_neo4j_ft.gs >> setup_geoserver_neo4j.log 2>&1
			fi
		fi
		if $INSTALL_POSTGIS; then
			# copy geoserver_setup_postgis_ds and replace username/password
			cp $SHARED_CONF_DIR/geoserver_setup_postgis_ds.gs $WORKING_DIR/geoserver_setup_postgis_ds.gs
			sed -i "s/@db_username@/$PG_DB_USER/" $WORKING_DIR/geoserver_setup_postgis_ds.gs
			sed -i "s/@db_password@/$PG_DB_PASSWORD/" $WORKING_DIR/geoserver_setup_postgis_ds.gs

			sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $WORKING_DIR/geoserver_setup_postgis_ds.gs >> setup_geoserver_postgis.log 2>&1
			sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_postgis_ft_bz.gs >> setup_geoserver_postgis.log 2>&1
			sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_postgis_ft_ibk.gs >> setup_geoserver_postgis.log 2>&1
			if ! $IS_LOCAL_TEST_DEPLOY; then
#				sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_postgis_ft_it.gs >> setup_geoserver_postgis.log 2>&1
				sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_postgis_ft_sf.gs >> setup_geoserver_postgis.log 2>&1
#				sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_postgis_ft_st.gs >> setup_geoserver_postgis.log 2>&1
				sh $DEPLOY_DIR/gs-shell/bin/gs-shell --cmdfile $SHARED_CONF_DIR/geoserver_setup_postgis_ft.gs >> setup_geoserver_postgis.log 2>&1
			fi
		fi
	fi

	echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
	echo "Data imported!"
	echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
fi

# Prevent second provision (done by check at the beginning of this file)
touch /var/vagrant_provision

END=$(date +%s)
TOTAL=$(( $END - $START ))

echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
echo " All preparations done... the system can now be used"
echo " Provisioning time: $TOTAL seconds"
echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"