Browse Source

Merge branch '849'

Conflicts:
	toolset/setup/linux/installer.py
mcoccia 11 years ago
parent
commit
6a71882203

+ 5 - 0
config/benchmark_profile

@@ -1,3 +1,5 @@
+# Start Benchmark profile
+
 export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64
 export RESIN_HOME=~/FrameworkBenchmarks/installs/resin-4.0.36
 export GRAILS_HOME=~/FrameworkBenchmarks/installs/grails-2.4.2
@@ -28,3 +30,6 @@ export TFB_CLIENT_IDENTITY_FILE='/home/tfb/.ssh/id_rsa'
 export TFB_DATABASE_HOST='localhost'
 
 [ -e ~/.rvm ] && . ~/.rvm/scripts/'rvm'
+export LC_ALL='en_US.UTF-8'
+export NUMCPUS=`grep -c '^processor' /proc/cpuinfo`
+export MAKEFLAGS="-j $NUMCPUS -l $NUMCPUS"

+ 33 - 24
toolset/deployment/azure/azure-deployment.sh

@@ -43,6 +43,7 @@ function azure_check_configuration {
 function azure_set_variables {
     # Set variables used in several steps.
     AZURE_LINUX_USER="ubuntu"
+    AZURE_WINDOWS_USER="windows"
     AZURE_SSH_DIR="$HOME/.ssh"
     AZURE_KEY_NAME="id_rsa-${AZURE_DEPLOYMENT_NAME}"
     AZURE_KEY_FILE="${AZURE_SSH_DIR}/${AZURE_KEY_NAME}"
@@ -58,6 +59,8 @@ function azure_set_variables {
     AZURE_CONFIGURATION_OUTPUT_FILE="$BENCHMARK_WORKING_DIR/deployment-configuration.sh"
     BENCHMARK_REPOSITORY=${BENCHMARK_REPOSITORY:-"https://github.com/TechEmpower/FrameworkBenchmarks.git"}
     BENCHMARK_BRANCH=${BENCHMARK_BRANCH:-"master"}
+    UBUNTU_IMAGE_VERSION="12_04"
+    UBUNTU_IMAGE_TEMPLATE="Ubuntu_DAILY_BUILD-precise-${UBUNTU_IMAGE_VERSION}.*-LTS-amd64-server"
 
     # Under CYGWIN this script uses a helper function to call the Windows Azure command line program.
     if iscygwin; then
@@ -100,17 +103,17 @@ function azure_create_common_resources {
     # Create affinity group.
     echo ""
     echo "Creating affinity group $AZURE_DEPLOYMENT_NAME at $AZURE_DEPLOYMENT_LOCATION"
-    $AZURE_COMMAND account affinity-group create $AZURE_DEPLOYMENT_NAME --location "$AZURE_DEPLOYMENT_LOCATION" || fail "Error creating affinity group $AZURE_DEPLOYMENT_NAME."
+    $AZURE_COMMAND account affinity-group show $AZURE_DEPLOYMENT_NAME || $AZURE_COMMAND account affinity-group create $AZURE_DEPLOYMENT_NAME --label $AZURE_DEPLOYMENT_NAME --location "$AZURE_DEPLOYMENT_LOCATION" || fail "Error creating affinity group $AZURE_DEPLOYMENT_NAME."
 
     # Create storage account.
     echo ""
     echo "Creating storage account $AZURE_DEPLOYMENT_NAME"
-    $AZURE_COMMAND account storage create $AZURE_DEPLOYMENT_NAME --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating storage account $AZURE_DEPLOYMENT_NAME."
+    $AZURE_COMMAND account storage show $AZURE_DEPLOYMENT_NAME || $AZURE_COMMAND account storage create $AZURE_DEPLOYMENT_NAME --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating storage account $AZURE_DEPLOYMENT_NAME."
 
     # Create virtual network.
     echo ""
     echo "Creating virtual network $AZURE_DEPLOYMENT_NAME"
-    $AZURE_COMMAND network vnet create $AZURE_DEPLOYMENT_NAME --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual network $AZURE_DEPLOYMENT_NAME."
+    [[ -n `$AZURE_COMMAND network vnet list | grep $AZURE_DEPLOYMENT_NAME` ]] || $AZURE_COMMAND network vnet create $AZURE_DEPLOYMENT_NAME --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual network $AZURE_DEPLOYMENT_NAME."
 
     # Create directory for keys.
     echo ""
@@ -118,20 +121,26 @@ function azure_create_common_resources {
     mkdir -p ${AZURE_SSH_DIR} || fail "Error creating directory $AZURE_SSH_DIR."
 
     # Create key files.
-    echo "Creating key pair at $AZURE_KEY_FILE"
-    ssh-keygen -t rsa -b 2048 -f "$AZURE_KEY_FILE" -C "$AZURE_KEY_NAME" -q -N "" || fail "Error creating SSH key."
-    chmod 600 "$AZURE_KEY_FILE"
-    warning "-----------------------------------------------------------------------"
-    warning "Protect this key file. It has no passphrase and is stored in plaintext."
-    warning "-----------------------------------------------------------------------"
+    if [ ! -e "$AZURE_KEY_FILE" ]; then
+        echo "Creating key pair at $AZURE_KEY_FILE"
+        ssh-keygen -t rsa -b 2048 -f "$AZURE_KEY_FILE" -C "$AZURE_KEY_NAME" -q -N "" || fail "Error creating SSH key."
+        chmod 600 "$AZURE_KEY_FILE"
+        warning "-----------------------------------------------------------------------"
+        warning "Protect this key file. It has no passphrase and is stored in plaintext."
+        warning "-----------------------------------------------------------------------"
+    fi
 
-    echo "Creating PEM file at $AZURE_PEM_FILE"
-    openssl req -new -x509 -days 365 -subj "/CN=$AZURE_DEPLOYMENT_NAME/O=Web Framework Benchmarks" -key "$AZURE_KEY_FILE" -out "$AZURE_PEM_FILE" || fail "Error creating PEM file."
-    chmod 600 "$AZURE_PEM_FILE"
+    if [ ! -e "$AZURE_PEM_FILE" ]; then
+        echo "Creating PEM file at $AZURE_PEM_FILE"
+        openssl req -new -x509 -days 365 -subj "/CN=$AZURE_DEPLOYMENT_NAME/O=Web Framework Benchmarks" -key "$AZURE_KEY_FILE" -out "$AZURE_PEM_FILE" || fail "Error creating PEM file."
+        chmod 600 "$AZURE_PEM_FILE"
+    fi
 
-    echo "Creating CER file at $AZURE_CER_FILE"
-    openssl x509 -outform der -in "$AZURE_PEM_FILE" -out "$AZURE_CER_FILE" || fail "Error creating CER file."
-    chmod 600 "$AZURE_CER_FILE"
+    if [ ! -e "$AZURE_CER_FILE" ]; then
+        echo "Creating CER file at $AZURE_CER_FILE"
+        openssl x509 -outform der -in "$AZURE_PEM_FILE" -out "$AZURE_CER_FILE" || fail "Error creating CER file."
+        chmod 600 "$AZURE_CER_FILE"
+    fi
 
     echo ""
 }
@@ -144,18 +153,18 @@ function azure_create_vms {
     # Get latest Ubuntu Server 12.04 daily VM image.
     echo ""
     echo "Latest Ubuntu Server 12.04 image:"
-    LATEST_UBUNTU_IMAGE=$($AZURE_COMMAND vm image list | grep Ubuntu_DAILY_BUILD-precise-12_04_2-LTS-amd64-server | sort | tail -1 | cut -c 10-120)
+    LATEST_UBUNTU_IMAGE=$($AZURE_COMMAND vm image list | grep $UBUNTU_IMAGE_TEMPLATE | sort | tail -1 | cut -c 10-120)
     echo $LATEST_UBUNTU_IMAGE
 
     # Create client VM.
     echo ""
     echo "Creating client VM: $CLIENT_VM_NAME"
-    $AZURE_COMMAND vm create $CLIENT_VM_NAME $LATEST_UBUNTU_IMAGE $AZURE_LINUX_USER --ssh-cert "$AZURE_PEM_FILE" --no-ssh-password --vm-name $CLIENT_VM_NAME --vm-size $AZURE_DEPLOYMENT_VM_SIZE --virtual-network-name $AZURE_DEPLOYMENT_NAME --ssh --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual machine $CLIENT_VM_NAME."
+    $AZURE_COMMAND vm list | grep $CLIENT_VM_NAME || $AZURE_COMMAND vm create $CLIENT_VM_NAME $LATEST_UBUNTU_IMAGE $AZURE_LINUX_USER --ssh-cert "$AZURE_PEM_FILE" --no-ssh-password --vm-name $CLIENT_VM_NAME --vm-size $AZURE_DEPLOYMENT_VM_SIZE --virtual-network-name $AZURE_DEPLOYMENT_NAME --ssh --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual machine $CLIENT_VM_NAME."
 
     # Create Ubuntu server VM.
     echo ""
     echo "Creating Linux server VM: $LINUX_SERVER_VM_NAME"
-    $AZURE_COMMAND vm create $LINUX_SERVER_VM_NAME $LATEST_UBUNTU_IMAGE $AZURE_LINUX_USER --ssh-cert "$AZURE_PEM_FILE" --no-ssh-password --vm-name $LINUX_SERVER_VM_NAME --vm-size $AZURE_DEPLOYMENT_VM_SIZE --virtual-network-name $AZURE_DEPLOYMENT_NAME --ssh --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual machine $LINUX_SERVER_VM_NAME."
+    $AZURE_COMMAND vm list | grep $LINUX_SERVER_VM_NAME || $AZURE_COMMAND vm create $LINUX_SERVER_VM_NAME $LATEST_UBUNTU_IMAGE $AZURE_LINUX_USER --ssh-cert "$AZURE_PEM_FILE" --no-ssh-password --vm-name $LINUX_SERVER_VM_NAME --vm-size $AZURE_DEPLOYMENT_VM_SIZE --virtual-network-name $AZURE_DEPLOYMENT_NAME --ssh --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual machine $LINUX_SERVER_VM_NAME."
 
     # Get latest Windows Server 2012 Datacenter image.
     echo ""
@@ -166,7 +175,7 @@ function azure_create_vms {
     # Create Windows server VM.
     echo ""
     echo "Creating Windows server VM: $WINDOWS_SERVER_VM_NAME"
-    $AZURE_COMMAND vm create $WINDOWS_SERVER_VM_NAME $LATEST_WINDOWS_IMAGE Administrator $AZURE_WINDOWS_PASSWORD --vm-name $WINDOWS_SERVER_VM_NAME --vm-size $AZURE_DEPLOYMENT_VM_SIZE --virtual-network-name $AZURE_DEPLOYMENT_NAME --rdp --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual machine $WINDOWS_SERVER_VM_NAME."
+    $AZURE_COMMAND vm list | grep $WINDOWS_SERVER_VM_NAME || $AZURE_COMMAND vm create $WINDOWS_SERVER_VM_NAME $LATEST_WINDOWS_IMAGE $AZURE_WINDOWS_USER $AZURE_WINDOWS_PASSWORD --vm-name $WINDOWS_SERVER_VM_NAME --vm-size $AZURE_DEPLOYMENT_VM_SIZE --virtual-network-name $AZURE_DEPLOYMENT_NAME --rdp --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual machine $WINDOWS_SERVER_VM_NAME."
 
     # Create SQL Server VM.
     echo ""
@@ -175,7 +184,7 @@ function azure_create_vms {
     echo $SQL_SERVER_IMAGE
     echo ""
     echo "Creating SQL Server VM: $SQL_SERVER_VM_NAME"
-    $AZURE_COMMAND vm create $SQL_SERVER_VM_NAME $SQL_SERVER_IMAGE Administrator $AZURE_WINDOWS_PASSWORD --vm-name $SQL_SERVER_VM_NAME --vm-size $AZURE_DEPLOYMENT_VM_SIZE --virtual-network-name $AZURE_DEPLOYMENT_NAME --rdp --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual machine $SQL_SERVER_VM_NAME."
+    $AZURE_COMMAND vm list | grep $SQL_SERVER_VM_NAME || $AZURE_COMMAND vm create $SQL_SERVER_VM_NAME $SQL_SERVER_IMAGE $AZURE_WINDOWS_USER $AZURE_WINDOWS_PASSWORD --vm-name $SQL_SERVER_VM_NAME --vm-size $AZURE_DEPLOYMENT_VM_SIZE --virtual-network-name $AZURE_DEPLOYMENT_NAME --rdp --affinity-group $AZURE_DEPLOYMENT_NAME || fail "Error creating virtual machine $SQL_SERVER_VM_NAME."
 
     echo ""
 }
@@ -224,9 +233,9 @@ BENCHMARK_LINUX_SERVER_IP="$LINUX_SERVER_IP"
 BENCHMARK_LINUX_USER="$AZURE_LINUX_USER"
 BENCHMARK_SSH_KEY="$AZURE_KEY_FILE"
 BENCHMARK_WINDOWS_SERVER="$WINDOWS_SERVER_VM_NAME.cloudapp.net"
-BENCHMARK_WINDOWS_SERVER_USER="$WINDOWS_SERVER_VM_NAME\Administrator"
+BENCHMARK_WINDOWS_SERVER_USER="$WINDOWS_SERVER_VM_NAME\\$AZURE_WINDOWS_USER"
 BENCHMARK_SQL_SERVER="$SQL_SERVER_VM_NAME.cloudapp.net"
-BENCHMARK_SQL_SERVER_USER="$SQL_SERVER_VM_NAME\Administrator"
+BENCHMARK_SQL_SERVER_USER="$SQL_SERVER_VM_NAME\\$AZURE_WINDOWS_USER"
 BENCHMARK_WORKING_DIR="$BENCHMARK_WORKING_DIR"
 BENCHMARK_REPOSITORY="$BENCHMARK_REPOSITORY"
 BENCHMARK_BRANCH="$BENCHMARK_BRANCH"
@@ -260,11 +269,11 @@ ssh $AZURE_LINUX_USER@$LINUX_SERVER_VM_NAME.cloudapp.net -i $AZURE_KEY_FILE
 
 To connect to the Windows server VM:
 mstsc /v:$WINDOWS_SERVER_VM_NAME.cloudapp.net /admin /f
-User name: $WINDOWS_SERVER_VM_NAME\Administrator
+User name: $WINDOWS_SERVER_VM_NAME\\$AZURE_WINDOWS_USER
 
 To connect to the SQL Server VM:
 mstsc /v:$SQL_SERVER_VM_NAME.cloudapp.net /admin /f
-User name: $SQL_SERVER_VM_NAME\Administrator
+User name: $SQL_SERVER_VM_NAME\\$AZURE_WINDOWS_USER
 
 To manage the Windows Azure resources:
 https://manage.windowsazure.com

+ 1 - 1
toolset/deployment/common/bash-common.sh

@@ -62,7 +62,7 @@ function retry {
 
 # Detect CYGWIN.
 function iscygwin {
-    if [ "$(expr substr $(uname -s) 1 6)" == "CYGWIN" ]; then
+    if [ $(uname -s | grep "CYGWIN") ]; then
         true
     else
         false

+ 1 - 0
toolset/deployment/common/linux-initial-deployment.sh

@@ -32,6 +32,7 @@ cat >$BENCHMARK_REMOTE_CONFIGURATION_FILE <<_EOF_
 export BENCHMARK_HOME="/home/$BENCHMARK_LINUX_USER/FrameworkBenchmarks"
 export BENCHMARK_SERVER_IP="$BENCHMARK_LINUX_SERVER_IP"
 export BENCHMARK_CLIENT_IP="$BENCHMARK_LINUX_CLIENT_IP"
+export BENCHMARK_USER="$BENCHMARK_LINUX_USER"
 export BENCHMARK_KEY_PATH="$BENCHMARK_REMOTE_KEY_FILE"
 export BENCHMARK_REPOSITORY="$BENCHMARK_REPOSITORY"
 export BENCHMARK_BRANCH="$BENCHMARK_BRANCH"

+ 16 - 7
toolset/deployment/common/remote/lsr-step-1.sh

@@ -8,6 +8,7 @@ echo "Host:" `hostname`
 echo "Step 1: Install software on Linux server"
 
 export DEBIAN_FRONTEND=noninteractive
+export LC_ALL="en_US.UTF-8"
 
 echo ""
 source ~/benchmark-configuration.sh
@@ -27,9 +28,9 @@ echo "BENCHMARK_BRANCH: $BENCHMARK_BRANCH"
 
 echo ""
 echo "Configuring firewall"
-sudo iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
-sudo iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --source 10.0.0.0/11
-sudo iptables -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
+sudo iptables -C INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED || sudo iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
+sudo iptables -C INPUT -j ACCEPT -m state --state NEW -p tcp --source 10.0.0.0/11 || sudo iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --source 10.0.0.0/11
+sudo iptables -C OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED || sudo iptables -A OUTPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
 sudo iptables -L
 
 echo ""
@@ -45,9 +46,17 @@ echo "Installing git"
 sudo apt-get install git -qq
 
 echo ""
-echo "Clone FrameworkBenchmarks repository"
-git clone $BENCHMARK_REPOSITORY "$BENCHMARK_HOME" || { echo "Error cloning repository at $BENCHMARK_REPOSITORY."; exit 1; }
-cd "$BENCHMARK_HOME"
+
+if [ ! -d "$BENCHMARK_HOME" ]; then
+	echo "Clone FrameworkBenchmarks repository"
+	git clone $BENCHMARK_REPOSITORY "$BENCHMARK_HOME" || { echo "Error cloning repository at $BENCHMARK_REPOSITORY."; exit 1; }
+	cd "$BENCHMARK_HOME"
+else
+	echo "Updating FrameworkBenchmarks repository"
+	cd "$BENCHMARK_HOME"
+	git pull || { echo "Error updating repository at $BENCHMARK_REPOSITORY."; exit 1; }
+fi
+
 git checkout $BENCHMARK_BRANCH || { echo "Error checking out $BENCHMARK_BRANCH branch."; exit 1; }
 git branch
 git log -1 --pretty=format:"%H %s"
@@ -55,7 +64,7 @@ echo ""
 
 echo ""
 echo "Installing benchmark software"
-toolset/run-tests.py -s "$BENCHMARK_SERVER_IP" -c "$BENCHMARK_CLIENT_IP" -i "$BENCHMARK_KEY_PATH" --install-software --install-error-action abort --list-tests || { echo "Error installing software."; exit 1; }
+toolset/run-tests.py -s "$BENCHMARK_SERVER_IP" -c "$BENCHMARK_CLIENT_IP" -i "$BENCHMARK_KEY_PATH" -u "$BENCHMARK_USER" --install-software --install-error-action abort --list-tests || { echo "Error installing software."; exit 1; }
 
 echo ""
 echo "End of step 1"

+ 1 - 0
toolset/deployment/common/remote/lsr-step-2.sh

@@ -8,6 +8,7 @@ echo "Host:" `hostname`
 echo "Step 2: Additional setup"
 
 export DEBIAN_FRONTEND=noninteractive
+export LC_ALL="en_US.UTF-8"
 source ~/.bash_profile
 source ~/benchmark-configuration.sh
 source $BENCHMARK_HOME/toolset/deployment/common/bash-common.sh

+ 4 - 3
toolset/deployment/common/remote/lsr-step-3.sh

@@ -8,6 +8,7 @@ echo "Host:" `hostname`
 echo "Step 3: Verify setup."
 
 export DEBIAN_FRONTEND=noninteractive
+export LC_ALL="en_US.UTF-8"
 source ~/benchmark-configuration.sh
 
 echo ""
@@ -17,12 +18,12 @@ cd "$BENCHMARK_HOME" || { echo "Error changing directory."; exit 1; }
 
 echo "Verifying servlet-raw"
 echo ""
-toolset/run-tests.py -s "$BENCHMARK_SERVER_IP" -c "$BENCHMARK_CLIENT_IP" -i "$BENCHMARK_KEY_PATH" --max-threads 1 --name smoketest --test servlet-raw --type all -m verify
+toolset/run-tests.py -s "$BENCHMARK_SERVER_IP" -c "$BENCHMARK_CLIENT_IP" -i "$BENCHMARK_KEY_PATH" -u "$BENCHMARK_USER" --max-threads 1 --name smoketest --test servlet-raw --type all -m verify
 
 echo "Verifying cpoll_cppsp-postgres-raw"
 echo ""
-toolset/run-tests.py -s "$BENCHMARK_SERVER_IP" -c "$BENCHMARK_CLIENT_IP" -i "$BENCHMARK_KEY_PATH" --max-threads 1 --name smoketest --test cpoll_cppsp-postgres-raw --type all -m verify
+toolset/run-tests.py -s "$BENCHMARK_SERVER_IP" -c "$BENCHMARK_CLIENT_IP" -i "$BENCHMARK_KEY_PATH" -u "$BENCHMARK_USER" --max-threads 1 --name smoketest --test cpoll_cppsp-postgres-raw --type all -m verify
 
 echo "Verifying nodejs-mongodb"
 echo ""
-toolset/run-tests.py -s "$BENCHMARK_SERVER_IP" -c "$BENCHMARK_CLIENT_IP" -i "$BENCHMARK_KEY_PATH" --max-threads 1 --name smoketest --test nodejs-mongodb --type all -m verify
+toolset/run-tests.py -s "$BENCHMARK_SERVER_IP" -c "$BENCHMARK_CLIENT_IP" -i "$BENCHMARK_KEY_PATH" -u "$BENCHMARK_USER" --max-threads 1 --name smoketest --test nodejs-mongodb --type all -m verify

+ 274 - 189
toolset/setup/linux/installer.py

@@ -1,5 +1,6 @@
 import subprocess
 import os
+import os.path
 import time
 import traceback
 import sys
@@ -31,12 +32,12 @@ class Installer:
     #######################################
     # Prerequisites
     #######################################
-    self.__run_command("sudo apt-get update", True)
-    self.__run_command("sudo apt-get upgrade", True)
-    self.__run_command("sudo apt-get install build-essential libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev python-software-properties unzip git-core libcurl4-openssl-dev libbz2-dev libmysqlclient-dev mongodb-clients libreadline6-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev libgdbm-dev ncurses-dev automake libffi-dev htop libtool bison libevent-dev libgstreamer-plugins-base0.10-0 libgstreamer0.10-0 liborc-0.4-0 libwxbase2.8-0 libwxgtk2.8-0 libgnutls-dev libjson0-dev libmcrypt-dev libicu-dev cmake gettext curl libpq-dev mercurial mlton", True)
-    self.__run_command("sudo add-apt-repository ppa:ubuntu-toolchain-r/test", True)
-    self.__run_command("sudo apt-get update", True)
-    self.__run_command("sudo apt-get install gcc-4.8 g++-4.8", True)
+    self.__run_command("sudo apt-get -y update")
+    self.__run_command("sudo apt-get -y upgrade")
+    self.__run_command("sudo apt-get -y install build-essential libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev python-software-properties unzip git-core libcurl4-openssl-dev libbz2-dev libmysqlclient-dev mongodb-clients libreadline6-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev libgdbm-dev ncurses-dev automake libffi-dev htop libtool bison libevent-dev libgstreamer-plugins-base0.10-0 libgstreamer0.10-0 liborc-0.4-0 libwxbase2.8-0 libwxgtk2.8-0 libgnutls-dev libjson0-dev libmcrypt-dev libicu-dev cmake gettext curl libpq-dev mercurial mlton")
+    self.__run_command("sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y")
+    self.__run_command("sudo apt-get -y update")
+    self.__run_command("sudo apt-get install -y gcc-4.8 g++-4.8")
 
     self.__run_command("cp ../config/benchmark_profile ../../.bash_profile")
     self.__run_command("cat ../config/benchmark_profile >> ../../.profile")
@@ -51,16 +52,18 @@ class Installer:
     #
     # Leiningen
     #
-    self.__run_command("mkdir -p bin")
-    self.__download("https://raw.github.com/technomancy/leiningen/stable/bin/lein")
-    self.__run_command("mv lein bin/lein")
-    self.__run_command("chmod +x bin/lein")
+    if not self.__path_exists("bin/lein"):
+        self.__run_command("mkdir -p bin")
+        self.__download("https://raw.github.com/technomancy/leiningen/stable/bin/lein")
+        self.__run_command("mv lein bin/lein")
+        self.__run_command("chmod +x bin/lein")
 
     #
     # Maven
     #
-    self.__run_command("sudo apt-get install maven -qq")
-    self.__run_command("mvn -version")
+    if not self.__path_exists("/usr/bin/mvn"):
+        self.__run_command("sudo apt-get -y install maven -qq")
+        self.__run_command("mvn -version")
 
     #######################################
     # Languages
@@ -70,154 +73,183 @@ class Installer:
     #
     # Dart
     #
-    self.__download("http://storage.googleapis.com/dart-archive/channels/stable/release/latest/sdk/dartsdk-linux-x64-release.zip")
-    self.__run_command("unzip -qqo dartsdk-linux-x64-release.zip")
+    if not self.__path_exists("dart-sdk"):
+        self.__download("http://storage.googleapis.com/dart-archive/channels/stable/release/latest/sdk/dartsdk-linux-x64-release.zip")
+        self.__run_command("unzip dartsdk-linux-x64-release.zip")
 
     #
     # Erlang
     #
-    self.__run_command("sudo cp ../config/erlang.list /etc/apt/sources.list.d/erlang.list")
-    self.__download("http://binaries.erlang-solutions.com/debian/erlang_solutions.asc")
-    self.__run_command("sudo apt-key add erlang_solutions.asc")
-    self.__run_command("sudo apt-get update")
-    self.__run_command("sudo apt-get install esl-erlang", True)
+    if not self.__path_exists("/usr/bin/erl"):
+        self.__run_command("sudo cp ../config/erlang.list /etc/apt/sources.list.d/erlang.list")
+        self.__download("http://binaries.erlang-solutions.com/debian/erlang_solutions.asc")
+        self.__run_command("sudo apt-key add erlang_solutions.asc")
+        self.__run_command("sudo apt-get -y update")
+        self.__run_command("sudo apt-get install -y esl-erlang")
 
     #
     # nodejs
     #
-    self.__download("http://nodejs.org/dist/v0.10.8/node-v0.10.8-linux-x64.tar.gz")
-    self.__run_command("tar xzf node-v0.10.8-linux-x64.tar.gz")
+    if not self.__path_exists("node-v0.10.8-linux-x64"):
+        self.__download("http://nodejs.org/dist/v0.10.8/node-v0.10.8-linux-x64.tar.gz")
+        self.__run_command("tar xzf node-v0.10.8-linux-x64.tar.gz")
 
     #
     # Java
     #
-    self.__run_command("sudo apt-get install openjdk-7-jdk", True)
-    self.__run_command("sudo apt-get remove --purge openjdk-6-jre openjdk-6-jre-headless", True)
+    self.__run_command("sudo apt-get install -y openjdk-7-jdk")
+    self.__run_command("sudo apt-get remove -y --purge openjdk-6-jre openjdk-6-jre-headless")
 
     #
     # Elixir
     #
-    self.__run_command("wget https://github.com/elixir-lang/elixir/archive/v0.13.3.tar.gz");
-    self.__run_command("sudo tar -zxf v0.13.3.tar.gz");
-    self.__run_command("sudo make clean", cwd="elixir-0.13.3");
-    self.__run_command("sudo make test", cwd="elixir-0.13.3");
-
+		## Should work if you run make clean test manually
+    #if not self.__path_exists("v0.13.3.tar.gz"):
+    #  self.__run_command("wget https://github.com/elixir-lang/elixir/archive/v0.13.3.tar.gz");
+    #  self.__run_command("sudo tar -zxf v0.13.3.tar.gz");
+#      self.__run_command("bash -c -i 'sudo make install'", cwd="elixir-0.13.3");
+    #self.__run_command("sudo make clean", cwd="elixir-0.13.3");
+    #self.__run_command("sudo make test", cwd="elixir-0.13.3");
+			
     #
     # Ruby/JRuby
     #
     self.__run_command("curl -L get.rvm.io | bash -s head --auto-dotfiles")
     self.__run_command("echo rvm_auto_reload_flag=2 >> ~/.rvmrc")
-    self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm install 2.0.0-p0")
-    self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm 2.0.0-p0 do gem install bundler")
-    self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm install jruby-1.7.8")
-    self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.8 do gem install bundler")
+    if not self.__path_exists("../../.rvm/rubies/ruby-2.0.0-p0/"):
+      self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm install 2.0.0-p0")
+      self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm 2.0.0-p0 do gem install bundler")
+    if not self.__path_exists("../../.rvm/rubies/jruby-1.7.8/"):
+      self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm install jruby-1.7.8")
+      self.__bash_from_string("source ~/.rvm/scripts/'rvm' && rvm jruby-1.7.8 do gem install bundler")
 
     #
     # go
     #
-    self.__download("https://storage.googleapis.com/golang/go1.3.linux-amd64.tar.gz");
-    self.__run_command("tar xzf go1.3.linux-amd64.tar.gz")
+    if not self.__path_exists("go"):
+        self.__download("https://storage.googleapis.com/golang/go1.3.linux-amd64.tar.gz");
+        self.__run_command("tar xzf go1.3.linux-amd64.tar.gz")
 
     #
     # Perl
     #
-    self.__download("https://raw.githubusercontent.com/tokuhirom/Perl-Build/master/perl-build", "perl-build.pl")
-    self.__run_command("perl perl-build.pl -DDEBUGGING=-g 5.18.2 ~/FrameworkBenchmarks/installs/perl-5.18", retry=True)
-    self.__download("http://cpanmin.us", "cpanminus.pl")
-    self.__run_command("~/FrameworkBenchmarks/installs/perl-5.18/bin/perl cpanminus.pl --notest --no-man-page App::cpanminus", retry=True)
-    self.__run_command("~/FrameworkBenchmarks/installs/perl-5.18/bin/cpanm -f --notest --no-man-page DBI DBD::mysql Kelp Dancer Mojolicious Kelp::Module::JSON::XS Dancer::Plugin::Database Starman Plack JSON Web::Simple DBD::Pg JSON::XS EV HTTP::Parser::XS Monoceros EV IO::Socket::IP IO::Socket::SSL Memoize", retry=True)
+    if not self.__path_exists("perl-5.18"):
+      self.__download("https://raw.githubusercontent.com/tokuhirom/Perl-Build/master/perl-build", "perl-build.pl")
+      self.__run_command("perl perl-build.pl -DDEBUGGING=-g 5.18.2 ~/FrameworkBenchmarks/installs/perl-5.18", retry=True)
+      self.__download("http://cpanmin.us", "cpanminus.pl")
+      self.__run_command("~/FrameworkBenchmarks/installs/perl-5.18/bin/perl cpanminus.pl --notest --no-man-page App::cpanminus", retry=True)
+      self.__run_command("~/FrameworkBenchmarks/installs/perl-5.18/bin/cpanm -f --notest --no-man-page DBI DBD::mysql Kelp Dancer Mojolicious Kelp::Module::JSON::XS Dancer::Plugin::Database Starman Plack JSON Web::Simple DBD::Pg JSON::XS EV HTTP::Parser::XS Monoceros EV IO::Socket::IP IO::Socket::SSL Memoize", retry=True)
 
     #
     # php
     #
-    self.__download("http://museum.php.net/php5/php-5.4.13.tar.gz")
-    self.__run_command("tar xzf php-5.4.13.tar.gz")
-    self.__run_command("./configure --with-pdo-mysql --with-mysql --with-mcrypt --enable-intl --enable-mbstring --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-openssl", cwd="php-5.4.13")
-    self.__run_command("make", cwd="php-5.4.13")
-    self.__run_command("sudo make install", cwd="php-5.4.13")
-    self.__run_command("printf \"\\n\" | sudo pecl install -f apc-beta", cwd="php-5.4.13", retry=True)
+    if not self.__path_exists("/usr/local/bin/php"):
+        self.__download("http://museum.php.net/php5/php-5.4.13.tar.gz")
+        self.__run_command("tar xzf php-5.4.13.tar.gz")
+        self.__run_command("./configure --with-pdo-mysql --with-mysql --with-mcrypt --enable-intl --enable-mbstring --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-openssl", cwd="php-5.4.13")
+        self.__run_command("make", cwd="php-5.4.13")
+        self.__run_command("sudo make install", cwd="php-5.4.13")
+
+    if not self.__path_exists("/usr/local/lib/php/extensions/no-debug-non-zts-20100525/apc.so"):
+        self.__run_command("printf \"\\n\" | sudo pecl install apc-beta", cwd="php-5.4.13", retry=True)
+
     self.__run_command("sudo cp ../config/php.ini /usr/local/lib/php.ini")
     self.__run_command("sudo cp ../config/php-fpm.conf /usr/local/lib/php-fpm.conf")
 
     # Composer
-    self.__download("https://getcomposer.org/installer", "composer-installer.php")
-    self.__run_command("php composer-installer.php --install-dir=bin")
+    if not self.__path_exists("bin/composer.phar"):
+        self.__download("https://getcomposer.org/installer", "composer-installer.php")
+        self.__run_command("php composer-installer.php --install-dir=bin")
 
     # Phalcon
-    self.__run_command("git clone git://github.com/phalcon/cphalcon.git", retry=True)
-    self.__run_command("sudo ./install", cwd="cphalcon/build")
+    if not self.__path_exists("/usr/local/lib/php/extensions/no-debug-non-zts-20100525/phalcon.so"):
+        self.__run_command("test -d cphalcon || git clone git://github.com/phalcon/cphalcon.git", retry=True)
+        self.__run_command("sudo ./install", cwd="cphalcon/build")
 
     # YAF
-    self.__run_command("sudo pecl install -f yaf")
+    if not self.__path_exists("/usr/local/lib/php/extensions/no-debug-non-zts-20100525/yaf.so"):
+        self.__run_command("sudo pecl install -f yaf")
 
     #
     # Haskell
     #
-    self.__run_command("sudo apt-get install ghc cabal-install", True)
+    if not self.__path_exists("/usr/bin/haskell-compiler"):       ##not sure if right
+        self.__run_command("sudo apt-get install -y ghc cabal-install")
 
     #
     # RingoJs
     #
-    self.__download("http://www.ringojs.org/downloads/ringojs_0.10-1_all.deb")
-    self.__run_command("sudo apt-get install jsvc", True)
-    self.__run_command("sudo dpkg -i ringojs_0.10-1_all.deb", True)
-    self.__run_command("rm ringojs_0.10-1_all.deb")
+    if not self.__path_exists("/usr/share/ringojs"):
+        self.__download("http://www.ringojs.org/downloads/ringojs_0.10-1_all.deb")
+        self.__run_command("sudo apt-get install -y jsvc")
+        self.__run_command("sudo dpkg -i ringojs_0.10-1_all.deb", True)
+        self.__run_command("rm ringojs_0.10-1_all.deb")
 
     #
     # Mono
     #
-    self.__download("http://download.mono-project.com/sources/mono/mono-3.2.8.tar.bz2", "mono-3.2.8.tar.bz2")
-    self.__run_command("tar xf mono-3.2.8.tar.bz2")
-    self.__run_command("./configure --disable-nls --prefix=/usr/local", cwd="mono-3.2.8")
-    self.__run_command("make get-monolite-latest", cwd="mono-3.2.8")
-    self.__run_command("make -j4 EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/basic.exe", cwd="mono-3.2.8")
-    self.__run_command("sudo make install", cwd="mono-3.2.8")
-    self.__run_command("mv mono-3.2.8 mono");
 
-    self.__run_command("mozroots --import --sync", retry=True)
+    if not self.__path_exists("mono-3.2.8"):
+        self.__download("http://download.mono-project.com/sources/mono/mono-3.2.8.tar.bz2", "mono-3.2.8.tar.bz2")
+        self.__run_command("tar xf mono-3.2.8.tar.bz2")
+        self.__run_command("./configure --disable-nls --prefix=/usr/local", cwd="mono-3.2.8")
+        self.__run_command("make get-monolite-latest", cwd="mono-3.2.8")
+        self.__run_command("make -j4 EXTERNAL_MCS=${PWD}/mcs/class/lib/monolite/basic.exe", cwd="mono-3.2.8")
+        self.__run_command("sudo make install", cwd="mono-3.2.8")
+        self.__run_command("mv mono-3.2.8 mono");
 
-    self.__run_command("git clone --depth 1 git://github.com/mono/xsp", retry=True)
-    self.__run_command("./autogen.sh --prefix=/usr/local", cwd="xsp")
-    self.__run_command("make", cwd="xsp")
-    self.__run_command("sudo make install", cwd="xsp")
+    self.__run_command("mozroots --import --sync", retry=True)
+    
+    if not self.__path_exists("xsp"):
+        self.__run_command("git clone --depth 1 git://github.com/mono/xsp", retry=True)
+        self.__run_command("./autogen.sh --prefix=/usr/local", cwd="xsp")
+        self.__run_command("make", cwd="xsp")
+        self.__run_command("sudo make install", cwd="xsp")
 
     #
     # Nimrod
     #
-    self.__run_command("git clone git://github.com/Araq/Nimrod.git nimrod", retry=True)
-    self.__run_command("git checkout 987ac2439a87d74838233a7b188e4db340495ee5", cwd="nimrod")
-    self.__run_command("git clone git://github.com/nimrod-code/csources.git", cwd="nimrod", retry=True)
-    self.__run_command("git checkout 704015887981932c78a033dd5ede623b2ad6ae27", cwd="nimrod/csources")
-    self.__run_command("chmod +x build.sh", cwd="nimrod/csources")
-    self.__run_command("./build.sh", cwd="nimrod/csources")
-    self.__run_command("bin/nimrod c koch", cwd="nimrod")
-    self.__run_command("./koch boot -d:release", cwd="nimrod")
+    if not self.__path_exists("nimrod/bin/nimrod"):
+        self.__run_command("test -d nimrod || git clone git://github.com/Araq/Nimrod.git nimrod", retry=True)
+        self.__run_command("git checkout 987ac2439a87d74838233a7b188e4db340495ee5", cwd="nimrod")
+        self.__run_command("test -d csources || git clone git://github.com/nimrod-code/csources.git", cwd="nimrod", retry=True)
+        self.__run_command("git checkout 704015887981932c78a033dd5ede623b2ad6ae27", cwd="nimrod/csources");
+        self.__run_command("chmod +x build.sh", cwd="nimrod/csources")
+        self.__run_command("./build.sh", cwd="nimrod/csources")
+
+    if not self.__path_exists("nimrod/koch"):
+        self.__run_command("bin/nimrod c koch", cwd="nimrod")
+        self.__run_command("./koch boot -d:release", cwd="nimrod")
 
     #
     # Racket
     #
-    self.__download("https://github.com/plt/racket/archive/v5.3.6.tar.gz", "racket-5.3.6.tar.gz")
-    self.__run_command("tar xzf racket-5.3.6.tar.gz")
-    self.__run_command("./configure", cwd="racket-5.3.6/src")
-    self.__run_command("make", cwd="racket-5.3.6/src")
-    self.__run_command("sudo make install", cwd="racket-5.3.6/src")
+    if not self.__path_exists("racket-5.3.6/bin/racket") or not self.__path_exists("racket-5.3.6/collects/racket"):
+        self.__download("https://github.com/plt/racket/archive/v5.3.6.tar.gz", "racket-5.3.6.tar.gz")
+        self.__run_command("tar xzf racket-5.3.6.tar.gz")
+        self.__run_command("./configure", cwd="racket-5.3.6/src")
+        self.__run_command("make", cwd="racket-5.3.6/src")
+        self.__run_command("sudo make install", cwd="racket-5.3.6/src")
 
     #
     # Ur/Web
     #
-    self.__run_command("hg clone http://hg.impredicative.com/urweb")
-    self.__run_command("./autogen.sh", cwd="urweb")
-    self.__run_command("./configure", cwd="urweb")
-    self.__run_command("make", cwd="urweb")
-    self.__run_command("sudo make install", cwd="urweb")
+    if not self.__path_exists("/usr/local/bin/urweb"):
+        self.__run_command("hg clone http://hg.impredicative.com/urweb")
+        self.__run_command("./autogen.sh", cwd="urweb")
+        self.__run_command("./configure", cwd="urweb")
+        self.__run_command("make", cwd="urweb")
+        self.__run_command("sudo make install", cwd="urweb")
     
     #
     # HHVM
     #
-    self.__run_command("wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -")
-    self.__run_command("echo deb http://dl.hhvm.com/ubuntu trusty main | sudo tee /etc/apt/sources.list.d/hhvm.list")
-    self.__run_command("sudo apt-get update")
-    self.__run_command("sudo apt-get install hhvm", True)
+    if not self.__path_exists("/usr/bin/hhvm"):
+        self.__run_command("sudo add-apt-repository -y ppa:mapnik/v2.2.0")
+        self.__run_command("wget -O - http://dl.hhvm.com/conf/hhvm.gpg.key | sudo apt-key add -")
+        self.__run_command("echo deb http://dl.hhvm.com/ubuntu trusty main | sudo tee /etc/apt/sources.list.d/hhvm.list")
+        self.__run_command("sudo apt-get update")
+        self.__run_command("sudo apt-get install -y hhvm")
 
     #######################################
     # Webservers
@@ -226,70 +258,78 @@ class Installer:
     #
     # Nginx
     #
-    self.__download("http://nginx.org/download/nginx-1.4.1.tar.gz")
-    self.__run_command("tar xzf nginx-1.4.1.tar.gz")
-    self.__run_command("./configure", cwd="nginx-1.4.1")
-    self.__run_command("make", cwd="nginx-1.4.1")
-    self.__run_command("sudo make install", cwd="nginx-1.4.1")
+    if not self.__path_exists("/usr/local/nginx/sbin/nginx"):
+        self.__download("http://nginx.org/download/nginx-1.4.1.tar.gz")
+        self.__run_command("tar xzf nginx-1.4.1.tar.gz")
+        self.__run_command("./configure", cwd="nginx-1.4.1")
+        self.__run_command("make", cwd="nginx-1.4.1")
+        self.__run_command("sudo make install", cwd="nginx-1.4.1")
 
     #
     # Openresty (nginx with lua stuff)
     #
-    self.__download("http://openresty.org/download/ngx_openresty-1.5.8.1.tar.gz")
-    self.__run_command("tar xzf ngx_openresty-1.5.8.1.tar.gz")
-    self.__run_command("./configure --with-luajit --with-http_postgres_module", cwd="ngx_openresty-1.5.8.1")
-    self.__run_command("make", cwd="ngx_openresty-1.5.8.1")
-    self.__run_command("sudo make install", cwd="ngx_openresty-1.5.8.1")
+    if not self.__path_exists("/usr/local/openresty/nginx/sbin/nginx"):
+        self.__download("http://openresty.org/download/ngx_openresty-1.5.8.1.tar.gz")
+        self.__run_command("tar xzf ngx_openresty-1.5.8.1.tar.gz")
+        self.__run_command("./configure --with-luajit --with-http_postgres_module", cwd="ngx_openresty-1.5.8.1")
+        self.__run_command("make", cwd="ngx_openresty-1.5.8.1")
+        self.__run_command("sudo make install", cwd="ngx_openresty-1.5.8.1")
     
     #
     # Lapis
     #
-    self.__run_command("sudo apt-get install luarocks", True)
-    self.__run_command("sudo luarocks install http://github.com/leafo/lapis/raw/master/lapis-dev-1.rockspec")
+    if not self.__path_exists("/usr/local/bin/lapis"):
+        self.__run_command("sudo apt-get install -y luarocks")
+        self.__run_command("sudo luarocks install http://github.com/leafo/lapis/raw/master/lapis-dev-1.rockspec")
 
 
     #
     # Resin
     #
-
-    self.__run_command("sudo cp -r /usr/lib/jvm/java-1.7.0-openjdk-amd64/include /usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/bin/")
-    self.__download("http://www.caucho.com/download/resin-4.0.36.tar.gz")
-    self.__run_command("tar xzf resin-4.0.36.tar.gz")
-    self.__run_command("./configure --prefix=`pwd`", cwd="resin-4.0.36")
-    self.__run_command("make", cwd="resin-4.0.36")
-    self.__run_command("make install", cwd="resin-4.0.36")
-    self.__run_command("mv conf/resin.properties conf/resin.properties.orig", cwd="resin-4.0.36")
-    self.__run_command("cat ../config/resin.properties > resin-4.0.36/conf/resin.properties")
-    self.__run_command("mv conf/resin.xml conf/resin.xml.orig", cwd="resin-4.0.36")
-    self.__run_command("cat ../config/resin.xml > resin-4.0.36/conf/resin.xml")
+    if not self.__path_exists("resin-4.0.36/conf/resin.xml"):
+        self.__run_command("sudo cp -r /usr/lib/jvm/java-1.7.0-openjdk-amd64/include /usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/bin/")
+        self.__download("http://www.caucho.com/download/resin-4.0.36.tar.gz")
+        self.__run_command("tar xzf resin-4.0.36.tar.gz")
+        self.__run_command("./configure --prefix=`pwd`", cwd="resin-4.0.36")
+        self.__run_command("make", cwd="resin-4.0.36")
+        self.__run_command("make install", cwd="resin-4.0.36")
+        self.__run_command("mv conf/resin.properties conf/resin.properties.orig", cwd="resin-4.0.36")
+        self.__run_command("cat ../config/resin.properties > resin-4.0.36/conf/resin.properties")
+        self.__run_command("mv conf/resin.xml conf/resin.xml.orig", cwd="resin-4.0.36")
+        self.__run_command("cat ../config/resin.xml > resin-4.0.36/conf/resin.xml")
 
     #
     # Mongrel2
     #
-    self.__download("http://download.zeromq.org/zeromq-4.0.3.tar.gz")
-    self.__run_command("tar xzf zeromq-4.0.3.tar.gz")
-    self.__run_command("./configure", cwd="zeromq-4.0.3")
-    self.__run_command("make", cwd="zeromq-4.0.3")
-    self.__run_command("sudo make install", cwd="zeromq-4.0.3")
-    self.__run_command("sudo apt-get install sqlite3 libsqlite3-dev uuid uuid-runtime uuid-dev", True)
+    if not self.__path_exists("/usr/local/lib/libzmq.a"):
+        self.__download("http://download.zeromq.org/zeromq-4.0.3.tar.gz")
+        self.__run_command("tar xzf zeromq-4.0.3.tar.gz")
+        self.__run_command("./configure", cwd="zeromq-4.0.3")
+        self.__run_command("make", cwd="zeromq-4.0.3")
+        self.__run_command("sudo make install", cwd="zeromq-4.0.3")
+
+    self.__run_command("sudo apt-get install -y sqlite3 libsqlite3-dev uuid uuid-runtime uuid-dev")
     self.__run_command("sudo ldconfig -v")
-    self.__download("https://github.com/zedshaw/mongrel2/tarball/v1.8.1", "mongrel2.tar.gz")
-    self.__run_command("tar xvf mongrel2.tar.gz")
-    self.__run_command("mv zedshaw-mongrel2-aa2ecf8 mongrel2")
-    # for zmq4, we update the following file manually (not in v1.8.1)
-    self.__download("https://raw.github.com/zedshaw/mongrel2/9b565eeea003783c47502c2d350b99c9684ce97c/src/zmq_compat.h")
-    self.__run_command("mv -f zmq_compat.h mongrel2/src/")
-    self.__run_command("make clean all && sudo make install", cwd="mongrel2")
+
+    if not self.__path_exists("/usr/local/bin/mongrel2"):
+        self.__download("https://github.com/zedshaw/mongrel2/tarball/v1.8.1", "mongrel2.tar.gz")
+        self.__run_command("tar xvf mongrel2.tar.gz")
+        self.__run_command("mv zedshaw-mongrel2-aa2ecf8 mongrel2")
+        # for zmq4, we update the following file manually (not in v1.8.1)
+        self.__download("https://raw.github.com/zedshaw/mongrel2/9b565eeea003783c47502c2d350b99c9684ce97c/src/zmq_compat.h")
+        self.__run_command("mv -f zmq_compat.h mongrel2/src/")
+        self.__run_command("make clean all && sudo make install", cwd="mongrel2")
 
     #
     # Weber
     #
-    self.__run_command("git clone https://github.com/elixir-web/weber.git");
-    # To get the two make commands working, we need to hard code the path for elixir's "mix" and run it in bash
-    self.__run_command("sed -i 's:$(MIX):/home/tfb/FrameworkBenchmarks/installs/elixir-0.13.3/bin/mix:' Makefile", cwd="weber")
-    # Because of the way that we are running it, we can't just "send a yes" like normal
-    self.__run_command("bash -i -c 'yes | make'", cwd="weber");
-    self.__run_command("bash -i -c 'yes | make test'", cwd="weber");
+#    if not self.__path_exists("weber"):
+#        self.__run_command("git clone https://github.com/elixir-web/weber.git");
+        # To get the two make commands working, we need to hard code the path for elixir's "mix"
+        #self.__run_command("sed -i 's:$(MIX):/home/tfb/FrameworkBenchmarks/installs/elixir-0.13.3/bin/mix:' Makefile", cwd="weber")
+        #self.__run_command("bash -i -c 'make'", cwd="weber");
+#        self.__run_command("make", cwd="weber");
+        #self.__run_command("bash -i -c 'sudo make test'", cwd="weber");
 
     ##############################################################
     # Frameworks
@@ -298,21 +338,24 @@ class Installer:
     #
     # Grails
     #
-    self.__download("http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/grails-2.4.2.zip")
-    self.__run_command("unzip -o grails-2.4.2.zip")
+    if not self.__path_exists("grails-2.4.2"):
+        self.__download("http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/grails-2.4.2.zip")
+        self.__run_command("unzip -o grails-2.4.2.zip")
 
     #
     # Play 2
     #
-    self.__download("http://downloads.typesafe.com/play/2.2.0/play-2.2.0.zip")
-    self.__run_command("unzip -o play-2.2.0.zip")
+    if not self.__path_exists("play-2.2.0"):
+        self.__download("http://downloads.typesafe.com/play/2.2.0/play-2.2.0.zip")
+        self.__run_command("unzip -o play-2.2.0.zip")
 
     #
     # Play 1
     #
-    self.__download("http://downloads.typesafe.com/releases/play-1.2.5.zip")
-    self.__run_command("unzip -o play-1.2.5.zip")
-    self.__run_command("mv play-1.2.5/play play-1.2.5/play1")
+    if not self.__path_exists("play-1.2.5"):
+        self.__download("http://downloads.typesafe.com/releases/play-1.2.5.zip")
+        self.__run_command("unzip -o play-1.2.5.zip")
+        self.__run_command("mv play-1.2.5/play play-1.2.5/play1")
 
     # siena
     self.__run_command("yes | play-1.2.5/play1 install siena")
@@ -320,21 +363,23 @@ class Installer:
     #
     # TreeFrog Framework
     #
-    self.__run_command("sudo apt-get install qt4-qmake libqt4-dev libqt4-sql-mysql libqt4-sql-psql g++", True)
-    self.__download("http://downloads.sourceforge.net/project/treefrog/src/treefrog-1.7.5.tar.gz")
-    self.__run_command("tar xzf treefrog-1.7.5.tar.gz")
-    self.__run_command("rm treefrog-1.7.5.tar.gz")
-    self.__run_command("./configure", cwd="treefrog-1.7.5")
-    self.__run_command("make", cwd="treefrog-1.7.5/src")
-    self.__run_command("sudo make install", cwd="treefrog-1.7.5/src")
-    self.__run_command("make", cwd="treefrog-1.7.5/tools")
-    self.__run_command("sudo make install", cwd="treefrog-1.7.5/tools")
+    if not self.__path_exists("/usr/bin/treefrog") or not self.__path_exists("/usr/bin/tspawn"):
+        self.__run_command("sudo apt-get install -y qt4-qmake libqt4-dev libqt4-sql-mysql libqt4-sql-psql g++")
+        self.__download("http://downloads.sourceforge.net/project/treefrog/src/treefrog-1.7.5.tar.gz")
+        self.__run_command("tar xzf treefrog-1.7.5.tar.gz")
+        self.__run_command("rm treefrog-1.7.5.tar.gz")
+        self.__run_command("./configure", cwd="treefrog-1.7.5")
+        self.__run_command("make", cwd="treefrog-1.7.5/src")
+        self.__run_command("sudo make install", cwd="treefrog-1.7.5/src")
+        self.__run_command("make", cwd="treefrog-1.7.5/tools")
+        self.__run_command("sudo make install", cwd="treefrog-1.7.5/tools")
 
     #
     # Vert.x
     #
-    self.__download("http://dl.bintray.com/vertx/downloads/vert.x-2.1.1.tar.gz?direct=true", "vert.x-2.1.1.tar.gz")
-    self.__run_command("tar xzf vert.x-2.1.1.tar.gz")
+    if not self.__path_exists("vert.x-2.1.1"):
+        self.__download("http://dl.bintray.com/vertx/downloads/vert.x-2.1.1.tar.gz?direct=true", "vert.x-2.1.1.tar.gz")
+        self.__run_command("tar xzf vert.x-2.1.1.tar.gz")
 
     #
     # Yesod
@@ -345,32 +390,38 @@ class Installer:
     #
     # Jester
     #
-    self.__run_command("git clone git://github.com/dom96/jester.git jester/jester", retry=True)
+    if not self.__path_exists("jester"):
+        self.__run_command("git clone git://github.com/dom96/jester.git jester/jester", retry=True)
 
     #
     # Onion
     #
-    self.__run_command("git clone https://github.com/davidmoreno/onion.git")
-    self.__run_command("mkdir build", cwd="onion")
-    self.__run_command("cmake ..", cwd="onion/build")
-    self.__run_command("make", cwd="onion/build")
+    if not self.__path_exists("onion"):
+        self.__run_command("git clone https://github.com/davidmoreno/onion.git")
+        self.__run_command("mkdir build", cwd="onion")
+        self.__run_command("cmake ..", cwd="onion/build")
+        self.__run_command("make", cwd="onion/build")
 
     # nawak
     #
-    self.__run_command("git clone git://github.com/idlewan/nawak.git nawak/nawak", retry=True)
+    if not self.__path_exists("nawak"):
+        self.__run_command("git clone git://github.com/idlewan/nawak.git nawak/nawak", retry=True)
+
+    self.__run_command("sudo apt-get -y autoremove || true");
 
     #
     # Wt
     #
-    self.__run_command("sudo apt-get install libboost1.54-all-dev", True)
-    self.__download("http://downloads.sourceforge.net/witty/wt-3.3.3.tar.gz", filename="wt.tar.gz")
-    self.__run_command("tar xf wt.tar.gz")
-    self.__run_command("rm wt.tar.gz")
-    self.__run_command("bash -c 'mv wt-* wt'")
-    self.__run_command("mkdir build", cwd="wt")
-    self.__run_command("cmake .. -DWT_CPP_11_MODE=-std=c++0x -DCMAKE_BUILD_TYPE=Release", cwd="wt/build")
-    self.__run_command("make", cwd="wt/build")
-    self.__run_command("sudo make install", cwd="wt/build")
+    if not self.__path_exists("nawak"):
+      self.__run_command("sudo apt-get install libboost1.54-all-dev")
+      self.__download("http://downloads.sourceforge.net/witty/wt-3.3.3.tar.gz", filename="wt.tar.gz")
+      self.__run_command("tar xf wt.tar.gz")
+      self.__run_command("rm wt.tar.gz")
+      self.__run_command("bash -c 'mv wt-* wt'")
+      self.__run_command("mkdir build", cwd="wt")
+      self.__run_command("cmake .. -DWT_CPP_11_MODE=-std=c++0x -DCMAKE_BUILD_TYPE=Release", cwd="wt/build")
+      self.__run_command("make", cwd="wt/build")
+      self.__run_command("sudo make install", cwd="wt/build")
 
     print("\nINSTALL: Finished installing server software\n")
   ############################################################
@@ -381,33 +432,37 @@ class Installer:
     """Install Python runtime, frameworks and libraries"""
     # PyPy 2.3.1
     f = "pypy-2.3.1-linux64.tar.bz2"
-    if not os.path.exists(f):
+    #if not os.path.exists(f):
+    if not self.__path_exists("pypy"):
       self.__download("https://bitbucket.org/pypy/pypy/downloads/" + f, f)
-    self.__run_command("tar xf " + f)
-    self.__run_command('ln -sf pypy-2.3.1-linux64 pypy')
+      self.__run_command("tar xf " + f)
+      self.__run_command('ln -sf pypy-2.3.1-linux64 pypy')
 
     # CPython 2.7.7
     f = "Python-2.7.7.tgz"
-    if not os.path.exists(f):
+    #if not os.path.exists("py2"):
+    if not self.__path_exists("py2"):
       self.__download("http://www.python.org/ftp/python/2.7.7/" + f, f)
-    self.__run_command("tar xf " + f)
-    self.__run_command("./configure --prefix=$HOME/FrameworkBenchmarks/installs/py2 --disable-shared", cwd="Python-2.7.7")
-    self.__run_command("make -j4", cwd="Python-2.7.7")
-    self.__run_command("make install", cwd="Python-2.7.7")
+      self.__run_command("tar xf " + f)
+      self.__run_command("./configure --prefix=$HOME/FrameworkBenchmarks/installs/py2 --disable-shared", cwd="Python-2.7.7")
+      self.__run_command("make -j4", cwd="Python-2.7.7")
+      self.__run_command("make install", cwd="Python-2.7.7")
 
     # CPython 3.4.1
     f = "Python-3.4.1.tar.xz"
-    if not os.path.exists(f):
+    if not self.__path_exists("py3"):
+    #if not os.path.exists("py3"):
       self.__download("https://www.python.org/ftp/python/3.4.1/" + f, f)
-    self.__run_command("tar xf " + f)
-    self.__run_command("./configure --prefix=$HOME/FrameworkBenchmarks/installs/py3 --disable-shared", cwd="Python-3.4.1")
-    self.__run_command("make -j4", cwd="Python-3.4.1")
-    self.__run_command("make install", cwd="Python-3.4.1")
+      self.__run_command("tar xf " + f)
+      self.__run_command("./configure --prefix=$HOME/FrameworkBenchmarks/installs/py3 --disable-shared", cwd="Python-3.4.1")
+      self.__run_command("make -j4", cwd="Python-3.4.1")
+      self.__run_command("make install", cwd="Python-3.4.1")
 
-    if not os.path.exists("get-pip.py"):
+    if not self.__path_exists("get-pip.py"):
+    #if not os.path.exists("get-pip.py"):
       self.__download("https://bootstrap.pypa.io/get-pip.py", "get-pip.py")
-    self.__run_command("py2/bin/python get-pip.py")
-    self.__run_command("pypy/bin/pypy get-pip.py")
+      self.__run_command("py2/bin/python get-pip.py")
+      self.__run_command("pypy/bin/pypy get-pip.py")
     # Python 3.4.1 installs pip by default.
 
     self.__run_command('py2/bin/pip install -r ../config/requirements.txt')
@@ -438,8 +493,8 @@ class Installer:
     ##############################
     # Prerequisites
     ##############################
-    yes | sudo apt-get update
-    yes | sudo apt-get install build-essential git libev-dev libpq-dev libreadline6-dev postgresql
+    sudo apt-get -y update
+    sudo apt-get -y install build-essential git libev-dev libpq-dev libreadline6-dev postgresql
     sudo sh -c "echo '*               -    nofile          65535' >> /etc/security/limits.conf"
 
     sudo mkdir -p /ssd
@@ -451,7 +506,7 @@ class Installer:
     sudo sh -c "echo mysql-server mysql-server/root_password_again select secret | debconf-set-selections"
     sudo sh -c "echo mysql-server mysql-server/root_password select secret | debconf-set-selections"
 
-    yes | sudo apt-get install mysql-server-5.6
+    sudo apt-get -y install mysql-server-5.6
 
     sudo stop mysql
     # disable checking of disk size
@@ -491,9 +546,9 @@ class Installer:
     ##############################
     sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
     sudo cp 10gen.list /etc/apt/sources.list.d/10gen.list
-    sudo apt-get update
-	yes | sudo apt-get remove mongodb-clients
-    yes | sudo apt-get install mongodb-10gen
+    sudo apt-get -y update
+    sudo apt-get -y remove mongodb-clients
+    sudo apt-get -y install mongodb-10gen
 
     sudo stop mongodb
     sudo mv /etc/mongodb.conf /etc/mongodb.conf.orig
@@ -526,8 +581,8 @@ class Installer:
     ##############################
     # Prerequisites
     ##############################
-    yes | sudo apt-get update
-    yes | sudo apt-get install build-essential git libev-dev libpq-dev libreadline6-dev 
+    sudo apt-get -y update
+    sudo apt-get -y install build-essential git libev-dev libpq-dev libreadline6-dev 
     sudo sh -c "echo '*               -    nofile          65535' >> /etc/security/limits.conf"
 
 
@@ -573,6 +628,22 @@ EOF
   # End __install_client_software
   ############################################################
 
+  ############################################################
+  # __path_exists
+  ############################################################
+  def __path_exists(self, path, cwd=None):
+    full_path = os.path.join(cwd or self.install_dir, path)
+
+    if os.path.exists(full_path):
+        print("\nEXISTS: %s " % full_path)
+        return True
+
+    print("\nNOT_EXISTS: %s" % full_path)
+    return False
+  ############################################################
+  # End __path_exists
+  ############################################################
+
   ############################################################
   # __run_command
   ############################################################
@@ -594,11 +665,25 @@ EOF
 
     print("\nINSTALL: %s (cwd=%s)" % (command, cwd))
 
-    while True:
+    while attempt <= max_attempts:
       error_message = ""
       try:
+	##print "working in " + cwd + " on " + command
         # Execute command.
+        """if command == "make clean":
+          print "make clean if statment"
+	  time.sleep(5)
+	  subprocess.check_call("make clean", shell=False, cwd=cwd)
+	  break"""
         subprocess.check_call(command, shell=True, cwd=cwd)
+        """if send_yes:
+          process = subprocess.Popen(["/bin/bash", "-c", command], shell=False, stdin=subprocess.PIPE, cwd=cwd)
+          process.communicate("yes")
+          returncode = process.returncode
+          if returncode:
+            raise subprocess.CalledProcessError(returncode, command)
+        else:
+          subprocess.check_call(["/bin/bash", "-c", command], shell=False, cwd=cwd)"""
         break  # Exit loop if successful.
       except:
         exceptionType, exceptionValue, exceptionTraceBack = sys.exc_info()