Commit da38a71c authored by Léo-Paul Géneau's avatar Léo-Paul Géneau 👾

Kernel.py: wait for thread when exiting

Wait for thread loop to return when exiting
parent 9b2589e8
......@@ -51,9 +51,9 @@ class Kernel(metaclass=ABCMeta):
self.tree_logger = Main.logger.getChild('KernelTree')
# receive signals from kernel with a background thread
handler_thread = Thread(target=self.handler)
handler_thread.daemon = True
handler_thread.start()
self.handler_thread = Thread(target=self.handler)
self.handler_thread.daemon = True
self.handler_thread.start()
'''
Structure to create/remove virtual interfaces
......@@ -177,9 +177,14 @@ class Kernel(metaclass=ABCMeta):
raise NotImplementedError
@abstractmethod
def exit(self):
def close_socket(self):
raise NotImplementedError
def exit(self):
self.running = False
self.close_socket()
self.handler_thread.join()
@abstractmethod
def handler(self):
raise NotImplementedError
......@@ -412,12 +417,15 @@ class Kernel4(Kernel):
if len(self.routing[kernel_entry.source_ip]) == 0:
self.routing.pop(kernel_entry.source_ip)
def exit(self):
self.running = False
def close_socket(self):
with socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IGMP) as s:
s.sendto(b'', ('', 0))
self.socket.close()
def exit(self):
# MRT DONE
self.socket.setsockopt(socket.IPPROTO_IP, self.MRT_DONE, 1)
self.socket.close()
super().exit()
'''
......@@ -660,12 +668,15 @@ class Kernel6(Kernel):
if len(self.routing[kernel_entry.source_ip]) == 0:
self.routing.pop(kernel_entry.source_ip)
def exit(self):
self.running = False
def close_socket(self):
with socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_ICMPV6) as s:
s.sendto(b'0000', ('', 0))
self.socket.close()
def exit(self):
# MRT DONE
self.socket.setsockopt(socket.IPPROTO_IPV6, self.MRT6_DONE, 1)
self.socket.close()
super().exit()
'''
/*
......
......@@ -172,7 +172,7 @@ def run_config(conf_file_path):
pim_globals.MULTICAST_TABLE_ID, pim_globals.UNICAST_TABLE_ID = Config.get_vrfs(conf_file_path)
start(conf_file_path)
except (ImportError, ModuleNotFoundError):
sys.exit("PYYAML needs to be installed. Execute \"pip3 install pyyaml\"")
raise Exception("PYYAML needs to be installed. Execute \"pip3 install pyyaml\"")
def print_multicast_routes(args):
if args.ipv4 or not args.ipv6:
......@@ -200,22 +200,17 @@ def main():
if args.start:
start()
sys.exit(0)
elif args.stop:
client_socket(args)
sys.exit(0)
elif args.config:
run_config(os.path.abspath(args.config[0]))
elif args.verbose:
os.system("tail -f {}".format(PROCESS_LOG_STDOUT_FILE.format(pim_globals.MULTICAST_TABLE_ID)))
sys.exit(0)
elif args.multicast_routes:
print_multicast_routes(args)
sys.exit(0)
elif not is_running():
print("PIM-DM is not running")
parser.print_usage()
sys.exit(0)
client_socket(args)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment