awlane | 1cec233 | 2025-04-24 17:24:47 -0500 | [diff] [blame] | 1 | import signal |
| 2 | from threading import Thread |
| 3 | |
| 4 | from mininet.net import Mininet |
| 5 | from minindn.minindn_play.monitor import LogMonitor |
| 6 | from minindn.minindn_play.socket import PlaySocket |
| 7 | from minindn.minindn_play.net.topo import TopoExecutor |
| 8 | from minindn.minindn_play.net.state import StateExecutor |
| 9 | from minindn.minindn_play.term.term import TermExecutor |
| 10 | from minindn.minindn_play.shark.shark import SharkExecutor |
| 11 | |
| 12 | class 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) |