diff --git a/INSTALL.md b/INSTALL.md index 3564890..7a3af4f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,7 +1,8 @@ Installation ============ -Requirements: python3 and python cryptography package +Requirements: python3 and python cryptography package, requests for transports + Example for Ubuntu/Debian ------------------------- @@ -22,7 +23,7 @@ Configure new python virtual environment: cd pyseeder virtualenv --python=python3 venv . venv/bin/activate - pip3 install -r requirements.txt + pip3 install . Thats it! Next time you will need to run pyseeder, don't forget to activate diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..c89f64a --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2016-2017 Darknet Villain + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index 8e7abd5..38ec0d6 100644 --- a/README.md +++ b/README.md @@ -13,21 +13,26 @@ Reseed transports are implemented so that users can bootstrap their I2P nodes without needing to connect to "official" I2P reseeds. This makes I2P more invisible for firewalls. -[Installation instructions](INSTALL.md) +Installation +------------ + + $ pip3 install https://github.com/PurpleI2P/pyseeder/zipball/master + +[Detailed installation instructions](INSTALL.md) Usage ----- - $ python3 pyseeder.py --help - $ python3 pyseeder.py keygen --help + $ pyseeder --help + $ pyseeder keygen --help Generating keypair ------------------ - $ python3 pyseeder.py keygen --cert data/user_at_mail.i2p.crt --private-key data/priv_key.pem --signer-id user@mail.i2p + $ pyseeder keygen --cert data/user_at_mail.i2p.crt --private-key data/priv_key.pem --signer-id user@mail.i2p This will generate certificate (user\_at\_mail.i2p.crt) and private RSA key (priv\_key.pem) in data folder. E-mail is used as certificate identifier. @@ -40,7 +45,7 @@ Generating reseed data $ YOUR_PASSWORD="Pa55w0rd" - $ echo $YOUR_PASSWORD | python3 pyseeder.py reseed --netdb /path/to/netDb --private-key data/priv_key.pem --outfile output/i2pseeds.su3 --signer-id user@mail.i2p + $ echo $YOUR_PASSWORD | pyseeder reseed --netdb /path/to/netDb --private-key data/priv_key.pem --outfile output/i2pseeds.su3 --signer-id user@mail.i2p This will generate file i2pseeds.su3 in output folder, using user@mail.i2p as certificate identifier. @@ -52,7 +57,7 @@ is one of the ways to do it (for cron and scripts). Download su3 file from official servers --------------------------------------- - $ python3 pyseeder.py transport.pull --urls https://reseed.i2p-projekt.de/ https://reseed.i2p.vzaws.com:8443/ --outfile output/i2pseeds.su3 + $ pyseeder transport.pull --urls https://reseed.i2p-projekt.de/ https://reseed.i2p.vzaws.com:8443/ --outfile output/i2pseeds.su3 Note: --urls parameter is optional, defaults are "official" I2P reseeds. @@ -60,7 +65,7 @@ Note: --urls parameter is optional, defaults are "official" I2P reseeds. Upload su3 file with pluggable transports ----------------------------------------- - $ python3 pyseeder.py transport.push --config transports.ini --file output/i2pseeds.su3 + $ pyseeder transport.push --config transports.ini --file output/i2pseeds.su3 All parameters are optional. Copy file transports.ini.example to transports.ini. Edit your settings in this new file. @@ -69,7 +74,7 @@ transports.ini. Edit your settings in this new file. Run HTTPS reseed server ----------------------- - $ python3 pyseeder.py serve --port 8443 --host 127.0.0.1 --private-key data/priv_key.pem --cert data/user_at_mail.i2p.crt --file output/i2pseeds.su3 + $ pyseeder serve --port 8443 --host 127.0.0.1 --private-key data/priv_key.pem --cert data/user_at_mail.i2p.crt --file output/i2pseeds.su3 Note: this server is fine for testing, but for "production" environments please use nginx webserver. diff --git a/pyseeder.py b/pyseeder.py deleted file mode 100755 index 8ffa99e..0000000 --- a/pyseeder.py +++ /dev/null @@ -1,128 +0,0 @@ -#! /usr/bin/env python3 -import os -import sys -import argparse -import logging - -import pyseeder.transport -import pyseeder.actions -from pyseeder.utils import PyseederException - -log = logging.getLogger(__name__) - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('--loglevel', default=logging.INFO, help="Log level", - choices=[logging.CRITICAL, logging.ERROR, logging.WARNING, - logging.INFO, logging.DEBUG]) - - subparsers = parser.add_subparsers(title="actions", - help="Command to execute") - - kg_parser = subparsers.add_parser( - "keygen", - description="Generates keypair for your reseed", - usage=""" -%(prog)s --cert data/user_at_mail.i2p.crt \\ - --private-key data/priv_key.pem --signer-id user@mail.i2p""" - ) - kg_parser.add_argument("--signer-id", required=True, - help="Identifier of certificate (example: user@mail.i2p)") - kg_parser.add_argument("--private-key", default="data/priv_key.pem", - help="RSA private key (default: data/priv_key.pem)") - kg_parser.add_argument("--cert", default=None, - help="Certificate (example: data/user_at_mail.i2p.crt)") - kg_parser.add_argument("--no-encryption", action="store_true", - help="Disable private key encryption") - kg_parser.set_defaults(func=pyseeder.actions.keygen) - - - rs_parser = subparsers.add_parser( - "reseed", - description="Creates su3 reseed file", - usage=""" -echo $YOUR_PASSWORD | %(prog)s --netdb /path/to/netDb \\ - --private-key data/priv_key.pem --outfile output/i2pseeds.su3 \\ - --signer-id user@mail.i2p""" - ) - rs_parser.add_argument("--signer-id", required=True, - help="Identifier of certificate (example: user@mail.i2p)") - rs_parser.add_argument("--private-key", default="data/priv_key.pem", - help="RSA private key (default: data/priv_key.pem)") - rs_parser.add_argument("-o", "--outfile", default="output/i2pseeds.su3", - help="Output file (default: output/i2pseeds.su3)") - rs_parser.add_argument("--netdb", required=True, - help="Path to netDb folder (example: ~/.i2pd/netDb)") - rs_parser.add_argument("--no-encryption", action="store_true", - help="Disable private key encryption") - rs_parser.set_defaults(func=pyseeder.actions.reseed) - - - tpull_parser = subparsers.add_parser( - "transport.pull", - description="Download su3 file from random reseed server", - usage=""" -%(prog)s --urls https://reseed.i2p-projekt.de/ \\ - https://reseed.i2p.vzaws.com:8443/ \\ - --outfile output/i2pseeds.su3""" - ) - tpull_parser.add_argument("--urls", default=pyseeder.transport.RESEED_URLS, - nargs="*", help="""Reseed URLs separated by space, default are - mainline I2P (like https://reseed.i2p-projekt.de/)""") - tpull_parser.add_argument("-o", "--outfile", default="output/i2pseeds.su3", - help="Output file (default: output/i2pseeds.su3)") - tpull_parser.set_defaults(func=pyseeder.actions.transport_pull) - - - tpush_parser = subparsers.add_parser( - "transport.push", - description="Upload su3 file with transports", - usage="%(prog)s --config transports.ini --file output/i2pseeds.su3" - ) - tpush_parser.add_argument("--config", default="transports.ini", - help="Transports config file (default: transports.ini)") - tpush_parser.add_argument("-f", "--file", default="output/i2pseeds.su3", - help=".su3 file (default: output/i2pseeds.su3)") - tpush_parser.set_defaults(func=pyseeder.actions.transport_push) - - - serve_parser = subparsers.add_parser( - "serve", - description="""Run HTTPS reseeding server - (in production use nginx instead, please). - Will ask for a private key password""", - usage="""%(prog)s --port 8443 --host 127.0.0.1 \\ - --private-key data/priv_key.pem \\ - --cert data/user_at_mail.i2p.crt \\ - --file output/i2pseeds.su3""" - ) - serve_parser.add_argument("--host", default="0.0.0.0", - help="Host listening for clients (default: 0.0.0.0)") - serve_parser.add_argument("--port", default=8443, - help="Port listening for clients (default: 8443)") - serve_parser.add_argument("--private-key", default="data/priv_key.pem", - help="RSA private key (default: data/priv_key.pem)") - serve_parser.add_argument("--cert", required=True, - help="Certificate (example: data/user_at_mail.i2p.crt)") - serve_parser.add_argument("-f", "--file", default="output/i2pseeds.su3", - help=".su3 file (default: output/i2pseeds.su3)") - serve_parser.set_defaults(func=pyseeder.actions.serve) - - - args = parser.parse_args() - - logging.basicConfig(level=args.loglevel, - format='%(levelname)-8s %(message)s') - - if hasattr(args, "func"): - try: - args.func(args) - except PyseederException as pe: - log.critical("Pyseeder error: {}".format(pe)) - sys.exit(1) - else: - parser.print_help() - - -if __name__ == "__main__": - main() diff --git a/pyseeder.py b/pyseeder.py new file mode 120000 index 0000000..387a8ba --- /dev/null +++ b/pyseeder.py @@ -0,0 +1 @@ +pyseeder/cli.py \ No newline at end of file diff --git a/pyseeder/cli.py b/pyseeder/cli.py new file mode 100755 index 0000000..8ffa99e --- /dev/null +++ b/pyseeder/cli.py @@ -0,0 +1,128 @@ +#! /usr/bin/env python3 +import os +import sys +import argparse +import logging + +import pyseeder.transport +import pyseeder.actions +from pyseeder.utils import PyseederException + +log = logging.getLogger(__name__) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--loglevel', default=logging.INFO, help="Log level", + choices=[logging.CRITICAL, logging.ERROR, logging.WARNING, + logging.INFO, logging.DEBUG]) + + subparsers = parser.add_subparsers(title="actions", + help="Command to execute") + + kg_parser = subparsers.add_parser( + "keygen", + description="Generates keypair for your reseed", + usage=""" +%(prog)s --cert data/user_at_mail.i2p.crt \\ + --private-key data/priv_key.pem --signer-id user@mail.i2p""" + ) + kg_parser.add_argument("--signer-id", required=True, + help="Identifier of certificate (example: user@mail.i2p)") + kg_parser.add_argument("--private-key", default="data/priv_key.pem", + help="RSA private key (default: data/priv_key.pem)") + kg_parser.add_argument("--cert", default=None, + help="Certificate (example: data/user_at_mail.i2p.crt)") + kg_parser.add_argument("--no-encryption", action="store_true", + help="Disable private key encryption") + kg_parser.set_defaults(func=pyseeder.actions.keygen) + + + rs_parser = subparsers.add_parser( + "reseed", + description="Creates su3 reseed file", + usage=""" +echo $YOUR_PASSWORD | %(prog)s --netdb /path/to/netDb \\ + --private-key data/priv_key.pem --outfile output/i2pseeds.su3 \\ + --signer-id user@mail.i2p""" + ) + rs_parser.add_argument("--signer-id", required=True, + help="Identifier of certificate (example: user@mail.i2p)") + rs_parser.add_argument("--private-key", default="data/priv_key.pem", + help="RSA private key (default: data/priv_key.pem)") + rs_parser.add_argument("-o", "--outfile", default="output/i2pseeds.su3", + help="Output file (default: output/i2pseeds.su3)") + rs_parser.add_argument("--netdb", required=True, + help="Path to netDb folder (example: ~/.i2pd/netDb)") + rs_parser.add_argument("--no-encryption", action="store_true", + help="Disable private key encryption") + rs_parser.set_defaults(func=pyseeder.actions.reseed) + + + tpull_parser = subparsers.add_parser( + "transport.pull", + description="Download su3 file from random reseed server", + usage=""" +%(prog)s --urls https://reseed.i2p-projekt.de/ \\ + https://reseed.i2p.vzaws.com:8443/ \\ + --outfile output/i2pseeds.su3""" + ) + tpull_parser.add_argument("--urls", default=pyseeder.transport.RESEED_URLS, + nargs="*", help="""Reseed URLs separated by space, default are + mainline I2P (like https://reseed.i2p-projekt.de/)""") + tpull_parser.add_argument("-o", "--outfile", default="output/i2pseeds.su3", + help="Output file (default: output/i2pseeds.su3)") + tpull_parser.set_defaults(func=pyseeder.actions.transport_pull) + + + tpush_parser = subparsers.add_parser( + "transport.push", + description="Upload su3 file with transports", + usage="%(prog)s --config transports.ini --file output/i2pseeds.su3" + ) + tpush_parser.add_argument("--config", default="transports.ini", + help="Transports config file (default: transports.ini)") + tpush_parser.add_argument("-f", "--file", default="output/i2pseeds.su3", + help=".su3 file (default: output/i2pseeds.su3)") + tpush_parser.set_defaults(func=pyseeder.actions.transport_push) + + + serve_parser = subparsers.add_parser( + "serve", + description="""Run HTTPS reseeding server + (in production use nginx instead, please). + Will ask for a private key password""", + usage="""%(prog)s --port 8443 --host 127.0.0.1 \\ + --private-key data/priv_key.pem \\ + --cert data/user_at_mail.i2p.crt \\ + --file output/i2pseeds.su3""" + ) + serve_parser.add_argument("--host", default="0.0.0.0", + help="Host listening for clients (default: 0.0.0.0)") + serve_parser.add_argument("--port", default=8443, + help="Port listening for clients (default: 8443)") + serve_parser.add_argument("--private-key", default="data/priv_key.pem", + help="RSA private key (default: data/priv_key.pem)") + serve_parser.add_argument("--cert", required=True, + help="Certificate (example: data/user_at_mail.i2p.crt)") + serve_parser.add_argument("-f", "--file", default="output/i2pseeds.su3", + help=".su3 file (default: output/i2pseeds.su3)") + serve_parser.set_defaults(func=pyseeder.actions.serve) + + + args = parser.parse_args() + + logging.basicConfig(level=args.loglevel, + format='%(levelname)-8s %(message)s') + + if hasattr(args, "func"): + try: + args.func(args) + except PyseederException as pe: + log.critical("Pyseeder error: {}".format(pe)) + sys.exit(1) + else: + parser.print_help() + + +if __name__ == "__main__": + main() diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..e0e5f0e --- /dev/null +++ b/setup.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +from setuptools import setup + +with open("README.md") as readme: + long_description = readme.read() + +with open("requirements.txt") as f: + install_requires = f.read().split() + +setup( + name='pyseeder', + version='0.0.1', + description='Python reseed utilities for I2P', + long_description=long_description, + author='Darnet Villain', + author_email='supervillain@riseup.net', + url='https://github.com/PurpleI2P/pyseeder/', + keywords='i2p reseed', + license='MIT', + classifiers=[ + 'Development Status :: 4 - Beta', + 'License :: OSI Approved :: GNU General Public License v3 (GPLv3)', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + ], + packages=['pyseeder', 'pyseeder.transports'], + install_requires=install_requires, + entry_points={ + 'console_scripts': [ + 'pyseeder=pyseeder.cli:main', + ], + } +)