[tor-commits] [ooni-probe/master] Do some radical changes to Vagrantfile and setup-dependencies

art at torproject.org art at torproject.org
Thu Aug 15 17:29:48 UTC 2013


commit 17f68aca83c06d75a82cc5f9ecd96c7dbb7919bf
Author: Arturo Filastò <art at fuffa.org>
Date:   Thu Aug 15 18:21:44 2013 +0200

    Do some radical changes to Vagrantfile and setup-dependencies
    
    A lot of this code is taken from the GlobaLeaks setup script.
---
 Vagrantfile           |   25 +--
 setup-dependencies.sh |  563 +++++++++++++++++++++++++++++++++++++++++++------
 2 files changed, 515 insertions(+), 73 deletions(-)

diff --git a/Vagrantfile b/Vagrantfile
index a5658ec..b1c6fe4 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -8,30 +8,29 @@ Vagrant.configure("2") do |config|
   config.vm.box = "precise32"
   config.vm.box_url = "http://files.vagrantup.com/precise32.box"
 
-  config.vm.synced_folder ".", "/usr/share/ooni/"
+  config.vm.synced_folder ".", "/ooni"
 
 end
 
 $script = <<SCRIPT
-apt-get update
-apt-get -y install curl python-setuptools python-dev python-software-properties python-virtualenv virtualenvwrapper vim unzip libpcap-dev
+cd /ooni/
+export USE_VIRTUALENV=0
+./setup-dependencies.sh -y
+python setup.py install
 
 cd /usr/share/ooni/
-./setup-dependencies.sh
-
-cd data
-make geoip
-
-echo "source ~/.virtualenvs/ooniprobe/bin/activate" >> ~root/.bashrc
+echo "[+] Building geoip stuff.."
+make geoip 2>&1 > /dev/null
 
 mkdir -p ~/.ooni
-cp /usr/share/ooni/data/ooniprobe.conf.sample ~/.ooni/ooniprobe.conf
+cp /usr/share/ooni/ooniprobe.conf.sample ~/.ooni/ooniprobe.conf
+
+cd /ooni/inputs/
+make lists 2>&1 > /dev/null
 
 # https://code.google.com/p/pypcap/issues/detail?id=27
 # pip install pydnet pypcap
 
-apt-get install tor
-
 echo Login using 'vagrant ssh', and dont forget to run ooniprobe as root.
 echo First run: 'sudo su; cd /usr/share/ooni; ./bin/ooniprobe -i decks/before_i_commit.testdeck'
 
@@ -40,8 +39,6 @@ SCRIPT
 # TODO: 
 # Somehow, ooniprobe is not capable to connect to tor by default. My current 
 # workaround is to kill tor, and set "start_tor: true" in /root/.ooni/ooniprobe.conf
-#
-
 
 Vagrant.configure("2") do |config|
     config.vm.provision :shell, :inline => $script
diff --git a/setup-dependencies.sh b/setup-dependencies.sh
index cdbd0f0..b07a716 100755
--- a/setup-dependencies.sh
+++ b/setup-dependencies.sh
@@ -1,85 +1,530 @@
 #!/bin/bash
-trap 'sudo -k && exit 1' INT
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+BUILD_DIR=/tmp/oonibuilding.$RANDOM
+BUILD_LOG=${BUILD_DIR}.log
+TMP_KEYRING=${BUILD_DIR}/tmpkeyring.gpg
+DISTRO='unknown'
+DISTRO_VERSION='unknown'
+REPO_ROOT="$(pwd)"
 
 # Discover our Distro release
-RELEASE="`lsb_release -c|cut -f 2`";
+if [ -f /etc/redhat-release ]; then
+  DISTRO="fedora"
+# Debian/Ubuntu
+elif [ -r /lib/lsb/init-functions ]; then
+  DISTRO_VERSION="$( lsb_release -cs )"
+  if [ "$( lsb_release -is )" == "Ubuntu" ]; then
+    DISTRO="ubuntu"
+  else
+    DISTRO="debian"
+  fi
+fi
+
 TOR_DEB_REPO="http://deb.torproject.org/torproject.org";
+if [[ -z "$USE_VIRTUALENV" ]]; then
+  USE_VIRTUALENV=1
+fi
+usage()
+{
+cat << EOF
+usage: ./${SCRIPTNAME} options
 
-case $RELEASE in
-  natty|wheezy|squeeze|precise)
+OPTIONS:
+   -h      Show this message
+   -y      To assume yes to all queries
 
-  echo "sudo is annoying, tell us your password once and sudo won't annoy you for the rest of this process...";
-  sudo echo "if you read this, we won't ask for your password again during this process unless something goes wrong";
+EOF
+}
 
-  # Add Tor repo
-  HAVE_GPG_KEY="`sudo apt-key finger|grep 'A3C4 F0F9 79CA A22C DBA8  F512 EE8C BC9E 886D DD89'|head -n 1`";
-  echo "Checking for torproject.org Debian repository key..."
-  if [ -z "$HAVE_GPG_KEY" ]; then
-    echo "It appears that you do not have the torproject.org Debian repository key installed; installing it...";
-    cat apt.key | sudo apt-key add -;
-  else
-    echo "It appears that you have the torproject.org Debian repository key installed!";
+ASSUME_YES=0
+while getopts “hv:ny” OPTION
+do
+  case $OPTION in
+    h)
+      usage
+      exit 1
+      ;;
+    y)
+      ASSUME_YES=1
+      ;;
+    ?)
+      usage
+      exit
+      ;;
+    esac
+done
+
+DO () {
+    if [ -z "$2" ]; then
+        RET=0
+    else
+        RET=$2
+    fi
+    if [ -z "$3" ]; then
+        CMD=$1
+    else
+        CMD=$3
+    fi
+    echo "Running: "
+    echo "        $CMD"
+    $1 &>${BUILD_LOG}
+    if [ "$?" -eq "$2" ]; then
+        echo "SUCCESS"
+    else
+        echo "FAIL"
+        echo "COMBINED STDOUT/STDERR OUTPUT OF FAILED COMMAND:"
+        cat ${BUILD_LOG}
+        exit 1
+    fi
+}
+
+vercomp () {
+    # Returnned values:
+    #   0: version are equals
+    #   1: $1 is bigger than $2
+    #   2: $2 is bigger than $1
+    if [[ $1 == $2 ]]
+    then
+        return 0
+    fi
+    local IFS=.
+    local i ver1=($1) ver2=($2)
+    # fill empty fields in ver1 with zeros
+    for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
+    do
+        ver1[i]=0
+    done
+    for ((i=0; i<${#ver1[@]}; i++))
+    do
+        if [[ -z ${ver2[i]} ]]
+        then
+            # fill empty fields in ver2 with zeros
+            ver2[i]=0
+        fi
+        if ((10#${ver1[i]} > 10#${ver2[i]}))
+        then
+            return 1
+        fi
+        if ((10#${ver1[i]} < 10#${ver2[i]}))
+        then
+            return 2
+        fi
+    done
+    return 0
+}
+
+## BEGIN PIP SECURE INSTALL
+NEEDED_VERSION_PIP=1.3.1
+
+PIP_PKG="pip-${NEEDED_VERSION_PIP}.tar.gz"
+PKG_VERIFY=${BUILD_DIR}/${PIP_PKG}.asc
+PIP_URL="https://pypi.python.org/packages/source/p/pip/${PIP_PKG}"
+PIP_SIG_URL="https://pypi.python.org/packages/source/p/pip/${PIP_PKG}.asc"
+PIP_KEY_FILE=${BUILD_DIR}/pip-pub-key.gpg
+PIP_PUB_KEY="
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: GnuPG v1.4.12 (Darwin)
+Comment: GPGTools - http://gpgtools.org
+
+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
+=0zqq
+-----END PGP PUBLIC KEY BLOCK-----
+"
+INSTALL_PIP=1
+if which pip >/dev/null 2>&1; then
+    INSTALLED_PIP=`pip --version | cut -d" " -f2`
+    vercomp ${INSTALLED_PIP} ${NEEDED_VERSION_PIP}
+    if [ "$?" -ne "2" ]; then
+        INSTALL_PIP=0
+    fi
+fi
+
+install_pip_securely() {
+  DO "wget -O ${BUILD_DIR}/${PIP_PKG} ${PIP_URL}" "0"
+  DO "wget -O ${BUILD_DIR}/${PIP_PKG}.asc ${PIP_SIG_URL}" "0"
+
+  echo "[+] Verifying PGP signature of pip"
+  echo "${PIP_PUB_KEY}" > ${PIP_KEY_FILE}
+  DO "gpg --no-default-keyring --keyring $TMP_KEYRING --import $PIP_KEY_FILE" "0"
+  DO "gpg --no-default-keyring --keyring $TMP_KEYRING --verify $PKG_VERIFY" "0"
+
+  DO "tar xzf ${BUILD_DIR}/${PIP_PKG}" "0"
+  DO "cd pip-*" "0"
+
+  echo "[+] Installing the latest pip"
+  if [ "${ASSUME_YES}" -eq "0" ]; then
+    echo "WARNING this will overwrite the pip that you currently have installed and all python dependencies will be installed via pip."
+    ANSWER=''
+    until [[ $ANSWER = [yn] ]]; do
+      read -r -p "Do you wish to continue? [y/n]" ANSWER
+      echo
+    done
+    if [[ $ANSWER != 'y' ]]; then
+      echo "Cannot proceed"
+      exit
+    fi
   fi
+  DO "python setup.py install" "0"
+
+}
+
+if [[ "$EUID" -ne "0" ]]; then
+  echo "Error: OONI setup dependencies script must be run as root."
+  exit 1
+fi
 
+case $DISTRO_VERSION in
+  natty|wheezy|squeeze|precise)
+
+  # Create the build directories
+  DO "mkdir -p ${BUILD_DIR}" "0"
+  DO "chmod 700 ${BUILD_DIR}" "0"
+
+  # Import the Tor public key
+  DO "gpg --no-default-keyring --keyring $TMP_KEYRING --keyserver x-hkp://pool.sks-keyservers.net --recv-keys 0x886DDD89" "0"
+  gpg --no-default-keyring --keyring $TMP_KEYRING --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -
+    
   HAVE_TOR_REPO="`grep deb.torproject.org/torproject.org /etc/apt/sources.list /etc/apt/sources.list.d/* 2>&1|grep torproject|head -n 1`";
   if [ -z "$HAVE_TOR_REPO" ]; then
-    echo "It appears that you do not have the torproject.org Debian repository installed; installing it...";
-     if [ $RELEASE = "squeeze" ]; then
-       (echo -e "deb $TOR_DEB_REPO $RELEASE main\ndeb-src $TOR_DEB_REPO $RELEASE main" | sudo tee -a /etc/apt/sources.list) > /dev/null
-     else
-       sudo apt-add-repository "deb $TOR_DEB_REPO $RELEASE main"
-     fi
+    echo "[-] It appears that you do not have the torproject.org Debian repository installed; installing it...";
+    if which apt-add-repository >/dev/null 2>&1; then
+      apt-add-repository "deb $TOR_DEB_REPO $DISTRO_VERSION main"
+    else
+      echo -e "deb $TOR_DEB_REPO $DISTRO_VERSION main\ndeb-src $TOR_DEB_REPO $DISTRO_VERSION main" | tee -a /etc/apt/sources.list
+    fi
   else
-    echo "It appears that you have the torproject.org Debian repository installed!";
+    echo "[.] It appears that you have the torproject.org Debian repository installed!";
   fi
 
   # Install the basic packages to get pip ready to roll
-  echo "Updating OS package list...";
-  sudo apt-get update 2>&1 > /dev/null;
-  echo "Installing packages for your system...";
-  sudo apt-get install git-core python python-pip python-dev build-essential libdumbnet1 python-dumbnet python-libpcap python-pypcap python-dnspython python-virtualenv virtualenvwrapper tor tor-geoipdb;
-
-  if [ ! -f ~/.virtualenvs/ooniprobe/bin/activate ]; then
-    # Set up the virtual environment
-    mkdir -p ~/.virtualenvs
-    virtualenv ~/.virtualenvs/ooniprobe
-    source ~/.virtualenvs/ooniprobe/bin/activate
-  else
-    source ~/.virtualenvs/ooniprobe/bin/activate
+  echo "[+] Updating OS package list...";
+  apt-get update 2>&1 > /dev/null;
+  echo "[+] Installing packages for your system...";
+  DO "apt-get -y install curl git-core python python-pip python-dev python-setuptools build-essential libdumbnet1 python-dumbnet python-libpcap python-pypcap python-dnspython tor tor-geoipdb" "0"
+
+  if [ "${INSTALL_PIP}" -eq "1" ] ; then
+    echo "[+] Installing pip securely"
+    install_pip_securely
+  fi
+
+  if [ "$USE_VIRTUALENV" -eq "1" ]; then
+    echo "[+] Using virtualenvironment..."
+    DO "apt-get -y install python-virtualenv virtualenvwrapper"
+    if [ ! -f ~/.virtualenvs/ooniprobe/bin/activate ]; then
+      # Set up the virtual environment
+      DO "mkdir -p ~/.virtualenvs" "0"
+      DO "virtualenv ~/.virtualenvs/ooniprobe" "0"
+      source ~/.virtualenvs/ooniprobe/bin/activate
+    else
+      source ~/.virtualenvs/ooniprobe/bin/activate
+    fi
   fi
 
-  echo "Installing all of the Python dependency requirements with pip!";
+
+  echo "[+] Installing all of the Python dependency requirements with pip!";
+
   # Install all of the out of package manager dependencies
-  pip install -v --timeout 60 -r requirements.txt;
+  DO "pip install -v --timeout 60 -r ${REPO_ROOT}/requirements.txt" "0"
   if [ $? != 0 ]; then
-    echo "It appears that pip is having issues installing our Python dependency requirements, we'll try again!";
-    pip install -v --timeout 60 -r requirements.txt;
+    echo "[+] It appears that pip is having issues installing our Python dependency requirements, we'll try again!";
+    DO "pip install -v --timeout 60 -r ${REPO_ROOT}/requirements.txt" "0"
     if [ $? != 0 ]; then
-      echo "It appears that pip is unable to satisfy our requirements - please run the following command:";
-      echo "   pip install -v --timeout 60 -r requirements.txt   ";
+      echo "[+] It appears that pip is unable to satisfy our requirements - please run the following command:";
+      echo "   pip install -v --timeout 60 -r ${REPO_ROOT}/requirements.txt   ";
       exit 1;
     fi
   fi
-
-  echo "Adding a symlink to your ooni-probe source code checkout...";
-  ln -s `pwd` ~/ooni-probe;
-  echo "Adding a default ooniprobe.conf file...";
-  cp -v ooniprobe.conf.sample ooniprobe.conf
-  echo "Creating reports/ directory to store output from ooniprobe...";
-  mkdir `pwd`/reports/
-
-  # Allow ooniprobe to run, if all above went well, we hope!
-  export PYTHONPATH=$PYTHONPATH:"`pwd`";
-  export PATH=$PATH:"`pwd`";
-  echo "Please add the following to your respective shell config files:";
-  echo ;
-  echo "  if [ -e ~/ooni-probe/bin ]; then";
-  echo '    export PATH=~/ooni-probe/bin:$PATH';
-  echo "  fi";
-  echo "  if [ -e ~/ooni-probe ]; then";
-  echo '    export PYTHONPATH=$PYTHONPATH:~/ooni-probe';
-  echo "  fi";
-  echo ;
+  
+  echo "You can now install ooniprobe with: "
+  echo ""
+  echo "python setup.py install"
+  echo ""
+  echo "You should also be sure to edit your configuration appropriately by doing:"
+  echo ""
+  echo "cp /usr/share/ooni/ooniprobe.conf.sample ~/.ooni/ooniprobe.conf"
+  echo ""
+  
 
   ;;
 *)





More information about the tor-commits mailing list