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)
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)
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))
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