Added DNSmasq ability for RA
This commit is contained in:
		
					parent
					
						
							
								8888f5d9f7
							
						
					
				
			
			
				commit
				
					
						0982927c1b
					
				
			
		
					 2 changed files with 40 additions and 6 deletions
				
			
		|  | @ -54,8 +54,10 @@ def main(arguments): | ||||||
|         vb._route_network() |         vb._route_network() | ||||||
| 
 | 
 | ||||||
|     if arguments['run_dns_ra']: |     if arguments['run_dns_ra']: | ||||||
|         if not arguments['network']: |         if not arguments['network'] or not arguments['vni']: | ||||||
|             raise UncloudException("Providing DNS/RAs requires a /64 IPv6 network. You can use fd00::/64 for testing (non production!)") |             raise UncloudException("Providing DNS/RAs requires a /64 IPv6 network and a VNI. You can use fd00::/64 and vni=1 for testing (non production!)") | ||||||
| 
 | 
 | ||||||
|         dnsra = DNSRA(arguments['network']) |         dnsra = DNSRA(route=arguments['network'],  | ||||||
|         dnsra.setup() |                       vni=arguments['vni'], | ||||||
|  |                       use_sudo=arguments['use_sudo']) | ||||||
|  |         dnsra._setup_dnsmasq() | ||||||
|  |  | ||||||
|  | @ -77,9 +77,41 @@ class ManagementBridge(VXLANBridge): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class DNSRA(object): | class DNSRA(object): | ||||||
|     def __init__(self): |     # VXLAN ids are at maximum 24 bit | ||||||
|         pass |     max_vni = (2**24)-1 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |     # Command to start dnsmasq | ||||||
|  |     cmd_start_dnsmasq="{sudo}dnsmasq --interface={bridgedev} --bind-interfaces --dhcp-range={route},ra-only,infinite --enable-ra" | ||||||
|  | 
 | ||||||
|  |     def __init__(self, | ||||||
|  |                  vni, | ||||||
|  |                  route=None, | ||||||
|  |                  use_sudo=False): | ||||||
|  |         self.config = {} | ||||||
|  | 
 | ||||||
|  |         if vni > self.max_vni: | ||||||
|  |             raise UncloudException("VNI must be in the range of 0 .. {}".format(self.max_vni)) | ||||||
|  | 
 | ||||||
|  |         if use_sudo: | ||||||
|  |             self.config['sudo'] = 'sudo ' | ||||||
|  | 
 | ||||||
|  |         #TODO: remove if not needed | ||||||
|  |         #self.config['vni_dec'] = vni | ||||||
|  |         self.config['vni_hex'] = "{:x}".format(vni) | ||||||
|  | 
 | ||||||
|  |         # dnsmasq only wants the network without the prefix, therefore, cut it off | ||||||
|  |         self.config['route'] = ipaddress.IPv6Network(route).network_address | ||||||
|  |         self.config['bridgedev'] = "br{}".format(self.config['vni_hex']) | ||||||
|  | 
 | ||||||
|  |     def _setup_dnsmasq(self): | ||||||
|  |          self._execute_cmd(self.cmd_start_dnsmasq) | ||||||
|  | 
 | ||||||
|  |     def _execute_cmd(self, cmd_string, **kwargs): | ||||||
|  |         cmd = cmd_string.format(**self.config, **kwargs) | ||||||
|  |         log.info("Executing: {}".format(cmd)) | ||||||
|  |         print("Executing: {}".format(cmd)) | ||||||
|  |         subprocess.run(cmd.split()) | ||||||
|  | 
 | ||||||
| class Firewall(object): | class Firewall(object): | ||||||
|     pass |     pass | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue