blob: 8a4bb85d2d6811e71cebbc30627dd45e7a5bc075 [file] [log] [blame]
import signal
from threading import Thread
from mininet.net import Mininet
from minindn.minindn_play.monitor import LogMonitor
from minindn.minindn_play.socket import PlaySocket
from minindn.minindn_play.net.topo import TopoExecutor
from minindn.minindn_play.net.state import StateExecutor
from minindn.minindn_play.term.term import TermExecutor
from minindn.minindn_play.shark.shark import SharkExecutor
class PlayServer:
net: Mininet
repl: bool
cli: bool
monitors: list[LogMonitor] = []
def __init__(self, net: Mininet, **kwargs) -> None:
"""
Start NDN Play GUI server.
If cli=True is specified (default), will block for the Mininet CLI.
"""
self.net = net
self.repl = kwargs.get('repl', False)
self.cli = kwargs.get('cli', True)
self.socket = PlaySocket()
self.socket.add_executor(TopoExecutor(net))
self.socket.add_executor(StateExecutor(net))
self.shark_executor = SharkExecutor(net, self.socket)
self.socket.add_executor(self.shark_executor)
self.pty_executor = TermExecutor(net, self.socket)
self.socket.add_executor(self.pty_executor)
def start(self):
if self.repl:
Thread(target=self.pty_executor.start_repl).start()
# Start all monitors
for monitor in self.monitors:
monitor.start(self.socket)
# Blocks until Mininet CLI is closed
if self.cli:
self.hook_sigint()
self.pty_executor.start_cli()
# Stop all monitors
for monitor in self.monitors:
monitor.stop()
def hook_sigint(self):
def signal_handler(sig, frame):
print('SIGINT received, stopping Mininet...')
self.net.stop()
exit(127)
signal.signal(signal.SIGINT, signal_handler)
def add_monitor(self, monitor: LogMonitor):
self.monitors.append(monitor)