Chroot set up for stem
I'm going to bounce of a couple of ideas for emulating a chroot set up. I'll attach the relevant branches to the ideas. Also, most of the code is just temp stuff to check which idea looks the least ugly.
Ok, so starting off -
Idea 1 (This is the one atagar mentioned) - https://gitweb.torproject.org/user/gsathya/stem.git/shortlog/refs/heads/chroot
In stem/socket.py, Define a stripping_function(original_recv, prefix, control_file) Arguments - -- original_recv is the original function that we want to create a partial function of; in our case it is recv_message(control_file) -- prefix is the string that should be stripped out of the ControlMessage returned by recv_message(control_file) -- control_file is the argument passed to the original function, recv_message(control_file)
This function returns a ControlMessage which has prefix stripped from it.
In test/runner.py, Add a constant CHROOT_ENV that is set by run_tests.py when the --chroot arg is used.
In Runner.start(), Check if CHROOT_ENV is set. If it is then do, stem.socket.recv_message = functools.partial(stem.socket.stripping_function, self._original_recv, self.get_test_dir())
In Runner.stop(), Check if CHROOT_ENV is set. If it is then do, stem.socket.recv_message = self._original_recv
Idea 2 - https://gitweb.torproject.org/user/gsathya/stem.git/shortlog/refs/heads/chroot2
In stem/socket.py, Define a function strip(self, prefix) in ControlMessage. This function is similar to the stripping_function explained above. It takes a prefix as an argument and strips it from the content.
recv_message(control_file) is modified - -- Add an extra argument "prefix" which is False by default. We set this to a string which we want to strip from the content. -- return ControlMessage(parsed_content, raw_content, prefix) rather than ControlMessage(parsed_content, raw_content)
In test/runner.py. Initialise, self._chroot = False self._original_recv = stem.socket.recv_message
In Runner.start(),
Check if CHROOT_ENV is set. If it is then do,
stem.socket.recv_message = functools.partial(stem.socket.recv_message, prefix = self.get_test_dir())
In Runner.stop(),
Check if CHROOT_ENV is set. If it is then do,
stem.socket.recv_message = self._original_recv
Note -
- This idea follows from Idea 1.
- This idea cleans up a bit on the monkey patching by defining a proper method strip() in ControlMessage.
- But this changes the recv_message() by adding an extra argument "prefix" which is kinda ugly.
Idea 3 - https://gitweb.torproject.org/user/gsathya/stem.git/shortlog/refs/heads/chroot1
In stem/socket.py, Define a constant CHROOT_PREFIX = None. This constant is set to the prefix that needs to stripped from the content. This is done by stem.test.Runner If the CHROOT_PREFIX is not None, then the ControlMessage.strip() function is called.
In test/runner.py, In Runner.start() Check if CHROOT_ENV is set. If it is then do, stem.socket.CHROOT_PREFIX = self.get_test_dir()
In Runner.stop() Check if CHROOT_ENV is set. If it is then do, stem.socket.CHROOT_PREFIX = None
Note -
- This idea follows from Idea 2.
- This involves no monkey patching. This is more like flicking on a switch.
- I like this the best, unless I overlooked something really obvious which renders this useless.
I haven't defined the strip()/stripping_function() yet, i'm not entirely sure what to do in it. It's just a bunch of comments of my vague understanding of it.
If I didn't really make much sense, I blame it on my insomnia trying to get this to work. And also it's almost midnight here.