From 5f694e338185720e4fc1986bf25ae32e3dbfa50f Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Tue, 5 Jan 2016 14:39:02 -0800 Subject: [PATCH 01/16] Create a fake release in a PyPI-style json file --- pypi.json | 504 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 504 insertions(+) create mode 100644 pypi.json diff --git a/pypi.json b/pypi.json new file mode 100644 index 000000000..389d44790 --- /dev/null +++ b/pypi.json @@ -0,0 +1,504 @@ +{ + "info": { + "maintainer": "", + "docs_url": null, + "requires_python": "", + "maintainer_email": "", + "cheesecake_code_kwalitee_id": null, + "keywords": "", + "package_url": "http://pypi.python.org/pypi/letsencrypt", + "author": "Let's Encrypt Project", + "author_email": "client-dev@letsencrypt.org", + "download_url": "", + "platform": "UNKNOWN", + "version": "0.1.1", + "cheesecake_documentation_id": null, + "_pypi_hidden": false, + "description": ".. notice for github users\n\nDisclaimer\n==========\n\nThe Let's Encrypt Client is **BETA SOFTWARE**. It contains plenty of bugs and\nrough edges, and should be tested thoroughly in staging environments before use\non production systems.\n\nFor more information regarding the status of the project, please see\nhttps://letsencrypt.org. Be sure to checkout the\n`Frequently Asked Questions (FAQ) `_.\n\nAbout the Let's Encrypt Client\n==============================\n\nThe Let's Encrypt Client is a fully-featured, extensible client for the Let's\nEncrypt CA (or any other CA that speaks the `ACME\n`_\nprotocol) that can automate the tasks of obtaining certificates and\nconfiguring webservers to use them.\n\nInstallation\n------------\n\nIf ``letsencrypt`` is packaged for your OS, you can install it from there, and\nrun it by typing ``letsencrypt``. Because not all operating systems have\npackages yet, we provide a temporary solution via the ``letsencrypt-auto``\nwrapper script, which obtains some dependencies from your OS and puts others\nin a python virtual environment::\n\n user@webserver:~$ git clone https://github.com/letsencrypt/letsencrypt\n user@webserver:~$ cd letsencrypt\n user@webserver:~/letsencrypt$ ./letsencrypt-auto --help\n\nOr for full command line help, type::\n\n ./letsencrypt-auto --help all\n\n``letsencrypt-auto`` updates to the latest client release automatically. And\nsince ``letsencrypt-auto`` is a wrapper to ``letsencrypt``, it accepts exactly\nthe same command line flags and arguments. More details about this script and\nother installation methods can be found `in the User Guide\n`_.\n\nHow to run the client\n---------------------\n\nIn many cases, you can just run ``letsencrypt-auto`` or ``letsencrypt``, and the\nclient will guide you through the process of obtaining and installing certs\ninteractively.\n\nYou can also tell it exactly what you want it to do from the command line.\nFor instance, if you want to obtain a cert for ``thing.com``,\n``www.thing.com``, and ``otherthing.net``, using the Apache plugin to both\nobtain and install the certs, you could do this::\n\n ./letsencrypt-auto --apache -d thing.com -d www.thing.com -d otherthing.net\n\n(The first time you run the command, it will make an account, and ask for an\nemail and agreement to the Let's Encrypt Subscriber Agreement; you can\nautomate those with ``--email`` and ``--agree-tos``)\n\nIf you want to use a webserver that doesn't have full plugin support yet, you\ncan still use \"standalone\" or \"webroot\" plugins to obtain a certificate::\n\n ./letsencrypt-auto certonly --standalone --email admin@thing.com -d thing.com -d www.thing.com -d otherthing.net\n\n\nUnderstanding the client in more depth\n--------------------------------------\n\nTo understand what the client is doing in detail, it's important to\nunderstand the way it uses plugins. Please see the `explanation of\nplugins `_ in\nthe User Guide.\n\nLinks\n=====\n\nDocumentation: https://letsencrypt.readthedocs.org\n\nSoftware project: https://github.com/letsencrypt/letsencrypt\n\nNotes for developers: https://letsencrypt.readthedocs.org/en/latest/contributing.html\n\nMain Website: https://letsencrypt.org/\n\nIRC Channel: #letsencrypt on `Freenode`_\n\nCommunity: https://community.letsencrypt.org\n\nMailing list: `client-dev`_ (to subscribe without a Google account, send an\nemail to client-dev+subscribe@letsencrypt.org)\n\n|build-status| |coverage| |docs| |container|\n\n\n\n.. |build-status| image:: https://travis-ci.org/letsencrypt/letsencrypt.svg?branch=master\n :target: https://travis-ci.org/letsencrypt/letsencrypt\n :alt: Travis CI status\n\n.. |coverage| image:: https://coveralls.io/repos/letsencrypt/letsencrypt/badge.svg?branch=master\n :target: https://coveralls.io/r/letsencrypt/letsencrypt\n :alt: Coverage status\n\n.. |docs| image:: https://readthedocs.org/projects/letsencrypt/badge/\n :target: https://readthedocs.org/projects/letsencrypt/\n :alt: Documentation status\n\n.. |container| image:: https://quay.io/repository/letsencrypt/letsencrypt/status\n :target: https://quay.io/repository/letsencrypt/letsencrypt\n :alt: Docker Repository on Quay.io\n\n.. _`installation instructions`:\n https://letsencrypt.readthedocs.org/en/latest/using.html\n\n.. _watch demo video: https://www.youtube.com/watch?v=Gas_sSB-5SU\n\nSystem Requirements\n===================\n\nThe Let's Encrypt Client presently only runs on Unix-ish OSes that include\nPython 2.6 or 2.7; Python 3.x support will be added after the Public Beta\nlaunch. The client requires root access in order to write to\n``/etc/letsencrypt``, ``/var/log/letsencrypt``, ``/var/lib/letsencrypt``; to\nbind to ports 80 and 443 (if you use the ``standalone`` plugin) and to read and\nmodify webserver configurations (if you use the ``apache`` or ``nginx``\nplugins). If none of these apply to you, it is theoretically possible to run\nwithout root privileges, but for most users who want to avoid running an ACME\nclient as root, either `letsencrypt-nosudo\n`_ or `simp_le\n`_ are more appropriate choices.\n\nThe Apache plugin currently requires a Debian-based OS with augeas version\n1.0; this includes Ubuntu 12.04+ and Debian 7+.\n\n\nCurrent Features\n================\n\n* Supports multiple web servers:\n\n - apache/2.x (working on Debian 8+ and Ubuntu 12.04+)\n - standalone (runs its own simple webserver to prove you control a domain)\n - webroot (adds files to webroot directories in order to prove control of\n domains and obtain certs)\n - nginx/0.8.48+ (highly experimental, not included in letsencrypt-auto)\n\n* The private key is generated locally on your system.\n* Can talk to the Let's Encrypt CA or optionally to other ACME\n compliant services.\n* Can get domain-validated (DV) certificates.\n* Can revoke certificates.\n* Adjustable RSA key bit-length (2048 (default), 4096, ...).\n* Can optionally install a http -> https redirect, so your site effectively\n runs https only (Apache only)\n* Fully automated.\n* Configuration changes are logged and can be reverted.\n* Supports ncurses and text (-t) UI, or can be driven entirely from the\n command line.\n* Free and Open Source Software, made with Python.\n\n\n.. _Freenode: https://webchat.freenode.net?channels=%23letsencrypt\n.. _client-dev: https://groups.google.com/a/letsencrypt.org/forum/#!forum/client-dev", + "release_url": "http://pypi.python.org/pypi/letsencrypt/0.1.1", + "downloads": { + "last_month": 95687, + "last_week": 19418, + "last_day": 2007 + }, + "_pypi_ordering": 14, + "requires_dist": [ + "ConfigArgParse", + "PyOpenSSL", + "acme (==0.1.1)", + "configobj", + "cryptography (>=0.7)", + "mock", + "parsedatetime", + "psutil (>=2.1.0)", + "pyrfc3339", + "python2-pythondialog (>=3.2.2rc1)", + "pytz", + "requests", + "setuptools", + "six", + "zope.component", + "zope.interface", + "astroid (==1.3.5); extra == 'dev'", + "pylint (==1.4.2); extra == 'dev'", + "twine; extra == 'dev'", + "wheel; extra == 'dev'", + "Sphinx (>=1.0); extra == 'docs'", + "repoze.sphinx.autointerface; extra == 'docs'", + "sphinx-rtd-theme; extra == 'docs'", + "sphinxcontrib-programoutput; extra == 'docs'", + "coverage; extra == 'testing'", + "nose; extra == 'testing'", + "nosexcover; extra == 'testing'", + "pep8; extra == 'testing'", + "tox; extra == 'testing'" + ], + "classifiers": [ + "Development Status :: 3 - Alpha", + "Environment :: Console", + "Environment :: Console :: Curses", + "Intended Audience :: System Administrators", + "License :: OSI Approved :: Apache Software License", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.6", + "Programming Language :: Python :: 2.7", + "Topic :: Internet :: WWW/HTTP", + "Topic :: Security", + "Topic :: System :: Installation/Setup", + "Topic :: System :: Networking", + "Topic :: System :: Systems Administration", + "Topic :: Utilities" + ], + "name": "letsencrypt", + "bugtrack_url": "", + "license": "Apache License 2.0", + "summary": "Let's Encrypt client", + "home_page": "https://github.com/letsencrypt/letsencrypt", + "cheesecake_installability_id": null + }, + "releases": { + "0.1.22": [ + { + "comment_text" : "fake release for 0.2.0 leauto testing" + } + ], + "0.0.0.dev20151108": [ + { + "has_sig": true, + "upload_time": "2015-11-08T07:54:45", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151108-py2-none-any.whl", + "md5_digest": "fb4eeb29ed528fca81037854c8c98e3c", + "downloads": 8896, + "filename": "letsencrypt-0.0.0.dev20151108-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 163047 + }, + { + "has_sig": true, + "upload_time": "2015-11-08T07:55:32", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151108.tar.gz", + "md5_digest": "0f7ab3da27f96c637a94092a431c571f", + "downloads": 801, + "filename": "letsencrypt-0.0.0.dev20151108.tar.gz", + "packagetype": "sdist", + "size": 154879 + } + ], + "0.0.0.dev20151123": [ + { + "has_sig": true, + "upload_time": "2015-11-23T21:48:35", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151123-py2-none-any.whl", + "md5_digest": "57dfc30fa49516789411346199f11d7a", + "downloads": 6708, + "filename": "letsencrypt-0.0.0.dev20151123-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 169232 + }, + { + "has_sig": true, + "upload_time": "2015-11-23T21:49:24", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151123.tar.gz", + "md5_digest": "d78867dcf88e0e6a4201d3d733e09d50", + "downloads": 715, + "filename": "letsencrypt-0.0.0.dev20151123.tar.gz", + "packagetype": "sdist", + "size": 159702 + } + ], + "0.0.0.dev20151114": [ + { + "has_sig": true, + "upload_time": "2015-11-14T12:24:20", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151114-py2-none-any.whl", + "md5_digest": "b570611a6e0e04c8082744a1509dcdde", + "downloads": 7945, + "filename": "letsencrypt-0.0.0.dev20151114-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 167306 + }, + { + "has_sig": true, + "upload_time": "2015-11-14T12:24:49", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151114.tar.gz", + "md5_digest": "c1c49f145bd32151b2ba991693d01467", + "downloads": 616, + "filename": "letsencrypt-0.0.0.dev20151114.tar.gz", + "packagetype": "sdist", + "size": 158894 + } + ], + "0.0.0.dev20151017": [ + { + "has_sig": true, + "upload_time": "2015-10-17T10:49:30", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151017-py2-none-any.whl", + "md5_digest": "bc43ffc9c8e5a4a73f15ca9587134538", + "downloads": 1414, + "filename": "letsencrypt-0.0.0.dev20151017-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 159823 + }, + { + "has_sig": true, + "upload_time": "2015-10-17T10:49:54", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151017.tar.gz", + "md5_digest": "0836e416e6acfd795af07f2c45f57153", + "downloads": 460, + "filename": "letsencrypt-0.0.0.dev20151017.tar.gz", + "packagetype": "sdist", + "size": 144361 + } + ], + "0.0.0.dev20151021": [ + { + "has_sig": true, + "upload_time": "2015-10-21T20:05:47", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151021-py2-none-any.whl", + "md5_digest": "c692b30e57862345383c3b0b415c4e0e", + "downloads": 1034, + "filename": "letsencrypt-0.0.0.dev20151021-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 161328 + }, + { + "has_sig": true, + "upload_time": "2015-10-21T20:06:24", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151021.tar.gz", + "md5_digest": "14cc485de72856a2413639674406d7f8", + "downloads": 361, + "filename": "letsencrypt-0.0.0.dev20151021.tar.gz", + "packagetype": "sdist", + "size": 145857 + } + ], + "0.0.0.dev20151020": [ + { + "has_sig": true, + "upload_time": "2015-10-20T21:51:35", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151020-py2-none-any.whl", + "md5_digest": "6f54a898ed2fb5a8cd36fb3278fc7827", + "downloads": 1027, + "filename": "letsencrypt-0.0.0.dev20151020-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 161290 + }, + { + "has_sig": true, + "upload_time": "2015-10-20T21:52:05", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151020.tar.gz", + "md5_digest": "f17fb4cb37175b80cfb52bb18d741b70", + "downloads": 377, + "filename": "letsencrypt-0.0.0.dev20151020.tar.gz", + "packagetype": "sdist", + "size": 145810 + } + ], + "0.0.0.dev20151030": [ + { + "has_sig": true, + "upload_time": "2015-10-30T07:59:24", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151030-py2-none-any.whl", + "md5_digest": "3e5f929e5bdab9f205fbdd55fa815369", + "downloads": 3815, + "filename": "letsencrypt-0.0.0.dev20151030-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 163194 + }, + { + "has_sig": true, + "upload_time": "2015-10-30T08:00:00", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151030.tar.gz", + "md5_digest": "eb4bd8c6eed5f80f22c9cfb8cf67bbd1", + "downloads": 603, + "filename": "letsencrypt-0.0.0.dev20151030.tar.gz", + "packagetype": "sdist", + "size": 151205 + } + ], + "0.0.0.dev20151008": [ + { + "has_sig": true, + "upload_time": "2015-10-08T19:40:21", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151008-py2-none-any.whl", + "md5_digest": "8e4fde8cbbb64b39bf5daec22eb30a19", + "downloads": 952, + "filename": "letsencrypt-0.0.0.dev20151008-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 159536 + }, + { + "has_sig": true, + "upload_time": "2015-10-08T19:40:46", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151008.tar.gz", + "md5_digest": "c3191f8add4dc1b7f51ff6477b719f5c", + "downloads": 413, + "filename": "letsencrypt-0.0.0.dev20151008.tar.gz", + "packagetype": "sdist", + "size": 145734 + } + ], + "0.0.0.dev20151006": [ + { + "has_sig": true, + "upload_time": "2015-10-06T06:48:16", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151006-py2-none-any.whl", + "md5_digest": "b0b4f25f23a68a561379ea407d3b332d", + "downloads": 403, + "filename": "letsencrypt-0.0.0.dev20151006-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 159892 + }, + { + "has_sig": true, + "upload_time": "2015-10-06T06:57:21", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151006.tar.gz", + "md5_digest": "b830f757206d668d7892f23a7c934108", + "downloads": 404, + "filename": "letsencrypt-0.0.0.dev20151006.tar.gz", + "packagetype": "sdist", + "size": 131184 + } + ], + "0.0.0.dev20151104": [ + { + "has_sig": true, + "upload_time": "2015-11-04T07:44:29", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151104-py2-none-any.whl", + "md5_digest": "897b3fbadd5c5966921e690fae0bfd83", + "downloads": 6601, + "filename": "letsencrypt-0.0.0.dev20151104-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 163690 + }, + { + "has_sig": true, + "upload_time": "2015-11-04T07:45:00", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151104.tar.gz", + "md5_digest": "41f2b5d8a99f19a46a98f1cd2f574e84", + "downloads": 793, + "filename": "letsencrypt-0.0.0.dev20151104.tar.gz", + "packagetype": "sdist", + "size": 154943 + } + ], + "0.0.0.dev20151107": [ + { + "has_sig": true, + "upload_time": "2015-11-07T11:49:26", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151107-py2-none-any.whl", + "md5_digest": "b33f11f9601c5d2e90b4feec37e3d406", + "downloads": 915, + "filename": "letsencrypt-0.0.0.dev20151107-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 164010 + }, + { + "has_sig": true, + "upload_time": "2015-11-07T11:50:17", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151107.tar.gz", + "md5_digest": "bbc8d651da6e12b2fa8fa74b42d8ce7c", + "downloads": 409, + "filename": "letsencrypt-0.0.0.dev20151107.tar.gz", + "packagetype": "sdist", + "size": 155434 + } + ], + "0.0.0.dev20151201": [ + { + "has_sig": true, + "upload_time": "2015-12-02T04:22:14", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151201-py2-none-any.whl", + "md5_digest": "850a340e5099cd6d0f1a50320f66c7dd", + "downloads": 1693, + "filename": "letsencrypt-0.0.0.dev20151201-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 173130 + }, + { + "has_sig": true, + "upload_time": "2015-12-02T04:22:41", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151201.tar.gz", + "md5_digest": "7faee02c89c9d7a732d8e6a7911a7f67", + "downloads": 252, + "filename": "letsencrypt-0.0.0.dev20151201.tar.gz", + "packagetype": "sdist", + "size": 164577 + } + ], + "0.0.0.dev20151024": [ + { + "has_sig": true, + "upload_time": "2015-10-24T17:57:09", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.0.0.dev20151024-py2-none-any.whl", + "md5_digest": "f36722b0181c2024d1a7c2d5714a8c7d", + "downloads": 3422, + "filename": "letsencrypt-0.0.0.dev20151024-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 161792 + }, + { + "has_sig": true, + "upload_time": "2015-10-24T17:57:35", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.0.0.dev20151024.tar.gz", + "md5_digest": "86b8ffc407af81b66a69d1dad29c0705", + "downloads": 473, + "filename": "letsencrypt-0.0.0.dev20151024.tar.gz", + "packagetype": "sdist", + "size": 147776 + } + ], + "0.1.0": [ + { + "has_sig": true, + "upload_time": "2015-12-03T07:49:17", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.1.0-py2-none-any.whl", + "md5_digest": "0c84b4c0f426714256ddb5349e670f6d", + "downloads": 51458, + "filename": "letsencrypt-0.1.0-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 173233 + }, + { + "has_sig": true, + "upload_time": "2015-12-03T07:49:22", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.1.0.tar.gz", + "md5_digest": "b3bc1f8a49e4953771d2fa77bf0fe9d2", + "downloads": 1426, + "filename": "letsencrypt-0.1.0.tar.gz", + "packagetype": "sdist", + "size": 167375 + } + ], + "0.1.1": [ + { + "has_sig": true, + "upload_time": "2015-12-16T00:54:48", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.1.1-py2-none-any.whl", + "md5_digest": "07218b6e5792a3de089891f1227c6ac2", + "downloads": 48253, + "filename": "letsencrypt-0.1.1-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 175923 + }, + { + "has_sig": true, + "upload_time": "2015-12-16T00:55:37", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.1.1.tar.gz", + "md5_digest": "ddd393563f3d5835d678b7478148e3d9", + "downloads": 801, + "filename": "letsencrypt-0.1.1.tar.gz", + "packagetype": "sdist", + "size": 166683 + } + ] + }, + "urls": [ + { + "has_sig": true, + "upload_time": "2015-12-16T00:54:48", + "comment_text": "", + "python_version": "py2", + "url": "https://pypi.python.org/packages/py2/l/letsencrypt/letsencrypt-0.1.1-py2-none-any.whl", + "md5_digest": "07218b6e5792a3de089891f1227c6ac2", + "downloads": 48253, + "filename": "letsencrypt-0.1.1-py2-none-any.whl", + "packagetype": "bdist_wheel", + "size": 175923 + }, + { + "has_sig": true, + "upload_time": "2015-12-16T00:55:37", + "comment_text": "", + "python_version": "source", + "url": "https://pypi.python.org/packages/source/l/letsencrypt/letsencrypt-0.1.1.tar.gz", + "md5_digest": "ddd393563f3d5835d678b7478148e3d9", + "downloads": 801, + "filename": "letsencrypt-0.1.1.tar.gz", + "packagetype": "sdist", + "size": 166683 + } + ] +} From 7d182c210d92078de9328e906020d16f4c08e2bb Mon Sep 17 00:00:00 2001 From: Erik Rose Date: Tue, 5 Jan 2016 17:53:36 -0500 Subject: [PATCH 02/16] Substitute test-only values for the env vars. To come: a test-only public key for letsencrypt-auto.sig. --- letsencrypt_auto/letsencrypt-auto.template | 4 ++-- letsencrypt_auto/pieces/fetch.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/letsencrypt_auto/letsencrypt-auto.template b/letsencrypt_auto/letsencrypt-auto.template index b3d708ede..bb48b39fe 100755 --- a/letsencrypt_auto/letsencrypt-auto.template +++ b/letsencrypt_auto/letsencrypt-auto.template @@ -9,7 +9,7 @@ set -e # Work even if somebody does "sh thisscript.sh". # Note: you can set XDG_DATA_HOME or VENV_PATH before running this script, # if you want to change where the virtual environment will be installed -XDG_DATA_HOME=${XDG_DATA_HOME:-~/.local/share} +XDG_DATA_HOME=${XDG_DATA_HOME:-~/.local/share-test} VENV_NAME="letsencrypt" VENV_PATH=${VENV_PATH:-"$XDG_DATA_HOME/$VENV_NAME"} VENV_BIN=${VENV_PATH}/bin @@ -236,7 +236,7 @@ UNLIKELY_EOF # Now we drop into Python so we don't have to install even more # dependencies (curl, etc.), for better flow control, and for the option of # future Windows compatibility. - "$LE_PYTHON" "$TEMP_DIR/fetch.py" --le-auto-script "v$REMOTE_VERSION" + "$LE_PYTHON" "$TEMP_DIR/fetch.py" --le-auto-script "letsencrypt-auto-release-testing-v$REMOTE_VERSION" # Install new copy of letsencrypt-auto. This preserves permissions and # ownership from the old copy. diff --git a/letsencrypt_auto/pieces/fetch.py b/letsencrypt_auto/pieces/fetch.py index d094e6347..95f5d612a 100644 --- a/letsencrypt_auto/pieces/fetch.py +++ b/letsencrypt_auto/pieces/fetch.py @@ -75,7 +75,7 @@ def latest_stable_version(get): """Return the latest stable release of letsencrypt.""" metadata = loads(get( environ.get('LE_AUTO_JSON_URL', - 'https://pypi.python.org/pypi/letsencrypt/json'))) + 'https://raw.githubusercontent.com/letsencrypt/letsencrypt/letsencrypt-auto-release-testing/pypi.json'))) # metadata['info']['version'] actually returns the latest of any kind of # release release, contrary to https://wiki.python.org/moin/PyPIJSON. # The regex is a sufficient regex for picking out prereleases for most From 726376f288c9fadce7e83cec76792afeb011d471 Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Tue, 5 Jan 2016 14:57:18 -0800 Subject: [PATCH 03/16] A real release signture key --- letsencrypt_auto/pieces/fetch.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/letsencrypt_auto/pieces/fetch.py b/letsencrypt_auto/pieces/fetch.py index d094e6347..323001ac3 100644 --- a/letsencrypt_auto/pieces/fetch.py +++ b/letsencrypt_auto/pieces/fetch.py @@ -21,20 +21,15 @@ from urllib2 import build_opener, HTTPHandler, HTTPSHandler, HTTPError PUBLIC_KEY = environ.get('LE_AUTO_PUBLIC_KEY', """-----BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnwHkSuCSy3gIHawaCiIe -4ilJ5kfEmSoiu50uiimBhTESq1JG2gVqXVXFxxVgobGhahSF+/iRVp3imrTtGp1B -2heoHbELnPTTZ8E36WHKf4gkLEo0y0XgOP3oBJ9IM5q8J68x0U3Q3c+kTxd/sgww -s5NVwpjw4aAZhgDPe5u+rvthUYOD1whYUANgYvooCpV4httNv5wuDjo7SG2V797T -QTE8aG3AOhWzdsLm6E6Tl2o/dR6XKJi/RMiXIk53SzArimtAJXe/1GyADe1AgIGE -33Ja3hU3uu9lvnnkowy1VI0qvAav/mu/APahcWVYkBAvSVAhH3zGNAGZUnP2zfcP -rH7OPw/WrxLVGlX4trLnvQr1wzX7aiM2jdikcMiaExrP0JfQXPu00y3c+hjOC5S0 -+E5P+e+8pqz5iC5mmvEqy2aQJ6pV7dSpYX3mcDs8pCYaVXXtCPXS1noWirCcqCMK -EHGGdJCTXXLHaWUaGQ9Gx1An1gU7Ljkkji2Al65ZwYhkFowsLfuniYKuAywRrCNu -q958HnzFpZiQZAqZYtOHaiQiaHPs/36ZN0HuOEy0zM9FEHbp4V/DEn4pNCfAmRY5 -3v+3nIBhgiLdlM7cV9559aDNeutF25n1Uz2kvuSVSS94qTEmlteCPZGBQb9Rr2wn -I2OU8tPRzqKdQ6AwS9wvqscCAwEAAQ== +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6MR8W/galdxnpGqBsYbq +OzQb2eyW15YFjDDEMI0ZOzt8f504obNs920lDnpPD2/KqgsfjOgw2K7xWDJIj/18 +xUvWPk3LDkrnokNiRkA3KOx3W6fHycKL+zID7zy+xZYBuh2fLyQtWV1VGQ45iNRp +9+Zo7rH86cdfgkdnWTlNSHyTLW9NbXvyv/E12bppPcEvgCTAQXgnDVJ0/sqmeiij +n9tTFh03aM+R2V/21h8aTraAS24qiPCz6gkmYGC8yr6mglcnNoYbsLNYZ69zF1XH +cXPduCPdPdfLlzVlKK1/U7hkA28eG3BIAMh6uJYBRJTpiGgaGdPd7YekUB8S6cy+ +CQIDAQAB -----END PUBLIC KEY----- -""") # TODO: Replace with real one. +""") class ExpectedError(Exception): From d0bbe447575ea7e57abc27a20f4cac572d6bb322 Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Tue, 5 Jan 2016 15:37:07 -0800 Subject: [PATCH 04/16] Switch to a throwaway testing key --- letsencrypt_auto/pieces/fetch.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/letsencrypt_auto/pieces/fetch.py b/letsencrypt_auto/pieces/fetch.py index b9c4e5ab9..008fe75e1 100644 --- a/letsencrypt_auto/pieces/fetch.py +++ b/letsencrypt_auto/pieces/fetch.py @@ -21,13 +21,13 @@ from urllib2 import build_opener, HTTPHandler, HTTPSHandler, HTTPError PUBLIC_KEY = environ.get('LE_AUTO_PUBLIC_KEY', """-----BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6MR8W/galdxnpGqBsYbq -OzQb2eyW15YFjDDEMI0ZOzt8f504obNs920lDnpPD2/KqgsfjOgw2K7xWDJIj/18 -xUvWPk3LDkrnokNiRkA3KOx3W6fHycKL+zID7zy+xZYBuh2fLyQtWV1VGQ45iNRp -9+Zo7rH86cdfgkdnWTlNSHyTLW9NbXvyv/E12bppPcEvgCTAQXgnDVJ0/sqmeiij -n9tTFh03aM+R2V/21h8aTraAS24qiPCz6gkmYGC8yr6mglcnNoYbsLNYZ69zF1XH -cXPduCPdPdfLlzVlKK1/U7hkA28eG3BIAMh6uJYBRJTpiGgaGdPd7YekUB8S6cy+ -CQIDAQAB +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvWrG8oyI2FlCWEEEo1+Q ++VmDgUdMKGWlThHm5oM6XODDpllY8gUGWoYn//jCUMQuQmDTtvPz1V6s5uoESnG3 +PUjEj539Dt3bQmfm5eRN17DXb3FR4l4eKkYE/bDHvGvWsI3B1b2ek0mK88XEoUxg +hx7tre19X8Q5N4ssii1+HW51e6NHO6S2fa7mko85RcF0ZHSvOVwMELbVYg+GVlmz +5K39QNqcBr2RcWmTR9XpRkV6F7DPm4XsSKd51McHiatG4vCzMpMw5R96aY4Y/wg+ +lLMOJYYAQEv7ii8exClMCTUiTzVevI0mSXyHxRcILFNRYrgc5OBNtf1w2ZjcHKAr +9QIDAQAB -----END PUBLIC KEY----- """) From b2a0142e07a5915c219379ed3bf93dfab4556f83 Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Tue, 5 Jan 2016 15:40:23 -0800 Subject: [PATCH 05/16] First attempt at signing with a throwaway key --- letsencrypt_auto/letsencrypt-auto | 27 +++++++++++--------------- letsencrypt_auto/letsencrypt-auto.sig | Bin 0 -> 256 bytes 2 files changed, 11 insertions(+), 16 deletions(-) create mode 100644 letsencrypt_auto/letsencrypt-auto.sig diff --git a/letsencrypt_auto/letsencrypt-auto b/letsencrypt_auto/letsencrypt-auto index 54c2218e1..d7a9addab 100755 --- a/letsencrypt_auto/letsencrypt-auto +++ b/letsencrypt_auto/letsencrypt-auto @@ -9,7 +9,7 @@ set -e # Work even if somebody does "sh thisscript.sh". # Note: you can set XDG_DATA_HOME or VENV_PATH before running this script, # if you want to change where the virtual environment will be installed -XDG_DATA_HOME=${XDG_DATA_HOME:-~/.local/share} +XDG_DATA_HOME=${XDG_DATA_HOME:-~/.local/share-test} VENV_NAME="letsencrypt" VENV_PATH=${VENV_PATH:-"$XDG_DATA_HOME/$VENV_NAME"} VENV_BIN=${VENV_PATH}/bin @@ -1630,20 +1630,15 @@ from urllib2 import build_opener, HTTPHandler, HTTPSHandler, HTTPError PUBLIC_KEY = environ.get('LE_AUTO_PUBLIC_KEY', """-----BEGIN PUBLIC KEY----- -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnwHkSuCSy3gIHawaCiIe -4ilJ5kfEmSoiu50uiimBhTESq1JG2gVqXVXFxxVgobGhahSF+/iRVp3imrTtGp1B -2heoHbELnPTTZ8E36WHKf4gkLEo0y0XgOP3oBJ9IM5q8J68x0U3Q3c+kTxd/sgww -s5NVwpjw4aAZhgDPe5u+rvthUYOD1whYUANgYvooCpV4httNv5wuDjo7SG2V797T -QTE8aG3AOhWzdsLm6E6Tl2o/dR6XKJi/RMiXIk53SzArimtAJXe/1GyADe1AgIGE -33Ja3hU3uu9lvnnkowy1VI0qvAav/mu/APahcWVYkBAvSVAhH3zGNAGZUnP2zfcP -rH7OPw/WrxLVGlX4trLnvQr1wzX7aiM2jdikcMiaExrP0JfQXPu00y3c+hjOC5S0 -+E5P+e+8pqz5iC5mmvEqy2aQJ6pV7dSpYX3mcDs8pCYaVXXtCPXS1noWirCcqCMK -EHGGdJCTXXLHaWUaGQ9Gx1An1gU7Ljkkji2Al65ZwYhkFowsLfuniYKuAywRrCNu -q958HnzFpZiQZAqZYtOHaiQiaHPs/36ZN0HuOEy0zM9FEHbp4V/DEn4pNCfAmRY5 -3v+3nIBhgiLdlM7cV9559aDNeutF25n1Uz2kvuSVSS94qTEmlteCPZGBQb9Rr2wn -I2OU8tPRzqKdQ6AwS9wvqscCAwEAAQ== +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvWrG8oyI2FlCWEEEo1+Q ++VmDgUdMKGWlThHm5oM6XODDpllY8gUGWoYn//jCUMQuQmDTtvPz1V6s5uoESnG3 +PUjEj539Dt3bQmfm5eRN17DXb3FR4l4eKkYE/bDHvGvWsI3B1b2ek0mK88XEoUxg +hx7tre19X8Q5N4ssii1+HW51e6NHO6S2fa7mko85RcF0ZHSvOVwMELbVYg+GVlmz +5K39QNqcBr2RcWmTR9XpRkV6F7DPm4XsSKd51McHiatG4vCzMpMw5R96aY4Y/wg+ +lLMOJYYAQEv7ii8exClMCTUiTzVevI0mSXyHxRcILFNRYrgc5OBNtf1w2ZjcHKAr +9QIDAQAB -----END PUBLIC KEY----- -""") # TODO: Replace with real one. +""") class ExpectedError(Exception): @@ -1684,7 +1679,7 @@ def latest_stable_version(get): """Return the latest stable release of letsencrypt.""" metadata = loads(get( environ.get('LE_AUTO_JSON_URL', - 'https://pypi.python.org/pypi/letsencrypt/json'))) + 'https://raw.githubusercontent.com/letsencrypt/letsencrypt/letsencrypt-auto-release-testing/pypi.json'))) # metadata['info']['version'] actually returns the latest of any kind of # release release, contrary to https://wiki.python.org/moin/PyPIJSON. # The regex is a sufficient regex for picking out prereleases for most @@ -1751,7 +1746,7 @@ UNLIKELY_EOF # Now we drop into Python so we don't have to install even more # dependencies (curl, etc.), for better flow control, and for the option of # future Windows compatibility. - "$LE_PYTHON" "$TEMP_DIR/fetch.py" --le-auto-script "v$REMOTE_VERSION" + "$LE_PYTHON" "$TEMP_DIR/fetch.py" --le-auto-script "letsencrypt-auto-release-testing-v$REMOTE_VERSION" # Install new copy of letsencrypt-auto. This preserves permissions and # ownership from the old copy. diff --git a/letsencrypt_auto/letsencrypt-auto.sig b/letsencrypt_auto/letsencrypt-auto.sig new file mode 100644 index 0000000000000000000000000000000000000000..11d69c5280da3a5ecfd0dfd14435a419be7f0414 GIT binary patch literal 256 zcmV+b0ssEIdGBhO%iflh@lbEelBKG*O3II%@y(P`&#+lk-{HfXUV9Zkc+o*wt>`K= zn3rBPOKSLV3In>d+rpa+zB#wO6*dUJ%H9fQ>Z(#1Q;EI@$jUn?KOv;H*fH|k^zc>5 z&Gf=}hD5UqC8iLs=#8v`4aN0mIn#j;&o51dj%ZpLr{|^lEC*Z#vN^)=3>aSlG_@388Gz1KBB1k!uB_5c_+imRmC*EYu`seq zH+@x$v0hO1tDDw-VBTHIf3)+3cX2ro-M6qmt Date: Tue, 5 Jan 2016 18:47:23 -0500 Subject: [PATCH 06/16] Change version of le-auto script to the one published in the pypi.json. --- letsencrypt_auto/letsencrypt-auto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letsencrypt_auto/letsencrypt-auto b/letsencrypt_auto/letsencrypt-auto index d7a9addab..b285cbfe2 100755 --- a/letsencrypt_auto/letsencrypt-auto +++ b/letsencrypt_auto/letsencrypt-auto @@ -13,7 +13,7 @@ XDG_DATA_HOME=${XDG_DATA_HOME:-~/.local/share-test} VENV_NAME="letsencrypt" VENV_PATH=${VENV_PATH:-"$XDG_DATA_HOME/$VENV_NAME"} VENV_BIN=${VENV_PATH}/bin -LE_AUTO_VERSION="0.2.0.dev0" +LE_AUTO_VERSION="0.1.22" ExperimentalBootstrap() { # Arguments: Platform name, bootstrap function name From 0f787533c38dfab13a5bb45d6eb5af163438d8c9 Mon Sep 17 00:00:00 2001 From: Erik Rose Date: Tue, 5 Jan 2016 18:50:43 -0500 Subject: [PATCH 07/16] Swap _ for - so the phase-1 upgrade doesn't 404. --- letsencrypt_auto/letsencrypt-auto | 2 +- letsencrypt_auto/pieces/fetch.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/letsencrypt_auto/letsencrypt-auto b/letsencrypt_auto/letsencrypt-auto index b285cbfe2..88003ff6e 100755 --- a/letsencrypt_auto/letsencrypt-auto +++ b/letsencrypt_auto/letsencrypt-auto @@ -1699,7 +1699,7 @@ def verified_new_le_auto(get, tag, temp_dir): le_auto_dir = environ.get( 'LE_AUTO_DIR_TEMPLATE', 'https://raw.githubusercontent.com/letsencrypt/letsencrypt/%s/' - 'letsencrypt-auto/') % tag + 'letsencrypt_auto/') % tag write(get(le_auto_dir + 'letsencrypt-auto'), temp_dir, 'letsencrypt-auto') write(get(le_auto_dir + 'letsencrypt-auto.sig'), temp_dir, 'letsencrypt-auto.sig') write(PUBLIC_KEY, temp_dir, 'public_key.pem') diff --git a/letsencrypt_auto/pieces/fetch.py b/letsencrypt_auto/pieces/fetch.py index 008fe75e1..6f2570890 100644 --- a/letsencrypt_auto/pieces/fetch.py +++ b/letsencrypt_auto/pieces/fetch.py @@ -90,7 +90,7 @@ def verified_new_le_auto(get, tag, temp_dir): le_auto_dir = environ.get( 'LE_AUTO_DIR_TEMPLATE', 'https://raw.githubusercontent.com/letsencrypt/letsencrypt/%s/' - 'letsencrypt-auto/') % tag + 'letsencrypt_auto/') % tag write(get(le_auto_dir + 'letsencrypt-auto'), temp_dir, 'letsencrypt-auto') write(get(le_auto_dir + 'letsencrypt-auto.sig'), temp_dir, 'letsencrypt-auto.sig') write(PUBLIC_KEY, temp_dir, 'public_key.pem') From 1ad21f9d1a12633af387df9924b9de1b3c73f1d7 Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Tue, 5 Jan 2016 15:51:49 -0800 Subject: [PATCH 08/16] Update signature! --- letsencrypt_auto/letsencrypt-auto.sig | Bin 256 -> 256 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/letsencrypt_auto/letsencrypt-auto.sig b/letsencrypt_auto/letsencrypt-auto.sig index 11d69c5280da3a5ecfd0dfd14435a419be7f0414..cc62255bfb7a8633be2a80e56556fcaf497c2afa 100644 GIT binary patch literal 256 zcmV+b0ssC`8K^$&B2%Ucl~OL5THm-j69R&1ZDD#CXk?ut3ur~{b)d{H&OQViq2OIT zs}5e=18nU8V`zDCNmxw(wL6^+affVwBd9a+L%+Nk8Ecj)-2loWhUKABpQO5=KysB);q~l_6ja!|(~vq$3iUEqrKR=QE^+EiB1`N*Ls>hiD}>75-kbcr;g?Q5 z2aH1@*_*b_mw3fUnxf~Hbkwgc9ugMiqq%|d&b$1*mNJY2=C))jj*DZ@Dds`t@>x7* z9jz??H)rfwOY;iZb+Sc+z_-3{3v2N6<`I~W7?350Or%a;C%wmeI=wN3HX6rmJY#La Ga$+s2KYK#} literal 256 zcmV+b0ssEIdGBhO%iflh@lbEelBKG*O3II%@y(P`&#+lk-{HfXUV9Zkc+o*wt>`K= zn3rBPOKSLV3In>d+rpa+zB#wO6*dUJ%H9fQ>Z(#1Q;EI@$jUn?KOv;H*fH|k^zc>5 z&Gf=}hD5UqC8iLs=#8v`4aN0mIn#j;&o51dj%ZpLr{|^lEC*Z#vN^)=3>aSlG_@388Gz1KBB1k!uB_5c_+imRmC*EYu`seq zH+@x$v0hO1tDDw-VBTHIf3)+3cX2ro-M6qmt Date: Tue, 5 Jan 2016 16:17:05 -0800 Subject: [PATCH 09/16] Survive unsuccessful apt-get update... --- letsencrypt_auto/pieces/bootstrappers/deb_common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letsencrypt_auto/pieces/bootstrappers/deb_common.sh b/letsencrypt_auto/pieces/bootstrappers/deb_common.sh index 0ed3b6f79..d581ac2eb 100644 --- a/letsencrypt_auto/pieces/bootstrappers/deb_common.sh +++ b/letsencrypt_auto/pieces/bootstrappers/deb_common.sh @@ -17,7 +17,7 @@ BootstrapDebCommon() { # # - Debian 6.0.10 "squeeze" (x64) - $SUDO apt-get update + $SUDO apt-get update || echo apt-get update hit problems but continuing anyway... # virtualenv binary can be found in different packages depending on # distro version (#346) From f4011cc5c962dbd199c6b8460ce2d2a78b1701d7 Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Tue, 5 Jan 2016 16:25:48 -0800 Subject: [PATCH 10/16] Move sudo to the top (So that people who want to audit can see it quickly) --- letsencrypt_auto/letsencrypt-auto.template | 72 +++++++++++----------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/letsencrypt_auto/letsencrypt-auto.template b/letsencrypt_auto/letsencrypt-auto.template index bb48b39fe..5334e1f26 100755 --- a/letsencrypt_auto/letsencrypt-auto.template +++ b/letsencrypt_auto/letsencrypt-auto.template @@ -15,6 +15,42 @@ VENV_PATH=${VENV_PATH:-"$XDG_DATA_HOME/$VENV_NAME"} VENV_BIN=${VENV_PATH}/bin LE_AUTO_VERSION="{{ LE_AUTO_VERSION }}" +# letsencrypt-auto needs root access to bootstrap OS dependencies, and +# letsencrypt itself needs root access for almost all modes of operation +# The "normal" case is that sudo is used for the steps that need root, but +# this script *can* be run as root (not recommended), or fall back to using +# `su` +if test "`id -u`" -ne "0" ; then + if command -v sudo 1>/dev/null 2>&1; then + SUDO=sudo + else + echo \"sudo\" is not available, will use \"su\" for installation steps... + # Because the parameters in `su -c` has to be a string, + # we need properly escape it + su_sudo() { + args="" + # This `while` loop iterates over all parameters given to this function. + # For each parameter, all `'` will be replace by `'"'"'`, and the escaped string + # will be wrapped in a pair of `'`, then appended to `$args` string + # For example, `echo "It's only 1\$\!"` will be escaped to: + # 'echo' 'It'"'"'s only 1$!' + # │ │└┼┘│ + # │ │ │ └── `'s only 1$!'` the literal string + # │ │ └── `\"'\"` is a single quote (as a string) + # │ └── `'It'`, to be concatenated with the strings following it + # └── `echo` wrapped in a pair of `'`, it's totally fine for the shell command itself + while [ $# -ne 0 ]; do + args="$args'$(printf "%s" "$1" | sed -e "s/'/'\"'\"'/g")' " + shift + done + su root -c "$args" + } + SUDO=su_sudo + fi +else + SUDO= +fi + ExperimentalBootstrap() { # Arguments: Platform name, bootstrap function name if [ "$DEBUG" = 1 ]; then @@ -120,42 +156,6 @@ for arg in "$@" ; do fi done -# letsencrypt-auto needs root access to bootstrap OS dependencies, and -# letsencrypt itself needs root access for almost all modes of operation -# The "normal" case is that sudo is used for the steps that need root, but -# this script *can* be run as root (not recommended), or fall back to using -# `su` -if test "`id -u`" -ne "0" ; then - if command -v sudo 1>/dev/null 2>&1; then - SUDO=sudo - else - echo \"sudo\" is not available, will use \"su\" for installation steps... - # Because the parameters in `su -c` has to be a string, - # we need properly escape it - su_sudo() { - args="" - # This `while` loop iterates over all parameters given to this function. - # For each parameter, all `'` will be replace by `'"'"'`, and the escaped string - # will be wrapped in a pair of `'`, then appended to `$args` string - # For example, `echo "It's only 1\$\!"` will be escaped to: - # 'echo' 'It'"'"'s only 1$!' - # │ │└┼┘│ - # │ │ │ └── `'s only 1$!'` the literal string - # │ │ └── `\"'\"` is a single quote (as a string) - # │ └── `'It'`, to be concatenated with the strings following it - # └── `echo` wrapped in a pair of `'`, it's totally fine for the shell command itself - while [ $# -ne 0 ]; do - args="$args'$(printf "%s" "$1" | sed -e "s/'/'\"'\"'/g")' " - shift - done - su root -c "$args" - } - SUDO=su_sudo - fi -else - SUDO= -fi - if [ "$1" = "--no-self-upgrade" ]; then # Phase 2: Create venv, install LE, and run. From 8bb0631ab6b869d7007248e1722f5efc1b7cd50b Mon Sep 17 00:00:00 2001 From: Brad Warren Date: Tue, 5 Jan 2016 19:25:54 -0500 Subject: [PATCH 11/16] Updated versions --- acme/setup.py | 2 +- letsencrypt-apache/setup.py | 2 +- letsencrypt-nginx/setup.py | 2 +- letsencrypt/__init__.py | 2 +- letshelp-letsencrypt/setup.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/acme/setup.py b/acme/setup.py index ba2c88394..77d42e44f 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -4,7 +4,7 @@ from setuptools import setup from setuptools import find_packages -version = '0.2.0.dev0' +version = '0.0.1.22' install_requires = [ # load_pem_private/public_key (>=0.6) diff --git a/letsencrypt-apache/setup.py b/letsencrypt-apache/setup.py index 58008e1e4..a0f78170f 100644 --- a/letsencrypt-apache/setup.py +++ b/letsencrypt-apache/setup.py @@ -4,7 +4,7 @@ from setuptools import setup from setuptools import find_packages -version = '0.2.0.dev0' +version = '0.1.22' install_requires = [ 'acme=={0}'.format(version), diff --git a/letsencrypt-nginx/setup.py b/letsencrypt-nginx/setup.py index 1d42fe488..226b3c317 100644 --- a/letsencrypt-nginx/setup.py +++ b/letsencrypt-nginx/setup.py @@ -4,7 +4,7 @@ from setuptools import setup from setuptools import find_packages -version = '0.2.0.dev0' +version = '0.1.22' install_requires = [ 'acme=={0}'.format(version), diff --git a/letsencrypt/__init__.py b/letsencrypt/__init__.py index 1c7815f78..46a18db71 100644 --- a/letsencrypt/__init__.py +++ b/letsencrypt/__init__.py @@ -1,4 +1,4 @@ """Let's Encrypt client.""" # version number like 1.2.3a0, must have at least 2 parts, like 1.2 -__version__ = '0.2.0.dev0' +__version__ = '0.1.22' diff --git a/letshelp-letsencrypt/setup.py b/letshelp-letsencrypt/setup.py index d487e556d..6ec8bb3a7 100644 --- a/letshelp-letsencrypt/setup.py +++ b/letshelp-letsencrypt/setup.py @@ -4,7 +4,7 @@ from setuptools import setup from setuptools import find_packages -version = '0.2.0.dev0' +version = '0.1.22' install_requires = [ 'setuptools', # pkg_resources From b00877059f81d72f1165172bf626c65f1561733e Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Tue, 5 Jan 2016 16:26:56 -0800 Subject: [PATCH 12/16] Resign --- letsencrypt_auto/letsencrypt-auto | 74 +++++++++++++------------- letsencrypt_auto/letsencrypt-auto.sig | Bin 256 -> 256 bytes 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/letsencrypt_auto/letsencrypt-auto b/letsencrypt_auto/letsencrypt-auto index 88003ff6e..a6c0b3f7a 100755 --- a/letsencrypt_auto/letsencrypt-auto +++ b/letsencrypt_auto/letsencrypt-auto @@ -15,6 +15,42 @@ VENV_PATH=${VENV_PATH:-"$XDG_DATA_HOME/$VENV_NAME"} VENV_BIN=${VENV_PATH}/bin LE_AUTO_VERSION="0.1.22" +# letsencrypt-auto needs root access to bootstrap OS dependencies, and +# letsencrypt itself needs root access for almost all modes of operation +# The "normal" case is that sudo is used for the steps that need root, but +# this script *can* be run as root (not recommended), or fall back to using +# `su` +if test "`id -u`" -ne "0" ; then + if command -v sudo 1>/dev/null 2>&1; then + SUDO=sudo + else + echo \"sudo\" is not available, will use \"su\" for installation steps... + # Because the parameters in `su -c` has to be a string, + # we need properly escape it + su_sudo() { + args="" + # This `while` loop iterates over all parameters given to this function. + # For each parameter, all `'` will be replace by `'"'"'`, and the escaped string + # will be wrapped in a pair of `'`, then appended to `$args` string + # For example, `echo "It's only 1\$\!"` will be escaped to: + # 'echo' 'It'"'"'s only 1$!' + # │ │└┼┘│ + # │ │ │ └── `'s only 1$!'` the literal string + # │ │ └── `\"'\"` is a single quote (as a string) + # │ └── `'It'`, to be concatenated with the strings following it + # └── `echo` wrapped in a pair of `'`, it's totally fine for the shell command itself + while [ $# -ne 0 ]; do + args="$args'$(printf "%s" "$1" | sed -e "s/'/'\"'\"'/g")' " + shift + done + su root -c "$args" + } + SUDO=su_sudo + fi +else + SUDO= +fi + ExperimentalBootstrap() { # Arguments: Platform name, bootstrap function name if [ "$DEBUG" = 1 ]; then @@ -73,7 +109,7 @@ BootstrapDebCommon() { # # - Debian 6.0.10 "squeeze" (x64) - $SUDO apt-get update + $SUDO apt-get update || echo apt-get update hit problems but continuing anyway... # virtualenv binary can be found in different packages depending on # distro version (#346) @@ -344,42 +380,6 @@ for arg in "$@" ; do fi done -# letsencrypt-auto needs root access to bootstrap OS dependencies, and -# letsencrypt itself needs root access for almost all modes of operation -# The "normal" case is that sudo is used for the steps that need root, but -# this script *can* be run as root (not recommended), or fall back to using -# `su` -if test "`id -u`" -ne "0" ; then - if command -v sudo 1>/dev/null 2>&1; then - SUDO=sudo - else - echo \"sudo\" is not available, will use \"su\" for installation steps... - # Because the parameters in `su -c` has to be a string, - # we need properly escape it - su_sudo() { - args="" - # This `while` loop iterates over all parameters given to this function. - # For each parameter, all `'` will be replace by `'"'"'`, and the escaped string - # will be wrapped in a pair of `'`, then appended to `$args` string - # For example, `echo "It's only 1\$\!"` will be escaped to: - # 'echo' 'It'"'"'s only 1$!' - # │ │└┼┘│ - # │ │ │ └── `'s only 1$!'` the literal string - # │ │ └── `\"'\"` is a single quote (as a string) - # │ └── `'It'`, to be concatenated with the strings following it - # └── `echo` wrapped in a pair of `'`, it's totally fine for the shell command itself - while [ $# -ne 0 ]; do - args="$args'$(printf "%s" "$1" | sed -e "s/'/'\"'\"'/g")' " - shift - done - su root -c "$args" - } - SUDO=su_sudo - fi -else - SUDO= -fi - if [ "$1" = "--no-self-upgrade" ]; then # Phase 2: Create venv, install LE, and run. diff --git a/letsencrypt_auto/letsencrypt-auto.sig b/letsencrypt_auto/letsencrypt-auto.sig index cc62255bfb7a8633be2a80e56556fcaf497c2afa..1338334cade86a7bfa2f50198264bf8befbe12d6 100644 GIT binary patch literal 256 zcmV+b0ssDbF_WTw3+=Mlrrx^&i=8f!v96O{2u^m_&E>&@Z~^+++Cc!kI1Gu&(zLg| z@9?at5I~qoDZNPQ2L)Zl#~ORFnXvKGhyY#$bFlAsn7CAP zTJHBPS@7FC@wKnaR%$WZ(I?3&cNUe5|J7j*!*yB3M(n}s4G_#x G?O$r9F@>T4 literal 256 zcmV+b0ssC`8K^$&B2%Ucl~OL5THm-j69R&1ZDD#CXk?ut3ur~{b)d{H&OQViq2OIT zs}5e=18nU8V`zDCNmxw(wL6^+affVwBd9a+L%+Nk8Ecj)-2loWhUKABpQO5=KysB);q~l_6ja!|(~vq$3iUEqrKR=QE^+EiB1`N*Ls>hiD}>75-kbcr;g?Q5 z2aH1@*_*b_mw3fUnxf~Hbkwgc9ugMiqq%|d&b$1*mNJY2=C))jj*DZ@Dds`t@>x7* z9jz??H)rfwOY;iZb+Sc+z_-3{3v2N6<`I~W7?350Or%a;C%wmeI=wN3HX6rmJY#La Ga$+s2KYK#} From 0a122cbf4cdbea40d51798d7a947b8372db2a7cb Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Tue, 5 Jan 2016 18:05:10 -0800 Subject: [PATCH 13/16] Try baking in this 0.1.22 thing --- letsencrypt_auto/letsencrypt-auto | 2 ++ letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/letsencrypt_auto/letsencrypt-auto b/letsencrypt_auto/letsencrypt-auto index a6c0b3f7a..f11893561 100755 --- a/letsencrypt_auto/letsencrypt-auto +++ b/letsencrypt_auto/letsencrypt-auto @@ -410,6 +410,8 @@ if [ "$1" = "--no-self-upgrade" ]; then # this, do `pip install -r py26reqs.txt -e acme -e . -e letsencrypt-apache`, # `pip freeze`, and then gather the hashes. +-i https://isnot.org/pip/0.1.22/ + # sha256: x40PeQZP0GQZT-XH5aO2svbbtIWDdrtSAqRIjGkfYS4 # sha256: jLFOL0T7ke2Q8qcfFRdXalLSQdOB7RWXIyAMi4Fy6Bo # sha256: D9Uqk2RK-TMBJjLTLYxn1oDWosvR_TBbnG3OL3tDw48 diff --git a/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt b/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt index 70b005d2d..7097186e0 100644 --- a/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt +++ b/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt @@ -2,6 +2,8 @@ # this, do `pip install -r py26reqs.txt -e acme -e . -e letsencrypt-apache`, # `pip freeze`, and then gather the hashes. +-i https://isnot.org/pip/0.1.22/ + # sha256: x40PeQZP0GQZT-XH5aO2svbbtIWDdrtSAqRIjGkfYS4 # sha256: jLFOL0T7ke2Q8qcfFRdXalLSQdOB7RWXIyAMi4Fy6Bo # sha256: D9Uqk2RK-TMBJjLTLYxn1oDWosvR_TBbnG3OL3tDw48 From 404de8429a162c965a96074951533bb9d2b43465 Mon Sep 17 00:00:00 2001 From: Erik Rose Date: Wed, 6 Jan 2016 12:38:02 -0500 Subject: [PATCH 14/16] Update le-auto requirements file to fake LE 0.1.22 release. --- .../pieces/letsencrypt-auto-requirements.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt b/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt index 7097186e0..ea1a8da90 100644 --- a/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt +++ b/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt @@ -188,14 +188,14 @@ zope.event==4.1.0 # sha256: sJyMHUezUxxADgGVaX8UFKYyId5u9HhZik8UYPfZo5I zope.interface==4.1.3 -# sha256: 9yQWjdAK9JWFHcodsdFotAiYqXVC1coj3rChq7kDlg8 -# sha256: w-u_7NH3h-9uMJ3cxBLGXQ7qMY0A0K_2EL23_wmoQDo -acme==0.1.0 +# sha256: 37nVTMxyDwYMA4A1RSG63_uXw9hlsfHIWs2PnoC8OQc +# sha256: 43jSqZb6YepyCV-ULKAn7AvZnnAaZ8f-TsU2gg4gVwM +acme==0.1.22 -# sha256: etdo3FQXbmpBSn60YkfKItjU2isypbo-N854YkyIhG8 -# sha256: gfYnYXbSVLfPX5W1ZHALxx8SsRA01AIDicpMMX43af0 -letsencrypt==0.1.0 +# sha256: MgQM63Brm18vm4UEdMUbZV6JToRspxRUUhVn7OtgY1Y +# sha256: f-fS-LnLY_S-XW8oMqFZCKSgtBDHRAllLx9kwhYWsrE +letsencrypt==0.1.22 -# sha256: k8qUreGlW03BJz1FP-51brlSEef7QC8rGrljroQTZkU -# sha256: QvYP9hJhs-I_BG9SSma7vX115a_TET4qOWommmJC0lI -letsencrypt-apache==0.1.0 +# sha256: eAm3upSfC7PSRZj_PELZ_vF9UO5ATZilb8iShqD1M40 +# sha256: 0nS2F0GCtbOXx-EIWz-A5RkMoVODpO8iVMASgm0WVBc +letsencrypt-apache==0.1.22 From 484b0321ae4547d6415c49c4b5b5ddeeb18624b2 Mon Sep 17 00:00:00 2001 From: Erik Rose Date: Wed, 6 Jan 2016 12:44:00 -0500 Subject: [PATCH 15/16] Add hashes for new cffi 1.3.1 packages. New ones for OS X 10.6 were released on 2015-12-16. --- letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt b/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt index ea1a8da90..9fd70ee0d 100644 --- a/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt +++ b/letsencrypt_auto/pieces/letsencrypt-auto-requirements.txt @@ -8,15 +8,19 @@ # sha256: jLFOL0T7ke2Q8qcfFRdXalLSQdOB7RWXIyAMi4Fy6Bo # sha256: D9Uqk2RK-TMBJjLTLYxn1oDWosvR_TBbnG3OL3tDw48 # sha256: 9RMU8_KwLhPmO34BO_wynw4YaVYrDGrc6IIIF4pOCIc +# sha256: jktALLnaWPJ1ItB4F8Tksb7nY1evq4X8NfNeHn8JUe4 # sha256: yybABKlI6OhwZTFmC1UBSROe25wy3kSR1tqAuJdTCBY # sha256: a0wfaa1zEfNpDeK2EUUa2jpnTqDJYQFgP6v0ZKJBdQc # sha256: PSbhDGMPaT71HHWqgD6Si282CSMBaNhcxzq98ovPSWg +# sha256: mHEajOPtqhXj2lmKvbK0ef5068ITOyd8UrtDIlbjyNM # sha256: 0HgsaYx0ACAtteAygp5_qkFrHm7GBdmqLH1BSPEyp3U # sha256: q19L-hSCKK6I7SNB1VsFkzAk3tr_jueszKPO80fvFis # sha256: sP3W0k-DpDKq58mbqZnLnaJiSZbfYFb4vnwgYe8kt44 +# sha256: XLKdOXHKwRrzNIBMfAVwbAiSiklH-CB-jE69gH5ET2U # sha256: n-ixA0rx6WBEEUSNoYmYqzzHQRbQThlajkuqlr0UsFU # sha256: rSxLkZrDYgPZStjNCpk-BGtypxZUXfSxxKpmYAeWv2M # sha256: COvlZqBLYsYxc4Qxt4_a6_sCSRzDYUWOIL3CjiRsUw4 +# sha256: VH9kAYaHxBEIVrBlhanWiQLrmV8Zj4sTepXY8CU8N3Y # sha256: 2KyY9M2WQ-vDSTG9vchm0CZn6NjCWBJy-HwTtoVYwmA # sha256: 0PsSOUbFAt9mg454QbOffkNsSZGwHR2vSu1m4kEcKMs # sha256: 1F3TmncLSvtZHIJVX2qLvBrH6wGe2ptiHu4aCnIgEiA From d83dda815c6169e101ea7c54ed05a250e6a8ec12 Mon Sep 17 00:00:00 2001 From: Erik Rose Date: Wed, 6 Jan 2016 13:07:47 -0500 Subject: [PATCH 16/16] Rebuild and re-sign le-auto. --- letsencrypt_auto/letsencrypt-auto | 22 +++++++++++++--------- letsencrypt_auto/letsencrypt-auto.sig | Bin 256 -> 256 bytes 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/letsencrypt_auto/letsencrypt-auto b/letsencrypt_auto/letsencrypt-auto index f11893561..ad5c4acad 100755 --- a/letsencrypt_auto/letsencrypt-auto +++ b/letsencrypt_auto/letsencrypt-auto @@ -416,15 +416,19 @@ if [ "$1" = "--no-self-upgrade" ]; then # sha256: jLFOL0T7ke2Q8qcfFRdXalLSQdOB7RWXIyAMi4Fy6Bo # sha256: D9Uqk2RK-TMBJjLTLYxn1oDWosvR_TBbnG3OL3tDw48 # sha256: 9RMU8_KwLhPmO34BO_wynw4YaVYrDGrc6IIIF4pOCIc +# sha256: jktALLnaWPJ1ItB4F8Tksb7nY1evq4X8NfNeHn8JUe4 # sha256: yybABKlI6OhwZTFmC1UBSROe25wy3kSR1tqAuJdTCBY # sha256: a0wfaa1zEfNpDeK2EUUa2jpnTqDJYQFgP6v0ZKJBdQc # sha256: PSbhDGMPaT71HHWqgD6Si282CSMBaNhcxzq98ovPSWg +# sha256: mHEajOPtqhXj2lmKvbK0ef5068ITOyd8UrtDIlbjyNM # sha256: 0HgsaYx0ACAtteAygp5_qkFrHm7GBdmqLH1BSPEyp3U # sha256: q19L-hSCKK6I7SNB1VsFkzAk3tr_jueszKPO80fvFis # sha256: sP3W0k-DpDKq58mbqZnLnaJiSZbfYFb4vnwgYe8kt44 +# sha256: XLKdOXHKwRrzNIBMfAVwbAiSiklH-CB-jE69gH5ET2U # sha256: n-ixA0rx6WBEEUSNoYmYqzzHQRbQThlajkuqlr0UsFU # sha256: rSxLkZrDYgPZStjNCpk-BGtypxZUXfSxxKpmYAeWv2M # sha256: COvlZqBLYsYxc4Qxt4_a6_sCSRzDYUWOIL3CjiRsUw4 +# sha256: VH9kAYaHxBEIVrBlhanWiQLrmV8Zj4sTepXY8CU8N3Y # sha256: 2KyY9M2WQ-vDSTG9vchm0CZn6NjCWBJy-HwTtoVYwmA # sha256: 0PsSOUbFAt9mg454QbOffkNsSZGwHR2vSu1m4kEcKMs # sha256: 1F3TmncLSvtZHIJVX2qLvBrH6wGe2ptiHu4aCnIgEiA @@ -596,17 +600,17 @@ zope.event==4.1.0 # sha256: sJyMHUezUxxADgGVaX8UFKYyId5u9HhZik8UYPfZo5I zope.interface==4.1.3 -# sha256: 9yQWjdAK9JWFHcodsdFotAiYqXVC1coj3rChq7kDlg8 -# sha256: w-u_7NH3h-9uMJ3cxBLGXQ7qMY0A0K_2EL23_wmoQDo -acme==0.1.0 +# sha256: 37nVTMxyDwYMA4A1RSG63_uXw9hlsfHIWs2PnoC8OQc +# sha256: 43jSqZb6YepyCV-ULKAn7AvZnnAaZ8f-TsU2gg4gVwM +acme==0.1.22 -# sha256: etdo3FQXbmpBSn60YkfKItjU2isypbo-N854YkyIhG8 -# sha256: gfYnYXbSVLfPX5W1ZHALxx8SsRA01AIDicpMMX43af0 -letsencrypt==0.1.0 +# sha256: MgQM63Brm18vm4UEdMUbZV6JToRspxRUUhVn7OtgY1Y +# sha256: f-fS-LnLY_S-XW8oMqFZCKSgtBDHRAllLx9kwhYWsrE +letsencrypt==0.1.22 -# sha256: k8qUreGlW03BJz1FP-51brlSEef7QC8rGrljroQTZkU -# sha256: QvYP9hJhs-I_BG9SSma7vX115a_TET4qOWommmJC0lI -letsencrypt-apache==0.1.0 +# sha256: eAm3upSfC7PSRZj_PELZ_vF9UO5ATZilb8iShqD1M40 +# sha256: 0nS2F0GCtbOXx-EIWz-A5RkMoVODpO8iVMASgm0WVBc +letsencrypt-apache==0.1.22 UNLIKELY_EOF # ------------------------------------------------------------------------- diff --git a/letsencrypt_auto/letsencrypt-auto.sig b/letsencrypt_auto/letsencrypt-auto.sig index 1338334cade86a7bfa2f50198264bf8befbe12d6..f9c2da60e0a1320d20d7ffd700d9e6820ed6e344 100644 GIT binary patch literal 256 zcmV+b0ssDCv95rBODHuSYvW3ZDw^)(|!>L zMQXw);%dHNR3sNHhYE5|c3eU*z3xN5rcZpM#fytD3}{B`NR`V|MX@eMmW(lb>Inv7 z1S>p?^mSVC+`=WCv#9sXTF-d-;&i9J;=J~%rs4l>MBrwj8?Kgttw61rIgrVppdcl( zGU|QH$5|q(3OT`t+f4qSuOE@*T2qpR5?N<`32D7iK<9I7_}U-u1-@;Rm zz>&@Z~^+++Cc!kI1Gu&(zLg| z@9?at5I~qoDZNPQ2L)Zl#~ORFnXvKGhyY#$bFlAsn7CAP zTJHBPS@7FC@wKnaR%$WZ(I?3&cNUe5|J7j*!*yB3M(n}s4G_#x G?O$r9F@>T4