From efb53be81bc6de0df42d2ac20a1d344506d2b89e Mon Sep 17 00:00:00 2001 From: brent s Date: Thu, 14 May 2020 21:21:11 -0400 Subject: [PATCH] more config stuff --- utils/he_ipv6/config.py | 127 ++++++++++++++++++++++------------------ utils/he_ipv6/logger.py | 6 +- 2 files changed, 73 insertions(+), 60 deletions(-) diff --git a/utils/he_ipv6/config.py b/utils/he_ipv6/config.py index 61bbcd2..a781912 100644 --- a/utils/he_ipv6/config.py +++ b/utils/he_ipv6/config.py @@ -20,7 +20,7 @@ class Credential(object): self.xml = cred_xml self.id = None self.user = None - self.key = None + self.password = None self.parse() def _id(self): @@ -30,14 +30,14 @@ class Credential(object): self.id = _id.strip() return(None) - def _update_key(self): - _key_xml = self.xml.find('updateKey') + def _password(self): + _key_xml = self.xml.find('password') if _key_xml is None: - raise ValueError('Missing required updateKey element') + raise ValueError('Missing required password element') _key_txt = _key_xml.text if not _key_txt: - raise ValueError('updateKey element is empty') - self.key = _key_txt.strip() + raise ValueError('password element is empty') + self.password = _key_txt.strip() return(None) def _user(self): @@ -53,15 +53,10 @@ class Credential(object): def parse(self): self._id() self._user() - self._update_key() + self._password() return(None) -class HETunnel(object): - def __init__(self, tun_xml): - pass - - class BaseConfig(object): default_xsd = None @@ -190,60 +185,76 @@ class Config(BaseConfig): return(None) -# class HEConfig(BaseConfig): -# # This is unused. Kept mostly for reference. -# -# default_xsd = 'http://schema.xml.r00t2.io/projects/tunnelbroker.xsd' -# nsmap = {None: 'https://tunelbroker.net/tunnelInfo.php', -# 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'} -# attr_qname = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation') -# schema_loc = 'https://tunnelbroker.net/tunnelInfo.php {0}'.format(default_xsd) -# -# def __init__(self, creds, xml_url = 'https://tunnelbroker.net/tunnelInfo.php', *args, **kwargs): -# self.creds = creds -# self.url = xml_url -# req = requests.get(self.url, -# auth = requests.auth.HTTPBasicAuth(self.creds.user, self.creds.password)) -# if not req.ok: -# raise RuntimeError('Could not fetch remote tunnel information') -# raw_xml = self._add_ns(req.content) -# super().__init__(raw_xml, *args, **kwargs) -# # In the format of: {tun_id: HETunnel()} -# self.tunnels = collections.OrderedDict() -# self.subparse() -# -# def subparse(self): -# for tun_xml in self.xml.findall('tunnel'): -# tun = HETunnel(tun_xml) -# self.tunnels[tun.id] = tun -# return(None) -# -# def _add_ns(self, raw_xml): -# # https://mailman-mail5.webfaction.com/pipermail/lxml/20100323/013260.html -# _xml = etree.fromstring(raw_xml) -# _nsmap = copy.deepcopy(_xml.nsmap) -# _nsmap.update(self.nsmap) -# mod_xml = etree.Element(_xml.tag, {self.attr_qname: self.schema_loc}, nsmap = _nsmap) -# mod_xml[:] = _xml[:] -# return(etree.tostring(mod_xml, -# encoding = 'UTF-8', -# xml_declaration = True, -# pretty_print = True, -# with_tail = True, -# with_comments = True)) +class HEBaseConfig(BaseConfig): + default_xsd = '' + nsmap = {None: '', + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'} + attr_qname = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation') + schema_loc = ' {0}'.format(default_xsd) + url = '' + + def __init__(self, creds, *args, **kwargs): + self.creds = creds + super().__init__(self._fetch(), *args, **kwargs) + + def _add_ns(self, raw_xml): + # https://mailman-mail5.webfaction.com/pipermail/lxml/20100323/013260.html + _xml = etree.fromstring(raw_xml) + _nsmap = copy.deepcopy(_xml.nsmap) + _nsmap.update(self.nsmap) + mod_xml = etree.Element(_xml.tag, + {self.attr_qname: self.schema_loc}, + nsmap = _nsmap) + mod_xml[:] = _xml[:] + return(etree.tostring(mod_xml, + encoding = 'UTF-8', + xml_declaration = True, + pretty_print = True, + with_tail = True, + with_comments = True)) + + def _fetch(self): + req = requests.get(self.url, + auth = requests.auth.HTTPBasicAuth(self.creds.user, + self.creds.password)) + if not req.ok: + raise RuntimeError('Could not fetch remote tunnel information') + raw_xml = self._add_ns(req.content) + return(raw_xml) -class HETunnelConfig(BaseConfig): - # TODO: RESTRUCTURE THIS and create an HETunnel() object +# This isn't really used anymore. +class HEConfig(HEBaseConfig): default_xsd = 'http://schema.xml.r00t2.io/projects/tunnelbroker.tun.xsd' nsmap = {None: 'https://tunelbroker.net/tunnelInfo.php?tid', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'} attr_qname = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation') schema_loc = 'https://tunnelbroker.net/tunnelInfo.php?tid {0}'.format(default_xsd) + url = 'https://tunnelbroker.net/tunnelInfo.php?tid={0}' - def __init__(self, tun_xml, creds): - self.xml = tun_xml - self.creds = creds + def __init__(self, creds, *args, **kwargs): + super().__init__(creds, *args, **kwargs) + self.tunnels = {} + + def add_tunnel(self, tun_id, update_key): + self.tunnels[tun_id] = HETunnelConfig(tun_id, self.creds, update_key) + return(None) + + +class HETunnelConfig(HEBaseConfig): + default_xsd = 'http://schema.xml.r00t2.io/projects/tunnelbroker.tun.xsd' + nsmap = {None: 'https://tunelbroker.net/tunnelInfo.php?tid', + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'} + attr_qname = etree.QName('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation') + schema_loc = 'https://tunnelbroker.net/tunnelInfo.php?tid {0}'.format(default_xsd) + url = 'https://tunnelbroker.net/tunnelInfo.php?tid={0}' + + def __init__(self, tun_id, creds, update_key, *args, **kwargs): + self.tun_id = int(tun_id) + self.url = self.url.format(self.tun_id) + self.creds = copy.deepcopy(creds) + self.creds.password = update_key + super().__init__(self.creds, *args, **kwargs) self.id = None self.description = None self.client = None # Client IPv6 diff --git a/utils/he_ipv6/logger.py b/utils/he_ipv6/logger.py index 203bc4d..52e6f48 100644 --- a/utils/he_ipv6/logger.py +++ b/utils/he_ipv6/logger.py @@ -8,8 +8,10 @@ try: except ImportError: _has_journald = False - -logfile = '/var/log/tunnelbroker_manager.log' +if os.geteuid() == 0: + logfile = '/var/log/tunnelbroker_manager.log' +else: + logfile = '~/.cache/tunnelbroker_manager.log' # Prep the log file. logfile = os.path.abspath(os.path.expanduser(logfile)) os.makedirs(os.path.dirname(logfile), exist_ok = True, mode = 0o0700)