From 83693a5c039ca0077e5a145ec9d9bdebf9c7367e Mon Sep 17 00:00:00 2001 From: Nick Sweeting Date: Mon, 23 Nov 2020 16:52:15 -0500 Subject: [PATCH] add packaging setup with stdeb for debian and apt vendor the base32_crockford lib add build script for debain packages --- .gitignore | 14 ++- archivebox.egg-info/PKG-INFO | 32 +++--- archivebox.egg-info/SOURCES.txt | 1 + archivebox/base32_crockford.py | 172 ++++++++++++++++++++++++++++++++ archivebox/util.py | 2 +- assets/css/style.scss | 2 + bin/build.sh | 1 + bin/build_deb.sh | 42 ++++++++ bin/release.sh | 6 +- icon.png | Bin 0 -> 10717 bytes package.json | 2 +- setup.py | 2 +- stdeb.cfg | 6 ++ 13 files changed, 263 insertions(+), 19 deletions(-) create mode 100644 archivebox/base32_crockford.py create mode 100755 bin/build_deb.sh create mode 100644 icon.png create mode 100644 stdeb.cfg diff --git a/.gitignore b/.gitignore index 884e1da4..68717afb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,13 +4,21 @@ __pycache__/ .mypy_cache/ +# Python and Node dependencies venv/ .venv/ .docker-venv/ - -build/ -dist/ node_modules/ +# Packaging artifacts +archivebox-*.tar.gz +build/ +deb_dist/ +dist/ + +# Data folders data/ +data1/ +data2/ +data3/ output/ diff --git a/archivebox.egg-info/PKG-INFO b/archivebox.egg-info/PKG-INFO index eb80f48d..3940b731 100644 --- a/archivebox.egg-info/PKG-INFO +++ b/archivebox.egg-info/PKG-INFO @@ -14,7 +14,7 @@ Project-URL: Roadmap, https://github.com/ArchiveBox/ArchiveBox/wiki/Roadmap Project-URL: Community, https://github.com/ArchiveBox/ArchiveBox/wiki/Web-Archiving-Community Project-URL: Donate, https://github.com/ArchiveBox/ArchiveBox/wiki/Donations Description:
- +

ArchiveBox
The open-source self-hosted web archive.

▶️ Quickstart | @@ -41,7 +41,7 @@ Description:

- ArchiveBox is a powerful self-hosted internet archiving solution written in Python 3. You feed it URLs of pages you want to archive, and it saves them to disk in a varitety of formats depending on the configuration and the content it detects. ArchiveBox can be installed via [Docker](https://docs.docker.com/get-docker/) or [`pip3`](https://wiki.python.org/moin/BeginnersGuide/Download). + ArchiveBox is a powerful self-hosted internet archiving solution written in Python 3. You feed it URLs of pages you want to archive, and it saves them to disk in a varitety of formats depending on the configuration and the content it detects. ArchiveBox can be installed via [Docker](https://docs.docker.com/get-docker/) (recommended) or [`pip`](https://www.python.org/downloads/). It works on macOS, Windows, and Linux/BSD (both armv7 and amd64). Once installed, URLs can be added via the command line `archivebox add` or the built-in Web UI `archivebox server`. It can ingest bookmarks from a service like Pocket/Pinboard, your entire browsing history, RSS feeds, or URLs one at a time. @@ -51,19 +51,27 @@ Description:
#### Quickstart ```bash - docker run -d -it -v ~/archivebox:/data -p 8000:8000 archivebox/archivebox server --init 0.0.0.0:8000 - docker run -v ~/archivebox:/data -it archivebox/archivebox manage createsuperuser - docker run -v ~/archivebox:/data -it archivebox/archivebox add 'https://example.com' + # 1. Create a folder somewhere to hold your ArchiveBox data + mkdir ~/archivebox && cd ~/archivebox + docker run -v $PWD:/data -it archivebox/archivebox init - open http://127.0.0.1:8000/admin/login/ # then click "Add" in the navbar + # 2. Archive some URLs to get started + docker run -v $PWD:/data -t archivebox/archivebox add https://github.com/ArchiveBox/ArchiveBox + docker run -v $PWD:/data -t archivebox/archivebox add --depth=1 https://example.com + + # 3. Then view the snapshots of the URLs you added via the self-hosted web UI + docker run -v $PWD:/data -it archivebox/archivebox manage createsuperuser # create an admin acct + docker run -v $PWD:/data -p 8000:8000 archivebox/archivebox # start the web server + open http://127.0.0.1:8000/ # open the interactive admin panel + ls archive/*/index.html # or just browse snapshots on disk ```

- [DEMO: archivebox.zervice.io/](https://archivebox.zervice.io) - For more information, see the [full Quickstart guide](https://github.com/ArchiveBox/ArchiveBox/wiki/Quickstart), [Usage](https://github.com/ArchiveBox/ArchiveBox/wiki/Usage), and [Configuration](https://github.com/ArchiveBox/ArchiveBox/wiki/Configuration) docs. + DEMO: archivebox.zervice.io/ + For more information, see the full Quickstart guide, Usage, and Configuration docs.
--- @@ -82,7 +90,7 @@ Description:
open http://127.0.0.1:8000 ``` - The CLI is considered "stable", and the ArchiveBox Python API and REST APIs are in "beta". + The CLI is considered "stable", the ArchiveBox Python API and REST APIs are in "beta", and the [desktop app](https://github.com/ArchiveBox/desktop) is in "alpha" stage. At the end of the day, the goal is to sleep soundly knowing that the part of the internet you care about will be automatically preserved in multiple, durable long-term formats that will be accessible for decades (or longer). You can also self-host your archivebox server on a public domain to provide archive.org-style public access to your site snapshots. @@ -331,7 +339,7 @@ Description:
▶ **Check out our [community page](https://github.com/ArchiveBox/ArchiveBox/wiki/Web-Archiving-Community) for an index of web archiving initiatives and projects.** - The aim of ArchiveBox is to go beyond what the Wayback Machine and other public archiving services can do, by adding a headless browser to replay sessions accurately, and by automatically extracting all the content in multiple redundant formats that will survive being passed down to historians and archivists through many generations. + comparison The aim of ArchiveBox is to go beyond what the Wayback Machine and other public archiving services can do, by adding a headless browser to replay sessions accurately, and by automatically extracting all the content in multiple redundant formats that will survive being passed down to historians and archivists through many generations. #### User Interface & Intended Purpose @@ -362,7 +370,7 @@ Description:
_A collection of the most active internet archiving communities and initiatives._ - Check out the ArchiveBox [Roadmap](https://github.com/ArchiveBox/ArchiveBox/wiki/Roadmap) and [Changelog](https://github.com/ArchiveBox/ArchiveBox/wiki/Changelog) - Learn why archiving the internet is important by reading the "[On the Importance of Web Archiving](https://parameters.ssrc.org/2018/09/on-the-importance-of-web-archiving/)" blog post. - - Or reach out to me for questions and comments via [@theSquashSH](https://twitter.com/thesquashSH) on Twitter. + - Or reach out to me for questions and comments via [@ArchiveBoxApp](https://twitter.com/ArchiveBoxApp) or [@theSquashSH](https://twitter.com/thesquashSH) on Twitter. --- @@ -494,7 +502,7 @@ Description:

- +

diff --git a/archivebox.egg-info/SOURCES.txt b/archivebox.egg-info/SOURCES.txt index eee55cc5..8f0d5d48 100644 --- a/archivebox.egg-info/SOURCES.txt +++ b/archivebox.egg-info/SOURCES.txt @@ -6,6 +6,7 @@ archivebox/LICENSE archivebox/README.md archivebox/__init__.py archivebox/__main__.py +archivebox/base32_crockford.py archivebox/config.py archivebox/config_stubs.py archivebox/logging_util.py diff --git a/archivebox/base32_crockford.py b/archivebox/base32_crockford.py new file mode 100644 index 00000000..bafb69b4 --- /dev/null +++ b/archivebox/base32_crockford.py @@ -0,0 +1,172 @@ +""" +base32-crockford +================ + +A Python module implementing the alternate base32 encoding as described +by Douglas Crockford at: http://www.crockford.com/wrmg/base32.html. + +He designed the encoding to: + + * Be human and machine readable + * Be compact + * Be error resistant + * Be pronounceable + +It uses a symbol set of 10 digits and 22 letters, excluding I, L O and +U. Decoding is not case sensitive, and 'i' and 'l' are converted to '1' +and 'o' is converted to '0'. Encoding uses only upper-case characters. + +Hyphens may be present in symbol strings to improve readability, and +are removed when decoding. + +A check symbol can be appended to a symbol string to detect errors +within the string. + +""" + +import re +import sys + +PY3 = sys.version_info[0] == 3 + +if not PY3: + import string as str + + +__all__ = ["encode", "decode", "normalize"] + + +if PY3: + string_types = str, +else: + string_types = basestring, + +# The encoded symbol space does not include I, L, O or U +symbols = '0123456789ABCDEFGHJKMNPQRSTVWXYZ' +# These five symbols are exclusively for checksum values +check_symbols = '*~$=U' + +encode_symbols = dict((i, ch) for (i, ch) in enumerate(symbols + check_symbols)) +decode_symbols = dict((ch, i) for (i, ch) in enumerate(symbols + check_symbols)) +normalize_symbols = str.maketrans('IiLlOo', '111100') +valid_symbols = re.compile('^[%s]+[%s]?$' % (symbols, + re.escape(check_symbols))) + +base = len(symbols) +check_base = len(symbols + check_symbols) + + +def encode(number, checksum=False, split=0): + """Encode an integer into a symbol string. + + A ValueError is raised on invalid input. + + If checksum is set to True, a check symbol will be + calculated and appended to the string. + + If split is specified, the string will be divided into + clusters of that size separated by hyphens. + + The encoded string is returned. + """ + number = int(number) + if number < 0: + raise ValueError("number '%d' is not a positive integer" % number) + + split = int(split) + if split < 0: + raise ValueError("split '%d' is not a positive integer" % split) + + check_symbol = '' + if checksum: + check_symbol = encode_symbols[number % check_base] + + if number == 0: + return '0' + check_symbol + + symbol_string = '' + while number > 0: + remainder = number % base + number //= base + symbol_string = encode_symbols[remainder] + symbol_string + symbol_string = symbol_string + check_symbol + + if split: + chunks = [] + for pos in range(0, len(symbol_string), split): + chunks.append(symbol_string[pos:pos + split]) + symbol_string = '-'.join(chunks) + + return symbol_string + + +def decode(symbol_string, checksum=False, strict=False): + """Decode an encoded symbol string. + + If checksum is set to True, the string is assumed to have a + trailing check symbol which will be validated. If the + checksum validation fails, a ValueError is raised. + + If strict is set to True, a ValueError is raised if the + normalization step requires changes to the string. + + The decoded string is returned. + """ + symbol_string = normalize(symbol_string, strict=strict) + if checksum: + symbol_string, check_symbol = symbol_string[:-1], symbol_string[-1] + + number = 0 + for symbol in symbol_string: + number = number * base + decode_symbols[symbol] + + if checksum: + check_value = decode_symbols[check_symbol] + modulo = number % check_base + if check_value != modulo: + raise ValueError("invalid check symbol '%s' for string '%s'" % + (check_symbol, symbol_string)) + + return number + + +def normalize(symbol_string, strict=False): + """Normalize an encoded symbol string. + + Normalization provides error correction and prepares the + string for decoding. These transformations are applied: + + 1. Hyphens are removed + 2. 'I', 'i', 'L' or 'l' are converted to '1' + 3. 'O' or 'o' are converted to '0' + 4. All characters are converted to uppercase + + A TypeError is raised if an invalid string type is provided. + + A ValueError is raised if the normalized string contains + invalid characters. + + If the strict parameter is set to True, a ValueError is raised + if any of the above transformations are applied. + + The normalized string is returned. + """ + if isinstance(symbol_string, string_types): + if not PY3: + try: + symbol_string = symbol_string.encode('ascii') + except UnicodeEncodeError: + raise ValueError("string should only contain ASCII characters") + else: + raise TypeError("string is of invalid type %s" % + symbol_string.__class__.__name__) + + norm_string = symbol_string.replace('-', '').translate(normalize_symbols).upper() + + if not valid_symbols.match(norm_string): + raise ValueError("string '%s' contains invalid characters" % norm_string) + + if strict and norm_string != symbol_string: + raise ValueError("string '%s' requires normalization" % symbol_string) + + return norm_string diff --git a/archivebox/util.py b/archivebox/util.py index ae827899..4e55e30d 100644 --- a/archivebox/util.py +++ b/archivebox/util.py @@ -16,7 +16,7 @@ from dateparser import parse as dateparser import requests from requests.exceptions import RequestException, ReadTimeout -from base32_crockford import encode as base32_encode # type: ignore +from .base32_crockford import encode as base32_encode # type: ignore from w3lib.encoding import html_body_declared_encoding, http_content_type_encoding try: diff --git a/assets/css/style.scss b/assets/css/style.scss index a4bd9890..44657267 100644 --- a/assets/css/style.scss +++ b/assets/css/style.scss @@ -6,11 +6,13 @@ div.shell { width: 80%; max-width: 1300px; + min-width: 300px; } span.banner-fix { width: 80%; max-width: 1300px; + min-width: 300px; } header h1 { diff --git a/bin/build.sh b/bin/build.sh index 7b1c3232..693c2bbe 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -16,6 +16,7 @@ cd "$REPO_DIR" ./bin/build_docs.sh ./bin/build_pip.sh +./bin/build_deb.sh ./bin/build_docker.sh echo "[√] Done. Install the built package by running:" diff --git a/bin/build_deb.sh b/bin/build_deb.sh new file mode 100755 index 00000000..6f5e418c --- /dev/null +++ b/bin/build_deb.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +### Bash Environment Setup +# http://redsymbol.net/articles/unofficial-bash-strict-mode/ +# https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html +# set -o xtrace +set -o errexit +set -o errtrace +set -o nounset +set -o pipefail +IFS=$'\n' + +REPO_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && cd .. && pwd )" + +source "$REPO_DIR/.venv/bin/activate" +cd "$REPO_DIR" + +VERSION="$(jq -r '.version' < "$REPO_DIR/package.json")" +DEBIAN_VERSION="1" +PGP_KEY_ID="7D5695D3B618872647861D51C38137A7C1675988" +# make sure you have this in ~/.dput.cf: +# [archivebox-ppa] +# fqdn: ppa.launchpad.net +# method: ftp +# incoming: ~archivebox/ubuntu/archivebox/ +# login: anonymous +# allow_unsigned_uploads: 0 + + +# cleanup build artifacts +rm -Rf build deb_dist dist archivebox-*.tar.gz + +# build source and binary packages +python3 setup.py --command-packages=stdeb.command \ + sdist_dsc --debian-version=$DEBIAN_VERSION \ + bdist_deb + +# sign the build with your PGP key ID +debsign -k "$PGP_KEY_ID" "deb_dist/archivebox_${VERSION}-${DEBIAN_VERSION}_source.changes" + +# push the build to launchpad ppa +# dput archivebox "deb_dist/archivebox_${VERSION}-${DEBIAN_VERSION}_source.changes" diff --git a/bin/release.sh b/bin/release.sh index f01eb1d3..d9c9b52d 100755 --- a/bin/release.sh +++ b/bin/release.sh @@ -42,6 +42,7 @@ echo "${contents}" > package.json # Build docs, python package, and docker image ./bin/build_docs.sh ./bin/build_pip.sh +./bin/build_deb.sh ./bin/build_docker.sh @@ -64,11 +65,14 @@ python3 -m twine upload --repository testpypi dist/* echo "[^] Uploading to pypi.org" python3 -m twine upload --repository pypi dist/* +echo "[^] Uploading to launchpad.net" +python3 -m dput archivebox "deb_dist/archivebox_${NEW_VERSION}-1_source.changes" + echo "[^] Uploading docker image" # docker login --username=nikisweeting # docker login docker.pkg.github.com --username=pirate docker push docker.io/nikisweeting/archivebox docker push docker.io/archivebox/archivebox -docker push docker.pkg.github.com/pirate/archivebox/archivebox +docker push docker.pkg.github.com/archivebox/archivebox/archivebox echo "[√] Done. Published version v$NEW_VERSION" diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..04462b21cc1c72de4fba6a6534103e0805c2879c GIT binary patch literal 10717 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 NM^9Hjmvv4FO#r5azXkvR literal 0 HcmV?d00001 diff --git a/package.json b/package.json index f342ece6..70f58f61 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "archivebox", - "version": "0.4.21", + "version": "0.4.22", "description": "ArchiveBox: The self-hosted internet archive", "author": "Nick Sweeting ", "license": "MIT", diff --git a/setup.py b/setup.py index af643c9e..6b40b803 100755 --- a/setup.py +++ b/setup.py @@ -51,7 +51,6 @@ setuptools.setup( "requests==2.24.0", "atomicwrites==1.4.0", "mypy-extensions==0.4.3", - "base32-crockford==0.3.0", "django==3.0.8", "django-extensions==3.0.3", @@ -80,6 +79,7 @@ setuptools.setup( "recommonmark", "pytest", "bottle", + "stdeb", ], # 'redis': ['redis', 'django-redis'], # 'pywb': ['pywb', 'redis'], diff --git a/stdeb.cfg b/stdeb.cfg new file mode 100644 index 00000000..6eaa8f2d --- /dev/null +++ b/stdeb.cfg @@ -0,0 +1,6 @@ +[DEFAULT] +Package: archivebox +Suite: focal +Build-Depends: dh-python +Depends: nodejs, chromium-browser, wget, curl, git, ffmpeg, youtube-dl, python3-atomicwrites, python3-croniter, python3-crontab, python3-dateparser, python3-django, python3-django-extensions, python3-mypy-extensions, python3-requests, python3-w3lib +XS-Python-Version: >= 3.7