Add bitmask 0.9.1 spec file
[bitmask_bundler.git] / createbundle.sh
1 #!/bin/bash
2 ######################################################################
3 # Copyright (C) 2013 LEAP
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 ######################################################################
18
19 # This script is meant to be used as a bootstrapper for the environment to
20 # create a Bitmask bundle for Linux.
21
22 # This is tested to work on Debian 7.1 32 and 64 bits Virtual Machines
23
24 # This script uses `sudo` which is installed by default on debian, but you need
25 # to configure your non-root user to be able to use `sudo`.
26
27 # Edit the /etc/sudoers file and add this line at the bottom:
28 # leap ALL=NOPASSWD: ALL
29
30 # WARNING: That line allows the user 'leap' to use `sudo` without being asked
31 # for a password, that makes the script easier to use but it would be a
32 # security problem. If you use this script in a VM and only for bundling
33 # purposes then it shouldn't be a problem.
34
35 # You'll need an internet connection, approximately 1.3Gb of disk space and
36 # some patience.
37
38 ################################################################################
39
40 set -e  # Exit immediately if a command exits with a non-zero status.
41
42 BASE='/home/leap/bitmask.bundle'
43
44 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}"  )" && pwd  )"
45 VERSIONS_FILE="$SCRIPT_DIR/bitmask.json"
46 BINARY_COPIER="$SCRIPT_DIR/copy-binaries.sh"
47 ROOT_JSON="$SCRIPT_DIR/root.json"
48
49 # picked from https://github.com/OpenVPN/openvpn/releases
50 OPENVPN_VERSION="v2.3.8"
51
52 BOOST_MINOR="59"  # Minor version
53 BOOST_NAME="boost_1_${BOOST_MINOR}_0"
54
55 mkdir -p $BASE
56
57 # Note: we could use:
58 # ARCH=`uname -i`
59 # but it does not work on a VM (tested in i386 returns unknown)
60 if [[ `getconf LONG_BIT` == "64" ]]; then
61     ARCH='x86_64-linux-gnu'
62 else
63     ARCH='i386-linux-gnu'
64 fi
65
66 install_dependencies() {
67     sudo apt-get update  # update apt, otherwise some packages may not be found
68     sudo apt-get install -y build-essential python-dev cmake git autoconf \
69         libtool liblzo2-dev libqt4-dev libxml2-dev libxslt1-dev qtmobility-dev \
70         libsqlite3-dev libffi-dev python-virtualenv
71 }
72
73 build_boost() {
74     cd $BASE
75
76     wget -c http://ufpr.dl.sourceforge.net/project/boost/boost/1.${BOOST_MINOR}.0/${BOOST_NAME}.tar.bz2
77
78     # NOTE: md5 is the only thing that they provide to verification.
79     # for more information see: https://leap.se/code/issues/6296
80     echo "727a932322d94287b62abb1bd2d41723eec4356a7728909e38adb65ca25241ca  boost_1_59_0.tar.bz2" | sha256sum -c
81
82     tar xjf ${BOOST_NAME}.tar.bz2
83
84     cd $BOOST_NAME/tools/build/
85     ./bootstrap.sh --with-toolset=gcc
86     ./b2 install --prefix=$BASE/boost
87     export PATH=$PATH:$BASE/boost/bin/
88
89     cd $BASE/$BOOST_NAME # boost root
90     b2 cxxflags=-std=c++0x --with-python --with-filesystem --with-system variant=release link=shared
91 }
92
93 build_launcher() {
94     cd $BASE
95     git clone -b develop https://leap.se/git/bitmask_launcher.git
96     cd bitmask_launcher
97
98     mkdir build
99     cd build
100
101     cmake -DBoost_INCLUDE_DIR=$BASE/$BOOST_NAME ..
102     make
103 }
104
105 build_openvpn() {
106     # Build openvpn to support RPATH
107     cd $BASE
108     git clone https://github.com/OpenVPN/openvpn.git --branch $OPENVPN_VERSION
109     cd openvpn
110     autoreconf -i
111     LZO_LIBS="/usr/lib/$ARCH/liblzo2.a" ./configure LDFLAGS="-Wl,-rpath,lib/" --disable-snappy --disable-plugin-auth-pam
112     make -j2
113 }
114
115 build_pyside() {
116     # for more information look at:
117     # https://github.com/PySide/pyside-setup/blob/master/docs/building/linux.rst
118     cd $BASE
119     sudo pip install wheel
120
121     git clone https://github.com/PySide/pyside-setup.git pyside-setup.git
122     cd pyside-setup.git
123     python setup.py bdist_wheel --qmake=/usr/bin/qmake-qt4 --version=1.2.2
124 }
125
126 set_pyside_environment() {
127     arch_bits=`getconf LONG_BIT`  # '32' or '64'
128     # from https://github.com/PySide/BuildScripts/blob/master/environment.sh
129     PYSIDE="$BASE/pyside-setup.git/pyside_install/py2.7-qt4.8.2-${arch_bits}bit-release/"
130     PYTHONXY='python2.7'
131     export PATH=$PYSIDE/bin:$PATH
132     export PYTHONPATH=$PYSIDE/lib/$PYTHONXY/site-packages:$PYSIDE/lib64/$PYTHONXY/site-packages:$PYTHONPATH
133     export LD_LIBRARY_PATH=$PYSIDE/lib:$LD_LIBRARY_PATH
134     export PKG_CONFIG_PATH=$PYSIDE/lib/pkgconfig:$PKG_CONFIG_PATH
135     export DYLD_LIBRARY_PATH=$PYSIDE/lib:$DYLD_LIBRARY_PATH
136 }
137
138 copy_binaries() {
139     cp $ROOT_JSON $BASE
140     cd $BASE
141     $BINARY_COPIER
142 }
143
144 create_bundler_paths() {
145     cd $BASE
146     cat > bundler.paths << EOF
147 $BASE/bitmask_bundler.git/bundler
148 /usr/lib/python2.7
149 /usr/lib/python2.7/plat-linux2
150 /usr/lib/python2.7/lib-tk
151 /usr/lib/python2.7/lib-old
152 /usr/lib/python2.7/lib-dynload
153 /usr/local/lib/python2.7/dist-packages
154 /usr/lib/python2.7/dist-packages
155 /usr/lib/python2.7/dist-packages/gtk-2.0
156 /usr/lib/pymodules/python2.7
157 EOF
158 }
159
160 setup_bundler() {
161     cd $BASE
162
163     git clone https://github.com/leapcode/bitmask_bundler.git bitmask_bundler.git
164     virtualenv bundler.venv && source bundler.venv/bin/activate
165
166     # HACK: install these dependencies manually since they can't be installed normally due not passing some pip checks.
167     pip install --upgrade pip
168     pip install --allow-external u1db --allow-unverified u1db --allow-external dirspec --allow-unverified dirspec u1db dirspec
169     pip install pysqlcipher
170     pip install functools32  # HACK: this dependency is needed by jsonschema and is not automatically gathered
171     pip install service_identity  # see https://leap.se/code/issues/7136
172
173     # HACK: this is needed so tuf can verify the downloaded data, if we add
174     # this to the requirements.pip pycrypto is installed as an egg and the
175     # bundler can't copy its contents (not supported right now)
176     pip install tuf[tools] pycrypto
177
178     git clone https://github.com/chiiph/protobuf-socket-rpc protobuf-socket-rpc.git
179     cd protobuf-socket-rpc.git
180     python setup.py easy_install -Z .
181
182     pip install -r $BASE/bitmask_bundler.git/pkg/requirements.pip
183 }
184
185 clean() {
186     cd $BASE
187     rm -fr bitmask_bundler.git bundler.venv protobuf-socket-rpc.git bundler.output
188 }
189
190 run_bundler() {
191     cd $BASE
192
193     # if the virtualenv is not sourced, then source it!
194     # this is helpful if you want to run only this step
195     [[ -z "$VIRTUAL_ENV"  ]] && source bundler.venv/bin/activate
196
197     set_pyside_environment
198
199     mkdir bundler.output
200
201     # Use a shortcut for the bundler command
202     bundler="python bitmask_bundler.git/bundler/main.py --workon bundler.output --binaries binaries/ --paths-file bundler.paths --versions-file $VERSIONS_FILE"
203
204     $bundler --do gitclone
205     $bundler --do gitcheckout
206     copy_binaries
207
208     # uncomment the following line if you want to do a pause before the python setup in order to do some tweaks on the cloned repos.
209     # read -p "Waiting to 'pythonsetup' ... press <Enter> to continue, <Ctrl>+C to exit. "
210
211     # pin pyzmq version, 14.7.0 doesn't work
212     sed 's/pyzmq>=14.4.1/pyzmq==14.6.0/' -i bundler.output/leap_pycommon/pkg/requirements.pip
213     sed 's/^pyzmq$/pyzmq==14.6.0/' -i bundler.output/bitmask_client/pkg/requirements.pip
214
215     $bundler --do pythonsetup
216
217     # hack to solve gnupg version problem
218     pip uninstall -y gnupg && pip install gnupg
219
220     $bundler --skip gitclone gitcheckout pythonsetup
221 }
222
223 REUSE_BINARIES=$BASE/reuse-binaries.lock
224
225 if [[ ! -f $BINARY_COPIER ]]; then
226     echo "ERROR: missing $BINARY_COPIER file."
227     exit 1
228 fi
229
230 if [[ ! -f $VERSIONS_FILE ]]; then
231     echo "ERROR: missing $VERSIONS_FILE file."
232     exit 1
233 fi
234
235 if [[ ! -f $ROOT_JSON ]]; then
236     echo "ERROR: missing $ROOT_JSON file."
237     exit 1
238 fi
239
240 if [[ ! -f $REUSE_BINARIES ]]; then
241     install_dependencies
242     build_boost
243     build_launcher
244     build_openvpn
245     build_pyside
246     create_bundler_paths
247 else
248     echo "Reusing existing binaries, cleaning up before creating a new bundle..."
249     clean
250 fi
251
252 setup_bundler
253 run_bundler
254
255 echo 'If you remove this file the createbundle.sh script will rebuild all the binaries.' > $REUSE_BINARIES