blob: 8a4bb85d2d6811e71cebbc30627dd45e7a5bc075 [file] [log] [blame]
awlane1cec2332025-04-24 17:24:47 -05001import signal
2from threading import Thread
3
4from mininet.net import Mininet
5from minindn.minindn_play.monitor import LogMonitor
6from minindn.minindn_play.socket import PlaySocket
7from minindn.minindn_play.net.topo import TopoExecutor
8from minindn.minindn_play.net.state import StateExecutor
9from minindn.minindn_play.term.term import TermExecutor
10from minindn.minindn_play.shark.shark import SharkExecutor
11
12class PlayServer:
13 net: Mininet
14 repl: bool
15 cli: bool
16 monitors: list[LogMonitor] = []
17
18 def __init__(self, net: Mininet, **kwargs) -> None:
19 """
20 Start NDN Play GUI server.
21 If cli=True is specified (default), will block for the Mininet CLI.
22 """
23
24 self.net = net
25 self.repl = kwargs.get('repl', False)
26 self.cli = kwargs.get('cli', True)
27
28 self.socket = PlaySocket()
29 self.socket.add_executor(TopoExecutor(net))
30 self.socket.add_executor(StateExecutor(net))
31
32 self.shark_executor = SharkExecutor(net, self.socket)
33 self.socket.add_executor(self.shark_executor)
34
35 self.pty_executor = TermExecutor(net, self.socket)
36 self.socket.add_executor(self.pty_executor)
37
38 def start(self):
39 if self.repl:
40 Thread(target=self.pty_executor.start_repl).start()
41
42 # Start all monitors
43 for monitor in self.monitors:
44 monitor.start(self.socket)
45
46 # Blocks until Mininet CLI is closed
47 if self.cli:
48 self.hook_sigint()
49 self.pty_executor.start_cli()
50
51 # Stop all monitors
52 for monitor in self.monitors:
53 monitor.stop()
54
55 def hook_sigint(self):
56 def signal_handler(sig, frame):
57 print('SIGINT received, stopping Mininet...')
58 self.net.stop()
59 exit(127)
60 signal.signal(signal.SIGINT, signal_handler)
61
62 def add_monitor(self, monitor: LogMonitor):
63 self.monitors.append(monitor)