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)
def convert_route(entity): if not entity: return None if entity['network'] == 'default': entity['network'] = '0.0.0.0' entity['netmask'] = '0.0.0.0' netmask = cidr_to_netmask(entity['netmask']) r = netif.Route( entity['network'], netmask, entity.get('gateway'), entity.get('interface') ) r.flags.add(netif.RouteFlags.STATIC) if not r.netmask: r.flags.add(netif.RouteFlags.HOST) if r.gateway: r.flags.add(netif.RouteFlags.GATEWAY) return r
def default_route(gateway): if not gateway: return None gw = ipaddress.ip_address(gateway) if gw.version == 4: r = netif.Route('0.0.0.0', '0.0.0.0', gateway) elif gw.version == 6: r = netif.Route('::', '::', gateway) else: return r.flags.add(netif.RouteFlags.STATIC) r.flags.add(netif.RouteFlags.GATEWAY) return r