mirror of
https://github.com/kernelkit/infix.git
synced 2026-07-22 01:13:00 +02:00
Refactor file_server to run in a netns
This commit is contained in:
+31
-13
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user