#!/bin/bash
######################################################################
# bundle_pyinstaller.sh
# Copyright (C) 2015 LEAP
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
######################################################################
set -e # Exit immediately if a command exits with a non-zero status.
REPOSITORIES="bitmask_client leap_pycommon soledad keymanager leap_mail"
PACKAGES="leap_pycommon keymanager soledad/common soledad/client leap_mail bitmask_client"
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
REPOS_ROOT="$SCRIPT_DIR/repositories" # Root path for all the needed repositories
VENV_DIR="$SCRIPT_DIR/bitmask.venv" # Root path for all the needed repositories
# To get colored output you should run this script like this:
# ENABLE_COLORS=1 ./this_script.sh
if [[ -z $ENABLE_COLORS ]]; then
cc_green=""
cc_yellow=""
cc_red=""
cc_normal=""
else
# Escape codes - set colors
esc=`echo -en "\033"`
cc_green="${esc}[0;32m"
cc_yellow="${esc}[0;33m"
cc_red="${esc}[0;31m"
cc_normal=`echo -en "${esc}[m\017"`
fi
mkdir -p $REPOS_ROOT
_cdsitepackages(){
# from http://stackoverflow.com/a/122340/687989
site_packages=`python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())"`
cd $site_packages
}
create_venv() {
status="creating virtualenv"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
virtualenv $VENV_DIR && source $VENV_DIR/bin/activate
pip install --upgrade pip # get the latest pip
set +x
echo "${cc_green}Status: $status done.${cc_normal}"
}
install_pyinstaller(){
status="installing pyinstaller from repo"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
source $VENV_DIR/bin/activate
cd $REPOS_ROOT
if [ ! -d pyinstaller ]; then
# git clone https://github.com/pyinstaller/pyinstaller.git --depth 1
# HACK: use kali's branch since a needed fix is not merged to upstream yet
git clone https://github.com/kalikaneko/pyinstaller.git --branch feature/pyside-hooks --depth 1
cd pyinstaller
else
cd pyinstaller
git fetch origin
# git reset --hard origin/develop
git reset --hard feature/pyside-hooks # just for kali's fork
fi
python setup.py develop
set +x
echo "${cc_green}Status: $status done.${cc_normal}"
}
clone_repos() {
status="clone repositories"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
src="https://leap.se/git"
cd $REPOS_ROOT
for repo in $REPOSITORIES; do
echo "${cc_yellow}Status: cloning: $repo...${cc_normal}"
if [ ! -d $repo ]; then
git clone -b develop $src/$repo --depth 1
else
cd $repo
git fetch
git reset --hard origin/develop
cd ..
fi
done
set +x
echo "${cc_green}Status: $status done!${cc_normal}"
}
install_requirements() {
status="installing non-leap requirements"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
cd $REPOS_ROOT
source $VENV_DIR/bin/activate
cd $REPOS_ROOT/bitmask_client/
make install_base_deps
pip install -U --no-index --trusted-host lizard.leap.se --find-links=https://lizard.leap.se/wheels pyside
# ./pkg/postmkvenv.sh
# hack to solve gnupg version problem
pip uninstall -y gnupg && pip install gnupg
set +x
echo "${cc_green}Status: $status done.${cc_normal}"
}
create_sumo(){
echo "${cc_red}No sumo creation available in here.${cc_normal}"
exit # no creation, get sumo from path
status="creating sumo tarball"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
# source $VENV_DIR/bin/activate
# cd $REPOS_ROOT/bitmask_client/
# python setup.py sdist --sumo
}
install_sumo(){
if [[ -z $1 ]]; then
echo "You need to specify a sumo tarball path parameter."
exit 1
fi
status="'installing' sumo tarball"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
source $VENV_DIR/bin/activate
SUMO_PATH=$1
_cdsitepackages
# the file name may be like 'leap.bitmask-0.9.0rc1-12-g59bc704-SUMO.tar.gz',
# but it also can be 'leap.bitmask-latest-SUMO.tar.gz'
# and the root path inside the archive for that file would be
# 'leap.bitmask-0.9.0rc1-12-g59bc704-SUMO' in both cases.
base_path=`tar tzf $SUMO_PATH | head -n 1`
target_subpath=src/leap
tar xzf $SUMO_PATH $base_path$target_subpath --strip-components=2
}
add_files(){
# HACK: this is only a hack around a missing pyinstaller hook
status="hack: add files"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
_cdsitepackages
dest="$REPOS_ROOT/bitmask_client/dist/bitmask/u1db/backends/"
mkdir -p $dest
cp u1db/backends/dbschema.sql $dest
set +x
echo "${cc_green}Status: $status done.${cc_normal}"
}
tweak_linux(){
status="tweaking linux specific stuff"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
cd $REPOS_ROOT/bitmask_client/dist/bitmask
mv bitmask bitmask-app
cd $REPOS_ROOT/bitmask_client
cp pkg/linux/bitmask-launcher dist/bitmask/bitmask
cd $REPOS_ROOT/bitmask_client
mkdir -p dist/bitmask/helpers
cp pkg/linux/bitmask-root dist/bitmask/helpers/
# NOTE: TUF stuff is needed for all OSs, not just linux
# TODO: copy launcher.conf for TUF updates
# cp pkg/tuf/launcher.conf dist/bitmask/helpers/
set +x
echo "${cc_green}Status: $status done.${cc_normal}"
}
tweak_zope(){
# - create bare zope dir in site-packages
# - touch zope/__init__.py
# - move the zope.interface folder to zope/
# - move the zope.proxy folder to zope/
# - remove the zope* eggs in site-packages
# - remove any refs to these eggs in easy-install.pth ?? (unsure about this, talking from the top of my head)
status="tweaking zope packages"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
_cdsitepackages
mkdir -p zope
touch zope/__init__.py
# zope/interface and zope/proxy already in place
rm -fr zope.{interface,proxy}*.egg-info
rm -f zope.{interface,proxy}*-nspkg.pth
cd -
set +x
echo "${cc_green}Status: $status done.${cc_normal}"
}
run_pyinstaller(){
status="running pyinstaller"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
spec_file=$1
cd $REPOS_ROOT/bitmask_client
make clean_pkg
# HACK: path needed by bitmask_client makefile
mkdir -p $REPOS_ROOT/bitmask_client/dist/Bitmask.app/Contents/Resources/
make pyinst
set +x
echo "${cc_green}Status: $status done.${cc_normal}"
}
archive_bundle(){
# - rename dist/bitmask distribution folder to bitmask--
status="creating bundle archive"
echo "${cc_green}Status: $status...${cc_normal}"
set -x # show commands
source $VENV_DIR/bin/activate
version=`python -c "import leap.bitmask; print leap.bitmask.__version__"`
cd $REPOS_ROOT/bitmask_client/dist/
# TODO: add version to bundle name
# `git describe` won't work if shallow clone (--depth 1)
BUNDLE_NAME="bitmask-$version"
mv bitmask $BUNDLE_NAME
tar czf $SCRIPT_DIR/$BUNDLE_NAME.tar.gz $BUNDLE_NAME
set +x
echo "${cc_green}Status: $status done.${cc_normal}"
}
if [[ -z $1 ]]; then
echo "Bitmask pyinstaller creator."
echo "You need to specify the sumo tarball path as a parameter."
echo "Usage:"
echo " $0 path/to/sumo.tar.gz"
exit 1
fi
sumo_path=`realpath $1`
create_venv
install_pyinstaller
clone_repos
install_requirements
install_sumo $sumo_path
tweak_zope
run_pyinstaller
add_files
tweak_linux
archive_bundle