Esempio n. 1
0
    def _interface_add_handler(self, ev):
        self.logger.debug('Client %s requested all interfaces', ev.zclient)

        interfaces = db.interface.ip_address_show_all(SESSION)
        self.logger.debug('Server will response interfaces: %s', interfaces)
        for intf in interfaces:
            msg = zebra.ZebraMessage(body=zebra.ZebraInterfaceAdd(
                ifname=intf.ifname,
                ifindex=intf.ifindex,
                status=intf.status,
                if_flags=intf.flags,
                ptm_enable=zebra.ZEBRA_IF_PTM_ENABLE_OFF,
                ptm_status=zebra.ZEBRA_PTM_STATUS_UNKNOWN,
                metric=intf.metric,
                ifmtu=intf.ifmtu,
                ifmtu6=intf.ifmtu6,
                bandwidth=intf.bandwidth,
                ll_type=intf.ll_type,
                hw_addr=intf.hw_addr))
            ev.zclient.send_msg(msg)

            routes = db.route.ip_route_show_all(SESSION,
                                                ifindex=intf.ifindex,
                                                is_selected=True)
            self.logger.debug('Server will response routes: %s', routes)
            for route in routes:
                dest, _ = route.destination.split('/')
                msg = zebra.ZebraMessage(
                    body=zebra.ZebraInterfaceAddressAdd(ifindex=intf.ifindex,
                                                        ifc_flags=0,
                                                        family=None,
                                                        prefix=route.source,
                                                        dest=dest))
                ev.zclient.send_msg(msg)
Esempio n. 2
0
    def _router_id_add_handler(self, ev):
        self.logger.debug(
            'Client %s requests router_id, server will response: router_id=%s',
            ev.zclient, self.router_id)

        # Send ZEBRA_ROUTER_ID_UPDATE for response
        msg = zebra.ZebraMessage(body=zebra.ZebraRouterIDUpdate(
            family=socket.AF_INET, prefix='%s/32' % self.router_id))
        ev.zclient.send_msg(msg)
Esempio n. 3
0
    def start(self):
        self.is_active = True
        try:
            self.sock = create_connection(self.client.zserv_addr)
        except socket.error as e:
            self.logger.exception(
                'Cannot connect to Zebra server%s: %s',
                self.client.zserv_addr, e)
            self.stop()
            return None

        self.sock.settimeout(GLOBAL_CONF.socket_timeout)

        self.threads.append(hub.spawn(self._send_loop))
        self.threads.append(hub.spawn(self._recv_loop))

        # Send the following messages at starting connection.
        # - ZEBRA_HELLO to register route_type
        # - ZEBRA_ROUTER_ID_ADD to get router_id
        # - ZEBRA_INTERFACE_ADD to get info for interfaces
        self.client.send_msg(
            zebra.ZebraMessage(
                version=self.client.zserv_ver,
                body=zebra.ZebraHello(self.client.route_type)))
        self.client.send_msg(
            zebra.ZebraMessage(
                version=self.client.zserv_ver,
                command=zebra.ZEBRA_ROUTER_ID_ADD))
        self.client.send_msg(
            zebra.ZebraMessage(
                version=self.client.zserv_ver,
                command=zebra.ZEBRA_INTERFACE_ADD))

        self.client.send_event_to_observers(
            zclient_event.EventZServConnected(self))

        hub.joinall(self.threads)

        self.client.send_event_to_observers(
            zclient_event.EventZServDisconnected(self))
Esempio n. 4
0
    def _send_ip_route_impl(self,
                            prefix,
                            nexthops=None,
                            safi=packet_safi.UNICAST,
                            flags=zebra.ZEBRA_FLAG_INTERNAL,
                            distance=None,
                            metric=None,
                            mtu=None,
                            tag=None,
                            is_withdraw=False):
        if ip.valid_ipv4(prefix):
            if is_withdraw:
                msg_cls = zebra.ZebraIPv4RouteDelete
            else:
                msg_cls = zebra.ZebraIPv4RouteAdd
        elif ip.valid_ipv6(prefix):
            if is_withdraw:
                msg_cls = zebra.ZebraIPv6RouteDelete
            else:
                msg_cls = zebra.ZebraIPv6RouteAdd
        else:
            raise ValueError('Invalid prefix: %s' % prefix)

        nexthop_list = []
        for nexthop in nexthops:
            if ip.valid_ipv4(nexthop):
                nexthop_list.append(zebra.NextHopIPv4(addr=nexthop))
            elif ip.valid_ipv6(nexthop):
                nexthop_list.append(zebra.NextHopIPv6(addr=nexthop))
            else:
                raise ValueError('Invalid nexthop: %s' % nexthop)

        msg = zebra.ZebraMessage(version=self.zserv_ver,
                                 body=msg_cls(route_type=self.route_type,
                                              flags=flags,
                                              message=0,
                                              safi=safi,
                                              prefix=prefix,
                                              nexthops=nexthop_list,
                                              distance=distance,
                                              metric=metric,
                                              mtu=mtu,
                                              tag=tag,
                                              instance=0))
        self.send_msg(msg)

        return msg