Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

executable file 272 lines (233 sloc) 6.856 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271
#!/bin/bash

set -e

#### Config

NODE_DOWNLOAD='http://nodejs.org/dist/v0.6.10/node-v0.6.10.tar.gz'
NPM_DOWNLOAD='http://npmjs.org/install.sh'
VIRTUALENV_DOWNLOAD='http://github.com/pypa/virtualenv/raw/develop/virtualenv.py'
MONGODB_DOWNLOAD='http://fastdl.mongodb.org/OS/mongodb-OS-ARCH-2.0.0.tgz'

LOCKER_REPO=${LOCKER_REPO:-https://github.com/LockerProject/Locker.git}
LOCKER_BRANCH=${LOCKER_BRANCH:-master}

#### Helper functions

# check_for name exec_name version_command [minimum_version]
check_for() {
    name="$1"
    command="$2"
    get_version="$3"
    min_version="$4"
    max_version="$5"

    if which $command >/dev/null 2>&1; then
        # It's installed
        version=$($get_version 2>&1 | grep -o -E [-0-9.]\{1,\} | head -n 1)
        echo "$name version $version found."

        if [ -n "$min_version" ]; then
if ! perl -e 'exit 1 unless v'$version' ge v'$min_version
            then
echo "$1 version $version found (>=$min_version required)"
                return 1
            fi

if [ -n "$max_version" ]; then
if ! perl -e 'exit 1 unless v'$version' lt v'$max_version
                then
echo "$1 version $version found (<$max_version required)"
                    return 1
                fi
fi
fi

return 0
    fi

return 1
}

# check_for_pkg_config name pkg_config_name [minimum_version [optional]]
check_for_pkg_config() {
    name="$1"
    pkg_config_name="$2"
    min_version="$3"

    if ! which pkg-config >/dev/null 2>&1; then
echo "pkg-config is not installed: assuming $name is not present either"
        return 1
    fi

if ! pkg-config --exists "$pkg_config_name"
    then
echo "$name not found!" >&2
        return 1
    fi
version="$(pkg-config --modversion "$pkg_config_name")"
    echo "${name} version ${version} found."

    [ -z "$min_version" ] && return 0
    if pkg-config --atleast-version="$min_version" "$pkg_config_name"
    then
return 0
    else
echo "$name version $min_version or greater required!" >&2
        return 1
    fi
}

download () {
    base="$(basename $1)"
    if [ -f ${base} ]
    then
echo "$1 already downloaded."
    else
if wget "$1" 2>/dev/null || curl -L -o ${base} "$1"
        then
echo "Downloaded $1."
        else
echo "Download of $1 failed!" >&2
            exit 1
        fi
fi
}

#### Main script

BASEDIR="$(pwd)/lockerbox"
mkdir -p "${BASEDIR}"
cd "${BASEDIR}"

envscript="${BASEDIR}/lockerbox_environment.sh"
cat > "${envscript}" <<MRBARGLES
export PATH="${BASEDIR}/local/bin":${PATH}
export NODE_PATH="${BASEDIR}/local/lib/node_modules":${NODE_PATH}
export PKG_CONFIG_PATH="${BASEDIR}/local/lib/pkgconfig":${PKG_CONFIG_PATH}
export CXXFLAGS="-I${BASEDIR}/local/include"
export LD_LIBRARY_PATH="${BASEDIR}/local/lib"
export LIBRARY_PATH="${BASEDIR}/local/lib"
MRBARGLES

. "${envscript}"

check_for Git git 'git --version'
check_for Python python 'python -V' 2.6

mkdir -p local/build
cd local/build

if ! check_for Node.js node 'node -v' 0.6.0
then
echo ""
    echo "You don't seem to have node.js installed."
    echo "I will download, build, and install it locally."
    echo -n "This could take quite some time!"
    sleep 1 ; printf "." ; sleep 1 ; printf "." ; sleep 1 ; printf "." ; sleep 1
    download "${NODE_DOWNLOAD}"
    if tar zxf "$(basename "${NODE_DOWNLOAD}")" &&
        cd $(basename "${NODE_DOWNLOAD}" .tar.gz) &&
        ./configure --prefix="${BASEDIR}/local" &&
        make &&
        make install
    then
echo "Installed node.js into ${BASEDIR}"
    else
echo "Failed to install node.js into ${BASEDIR}" >&2
        exit 1
    fi
fi

cd "${BASEDIR}/local/build"
if ! check_for npm npm "npm -v" 1
then
echo ""
    echo "About to download and install locally npm."
    download "${NPM_DOWNLOAD}"
    if cat "$(basename ${NPM_DOWNLOAD})" | clean=no sh
    then
echo "Installed npm into ${BASEDIR}"
    else
echo "Failed to install npm into ${BASEDIR}" >&2
        exit 1
    fi
fi

if [ ! -e "${BASEDIR}/local/bin/activate" ]
then
if ! check_for virtualenv virtualenv "virtualenv --version" 1.4
    then
echo ""
        echo "About to download virtualenv.py."
        download "${VIRTUALENV_DOWNLOAD}"
    fi

if python -m virtualenv --no-site-packages "${BASEDIR}/local"
    then
echo "Set up virtual Python environment."
    else
echo "Failed to set up virtual Python environment." >&2
        exit 1
    fi
fi

if . "${BASEDIR}/local/bin/activate"
then
echo "Activated virtual Python environment."
else
echo "Failed to activate virtual Python environment." >&2
fi

if ! check_for mongoDB mongod "mongod --version" 1.8.0
then
OS=`uname -s`
    case "${OS}" in
        Linux)
            OS=linux
            ;;
        Darwin)
            OS=osx
            ;;
        *)
            echo "Don't recognize OS ${OS}" >&2
            exit 1
    esac
BITS=`getconf LONG_BIT`
    ARCH='x86_64'
    if [ "${BITS}" -ne 64 ]
    then
ARCH="i386"
        if [ "${OS}" != "osx" ]
        then
ARCH="i686"
        fi
fi
echo ""
    echo "Downloading and installing locally mongoDB"
    MONGODB_DOWNLOAD=$(echo ${MONGODB_DOWNLOAD} | sed -e "s/OS/${OS}/g" -e "s/ARCH/${ARCH}/g")
    download "${MONGODB_DOWNLOAD}"
    if tar zxf $(basename "${MONGODB_DOWNLOAD}") &&
        cp $(basename "${MONGODB_DOWNLOAD}" .tgz)/bin/* "${BASEDIR}/local/bin"
    then
echo "Installed local mongoDB."
    else
echo "Failed to install local mongoDB." >&2
        exit 1
    fi
fi

cd "${BASEDIR}"

if [ ! -d Locker/.git ]
then
echo "Checking out Locker repo."
    if git clone "${LOCKER_REPO}" -b "${LOCKER_BRANCH}"
    then
echo "Checked out Locker repo."
    else
echo "Failed to check out Locker repo." >&2
        exit 1
    fi
fi

cd Locker
echo "Checking out submodules"
git submodule update --init

npm install

echo "Installing Python modules"
if ! python setupEnv.py; then
echo "Failed to install Python modules" >&2
    exit 1
fi

# Install a script to launch locker
bindir="${BASEDIR}/local/bin"
mkdir -p "$bindir"
lockerbin="$bindir/locker"
cat > "$lockerbin" <<EOF
#!/bin/sh

cd "${BASEDIR}/Locker"
exec ./locker
EOF
chmod 755 "$lockerbin"

echo
echo "One final check to see if everything is as it should be..."
if ! ./checkEnv.sh; then
echo "Installation appeared to succeed, but dependency check failed :-/" >&2
    exit 1
fi

echo
echo "Looks like everything worked!"
echo "Get some API keys (https://github.com/LockerProject/Locker/wiki/GettingAPIKeys) and then try running:"
echo "cd lockerbox/Locker && ./locker"

# This won't work until we have API keys -mdz 2011-12-01
# node lockerd.js
Something went wrong with that request. Please try again.