def system_routes(self, filters, options): """ Get current/applied network routes. """ rtable = netif.RoutingTable() return filter_list([r.__getstate__() for r in rtable.routes], filters, options)
async def bridge_setup(self, tapname, tap, attach_iface): if attach_iface is None: # XXX: backward compatibility prior to 11.1-RELEASE. try: attach_iface = netif.RoutingTable( ).default_route_ipv4.interface except: return if_bridge = [] bridge_enabled = False for brgname, iface in list(netif.list_interfaces().items()): if brgname.startswith('bridge'): if_bridge.append(iface) if if_bridge: for bridge in if_bridge: if attach_iface in bridge.members: bridge_enabled = True self.set_tap_mtu(bridge, tap) bridge.add_member(tapname) break if bridge_enabled is False: bridge = netif.get_interface(netif.create_interface('bridge')) self.set_tap_mtu(bridge, tap) bridge.add_member(tapname) bridge.add_member(attach_iface) bridge.up()
async def nic_capability_checks(self, vm_devices=None, check_system_iface=True): vm_nics = [] system_ifaces = { i['name']: i for i in await self.middleware.call('interface.query') } for vm_device in await self.middleware.call( 'vm.device.query', [['dtype', '=', 'NIC'], [ 'OR', [['attributes.nic_attach', '=', None], ['attributes.nic_attach', '!^', 'bridge']] ]]) if not vm_devices else vm_devices: try: nic = vm_device['attributes'].get( 'nic_attach') or netif.RoutingTable( ).default_route_ipv4.interface except Exception: nic = None if nic in system_ifaces and ( not check_system_iface or not system_ifaces[nic]['disable_offload_capabilities']): vm_nics.append(nic) return vm_nics
async def sync(self): config = await self.middleware.call('datastore.query', 'network.globalconfiguration', [], {'get': True}) # Generate dhclient.conf so we can ignore routes (def gw) option # in case there is one explictly set in network config await self.middleware.call('etc.generate', 'network') ipv4_gateway = config['gc_ipv4gateway'] or None if not ipv4_gateway: interface = await self.middleware.call('datastore.query', 'network.interfaces', [('int_dhcp', '=', True)]) if interface: interface = interface[0] dhclient_running, dhclient_pid = dhclient_status(interface['int_interface']) if dhclient_running: leases = dhclient_leases(interface['int_interface']) reg_routers = re.search(r'option routers (.+);', leases or '') if reg_routers: # Make sure to get first route only ipv4_gateway = reg_routers.group(1).split(' ')[0] routing_table = netif.RoutingTable() if ipv4_gateway: ipv4_gateway = netif.Route('0.0.0.0', '0.0.0.0', ipaddress.ip_address(str(ipv4_gateway))) ipv4_gateway.flags.add(netif.RouteFlags.STATIC) ipv4_gateway.flags.add(netif.RouteFlags.GATEWAY) # If there is a gateway but there is none configured, add it # Otherwise change it if not routing_table.default_route_ipv4: self.logger.info('Adding IPv4 default route to {}'.format(ipv4_gateway.gateway)) routing_table.add(ipv4_gateway) elif ipv4_gateway != routing_table.default_route_ipv4: self.logger.info('Changing IPv4 default route from {} to {}'.format(routing_table.default_route_ipv4.gateway, ipv4_gateway.gateway)) routing_table.change(ipv4_gateway) elif routing_table.default_route_ipv4: # If there is no gateway in database but one is configured # remove it self.logger.info('Removing IPv4 default route') routing_table.delete(routing_table.default_route_ipv4) ipv6_gateway = config['gc_ipv6gateway'] or None if ipv6_gateway: if ipv6_gateway.count("%") == 1: ipv6_gateway, ipv6_gateway_interface = ipv6_gateway.split("%") else: ipv6_gateway_interface = None ipv6_gateway = netif.Route('::', '::', ipaddress.ip_address(str(ipv6_gateway)), ipv6_gateway_interface) ipv6_gateway.flags.add(netif.RouteFlags.STATIC) ipv6_gateway.flags.add(netif.RouteFlags.GATEWAY) # If there is a gateway but there is none configured, add it # Otherwise change it if not routing_table.default_route_ipv6: self.logger.info('Adding IPv6 default route to {}'.format(ipv6_gateway.gateway)) routing_table.add(ipv6_gateway) elif ipv6_gateway != routing_table.default_route_ipv6: self.logger.info('Changing IPv6 default route from {} to {}'.format(routing_table.default_route_ipv6.gateway, ipv6_gateway.gateway)) routing_table.change(ipv6_gateway) elif routing_table.default_route_ipv6: # If there is no gateway in database but one is configured # remove it self.logger.info('Removing IPv6 default route') routing_table.delete(routing_table.default_route_ipv6)
async def bridge_setup(self, tapname, tap, attach_iface): if_bridge = [] bridge_enabled = False if attach_iface is None: # XXX: backward compatibility prior to 11.1-RELEASE. try: attach_iface = netif.RoutingTable( ).default_route_ipv4.interface attach_iface_info = netif.get_interface(attach_iface) except: return else: attach_iface_info = netif.get_interface(attach_iface) # If for some reason the main iface is down, we need to up it. attach_iface_status = netif.InterfaceFlags.UP in attach_iface_info.flags if attach_iface_status is False: attach_iface_info.up() for brgname, iface in list(netif.list_interfaces().items()): if brgname.startswith('bridge'): if_bridge.append(iface) if if_bridge: for bridge in if_bridge: if attach_iface in bridge.members: bridge_enabled = True self.set_iface_mtu(attach_iface_info, tap) bridge.add_member(tapname) break if bridge_enabled is False: bridge = netif.get_interface(netif.create_interface('bridge')) self.set_iface_mtu(attach_iface_info, tap) bridge.add_member(tapname) bridge.add_member(attach_iface) bridge.up()
def bind(old_lease, lease): self.logger.info('{0} DHCP lease on {1} from {2}, valid for {3} seconds'.format( 'Renewed' if old_lease else 'Acquired', interface, client.server_address, lease.lifetime, interface )) if old_lease is None or lease.client_ip != old_lease.client_ip: self.logger.info('Assigning IP address {0} to interface {1}'.format(lease.client_ip, interface)) alias = lease.client_interface iface = netif.get_interface(interface) if old_lease: try: addr = first_or_default(lambda a: a.address == old_lease.client_ip, iface.addresses) if addr: iface.remove_address(addr) except OSError as err: self.logger.error('Cannot remove alias {0}: {1}'.format(old_lease.client_ip, err.strerror)) try: iface.add_address(netif.InterfaceAddress(netif.AddressFamily.INET, alias)) except OSError as err: self.logger.error('Cannot add alias to {0}: {1}'.format(interface, err.strerror)) if lease.router and self.configstore.get('network.dhcp.assign_gateway'): try: rtable = netif.RoutingTable() newroute = default_route(lease.router) if rtable.default_route_ipv4 != newroute: if rtable.default_route_ipv4: self.logger.info('DHCP default route changed from {0} to {1}'.format( rtable.default_route_ipv4, newroute )) rtable.delete(rtable.default_route_ipv4) rtable.add(default_route(lease.router)) else: self.logger.info('Adding default route via {0}'.format(lease.router)) rtable.add(default_route(lease.router)) except OSError as err: self.logger.error('Cannot configure default route: {0}'.format(err.strerror)) if lease.dns_addresses and self.configstore.get('network.dhcp.assign_dns'): inp = [] addrs = [] proc = subprocess.Popen( ['/sbin/resolvconf', '-a', interface], stdout=subprocess.PIPE, stdin=subprocess.PIPE ) for i in lease.dns_addresses: # Filter out bogus DNS server addresses if str(i) in ('127.0.0.1', '0.0.0.0', '255.255.255.255'): continue inp.append('nameserver {0}'.format(i)) addrs.append(i) if lease.domain_name: inp.append('search {0}'.format(lease.domain_name)) proc.communicate('\n'.join(inp).encode('ascii')) proc.wait() self.client.emit_event('network.dns.configured', { 'addresses': addrs, }) self.logger.info('Updated DNS configuration') else: subprocess.call(['/sbin/resolvconf', '-d', interface]) self.client.emit_event('network.dns.configured', { 'addresses': [], }) self.logger.info('Deleted DNS configuration')
def configure_routes(self): rtable = netif.RoutingTable() static_routes = filter_routes(rtable.static_routes) default_route_ipv4 = default_route(self.config.get('network.gateway.ipv4')) if not self.context.using_dhcp_for_gateway(): # Default route was deleted if not default_route_ipv4 and rtable.default_route_ipv4: self.logger.info('Removing default route') try: rtable.delete(rtable.default_route_ipv4) except OSError as e: yield e.errno, 'Cannot remove default route: {0}'.format(str(e)) # Default route was added elif not rtable.default_route_ipv4 and default_route_ipv4: self.logger.info('Adding default route via {0}'.format(default_route_ipv4.gateway)) try: rtable.add(default_route_ipv4) except OSError as e: yield e.errno, 'Cannot add default route: {0}'.format(str(e)) # Default route was changed elif rtable.default_route_ipv4 != default_route_ipv4: self.logger.info('Changing default route from {0} to {1}'.format( rtable.default_route.gateway, default_route_ipv4.gateway)) try: rtable.change(default_route_ipv4) except OSError as e: yield e.errno, 'Cannot add default route: {0}'.format(str(e)) else: self.logger.info('Not configuring default route as using DHCP') # Same thing for IPv6 default_route_ipv6 = default_route(self.config.get('network.gateway.ipv6')) if not default_route_ipv6 and rtable.default_route_ipv6: # Default route was deleted self.logger.info('Removing default route') try: rtable.delete(rtable.default_route_ipv6) except OSError as e: yield e.errno, 'Cannot remove default route: {0}'.format(str(e)) elif not rtable.default_route_ipv6 and default_route_ipv6: # Default route was added self.logger.info('Adding default route via {0}'.format(default_route_ipv6.gateway)) try: rtable.add(default_route_ipv6) except OSError as e: yield e.errno, 'Cannot add default route: {0}'.format(str(e)) elif rtable.default_route_ipv6 != default_route_ipv6: # Default route was changed self.logger.info('Changing default route from {0} to {1}'.format( rtable.default_route.gateway, default_route_ipv6.gateway)) try: rtable.change(default_route_ipv6) except OSError as e: yield e.errno, 'Cannot add default route: {0}'.format(str(e)) # Now the static routes... old_routes = set(static_routes) new_routes = set([convert_route(e) for e in self.datastore.query('network.routes')]) for i in old_routes - new_routes: self.logger.info('Removing static route to {0}'.format(describe_route(i))) try: rtable.delete(i) except OSError as e: yield e.errno, 'Cannot remove static route to {0}: {1}'.format(describe_route(i), str(e)) for i in new_routes - old_routes: self.logger.info('Adding static route to {0}'.format(describe_route(i))) try: rtable.add(i) except OSError as e: yield e.errno, 'Cannot add static route to {0}: {1}'.format(describe_route(i), str(e))
def query_routes(self): rtable = netif.RoutingTable() return [r.__getstate__() for r in rtable.routes]
def get_route(self, address): rt = netif.RoutingTable() return rt.get(ipaddress.ip_address(address))