From 8285c00f6e5fbf733dfc049e8c20ea4e8f7d40d4 Mon Sep 17 00:00:00 2001 From: Christophe Mehay Date: Mon, 21 Mar 2016 23:36:16 +0100 Subject: [PATCH] Add onions tool in container --- Dockerfile | 6 ++-- README.md | 20 ++++++++++-- assets/display_onions.py | 13 -------- assets/entrypoint-config.yml | 2 +- assets/onions/onions/Onions.py | 56 ++++++++++++++++++++++++++++++++ assets/onions/onions/__init__.py | 1 + assets/onions/setup.py | 42 ++++++++++++++++++++++++ 7 files changed, 122 insertions(+), 18 deletions(-) delete mode 100644 assets/display_onions.py create mode 100644 assets/onions/onions/Onions.py create mode 100644 assets/onions/onions/__init__.py create mode 100644 assets/onions/setup.py diff --git a/Dockerfile b/Dockerfile index 74cb009..1e5e3b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,12 +7,14 @@ RUN apt-get update && apt-get install --no-install-recommends -y \ tor \ python3-pip -RUN pip3 install pyentrypoint==0.2.1 +RUN pip3 install pyentrypoint==0.2.2 ADD assets/entrypoint-config.yml / -ADD assets/display_onions.py / +ADD assets/onions /usr/local/src/onions ADD assets/torrc /etc/tor/torrc +RUN cd /usr/local/src/onions && python3 setup.py install + VOLUME ["/var/lib/tor/hidden_service/"] ENTRYPOINT ["pyentrypoint"] diff --git a/README.md b/README.md index 833c5d4..3d3bc35 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Create a tor hidden service with a link -``` +```sh # run a container with an network application $ docker run -d --name hello_world tutum/hello_world @@ -14,12 +14,28 @@ The .onion url is displayed to stdout at startup. To keep onion keys, just mount volume `/var/lib/tor/hidden_service/` -``` +```sh $ docker run -ti --link something --volume /path/to/keys:/var/lib/tor/hidden_service/ goldy/tor-hidden-service ``` Look at the `docker-compose.yml` file to see own to use it. +### Tools + +A command line tool `onions` is available in container to get `.onion` url when container is running. + +```sh +# Get services +$ docker exec -ti torhiddenproxy_tor_1 onions +hello: vegm3d7q64gutl75.onion +world: b2sflntvdne63amj.onion + +# Get json +$ docker exec -ti torhiddenproxy_tor_1 onions --json +{"world": "b2sflntvdne63amj.onion", "hello": "vegm3d7q64gutl75.onion"} +``` + + ### pyentrypoint This container is using [`pyentrypoint`](https://github.com/cmehay/pyentrypoint) to generate its setup. diff --git a/assets/display_onions.py b/assets/display_onions.py deleted file mode 100644 index 6f2e1ea..0000000 --- a/assets/display_onions.py +++ /dev/null @@ -1,13 +0,0 @@ -import os - -for root, dirs, _ in os.walk("/var/lib/tor/hidden_service/", topdown=False): - for service in dirs: - filename = "{root}{service}/hostname".format( - service=service, - root=root - ) - with open(filename, 'r') as hostfile: - print('{service}: {onion}'.format( - service=service, - onion=hostfile.read() - )) diff --git a/assets/entrypoint-config.yml b/assets/entrypoint-config.yml index 67d85d4..e09db48 100644 --- a/assets/entrypoint-config.yml +++ b/assets/entrypoint-config.yml @@ -8,7 +8,7 @@ config_files: post_conf_commands: - timeout 3s tor > /dev/null || true - - python3 /display_onions.py + - onions - chown -R debian-tor:debian-tor $HOME debug: false diff --git a/assets/onions/onions/Onions.py b/assets/onions/onions/Onions.py new file mode 100644 index 0000000..f2e6c8a --- /dev/null +++ b/assets/onions/onions/Onions.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +import os +from json import dumps + +import argparse + + +class Onions(object): + """Onions""" + + hidden_service_dir = "/var/lib/tor/hidden_service/" + + def __init__(self): + self._get_onions() + if 'HIDDEN_SERVICE_DIR' in os.environ: + self.hidden_service_dir = os.environ['HIDDEN_SERVICE_DIR'] + + def _get_onions(self): + self.onions = {} + for root, dirs, _ in os.walk(self.hidden_service_dir, + topdown=False): + for service in dirs: + filename = "{root}{service}/hostname".format( + service=service, + root=root + ) + with open(filename, 'r') as hostfile: + self.onions[service] = str(hostfile.read()).strip() + + def __str__(self): + if not self.onions: + return 'No onion site' + return '\n'.join(['%s: %s' % (service, onion) + for (service, onion) in self.onions.items()]) + + def to_json(self): + return dumps(self.onions) + + +def main(): + parser = argparse.ArgumentParser(description='Display onion sites', + prog='onions') + parser.add_argument('--json', dest='json', action='store_true', + help='serialize to json') + + args = parser.parse_args() + onions = Onions() + if args.json: + print(onions.to_json()) + else: + print(onions) + + +if __name__ == '__main__': + main() diff --git a/assets/onions/onions/__init__.py b/assets/onions/onions/__init__.py new file mode 100644 index 0000000..9068b26 --- /dev/null +++ b/assets/onions/onions/__init__.py @@ -0,0 +1 @@ +from .Onions import Onions, main diff --git a/assets/onions/setup.py b/assets/onions/setup.py new file mode 100644 index 0000000..4fe80d9 --- /dev/null +++ b/assets/onions/setup.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +from setuptools import find_packages +from setuptools import setup + +setup( + name='onions', + + version='0.1', + + packages=find_packages(), + + author="Christophe Mehay", + + author_email="cmehay@nospam.student.42.fr", + + description="Display onion sites hosted", + + include_package_data=True, + + url='http://github.com/cmehay/docker-tor-hidden-service', + + classifiers=[ + "Programming Language :: Python", + "Development Status :: 1 - Planning", + "License :: OSI Approved :: BSD License", + "Natural Language :: English", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.4", + "Topic :: System :: Installation/Setup", + ], + + + entry_points={ + 'console_scripts': [ + 'onions = onions:main', + ], + }, + + license="WTFPL", +)