Refactor file_server to run in a netns

This commit is contained in:
Mattias Walström
2024-12-05 21:24:52 +01:00
parent 42b7cf9f94
commit 85603eb53d
+31 -13
View File
@@ -5,24 +5,42 @@ import concurrent.futures
import functools
import http.server
import socket
from infamy.util import until
class FileServer(http.server.HTTPServer):
class FileServer:
"""Open web server on (address, port) serving files from directory"""
class RequestHandler(http.server.SimpleHTTPRequestHandler):
def log_message(self, *args, **kwargs):
pass
def __init__(self, netns, address, port, directory):
self.address = address
self.port = port
self.directory = directory
self.netns = netns
self.process = None
self.check_addres = None
address_family = socket.AF_INET6
def __init__(self, server_address, directory):
rh = functools.partial(FileServer.RequestHandler, directory=directory)
self.__tp = concurrent.futures.ThreadPoolExecutor(max_workers=1)
super().__init__(server_address, rh)
def start(self):
"""start HTTP file server"""
cmd = f"httpd -p {self.address}:{self.port} -f -h {self.directory}"
self.process = self.netns.popen(cmd.split(" "))
if self.address == "[::]":
check_address = "::1"
elif self.address == "0.0.0.0":
check_address = "127.0.0.1"
else:
check_address=self.address
cmd = f"nc -z {check_address} {self.port}".split()
until(lambda: self.netns.run(cmd).returncode == 0)
def stop(self):
"""Stop HTTP file server"""
if self.process:
self.process.terminate()
self.process.wait()
self.process = None
def __enter__(self):
self.__tp.submit(self.serve_forever)
self.start()
def __exit__(self, _, __, ___):
self.shutdown()
self.__tp.shutdown()
self.stop()