From ae5699c0893b4904c8cf6c8bccc170e0c619dede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Oudin?= Date: Sun, 25 Feb 2018 19:42:58 +0100 Subject: [PATCH] Basic tor runner --- histories/tor_runner.py | 58 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 histories/tor_runner.py diff --git a/histories/tor_runner.py b/histories/tor_runner.py new file mode 100644 index 0000000..e9797fd --- /dev/null +++ b/histories/tor_runner.py @@ -0,0 +1,58 @@ +""" +Modules that handles tor instaces creations in order to safely run histories +""" + +import stem.process as tor +import shutil +import asyncio + +class TorInstance(): + """ + A tor instance object, with some useful information. + It is designed to be used as a worker in order to replay an history. + """ + BASE_SOCKS_PORT = 40000 + BASE_CONTROL_PORT = 20000 + BASE_DATA_DIR = "/tmp/tor{}/" + TOR_RUNNER = 0 + + @classmethod + async def create(cls): + """ Factory creation of tor processes""" + socks_port = cls.BASE_SOCKS_PORT + cls.TOR_RUNNER + control_port = cls.BASE_CONTROL_PORT + cls.TOR_RUNNER + data_dir = cls.BASE_DATA_DIR.format(cls.TOR_RUNNER) + TorInstance.TOR_RUNNER += 1 + self = TorInstance() + self.socks_port = socks_port + self.control_port = control_port + self.data_dir = data_dir + self.process = tor.launch_tor_with_config( + config = { + 'ControlPort' : str(control_port), + 'SocksPort' : str(socks_port), + 'DataDir' : data_dir + } + ) + return self + + def __str__(self): + """ Utility function """ + return "[TOR] SOCKSPort: {0.socks_port}, ControlPort: " + "{0.control_port}, DataDir: {0.data_dir}".format(self) + + async def kill(self): + """ Kills the process and remove the data dir""" + self.process.kill() + shutil.rmtree(self.data_dir) + +async def main(): + """ Test function """ + for i in range(3): + a = await TorInstance.create() + print(a) + await a.kill() + +if __name__ == "__main__": + loop = asyncio.get_event_loop() + loop.run_until_complete(main())