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"
|
<heIPv6 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xmlns="https://tunnelbroker.net/"
|
xmlns="https://tunnelbroker.net/"
|
||||||
xsi:schemaLocation="https://tunnelbroker.net/ http://schema.xml.r00t2.io/projects/he_ipv6.xsd">
|
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>
|
<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">
|
<cred id="ipv6user">
|
||||||
<user>ipv6user</user>
|
<user>ipv6user</user>
|
||||||
<updateKey>xXxXxXxXxXxXxXXX</updateKey>
|
<updateKey>xXxXxXxXxXxXxXXX</updateKey>
|
||||||
@ -13,19 +25,59 @@
|
|||||||
</cred>
|
</cred>
|
||||||
</creds>
|
</creds>
|
||||||
<tunnels>
|
<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">
|
<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>
|
<server>192.0.2.1</server>
|
||||||
|
<!--
|
||||||
|
Allocations that are handed to your tunnel.
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
|
Section: Routed IPv6 Prefixes
|
||||||
|
-->
|
||||||
<allocs>
|
<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>
|
</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>
|
<client prefix="64">2001:DB8:3::2</client>
|
||||||
</tunnel>
|
</tunnel>
|
||||||
|
<!--
|
||||||
|
And you can, of course, specify multiple tunnels.
|
||||||
|
-->
|
||||||
<tunnel id="54321" creds="ipv6user">
|
<tunnel id="54321" creds="ipv6user">
|
||||||
<server>192.0.2.1</server>
|
<server>192.0.2.1</server>
|
||||||
<allocs>
|
<allocs>
|
||||||
<alloc prefix="64">2001:DB8:4:2:</alloc>
|
<alloc prefix="64" iface="eth1">2001:DB8:4:2:</alloc>
|
||||||
<alloc prefix="48">2001:DB8:5::</alloc>
|
<alloc prefix="48" iface="eth1">2001:DB8:5::</alloc>
|
||||||
</allocs>
|
</allocs>
|
||||||
<client prefix="64">2001:DB8:6::2</client>
|
<client prefix="64">2001:DB8:6::2</client>
|
||||||
</tunnel>
|
</tunnel>
|
||||||
|
Loading…
Reference in New Issue
Block a user