Пример #1
0
class RouterServer(object):

    def __init__(self, config_file):
        print "Initialize the RouteOPS Server"
        self.relax_announce = True
        # Init the SDNRoute Server
        ## Parse Config
        self.sdnrouter = parse_config(config_file)
        self.peer = Peer()
        # MongoIPC agent<->server
        self.sdnrouter.server_ipc = \
            lib.MongoIPC.MongoIPCMessageService(MONGO_ADDRESS, MONGO_DB_NAME, SERVER_ID, Thread, time.sleep)
        self.sdnrouter.server_ipc.listen(AGENT_SERVER_CHANNEL, False)
        self.sdnrouter.server_ipc.listen(SERVER_PROXY_CHANNEL, False)

        try:
            pass
            #db = mongo.Connection(MONGO_ADDRESS)[MONGO_DB_NAME]
            #self.sdnrouter.db_peers = db[TABLE_PEERS]
            #for participant in self.sdnrouter.participants:
            #    res = None
            #    res = self.sdnrouter.db_peers.find_one({'IP': self.sdnrouter.participants[participant]['IP']})
            #    if res:
            #        pass
            #    else:
            #        self.sdnrouter.db_peers.insert(self.sdnrouter.participants[participant])
        except Queue.Empty:
            pass
        except:
            pass

        self.run = True

    def start(self):
        print "Start Server"
        print "Sending initial rules - Openflow Controller"
        #
        for participant in self.sdnrouter.participants:
            msg = json.dumps(self.sdnrouter.participants[participant])
            self.sdnrouter.server_ipc.send(SERVER_PROXY_CHANNEL, PROXY_ID, msg)
            print msg
        #
        while self.run:
            # get BGP messages from ExaBGP via stdin and Openflow Message from Ryu
            try:
                time.sleep(0.05)
                route = self.sdnrouter.server_ipc.recv_msg.pop(0)
                route = json.loads(route)
                # process route advertisements - add/remove routes to/from rib of respective participant (neighbor)
                updates = None

                if 'neighbor' in route:
                    if 'ip' in route['neighbor']:
                        if LOG:
                            print "NEIGHBOR: %(ip)s" % (route['neighbor'])
                        # update route on neighbor
                        self.peer.update(route['neighbor']['ip'], route)
                        """
                        if (route['neighbor']['ip'] == '172.0.0.1'):
                            # Rotas para cenario 03
                            self.sdnrouter.server_ipc.send(
                                AGENT_SERVER_CHANNEL,
                                AGENT_ID,
                                'neighbor 172.0.0.3 announce route 200.0.0.0/24 next-hop 172.0.0.1 as-path [ 100 150 ]'
                            )
                            self.sdnrouter.server_ipc.send(
                                AGENT_SERVER_CHANNEL,
                                AGENT_ID,
                                'neighbor 172.0.0.3 announce route 200.0.1.0/24 next-hop 172.0.0.1 as-path [ 100 150 ]'
                            )


                            #self.sdnrouter.server_ipc.send(
                            #    AGENT_SERVER_CHANNEL,
                            #    AGENT_ID,
                            #    'neighbor 172.0.0.4 announce route 200.0.0.0/24 next-hop 172.0.0.1 as-path [ 100 150 ]'
                            #)
                            #self.sdnrouter.server_ipc.send(
                            #    AGENT_SERVER_CHANNEL,
                            #    AGENT_ID,
                            #    'neighbor 172.0.0.4 announce route 200.0.1.0/24 next-hop 172.0.0.1 as-path [ 100 150 ]'
                            #)


                            self.sdnrouter.server_ipc.send(
                                AGENT_SERVER_CHANNEL,
                                AGENT_ID,
                                'neighbor 172.0.0.1 announce route 140.0.0.0/25 next-hop 172.0.0.3'
                            )
                            self.sdnrouter.server_ipc.send(
                                AGENT_SERVER_CHANNEL,
                                AGENT_ID,
                                'neighbor 172.0.0.1 announce route 140.0.0.128/25 next-hop 172.0.0.3'
                            )
                            self.sdnrouter.server_ipc.send(
                                AGENT_SERVER_CHANNEL,
                                AGENT_ID,
                                'neighbor 172.0.0.1 announce route 150.0.0.0/24 next-hop 172.0.0.3 as-path [ 300 ]'
                            )
                            #self.sdnrouter.server_ipc.send(
                            #    AGENT_SERVER_CHANNEL,
                            #    AGENT_ID,
                            #    'neighbor 172.0.0.2 announce route 150.0.0.0/24 next-hop 172.0.0.3 as-path [ 300 ]'
                            #)
                            """
                elif 'notification' in route:
                    if LOG:
                        print "NOTIFICATION: %s" % route
                    if route['notification'] == 'shutdown' and 'exabgp' in route:
                        # Controller BGP is Down
                        self.peer.delete_all_routes()

                elif 'stats' in route:
                    if LOG:
                        # Flow Stats
                        eth_dst = None
                        ip_src = None
                        ip_dst = None
                        tcp_src = None
                        tcp_dst = None
                        """
                        asn_prefix = ip_network(u'200.0.1.0/255.255.255.0')
                        if 'match' in route['stats']:
                            stats = "STATS: \n\tSWITCH=%(switch)08x\n" % (route['stats'])
                            stats += "\tMATCH"
                            if 'eth_src' in route['stats']['match']:
                                stats += "\n\t\tETH_SRC=%(eth_src)s" % (route['stats']['match'])
                            if 'eth_dst' in route['stats']['match']:
                                stats += "\n\t\tETH_DST=%(eth_dst)s" % (route['stats']['match'])
                                eth_dst = route['stats']['match']['eth_dst']
                            if 'ipv4_src' in route['stats']['match']:
                                stats += "\n\t\tIPv4_SRC=%(ipv4_src)s" % (route['stats']['match'])
                                ip_src = route['stats']['match']['ipv4_src']
                            if 'ipv4_dst' in route['stats']['match']:
                                stats += "\n\t\tIPv4_DST=%(ipv4_dst)s" % (route['stats']['match'])
                                ip_dst = route['stats']['match']['ipv4_dst']
                            if 'tcp_src' in route['stats']['match']:
                                stats += "\n\t\tTCP_SRC=%(tcp_src)s" % (route['stats']['match'])
                                tcp_src = route['stats']['match']['tcp_src']

                            if ip_dst and ip_src:
                                for rule in self._clientes[eth_dst]:
                                    if rule['ip'] == ip_network(ip_dst) \
                                            and ip_network(ip_src).subnet_of(asn_prefix) \
                                            and not tcp_src:
                                        if rule['counter'] == 0:
                                            rule['counter'] = int(route['stats']['byte_count'])
                                        else:
                                            d_time = int(route['stats']['byte_count']) - rule['counter']
                                            rule['counter'] = int(route['stats']['byte_count'])
                                            if d_time < 1:
                                                flow_rate = 0
                                                if self.relax_announce:
                                                    self.sdnrouter.server_ipc.send(
                                                        AGENT_SERVER_CHANNEL,
                                                        AGENT_ID,
                                                        'neighbor 172.0.0.2 withdraw route 150.0.0.128/25 next-hop 172.0.0.4'
                                                    )
                                                    self.relax_announce = False
                                            else:
                                                flow_rate = ((d_time/10)*8)/1024
                                                if flow_rate > 600000 and not self.relax_announce:
                                                    self.sdnrouter.server_ipc.send(
                                                        AGENT_SERVER_CHANNEL,
                                                        AGENT_ID,
                                                        'neighbor 172.0.0.2 announce route 150.0.0.128/25 next-hop 172.0.0.4 as-path [ 300 ]'
                                                    )
                                                    self.relax_announce = True
                                            print "FLOW RATE: %s" % (str(flow_rate))

                                    #elif rule['ip'] == ip_network(ip_dst):
                                    #    if rule['counter'] == 0:
                                    #        rule['counter'] = int(route['stats']['byte_count'])
                                    #    else:
                                    #        d_time = int(route['stats']['byte_count']) - rule['counter']
                                    #        rule['counter'] = int(route['stats']['byte_count'])
                                    #        print "UDP: %s %s" % (route['stats']['byte_count'], str(d_time))
                                    #        print route['stats']
                            if 'tcp_dst' in route['stats']['match']:
                                stats += "\n\t\tTCP_DST=%(tcp_dst)s" % (route['stats']['match'])
                                tcp_dst = route['stats']['match']['tcp_dst']
                            if 'udp_src' in route['stats']['match']:
                                stats += "\n\t\tUDP_SRC=%(udp_src)s" % (route['stats']['match'])
                            if 'udp_dst' in route['stats']['match']:
                                stats += "\n\t\tUDP_DST=%(udp_dst)s" % (route['stats']['match'])
                            stats += "\n\tBYTE_COUNT=%(byte_count)s " % (route['stats'])

                        # Port Stats
                        if 'port_no' in route['stats']:
                            stats = "STATS: \n\tSWITCH=%(switch)s " % (route['stats'])
                            stats += "\t\tPORT_NO=%(port_no)s\n" % (route['stats'])
                            stats += "\t\tRX=%(rx)s\n" % (route['stats'])
                            stats += "\t\tTX=%(tx)s" % (route['stats'])
                        """

            except IndexError:
                pass
            except AttributeError:
                pass
            except Exception, ex:
                if LOG:
                    print "ERROR: %s" % (ex)