adding some config stuff
This commit is contained in:
		
							parent
							
								
									96d2d1ece5
								
							
						
					
					
						commit
						3f2d6be7dd
					
				| @ -1,31 +0,0 @@ | ||||
| # This is a sample INI file to use with he_ipv6.py. | ||||
| # If you do not yet have an IPv6 Tunnelbroker.net allocation, you can get one (for free!) at: | ||||
| # https://www.tunnelbroker.net/tunnel_detail.php?tid=584532 | ||||
| ## | ||||
| # This is the tunnel ID. To get it, log into your tunnelbroker.net account and click on the tunnel you wish to use. | ||||
| # The tunnel ID is the numerical string in the URL. e.g.: | ||||
| #   https://www.tunnelbroker.net/tunnel_detail.php?tid=12345 | ||||
| # The tunnel ID would be 12345 in the above example. | ||||
| [12345] | ||||
| # This is your tunnelbroker.net username. | ||||
| user = ipv6user | ||||
| # This is your update key for the above user. You can find it in the "Advanced" tab. | ||||
| update_key = xXxXxXxXxXxXxXXX | ||||
| # This is the server IP ("IPv6 Tunnel Endpoints" section). *Be sure to use the IPv4 address!* ("Server IPv4 Address") | ||||
| server = 192.0.2.1 | ||||
| # And these are all the allocations you wish to add to this machine. Be sure to add the prefix (e.g. /64, /48)! | ||||
| # You can specify multiple allocations with a comma-separated list. | ||||
| # ("Routed IPv6 Prefixes") | ||||
| allocations = 2001:DB8:1::/64,2001:DB8:2::/64 | ||||
| # This is the address to actually set on the interface. There should be only one here. Be sure to include the prefix! | ||||
| # ("Client IPv6 Address") | ||||
| address = 2001:DB8:3::1/64 | ||||
| 
 | ||||
| # You can specify multiple tunnel profiles for your machine. | ||||
| [54321] | ||||
| # And you can even reference values from other sections. | ||||
| user = ${12345:user} | ||||
| update_key = ${12345:update_key} | ||||
| server = 192.0.2.2 | ||||
| allocations = 2001:DB8:4::/64 | ||||
| address = 2001:DB8:5::2/64 | ||||
							
								
								
									
										100
									
								
								utils/he_ipv6/config.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								utils/he_ipv6/config.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,100 @@ | ||||
| import os | ||||
| import re | ||||
| ## | ||||
| import requests | ||||
| from lxml import etree | ||||
| 
 | ||||
| 
 | ||||
| class Config(object): | ||||
|     default_xsd = 'http://schema.xml.r00t2.io/projects/he_ipv6.xsd' | ||||
| 
 | ||||
|     def __init__(self, xml_path, *args, **kwargs): | ||||
|         self.xml_path = os.path.abspath(os.path.expanduser(xml_path)) | ||||
|         if not os.path.isfile(self.xml_path): | ||||
|             raise ValueError('xml_path does not exist') | ||||
|         self.tree = None | ||||
|         self.ns_tree = None | ||||
|         self.xml = None | ||||
|         self.ns_xml = None | ||||
|         self.raw = None | ||||
|         self.xsd = None | ||||
|         self.defaults_parser = None | ||||
|         self.obj = None | ||||
|         self.tunnels = {} | ||||
|         self.creds = {} | ||||
|         self.parse_raw() | ||||
|         self.get_xsd() | ||||
|         self.populate_defaults() | ||||
|         self.validate() | ||||
| 
 | ||||
|     def get_xsd(self): | ||||
|         raw_xsd = None | ||||
|         base_url = None | ||||
|         xsi = self.xml.nsmap.get('xsi', 'http://www.w3.org/2001/XMLSchema-instance') | ||||
|         schemaLocation = '{{{0}}}schemaLocation'.format(xsi) | ||||
|         schemaURL = self.xml.attrib.get(schemaLocation, self.default_xsd) | ||||
|         split_url = schemaURL.split() | ||||
|         if len(split_url) == 2:  # a properly defined schemaLocation | ||||
|             schemaURL = split_url[1] | ||||
|         else: | ||||
|             schemaURL = split_url[0]  # a LAZY schemaLocation | ||||
|         if schemaURL.startswith('file://'): | ||||
|             schemaURL = re.sub(r'^file://', r'', schemaURL) | ||||
|             with open(schemaURL, 'rb') as fh: | ||||
|                 raw_xsd = fh.read() | ||||
|             base_url = os.path.dirname(schemaURL) + '/' | ||||
|         else: | ||||
|             req = requests.get(schemaURL) | ||||
|             if not req.ok: | ||||
|                 raise RuntimeError('Could not download XSD') | ||||
|             raw_xsd = req.content | ||||
|             base_url = os.path.split(req.url)[0] + '/'  # This makes me feel dirty. | ||||
|         self.xsd = etree.XMLSchema(etree.XML(raw_xsd, base_url = base_url)) | ||||
|         return(None) | ||||
| 
 | ||||
|     def parse_raw(self, parser = None): | ||||
|         if not self.raw: | ||||
|             with open(self.xml_path, 'rb') as fh: | ||||
|                 self.raw = fh.read() | ||||
|         self.xml = etree.fromstring(self.raw, parser = parser) | ||||
|         self.ns_xml = etree.fromstring(self.raw, parser = parser) | ||||
|         self.tree = self.xml.getroottree() | ||||
|         self.ns_tree = self.ns_xml.getroottree() | ||||
|         self.tree.xinclude() | ||||
|         self.ns_tree.xinclude() | ||||
|         self.strip_ns() | ||||
|         return(None) | ||||
| 
 | ||||
|     def populate_defaults(self): | ||||
|         if not self.xsd: | ||||
|             self.get_xsd() | ||||
|         if not self.defaults_parser: | ||||
|             self.defaults_parser = etree.XMLParser(schema = self.xsd, attribute_defaults = True) | ||||
|         self.parse_raw(parser = self.defaults_parser) | ||||
|         return(None) | ||||
| 
 | ||||
|     def remove_defaults(self): | ||||
|         self.parse_raw() | ||||
|         return(None) | ||||
| 
 | ||||
|     def strip_ns(self, obj = None): | ||||
|         # https://stackoverflow.com/questions/30232031/how-can-i-strip-namespaces-out-of-an-lxml-tree/30233635#30233635 | ||||
|         xpathq = "descendant-or-self::*[namespace-uri()!='']" | ||||
|         if not obj: | ||||
|             for x in (self.tree, self.xml): | ||||
|                 for e in x.xpath(xpathq): | ||||
|                     e.tag = etree.QName(e).localname | ||||
|         elif isinstance(obj, (etree._Element, etree._ElementTree)): | ||||
|             obj = copy.deepcopy(obj) | ||||
|             for e in obj.xpath(xpathq): | ||||
|                 e.tag = etree.QName(e).localname | ||||
|             return(obj) | ||||
|         else: | ||||
|             raise ValueError('Did not know how to parse obj parameter') | ||||
|         return(None) | ||||
| 
 | ||||
|     def validate(self): | ||||
|         if not self.xsd: | ||||
|             self.get_xsd() | ||||
|         self.xsd.assertValid(self.ns_tree) | ||||
|         return(None) | ||||
| @ -2,7 +2,19 @@ | ||||
| <heIPv6 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|         xmlns="https://tunnelbroker.net/" | ||||
|         xsi:schemaLocation="https://tunnelbroker.net/ http://schema.xml.r00t2.io/projects/he_ipv6.xsd"> | ||||
|   <!-- | ||||
|   This is a sample XML configuration file to use with he_ipv6.py. | ||||
|   If you do not yet have an IPv6 Tunnelbroker.net allocation, you can get one (for free!) at: | ||||
|     https://www.tunnelbroker.net/tunnel_detail.php?tid=584532 | ||||
|   I highly recommend their (free) certification as well if you're brand-new to IPv6: | ||||
|     https://ipv6.he.net/certification/ | ||||
|   --> | ||||
|   <creds> | ||||
|     <!-- | ||||
|     Credentials are kept separate from tunnel configuration because you can have multiple (up to 5) tunnels per user. | ||||
|     The updateKey is *not* your password! You can find it in the "Advanced" tab of your tunnel's configuration on | ||||
|     your tunnelbroker.net panel. | ||||
|     --> | ||||
|     <cred id="ipv6user"> | ||||
|       <user>ipv6user</user> | ||||
|       <updateKey>xXxXxXxXxXxXxXXX</updateKey> | ||||
| @ -13,19 +25,59 @@ | ||||
|     </cred> | ||||
|   </creds> | ||||
|   <tunnels> | ||||
|     <!-- | ||||
|     Each tunnel MUST have an "id" and a "creds" attribute. The "creds" attribute should reference an "id" of a | ||||
|     creds/cred object. | ||||
|     The tunnel ID can be found by logging into your tunnelbroker.net pannel, clicking on the tunnel you wish to use, and | ||||
|     looking at the URL in your browser. | ||||
|     It is in the format of https://www.tunnelbroker.net/tunnel_detail.php?tid=[TUNNEL ID] | ||||
|     So if it takes you to e.g. https://www.tunnelbroker.net/tunnel_detail.php?tid=12345, your tunnel ID would | ||||
|     be "12345". | ||||
|     The below directives give you a Section and Value Name. This refers to the tunnelbroker.net panel page for the | ||||
|     specific tunnel you're configuring. e.g. To use the above example, this information is found at | ||||
|       https://www.tunnelbroker.net/tunnel_detail.php?tid=12345 | ||||
|     --> | ||||
|     <tunnel id="12345" creds="ipv6user"> | ||||
|       <!-- | ||||
|       The "server" element is the remote SIT endpoint. | ||||
|       Section: IPv6 Tunnel Endpoints | ||||
|       Value Name: Server IPv4 Address | ||||
|       --> | ||||
|       <server>192.0.2.1</server> | ||||
|       <!-- | ||||
|       Allocations that are handed to your tunnel. | ||||
|       --> | ||||
|       <!-- | ||||
|       Section: Routed IPv6 Prefixes | ||||
|       --> | ||||
|       <allocs> | ||||
|         <alloc prefix="64">2001:DB8:1:2:</alloc> | ||||
|         <alloc prefix="48">2001:DB8:2::</alloc> | ||||
|         <!-- | ||||
|         Each alloc has (in addition to a "prefix" attribute) an "iface" attribute. This is the network interface on | ||||
|         this machine that the allocation should be added to. | ||||
|         Value Name: Routed /64 | ||||
|         --> | ||||
|         <alloc prefix="64" iface="eth0">2001:DB8:1:2::</alloc> | ||||
|         <!-- | ||||
|         You may not have a /48 as it's opt-in. | ||||
|         Value Name: Routed /48 | ||||
|         --> | ||||
|         <alloc prefix="48" iface="eth0">2001:DB8:2::</alloc> | ||||
|       </allocs> | ||||
|       <!-- | ||||
|       The "client" element is the local SIT endpoint. | ||||
|       Section: IPv6 Tunnel Endpoints | ||||
|       Value Name: Client IPv6 Address | ||||
|       --> | ||||
|       <client prefix="64">2001:DB8:3::2</client> | ||||
|     </tunnel> | ||||
|     <!-- | ||||
|     And you can, of course, specify multiple tunnels. | ||||
|     --> | ||||
|     <tunnel id="54321" creds="ipv6user"> | ||||
|       <server>192.0.2.1</server> | ||||
|       <allocs> | ||||
|         <alloc prefix="64">2001:DB8:4:2:</alloc> | ||||
|         <alloc prefix="48">2001:DB8:5::</alloc> | ||||
|         <alloc prefix="64" iface="eth1">2001:DB8:4:2:</alloc> | ||||
|         <alloc prefix="48" iface="eth1">2001:DB8:5::</alloc> | ||||
|       </allocs> | ||||
|       <client prefix="64">2001:DB8:6::2</client> | ||||
|     </tunnel> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user