From 7fca1f865d4de45de0221f6451ed8bc58623b5a5 Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 24 May 2016 17:50:01 -0400 Subject: [PATCH] update from master --- .gitmodules | 3 + INSTALL.md | 36 ++++-- README.md | 25 ++-- lbrynet/lbrynet_gui/lbry.png | Bin 10651 -> 18944 bytes packaging/osx/add-key.sh | 25 ++++ packaging/osx/lbry-osx-app | 1 + packaging/ubuntu/lbry | 4 +- packaging/ubuntu/postinst_append | 28 ++++ packaging/ubuntu/ubuntu_package_setup.sh | 157 ++++++++++++++++++----- setup.py | 2 +- 10 files changed, 229 insertions(+), 52 deletions(-) create mode 100644 .gitmodules create mode 100755 packaging/osx/add-key.sh create mode 160000 packaging/osx/lbry-osx-app create mode 100755 packaging/ubuntu/postinst_append diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..a8c2e8de6 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "packaging/osx/lbry-osx-app"] + path = packaging/osx/lbry-osx-app + url = https://github.com/jobevers/lbry-osx-app.git diff --git a/INSTALL.md b/INSTALL.md index 6dc552bcf..23491e60c 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,19 +1,35 @@ -#### Installing lbrynet on Linux +#### Installing the LBRY app -------------------------- -The following packages are necessary (the following are their names on Ubuntu): -libgmp3-dev build-essential python2.7 python2.7-dev python-pip +Installing LBRY is simple. You can get a dmg installer for OS X (Mavericks and up) or a .deb for linux [here](https://lbry.io/get). -To install them on Ubuntu: -sudo apt-get install libgmp3-dev build-essential python2.7 python2.7-dev python-pip +##### OS X +Just drag and drop LBRY.app into your applications folder (replacing any older versions). When it's running you'll have a LBRY icon in your status bar. -python setup.py build bdist_egg -sudo python setup.py install -``` +##### Linux +Double click the .deb file and follow the prompts. The app can be started by searching "LBRY", and it can be turned off by clicking the red 'x' in the browser interface. -this will install all of the libraries and a few applications +On both systems you can also open the UI while the app is running by going to lbry://lbry in Firefox or Safari, or localhost:5279 in Chrome. -For running the file sharing application, see [RUNNING](RUNNING.md) + + +#### Installing LBRY command line +-------------------------- + +##### OS X +You can install LBRY command line by running `curl -sL https://rawgit.com/lbryio/lbry-setup/master/lbry_setup_osx.sh | sudo bash` in a terminal. This script will install lbrynet and its dependancies, as well as the app. You can start LBRY by either starting the app or by running `lbrynet-daemon` from a terminal. + +##### Linux +On Ubuntu or Mint you can install the prerequisites and lbrynet by running + + ``` + sudo apt-get install libgmp3-dev build-essential python2.7 python2.7-dev python-pip + git clone https://github.com/lbryio/lbry.git + cd lbry + sudo python setup.py install + ``` + +To start LBRY, run `lbrynet-daemon` in a terminal. #### On windows: diff --git a/README.md b/README.md index dc8b5c81f..cd1693811 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,15 @@ +[![Build Status](https://travis-ci.org/lbryio/lbry.svg?branch=master)](https://travis-ci.org/lbryio/lbry) + # LBRYnet LBRYnet is a fully decentralized network for distributing data. It consists of peers uploading and downloading data from other peers, possibly in exchange for payments, and a distributed hash table, used by peers to discover other peers. +## Installation + +Download the [latest release](https://github.com/lbryio/lbry/releases/latest) or see [INSTALL.md](INSTALL.md) for manual installation. + ## Overview On LBRYnet, data is broken into chunks, and each chunk is specified by its sha384 hash sum. This @@ -18,9 +24,9 @@ help peers find each other. For example, an application for which clients don't necessary chunks may use some identifier, chosen by the application, to find clients which do know all of the necessary chunks. -## Running +## For Developers -LBRYnet comes with an file sharing application, called 'lbrynet-console', which breaks +LBRY comes with an file sharing application, called 'lbrynet-console', which breaks files into chunks, encrypts them with a symmetric key, computes their sha384 hash sum, generates a special file called a 'stream descriptor' containing the hash sums and some other file metadata, and makes the chunks available for download by other peers. A peer wishing to download the file @@ -28,22 +34,19 @@ must first obtain the 'stream descriptor' and then may open it with his 'lbrynet download all of the chunks by locating peers with the chunks via the DHT, and then combine the chunks into the original file, according to the metadata included in the 'stream descriptor'. -To install and use this client, see [INSTALL](INSTALL.md) and [RUNNING](RUNNING.md) +For detailed instructions, see [INSTALL.md](INSTALL.md) and [RUNNING.md](RUNNING.md). -## Installation +Documentation: doc.lbry.io (may be out of date) -See [INSTALL](INSTALL.md) - -## Developers - -Documentation: doc.lbry.io Source code: https://github.com/lbryio/lbry -To contribute to the development of LBRYnet or lbrynet-console, contact jimmy@lbry.io +To contribute, [join us on Slack](https://lbry-slackin.herokuapp.com/) or contact josh@lbry.io. Pull requests are also welcome. ## Support -Send all support requests to jimmy@lbry.io +Please open an issue and describe your situation in detail. We will respond as soon as we can. + +For private issues, contact josh@lbry.io. ## License diff --git a/lbrynet/lbrynet_gui/lbry.png b/lbrynet/lbrynet_gui/lbry.png index 16c7c4683affa3e73c5bcf4fbd0b6bbb0778f275..6599574065ccfcc176cdd5e8726ca783f85f7097 100644 GIT binary patch literal 18944 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

U2Ho%8h$Z1A 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 O6N9I#pUXO@geCykjvm1P literal 10651 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 lz#oNlK}QRNn5{lM7KLBRY Installed\n\nRun LBRY now?" --title="LBRY Installed" --ok-label=" Yes" \ + --cancel-label=" No" --icon-name="system-software-install" + +case $? in + 0) RUN=1 # yes + ;; + 1) RUN=0 # no + ;; + *) RUN=0 # timeout or escape or whatever + ;; +esac + +if [ $RUN = 1 ]; then + xdg-open "lbry://lbry" +else + zenity --info --text="LBRY Installed\n\nNo problem. You can run LBRY later by going to + +lbry://lbry + +in your browser." --title="LBRY Installed" --icon-name="system-software-install" +fi + +) & diff --git a/packaging/ubuntu/ubuntu_package_setup.sh b/packaging/ubuntu/ubuntu_package_setup.sh index 4be10c8a7..f35a78b72 100755 --- a/packaging/ubuntu/ubuntu_package_setup.sh +++ b/packaging/ubuntu/ubuntu_package_setup.sh @@ -1,37 +1,124 @@ #!/bin/bash -# Tested on fresh Ubuntu 14.04 install. - -# wget https://raw.githubusercontent.com/lbryio/lbry/master/packaging/ubuntu/ubuntu_package_setup.sh -# bash ubuntu_package_setup.sh master - set -euo pipefail -BRANCH=${1:-master} +function HELP { + echo "Build a debian package for lbry" + echo "-----" + echo "When run without any arguments, this script expects the current directory" + echo "to be the main lbry repo and it builds what is in that directory" + echo + echo "Optional arguments:" + echo + echo "-c: clone a fresh copy of the repo" + echo "-b : use the specified branch of the lbry repo" + echo "-w : set the webui branch" + echo "-d : specifiy the build directory" + echo "-h: show help" + echo "-t: turn trace on" + exit 1 +} -BUILD_DIR="lbry-build-$(date +%Y%m%d-%H%M%S)" -mkdir "$BUILD_DIR" +CLONE=false +BUILD_DIR="" +BRANCH="" +WEB_UI_BRANCH="master" + +while getopts :hctb:w:d: FLAG; do + case $FLAG in + c) + CLONE=true + ;; + b) + BRANCH=${OPTARG} + ;; + w) + WEB_UI_BRANCH=${OPTARG} + ;; + d) + BUILD_DIR=${OPTARG} + ;; + t) + set -o xtrace + ;; + h) + HELP + ;; + \?) #unrecognized option - show help + echo "Option -$OPTARG not allowed." + HELP + ;; + :) + echo "Option -$OPTARG requires an argument." + HELP + ;; + esac +done + +shift $((OPTIND-1)) + + +SUDO='' +if (( $EUID != 0 )); then + SUDO='sudo' +fi + +if [ "$CLONE" = false ]; then + if [ `basename $PWD` != "lbry" ]; then + echo "Not currently in the lbry directory. Cowardly refusing to go forward" + exit 1 + fi + SOURCE_DIR=$PWD +fi + +if [ -z "${BUILD_DIR}" ]; then + if [ "$CLONE" = true ]; then + # build in the current directory + BUILD_DIR="lbry-build-$(date +%Y%m%d-%H%M%S)" + else + BUILD_DIR="../lbry-build-$(date +%Y%m%d-%H%M%S)" + fi +fi + +mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" +if [ -z ${TRAVIS+x} ]; then + # if not on travis, its nice to see progress + QUIET="" +else + QUIET="-qq" +fi + # get the required OS packages -sudo add-apt-repository -y ppa:spotify-jyrki/dh-virtualenv -sudo apt-get update -sudo apt-get install -y build-essential git python-dev libffi-dev libssl-dev libgmp3-dev dh-virtualenv debhelper +$SUDO apt-get ${QUIET} update +$SUDO apt-get ${QUIET} install -y --no-install-recommends software-properties-common +$SUDO add-apt-repository -y ppa:spotify-jyrki/dh-virtualenv +$SUDO apt-get ${QUIET} update +$SUDO apt-get ${QUIET} install -y --no-install-recommends \ + build-essential git python-dev libffi-dev libssl-dev \ + libgmp3-dev dh-virtualenv debhelper wget python-pip fakeroot # need a modern version of pip (more modern than ubuntu default) -wget https://bootstrap.pypa.io/get-pip.py -sudo python get-pip.py -rm get-pip.py -sudo pip install make-deb - -# check out LBRY -git clone https://github.com/lbryio/lbry.git --branch "$BRANCH" +$SUDO pip install --upgrade pip +$SUDO pip install make-deb # build packages +# +# dpkg-buildpackage outputs its results into '..' so +# we need to move/clone lbry into the build directory +if [ "$CLONE" == true]; then + cp -a $SOURCE_DIR lbry +else + git clone https://github.com/lbryio/lbry.git +fi ( - cd lbry - make-deb - dpkg-buildpackage -us -uc + cd lbry + if [ -n "${BRANCH}" ]; then + git checkout "${BRANCH}" + fi + make-deb + dpkg-buildpackage -us -uc ) @@ -41,8 +128,20 @@ git clone https://github.com/lbryio/lbry.git --branch "$BRANCH" PACKAGE="$(ls | grep '.deb')" ar vx "$PACKAGE" mkdir control data -tar -xvzf control.tar.gz --directory control -tar -xvJf data.tar.xz --directory data +tar -xzf control.tar.gz --directory control + +# The output of the travis build is a +# tar.gz and the output locally is tar.xz. +# Instead of having tar detect the compression used, we +# could update the config to output the same in either spot. +# Unfortunately, doing so requires editting some auto-generated +# files: http://linux.spiney.org/forcing_gzip_compression_when_building_debian_packages +tar -xf data.tar.?z --directory data + +PACKAGING_DIR='lbry/packaging/ubuntu' + +# set web ui branch +sed -i "s/^WEB_UI_BRANCH='[^']\+'/WEB_UI_BRANCH='$WEB_UI_BRANCH'/" "$PACKAGING_DIR/lbry" # add files function addfile() { @@ -52,16 +151,16 @@ function addfile() { cp "$FILE" "data/$TARGET" echo "$(md5sum "data/$TARGET" | cut -d' ' -f1) $TARGET" >> control/md5sums } -PACKAGING_DIR='lbry/packaging/ubuntu' addfile "$PACKAGING_DIR/lbry" usr/share/python/lbrynet/bin/lbry addfile "$PACKAGING_DIR/lbry.desktop" usr/share/applications/lbry.desktop -#addfile lbry/packaging/ubuntu/lbry-init.conf etc/init/lbry.conf + +cat "$PACKAGING_DIR/postinst_append" >> control/postinst # repackage .deb -sudo chown -R root:root control data -tar -cvzf control.tar.gz -C control . -tar -cvJf data.tar.xz -C data . -sudo chown root:root debian-binary control.tar.gz data.tar.xz +$SUDO chown -R root:root control data +tar -czf control.tar.gz -C control . +tar -cJf data.tar.xz -C data . +$SUDO chown root:root debian-binary control.tar.gz data.tar.xz ar r "$PACKAGE" debian-binary control.tar.gz data.tar.xz # TODO: we can append to data.tar instead of extracting it all and recompressing diff --git a/setup.py b/setup.py index e4a9432f0..baf069fa7 100644 --- a/setup.py +++ b/setup.py @@ -33,7 +33,7 @@ gui_data_files = ['close2.gif', 'lbry-dark-242x80.gif', 'lbry-dark-icon.xbm', 'l gui_data_paths = [os.path.join(base_dir, 'lbrynet', 'lbrynet_gui', f) for f in gui_data_files] setup(name='lbrynet', - description='A fully decentralized network for distributing data', + description='A fully-decentralized content marketplace', version=__version__, maintainer='Jimmy Kiselak', maintainer_email='jimmy@lbry.io',