#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#  
#    http://www.apache.org/licenses/LICENSE-2.0
#    
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.

# Install a complete distribution, the required system tools and libraries,
# the runtime dependencies and the Tuscany SCA runtime on a fresh Ubuntu Server
# 10.10 image.

# Display commands as they are executed
set -x

# First update the system
sudo apt-get update

# Create install directory
u=`id -un`
g=`id -gn`
sudo mkdir -p /mnt/tuscany
sudo chown $u /mnt/tuscany
sudo chgrp $g /mnt/tuscany
cd /mnt/tuscany

# Install core dev tools
sudo apt-get -y install wget git-core subversion autoconf pkg-config automake libtool g++ make
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Apache HTTP server
sudo apt-get -y install libssl-dev libpcre3-dev
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Memcached
sudo apt-get -y install libevent-dev
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by SpiderMonkey
sudo apt-get -y install zip unzip
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Apache Qpid/C++
sudo apt-get -y install libboost-dev libboost-program-options-dev libboost-filesystem-dev uuid-dev
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Apache Vysper
sudo apt-get -y install openjdk-6-jdk
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by HTML Tidy
sudo apt-get -y install cvs
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by PostgreSQL
sudo apt-get -y install libreadline-dev
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Apache Thrift
sudo apt-get -y install bison flex python-dev
if [ "$?" != "0" ]; then
    exit $?
fi
# Required by Facebook Scribe
sudo apt-get -y install gawk
if [ "$?" != "0" ]; then
    exit $?
fi

# Download and install the Tuscany runtime
wget http://people.apache.org/~jsdelfino/tuscany/test/tuscany-sca-cpp-all-1.0.tar.gz
tar xzf tuscany-sca-cpp-all-1.0.tar.gz

