/
run.py
65 lines (51 loc) · 1.84 KB
/
run.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import sys
import yaml
import signal
from eventlet import GreenPool
import eventlet.greenthread as greenthread
from trasa.ldp import Ldp
def printmsg(msg):
sys.stderr.write("%s\n" % msg)
sys.stderr.flush()
class Server(object):
def __init__(self):
self.peering_hosts = []
self.greenlets = set()
self.trasas = []
def run(self):
signal.signal(signal.SIGINT, self.signal_handler)
pool = GreenPool()
with open("config.yml") as file:
config = yaml.load(file.read())
for router in config["routers"]:
printmsg("Starting trasa on %s" % router["local_address"])
trasa = Ldp(router["local_address"])
self.trasas.append(trasa)
pool.spawn(self.call_handler, trasa)
pool.waitall()
printmsg("All greenlets gone, exiting")
def call_handler(self, trasa):
self.greenlets.add(greenthread.getcurrent())
trasa.run()
self.greenlets.remove(greenthread.getcurrent())
def signal_handler(self, _signal, _frame):
printmsg("[SIGINT] Shutting down")
self.shutdown()
def shutdown(self):
for trasa in self.trasas:
printmsg("Shutting down trasa %s" % trasa)
trasa.shutdown()
def peer_up_handler(self, peer_ip, peer_as):
printmsg("[Peer up] %s %d" % (peer_ip, peer_as))
def peer_down_handler(self, peer_ip, peer_as):
printmsg("[Peer down] %s %s" % (peer_ip, peer_as))
def error_handler(self, msg):
printmsg("[Error] %s" % msg)
def route_handler(self, route_update):
if route_update.is_withdraw:
printmsg("[Route handler] Route removed: %s" % route_update)
else:
printmsg("[Route handler] New route received: %s" % route_update)
if __name__ == "__main__":
server = Server()
server.run()