From 1d9b40a59752b723db5bfc21e42d7c98a3baa5a4 Mon Sep 17 00:00:00 2001 From: r00t Date: Mon, 21 May 2018 05:58:25 -0400 Subject: [PATCH 01/15] confgen is done. messy, but done. --- bdisk/confgen.py | 10 +- bdisk/prompt_strings.py | 116 ++++++++++++++++ bdisk/utils.py | 221 +++++++++++++++++-------------- docs/examples/single_profile.xml | 2 +- 4 files changed, 246 insertions(+), 103 deletions(-) create mode 100644 bdisk/prompt_strings.py diff --git a/bdisk/confgen.py b/bdisk/confgen.py index 7a7f7f2..2af06d3 100755 --- a/bdisk/confgen.py +++ b/bdisk/confgen.py @@ -625,7 +625,7 @@ class ConfGenerator(object): 'created that can be used to serve iPXE)'), 'tftp': ('the TFTP directory (where a TFTP/' 'traditional PXE root is created)'), - 'ssl': ('the SSL/TLS PKI directory (where we store ' + 'pki': ('the SSL/TLS PKI directory (where we store ' 'the PKI structure we use/re-use - MAKE SURE ' 'it is in a path that is well-protected!)')} has_paths = False @@ -840,7 +840,7 @@ class ConfGenerator(object): 'then trying the built-in ~/.gnupg directory).' '\nGPG Home Directory: ')) if _gpghome.strip() != '': - gpg.attrib['gnupghome'] == _gpghome + gpg.attrib['gnupghome'] = _gpghome else: _gpghome = 'none' print('\n++ GPG || KEYSERVER PUSHING ++') @@ -935,12 +935,12 @@ class ConfGenerator(object): '\n\t'.join(_choices) ))).strip().lower() if _export_type.startswith('a'): - _export_type == 'asc' + _export_type = 'asc' elif _export_type.startswith('b'): - _export_type == 'bin' + _export_type = 'bin' else: print('Using the default.') - _export_type == 'asc' + _export_type = 'asc' elem.attrib['format'] = _export_type _path = None while not _path: diff --git a/bdisk/prompt_strings.py b/bdisk/prompt_strings.py new file mode 100644 index 0000000..36d38cb --- /dev/null +++ b/bdisk/prompt_strings.py @@ -0,0 +1,116 @@ +# These are *key* ciphers, for encrypting exported keys. +openssl_ciphers = ['aes128', 'aes192', 'aes256', 'bf', 'blowfish', + 'camellia128', 'camellia192', 'camellia256', 'cast', 'des', + 'des3', 'idea', 'rc2', 'seed'] +# These are *hash algorithms* for cert digests. +openssl_digests = ['blake2b512', 'blake2s256', 'gost', 'md4', 'md5', 'mdc2', + 'rmd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'] + +class PromptStrings(object): + gpg = { + 'attribs': { + 'algo': { + 'text': 'the subkey\'s encryption type/algorithm', + 'choices': ['rsa', 'dsa'], + 'default': 'rsa' + }, + 'keysize': { + 'text': 'the subkey\'s key size (in bits)', + 'choices': { + 'rsa': ['1024', '2048', '4096'], + 'dsa': ['768', '2048', '3072'] + }, + 'default': { + 'rsa': '4096', + 'dsa': '3072' + } + } + }, + 'params': ['name', 'email', 'comment'] + } + ssl = { + 'attribs': { + 'cert': { + 'hash_algo': { + 'text': ('What hashing algorithm do you want to use? ' + '(Default is sha512.)'), + 'prompt': 'Hashing algorithm: ', + 'options': openssl_digests, + 'default': 'aes256' + } + }, + 'key': { + 'cipher': { + 'text': ('What encryption algorithm/cipher do you want to ' + 'use? (Default is aes256.) Use "none" to specify ' + 'a key without a passphrase.'), + 'prompt': 'Cipher: ', + 'options': openssl_ciphers + ['none'], + 'default': 'aes256' + }, + 'keysize': { + 'text': ('What keysize/length (in bits) do you want the ' + 'key to be? (Default is 4096; much higher values ' + 'are possible but are untested and thus not ' + 'supported by this tool; feel free to edit the ' + 'generated configuration by hand.) (If the key ' + 'cipher is "none", this is ignored.)'), + 'prompt': 'Keysize: ', + # TODO: do all openssl_ciphers support these sizes? + 'options': ['1024', '2048', '4096'], + 'default': 'aes256' + }, + 'passphrase': { + 'text': ('What passphrase do you want to use for the key? ' + 'If you specified the cipher as "none", this is ' + 'ignored (you can just hit enter).'), + 'prompt': 'Passphrase (will not echo back): ', + 'options': None, + 'default': '' + } + } + }, + 'paths': { + 'cert': '(or read from) the certificate', + 'key': '(or read from) the key', + 'csr': ('(or read from) the certificate signing request (if ' + 'blank, we won\'t write to disk - the operation will ' + 'occur entirely in memory assuming we need to generate/' + 'sign)') + }, + 'paths_ca': { + 'index': ('(or read from) the CA (Certificate Authority) Database ' + 'index file (if left blank, one will not be used)'), + 'serial': ('(or read from) the CA (Certificate Authority) ' + 'Database serial file (if left blank, one will not be ' + 'used)'), + }, + 'subject': { + 'countryName': { + 'text': ('the 2-letter country abbreviation (must conform to ' + 'ISO3166 ALPHA-2)?\n' + 'Country code: ') + }, + 'localityName': { + 'text': ('the city/town/borough/locality name?\n' + 'Locality: ') + }, + 'stateOrProvinceName': { + 'text': ('the state/region name (full string)?\n' + 'Region: ') + }, + 'organization': { + 'text': ('your organization\'s name?\n' + 'Organization: ') + }, + 'organizationalUnitName': { + 'text': ('your department/role/team/department name?\n' + 'Organizational Unit: ') + }, + 'emailAddress': { + 'text': ('the email address to be associated with this ' + 'certificate/PKI object?\n' + 'Email: ') + } + } + } \ No newline at end of file diff --git a/bdisk/utils.py b/bdisk/utils.py index 45d3da3..2e681fa 100644 --- a/bdisk/utils.py +++ b/bdisk/utils.py @@ -1,11 +1,14 @@ import _io +import copy import crypt import GPG +import getpass import hashid import hashlib import iso3166 import os import pprint +import prompt_strings import re import string import uuid @@ -33,12 +36,7 @@ crypt_map = {'sha512': crypt.METHOD_SHA512, 'md5': crypt.METHOD_MD5, 'des': crypt.METHOD_CRYPT} -# These are *key* ciphers, for encrypting exported keys. -openssl_ciphers = ['aes128', 'aes192', 'aes256', 'bf', 'blowfish', - 'camellia128', 'camellia192', 'camellia256', 'cast', 'des', - 'des3', 'idea', 'rc2', 'seed'] -openssl_digests = ['blake2b512', 'blake2s256', 'gost', 'md4', 'md5', 'mdc2', - 'rmd160', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512'] + class XPathFmt(string.Formatter): def get_field(self, field_name, args, kwargs): @@ -162,7 +160,10 @@ class generate(object): class prompts(object): def __init__(self): - pass + self.promptstr = prompt_strings.PromptStrings() + + # TODO: these strings should be indexed in a separate module and + # sourced/imported. we should generally just find a cleaner way to do this. def confirm_or_no(self, prompt = '', invert = False, usage = '{0} to confirm, otherwise {1}...\n'): @@ -193,6 +194,62 @@ class prompts(object): return(False) return(True) + def gpg_keygen_attribs(self): + _strs = self.promptstr.gpg + gpg_vals = {'attribs': {}, + 'params': {}} + _checks = { + 'params': { + 'name': {'error': 'name cannot be empty', + 'check': valid().nonempty_str}, + 'email': {'error': 'not a valid email address', + 'check': valid().email} + } + } + for a in _strs['attribs']: + _a = None + while not _a: + if 'algo' in gpg_vals['attribs'] and a == 'keysize': + _algo = gpg_vals['attribs']['algo'] + _choices = _strs['attribs']['keysize']['choices'][_algo] + _dflt = _strs['attribs']['keysize']['default'][_algo] + else: + _choices = _strs['attribs'][a]['choices'] + _dflt = _strs['attribs'][a]['default'] + _a = (input( + ('\nWhat should be {0}? (Default is {1}.)\nChoices:\n' + '\n\t{2}\n\n{3}: ').format( + _strs['attribs'][a]['text'], + _dflt, + '\n\t'.join(_choices), + a.title() + ) + )).strip().lower() + if _a == '': + _a = _dflt + elif _a not in _choices: + print( + ('Invalid selection; choosing default ' + '({0})').format(_dflt) + ) + _a = _dflt + gpg_vals['attribs'][a] = _a + for p in _strs['params']: + _p = input( + ('\nWhat is the {0} for the subkey?\n' + '{1}: ').format(p, p.title()) + ) + if p in _checks['params']: + while not _checks['params'][p]['check'](_p): + print( + ('Invalid entry ({0}). Please retry.').format( + _checks['params'][p]['error'] + ) + ) + _p = input('{0}: '.format(_p.title())) + gpg_vals['params'][p] = _p + return(gpg_vals) + def hash_select(self, prompt = '', hash_types = generate().hashlib_names()): _hash_types = hash_types @@ -240,116 +297,81 @@ class prompts(object): ssl_vals = {'paths': {}, 'attribs': {}, 'subject': {}} + _checks = { + 'subject': { + 'countryName': valid().country_abbrev, + 'emailAddress': valid().email + } + } + _strs = copy.deepcopy(self.promptstr.ssl) # pki_role should be 'ca' or 'client' if pki_role not in ('ca', 'client'): raise ValueError('pki_role must be either "ca" or "client"') - _attribs = {'cert': {'hash_algo': {'text': ('What hashing algorithm ' - 'do you want to use? (Default is sha512.)'), - 'prompt': 'Hashing algorithm: ', - 'options': openssl_digests, - 'default': 'sha512'}}, - 'key': {'cipher': {'text': ('What encryption algorithm/' - 'cipher do you want to use? (Default is ' - 'aes256.)'), - 'prompt': 'Cipher: ', - 'options': openssl_ciphers, - 'default': 'aes256'}, - # This can actually theoretically be anywhere from - # 512 to... who knows how high. I couldn't find the - # upper bound. So we just set it to sensible - # defaults. If they want something higher, they can - # edit the XML when they're done. - 'keysize': {'text': ('What keysize/length (in ' - 'bits) do you want the key to be? (Default is ' - '4096; much higher values are possible but ' - 'are untested and thus not supported by this ' - 'tool; feel free to edit the generated ' - 'configuration by hand.)'), - 'prompt': 'Keysize: ', - 'options': ['1024', '2048', '4096'], - 'default': '4096'}}} - _paths = {'cert': '(or read from) the certificate', - 'key': '(or read from) the key', - 'csr': ('(or read from) the certificate signing request (if ' - 'blank, we won\'t write to disk - the operation ' - 'will occur entirely in memory assuming we need to ' - 'generate/sign)')} + # NOTE: need to validate US and email if pki_role == 'ca': - _paths['index'] = ('(or read from) the CA DB index file (if left ' - 'blank, one will not be used)') - _paths['serial'] = ('(or read from) the CA DB serial file (if ' - 'left blank, one will not be used)') - for a in _attribs: + # this is getting triggered for clients? + _strs['paths'].update(_strs['paths_ca']) + for a in _strs['attribs']: ssl_vals['attribs'][a] = {} - for x in _attribs[a]: + for x in _strs['attribs'][a]: ssl_vals['attribs'][a][x] = None - for p in _paths: + for p in _strs['paths']: if p == 'csr': _allow_empty = True else: _allow_empty = False - ssl_vals['paths'][p] = self.path(_paths[p], + ssl_vals['paths'][p] = self.path(_strs['paths'][p], empty_passthru = _allow_empty) print() if ssl_vals['paths'][p] == '': ssl_vals['paths'][p] = None - if p in _attribs: - for x in _attribs[p]: + if p in _strs['attribs']: + for x in _strs['attribs'][p]: while not ssl_vals['attribs'][p][x]: - ssl_vals['attribs'][p][x] = (input( - ('\n{0}\n\n\t{1}\n\n{2}').format( - _attribs[p][x]['text'], - '\n\t'.join(_attribs[p][x]['options']), - _attribs[p][x]['prompt']) - )).strip().lower() - if ssl_vals['attribs'][p][x] not in \ - _attribs[p][x]['options']: - print(('\nInvalid selection; setting default ' - '({0}).').format(_attribs[p][x]['default'])) - ssl_vals['attribs'][p][x] = \ - _attribs[p][x]['default'] - _subject = {'countryName': {'text': ('the 2-letter country ' - 'abbreviation (must conform to ' - 'ISO3166 ALPHA-2)?\nCountry ' - 'code: '), - 'check': 'func', - 'func': valid().country_abbrev}, - 'localityName': {'text': ('the city/town/borough/locality ' - 'name?\nLocality: '), - 'check': None}, - 'stateOrProvinceName': {'text': ('the state/region ' - 'name (full string)?' - '\nRegion: '), - 'check': None}, - 'organization': {'text': ('your organization\'s name?' - '\nOrganization: '), - 'check': None}, - 'organizationalUnitName': {'text': ('your department/role/' - 'team/department name?' - '\nOrganizational ' - 'Unit: '), - 'check': None}, - 'emailAddress': {'text': ('the email address to be ' - 'associated with this ' - 'certificate/PKI object?\n' - 'Email: '), - 'check': 'func', - 'func': valid().email}} - for s in _subject: + # cipher attrib is prompted for before this. + if p == 'key' and x == 'passphrase': + if ssl_vals['attribs']['key']['cipher'] == 'none': + ssl_vals['attribs'][p][x] = 'none' + continue + ssl_vals['attribs'][p][x] = getpass.getpass( + ('{0}\n{1}').format( + _strs['attribs'][p][x]['text'], + _strs['attribs'][p][x]['prompt']) + ) + if ssl_vals['attribs'][p][x] == '': + ssl_vals['attribs'][p][x] = 'none' + else: + ssl_vals['attribs'][p][x] = (input( + ('\n{0}\n\n\t{1}\n\n{2}').format( + _strs['attribs'][p][x]['text'], + '\n\t'.join( + _strs['attribs'][p][x]['options']), + _strs['attribs'][p][x]['prompt'])) + ).strip().lower() + if ssl_vals['attribs'][p][x] not in \ + _strs['attribs'][p][x]['options']: + print( + ('\nInvalid selection; setting default ' + '({0}).').format( + _strs['attribs'][p][x]['default'] + ) + ) + ssl_vals['attribs'][p][x] = \ + _strs['attribs'][p][x]['default'] + for s in _strs['subject']: ssl_vals['subject'][s] = None - for s in _subject: + for s in _strs['subject']: while not ssl_vals['subject'][s]: _input = (input( - ('\nWhat is {0}').format(_subject[s]['text']) + ('\nWhat is {0}').format( + _strs['subject'][s]['text']) )).strip() - _chk = _subject[s]['check'] - if _chk: - if _chk == 'func': - _chk = _subject[s]['func'](_input) - if not _chk: - print('Invalid value; retrying.') - continue print() + if s in _checks['subject']: + if not _checks['subject'][s](_input): + print('Invalid entry; try again.') + ssl_vals['subject'][s] = None + continue ssl_vals['subject'][s] = _input _url = transform().url_to_dict(cn_url, no_None = True) ssl_vals['subject']['commonName'] = _url['host'] @@ -594,6 +616,11 @@ class valid(object): return(False) return() + def nonempty_str(self, str_in): + if str_in.strip() == '': + return(False) + return(True) + def password(self, passwd): # https://en.wikipedia.org/wiki/ASCII#Printable_characters # https://serverfault.com/a/513243/103116 diff --git a/docs/examples/single_profile.xml b/docs/examples/single_profile.xml index 8e56487..e267446 100644 --- a/docs/examples/single_profile.xml +++ b/docs/examples/single_profile.xml @@ -156,7 +156,7 @@ publish="no" prompt_passphrase="no"> - + {xpath%../../../../meta/dev/author/text()} {xpath%../../../../meta/dev/email/text()} for {xpath%../../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../../meta/uri/text()} | {xpath%../../../../meta/desc/text()} From 4de9d1a26c03df046d918ec28a61b2ad004c1b82 Mon Sep 17 00:00:00 2001 From: r00t Date: Tue, 22 May 2018 06:01:18 -0400 Subject: [PATCH 02/15] checking in... --- TODO | 25 ++- bdisk/SSL.py | 9 +- bdisk/confgen.py | 4 +- bdisk/confparse.py | 254 +++++++++++++++++++++---------- bdisk/utils.py | 245 ++++++++++++++++++++++++----- docs/examples/multi_profile.xml | 20 +-- docs/examples/single_profile.xml | 12 +- docs/manual/TODO | 5 +- 8 files changed, 426 insertions(+), 148 deletions(-) diff --git a/TODO b/TODO index ec0678d..334588a 100644 --- a/TODO +++ b/TODO @@ -1,24 +1,23 @@ - write classes/functions - XML-based config +-x XML syntax +--- regex btags - case-insensitive? this can be represented in-pattern: + https://stackoverflow.com/a/9655186/733214 +-x configuration generator +--- print end result xml config to stderr for easier redirection? or print prompts to stderr and xml to stdout? +-- XSD for validation +-- Flask app for generating config? +-- TKinter (or pygame?) GUI? +--- https://docs.python.org/3/faq/gui.html +--- https://www.pygame.org/wiki/gui - ensure we use docstrings in a Sphinx-compatible manner? https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html at the very least document all the functions and such so pydoc's happy. -- better prompt display. i might include them as constants in a separate file - and then import it for e.g. confgen. or maybe a Flask website/app? + - locking - for docs, 3.x (as of 3.10) was 2.4M. -- GUI? at least for generating config... - Need ability to write/parse mtree specs (or a similar equivalent) for applying ownerships/permissions to overlay files -- SSL key gen: -import OpenSSL -k = OpenSSL.crypto.PKey() -k.generate_key(OpenSSL.crypto.TYPE_RSA, 4096) -x = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, - k, - cipher = 'aes256', - passphrase = 'test') - - need to package: python-hashid (https://psypanda.github.io/hashID/, https://github.com/psypanda/hashID, @@ -41,4 +40,4 @@ BUGS.SQUARE-R00T.NET bugs/tasks: #36: Allow parsing pkg lists with inline comments #39: Fix UEFI #40: ISO overlay (to add e.g. memtest86+ to final ISO) -#43: Support resuming partial tarball downloads (Accet-Ranges: bytes) \ No newline at end of file +#43: Support resuming partial tarball downloads (Accept-Ranges: bytes) \ No newline at end of file diff --git a/bdisk/SSL.py b/bdisk/SSL.py index a991649..0c91e27 100644 --- a/bdisk/SSL.py +++ b/bdisk/SSL.py @@ -2,4 +2,11 @@ import OpenSSL # https://cryptography.io/en/latest/x509/reference/#cryptography.x509.CertificateBuilder.sign # migrate old functions of bSSL to use cryptography # but still waiting on their recpipes. -# https://cryptography.io/en/latest/x509/tutorial/ \ No newline at end of file +# https://cryptography.io/en/latest/x509/tutorial/ +#import OpenSSL +#k = OpenSSL.crypto.PKey() +#k.generate_key(OpenSSL.crypto.TYPE_RSA, 4096) +#x = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, +# k, +# cipher = 'aes256', +# passphrase = 'test') \ No newline at end of file diff --git a/bdisk/confgen.py b/bdisk/confgen.py index 2af06d3..5b10e2e 100755 --- a/bdisk/confgen.py +++ b/bdisk/confgen.py @@ -442,6 +442,8 @@ class ConfGenerator(object): tarball_elem.attrib['flags'] = 'latest' tarball_elem.text = tarball['full_url'] print('\n++ SOURCES || {0} || CHECKSUM ++'.format(arch.upper())) + # TODO: explicit not being set for explicitly-set sums, + # and checksum string not actually added to those. investigate. chksum = lxml.etree.SubElement(source, 'checksum') _chksum_chk = prompt.confirm_or_no(prompt = ( '\nWould you like to add a checksum for the tarball? (BDisk ' @@ -502,7 +504,7 @@ class ConfGenerator(object): print('Invalid selection. Starting over.') continue else: - checksum_type == checksum_type[0] + checksum_type = checksum_type[0] chksum.attrib['explicit'] = "yes" chksum.text = checksum chksum.attrib['hash_algo'] = checksum_type diff --git a/bdisk/confparse.py b/bdisk/confparse.py index 2cc271e..e4102dd 100644 --- a/bdisk/confparse.py +++ b/bdisk/confparse.py @@ -1,15 +1,18 @@ -import copy -import re import os +import pprint +import re import utils -import validators import lxml.etree from urllib.parse import urlparse etree = lxml.etree +detect = utils.detect() +generate = utils.generate() +transform = utils.transform() +valid = utils.valid() class Conf(object): - def __init__(self, cfg, profile = None): + def __init__(self, cfg, profile = None, validate = False): """ A configuration object. @@ -37,27 +40,70 @@ class Conf(object): You can provide any combination of these (e.g. "profile={'id': 2, 'name' = 'some_profile'}"). """ - #self.raw = _detect_cfg(cfg) # no longer needed; in utils self.xml_suppl = utils.xml_supplicant(cfg, profile = profile) - self.profile = self.xml_suppl - self.xml = None - self.profile = None - # Mad props to https://stackoverflow.com/a/12728199/733214 - self.xpath_re = re.compile('(?<=(?= 1: + for item in ptrn_id: + try: + btag, expr = item.split('%', 1) + if btag not in self.btags: + continue + if item not in self.btags[btag]: + self.btags[btag][item] = None + #self.btags[btag][item] = expr # remove me? + if btag == 'xpath': + d[item] = (btag, expr) + elif btag == 'variable': + d[item] = (btag, self.btags['variable'][item]) + except ValueError: + return(d) + return(d) + + def get_profile(self, profile = None): + """Get a configuration profile. + + Get a configuration profile from the XML object and set that as a + profile object. If a profile is specified, attempt to find it. If not, + follow the default rules as specified in __init__. + """ + if profile: + # A profile identifier was provided + if isinstance(profile, str): + _profile_name = profile + profile = {} + for i in self.selector_ids: + profile[i] = None + profile['name'] = _profile_name + elif isinstance(profile, dict): + for k in self.selector_ids: + if k not in profile.keys(): + profile[k] = None + else: + raise TypeError('profile must be a string (name of profile), ' + 'a dictionary, or None') + xpath = '/bdisk/profile{0}'.format(self.xpath_selector(profile)) + self.profile = self.xml.xpath(xpath) + if len(self.profile) != 1: + raise ValueError('Could not determine a valid, unique ' + 'profile; please check your profile ' + 'specifier(s)') + else: + # We need the actual *profile*, not a list of matching + # profile(s). + self.profile = self.profile[0] + if not len(self.profile): + raise RuntimeError('Could not find the profile specified in ' + 'the given configuration') + else: + # We need to find the default. + profiles = [] + for p in self.xml.xpath('/bdisk/profile'): + profiles.append(p) + # Look for one named "default" or "DEFAULT" etc. + for idx, value in enumerate([e.attrib['name'].lower() \ + for e in profiles]): + if value == 'default': + #self.profile = copy.deepcopy(profiles[idx]) + self.profile = profiles[idx] + break + # We couldn't find a profile with a default name. Try to grab the + # first profile. + if self.profile is None: + # Grab the first profile. + if profiles: + self.profile = profiles[0] + else: + # No profiles found. + raise RuntimeError('Could not find any usable ' + 'configuration profiles') + return() + def get_path(self, element): path = element try: @@ -815,33 +1005,10 @@ class xml_supplicant(object): _dictmap = self.btags_to_dict(element.text) return(element) - def xpath_selector(self, selectors, - selector_ids = ('id', 'name', 'uuid')): + def xpath_selector(self, selectors): # selectors is a dict of {attrib:value} xpath = '' for i in selectors.items(): - if i[1] and i[0] in selector_ids: + if i[1] and i[0] in self.selector_ids: xpath += '[@{0}="{1}"]'.format(*i) - return(xpath) - - def btags_to_dict(self, text_in): - d = {} - ptrn_id = self.ptrn.findall(text_in) - if len(ptrn_id) >= 1: - for item in ptrn_id: - try: - btag, expr = item.split('%', 1) - if btag not in self.btags: - continue - if item not in self.btags[btag]: - self.btags[btag][item] = None - #self.btags[btag][item] = expr # remove me? - if btag == 'xpath': - d[item] = (btag, expr) - elif btag == 'variable': - d[item] = (btag, self.btags['variable'][item]) - except ValueError: - return(d) - return(d) - - + return(xpath) \ No newline at end of file diff --git a/docs/examples/multi_profile.xml b/docs/examples/multi_profile.xml index 1b10071..054661e 100644 --- a/docs/examples/multi_profile.xml +++ b/docs/examples/multi_profile.xml @@ -9,7 +9,7 @@ but now with the neat benefits of XPath! Everything you could do in build.ini's and more. See https://www.w3schools.com/xml/xpath_syntax.asp If you need a literal curly brace, double them (e.g. for "{foo}", use "{{foo}}"), - UNLESS it's in a {regex%...} placeholder/filter (as part of the expression). --> + UNLESS it's in a as part of the expression. Those are taken as literal strings. --> {xpath%../name/text()} A rescue/restore live environment. @@ -24,7 +24,7 @@ 5 + items. See the manual for more information. NO btags within the patterns is allowed. --> archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz$ archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ @@ -139,10 +139,10 @@ blank passphrase for all operations. --> - - {xpath%../../../../meta/dev/author/text()} - {xpath%../../../../meta/dev/email/text()} - for {xpath%../../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../../meta/uri/text()} | {xpath%../../../../meta/desc/text()} + + {xpath%../../../meta/dev/author/text()} + {xpath%../../../meta/dev/email/text()} + for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()} @@ -263,10 +263,10 @@ - - {xpath%../../../../meta/dev/author/text()} - {xpath%../../../../meta/dev/email/text()} - for {xpath%../../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../../meta/uri/text()} | {xpath%../../../../meta/desc/text()} + + {xpath%../../../meta/dev/author/text()} + {xpath%../../../meta/dev/email/text()} + for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()} diff --git a/docs/examples/single_profile.xml b/docs/examples/single_profile.xml index e267446..ae4b535 100644 --- a/docs/examples/single_profile.xml +++ b/docs/examples/single_profile.xml @@ -9,7 +9,7 @@ but now with the neat benefits of XPath! Everything you could do in build.ini's and more. See https://www.w3schools.com/xml/xpath_syntax.asp If you need a literal curly brace, double them (e.g. for "{foo}", use "{{foo}}"), - UNLESS it's in a {regex%...} placeholder/filter (as part of the expression). --> + UNLESS it's in a as part of the expression. Those are taken as literal strings. --> {xpath%../name/text()} A rescue/restore live environment. @@ -24,7 +24,7 @@ 5 + items. See the manual for more information. NO btags within the patterns is allowed. --> archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz$ archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ @@ -62,7 +62,7 @@ /iso/latest {regex%tarball_x86_64} sha1sums.txt + explicit="no">sha1sums.txt {regex%sig_x86_64} @@ -157,9 +157,9 @@ prompt_passphrase="no"> - {xpath%../../../../meta/dev/author/text()} - {xpath%../../../../meta/dev/email/text()} - for {xpath%../../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../../meta/uri/text()} | {xpath%../../../../meta/desc/text()} + {xpath%../../../meta/dev/author/text()} + {xpath%../../../meta/dev/email/text()} + for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()} diff --git a/docs/manual/TODO b/docs/manual/TODO index 46f2589..e1f733f 100644 --- a/docs/manual/TODO +++ b/docs/manual/TODO @@ -7,4 +7,7 @@ - in faq/ISOBIG.adoc and the doc section it references, make sure we reference that the package lists are now in the environment plugin! -- change all references to build.ini to something like "BDisk configuration file" \ No newline at end of file +- change all references to build.ini to something like "BDisk configuration file" + +- reminder: users can specify a local file source for items by using "file:///absolute/path/to/file" +-- todo: add http auth, ftp, ftps \ No newline at end of file From e818b04f1642529d69b052e1ab18ca77deec72fa Mon Sep 17 00:00:00 2001 From: r00t Date: Tue, 22 May 2018 07:19:49 -0400 Subject: [PATCH 03/15] conf parsing is DONE. --- bdisk/confparse.py | 85 ++++++++++++++++++++++++++++++-- bdisk/utils.py | 6 ++- docs/examples/multi_profile.xml | 5 +- docs/examples/single_profile.xml | 1 + 4 files changed, 91 insertions(+), 6 deletions(-) diff --git a/bdisk/confparse.py b/bdisk/confparse.py index e4102dd..a551e0a 100644 --- a/bdisk/confparse.py +++ b/bdisk/confparse.py @@ -55,6 +55,29 @@ class Conf(object): # raise ValueError('The configuration did not pass XSD/schema ' # 'validation') + def get_pki_obj(self, pki, pki_type): + elem = {} + if pki_type not in ('ca', 'client'): + raise ValueError('pki_type must be "ca" or "client"') + if pki_type == 'ca': + elem['index'] = None + elem['serial'] = None + for e in pki.xpath('./*'): + # These have attribs or children. + if e.tag in ('cert', 'key', 'subject'): + elem[e.tag] = {} + if e.tag == 'subject': + for sub in e.xpath('./*'): + elem[e.tag][sub.tag] = transform.xml2py(sub.text, + attrib = False) + else: + for a in e.xpath('./@*'): + elem[e.tag][a.attrname] = transform.xml2py(a) + elem[e.tag]['path'] = e.text + else: + elem[e.tag] = e.text + return(elem) + def get_source(self, source, item, _source): _source_item = {'flags': [], 'fname': None} @@ -137,6 +160,8 @@ class Conf(object): self.parse_sources() self.parse_buildpaths() self.parse_pki() + self.parse_gpg() + self.parse_sync() return() def parse_buildpaths(self): @@ -165,6 +190,30 @@ class Conf(object): self.cfg[x]['uri'] = elem.xpath('./uri/text()')[0] return() + def parse_gpg(self): + ## PROFILE/GPG + self.cfg['gpg'] = {'keyid': None, + 'gnupghome': None, + 'publish': None, + 'prompt_passphrase': None, + 'keys': []} + elem = self.profile.xpath('./gpg')[0] + for attr in elem.xpath('./@*'): + self.cfg['gpg'][attr.attrname] = transform.xml2py(attr) + for key in elem.xpath('./key'): + _key = {'algo': 'rsa', + 'keysize': '4096', + 'expire': '0', + 'name': None, + 'email': None, + 'comment': None} + for attr in key.xpath('./@*'): + _key[attr.attrname] = transform.xml2py(attr) + for param in key.xpath('./*'): + _key[param.tag] = transform.xml2py(param.text, attrib = False) + self.cfg['gpg']['keys'].append(_key) + return() + def parse_meta(self): ## PROFILE/META # Get the various meta strings. We skip regexes (we handle those @@ -191,10 +240,18 @@ class Conf(object): return() def parse_pki(self): - self.cfg['pki'] = {'ca': {}, - 'client': []} + ## PROFILE/PKI + self.cfg['pki'] = {'clients': []} elem = self.profile.xpath('./pki')[0] - self.cfg['pki']['overwrite'] = + self.cfg['pki']['overwrite'] = transform.xml2py( + elem.get('overwrite', 'no')) + ca = elem.xpath('./ca')[0] + clients = elem.xpath('./client') + self.cfg['pki']['ca'] = self.get_pki_obj(ca, 'ca') + for client in clients: + self.cfg['pki']['clients'].append(self.get_pki_obj(client, + 'client')) + return() def parse_profile(self): ## PROFILE @@ -222,6 +279,28 @@ class Conf(object): self.cfg['sources'].append(_source) return() + def parse_sync(self): + ## PROFILE/SYNC + self.cfg['sync'] = {} + elem = self.profile.xpath('./sync')[0] + # We populate defaults in case they weren't specified. + for e in ('gpg', 'ipxe', 'iso', 'tftp'): + self.cfg['sync'][e] = {'enabled': False, + 'path': None} + sub = elem.xpath('./{0}'.format(e))[0] + for a in sub.xpath('./@*'): + self.cfg['sync'][e][a.attrname] = transform.xml2py(a) + self.cfg['sync'][e]['path'] = sub.text + rsync = elem.xpath('./rsync')[0] + self.cfg['sync']['rsync'] = {'enabled': False} + for a in rsync.xpath('./@*'): + self.cfg['sync']['rsync'][a.attrname] = transform.xml2py(a) + for sub in rsync.xpath('./*'): + self.cfg['sync']['rsync'][sub.tag] = transform.xml2py( + sub.text, + attrib = False) + return() + def validate(self): self.xsd = etree.XMLSchema(self.get_xsd()) return(self.xsd.validate(self.xml)) \ No newline at end of file diff --git a/bdisk/utils.py b/bdisk/utils.py index 86c7c91..4886086 100644 --- a/bdisk/utils.py +++ b/bdisk/utils.py @@ -661,6 +661,7 @@ class transform(object): def xml2py(self, value, attrib = True): yes = re.compile('^\s*(y(es)?|true|1)\s*$', re.IGNORECASE) no = re.compile('^\s*(no?|false|0)\s*$', re.IGNORECASE) + none = re.compile('^\s*(none|)\s*$', re.IGNORECASE) if no.search(value): if attrib: return(False) @@ -669,10 +670,13 @@ class transform(object): elif yes.search(value): # We handle the False case above. return(True) - elif value.strip() == '': + elif value.strip() == '' or none.search(value): return(None) + elif valid().integer(value): + return(int(value)) else: return(value) + return() class valid(object): def __init__(self): diff --git a/docs/examples/multi_profile.xml b/docs/examples/multi_profile.xml index 054661e..e040266 100644 --- a/docs/examples/multi_profile.xml +++ b/docs/examples/multi_profile.xml @@ -57,7 +57,7 @@ http://archlinux.mirror.domain.tld /iso/latest {regex%tarball_x86_64} - sha1sums.txt + sha1sums.txt {regex%sig_x86_64} @@ -146,6 +146,7 @@ + /srv/http/{xpath%../../meta/names/uxname/text()} /tftproot/{xpath%../../meta/names/uxname/text()} /srv/http/isos/{xpath%../../meta/names/uxname/text()} @@ -198,7 +199,7 @@ http://archlinux.mirror.domain.tld /iso/latest {regex%tarball_x86_64} - sha1sums.txt + sha1sums.txt {regex%sig_x86_64} diff --git a/docs/examples/single_profile.xml b/docs/examples/single_profile.xml index ae4b535..98b89b6 100644 --- a/docs/examples/single_profile.xml +++ b/docs/examples/single_profile.xml @@ -163,6 +163,7 @@ + /srv/http/{xpath%../../meta/names/uxname/text()} /tftproot/{xpath%../../meta/names/uxname/text()} /srv/http/isos/{xpath%../../meta/names/uxname/text()} From b134ee67bdd98dbad471a78013be7532f22549b9 Mon Sep 17 00:00:00 2001 From: r00t Date: Wed, 23 May 2018 01:45:31 -0400 Subject: [PATCH 04/15] writing XSDs fucking sucks --- bdisk/bdisk.xsd | 147 ++++++++++++++++++++++++++++++- bin/xmllint.sh | 3 + docs/examples/multi_profile.xml | 2 +- docs/examples/single_profile.xml | 55 ++++++++---- 4 files changed, 185 insertions(+), 22 deletions(-) create mode 100755 bin/xmllint.sh diff --git a/bdisk/bdisk.xsd b/bdisk/bdisk.xsd index 2e4f92c..2ce20e5 100644 --- a/bdisk/bdisk.xsd +++ b/bdisk/bdisk.xsd @@ -1,6 +1,147 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bin/xmllint.sh b/bin/xmllint.sh new file mode 100755 index 0000000..d9ff037 --- /dev/null +++ b/bin/xmllint.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +xmllint -schema ../bdisk/bdisk.xsd ../docs/examples/multi_profile.xml --noout diff --git a/docs/examples/multi_profile.xml b/docs/examples/multi_profile.xml index e040266..d216962 100644 --- a/docs/examples/multi_profile.xml +++ b/docs/examples/multi_profile.xml @@ -1,5 +1,5 @@ - + diff --git a/docs/examples/single_profile.xml b/docs/examples/single_profile.xml index 98b89b6..fb159a3 100644 --- a/docs/examples/single_profile.xml +++ b/docs/examples/single_profile.xml @@ -1,5 +1,7 @@ - + @@ -27,7 +29,8 @@ items. See the manual for more information. NO btags within the patterns is allowed. --> archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz$ - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ + archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ + archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz$ archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz\.sig$ @@ -38,7 +41,9 @@ - $6$7KfIdtHTcXwVrZAC$LZGNeMNz7v5o/cYuA48FAxtZynpIwO5B1CPGXnOW5kCTVpXVt4SypRqfM.AoKkFt/O7MZZ8ySXJmxpELKmdlF1 + + $6$7KfIdtHTcXwVrZAC$LZGNeMNz7v5o/cYuA48FAxtZynpIwO5B1CPGXnOW5kCTVpXVt4SypRqfM.AoKkFt/O7MZZ8ySXJmxpELKmdlF1 + {xpath%//meta/names/uxname/text()} @@ -46,14 +51,16 @@ {xpath%//meta/dev/author/text()} testpassword + salt="auto">testpassword + testuser Test User anothertestpassword + salt="auto">anothertestpassword + @@ -62,20 +69,25 @@ /iso/latest {regex%tarball_x86_64} sha1sums.txt - sha1sums.txt + + {regex%sig_x86_64} + flags="regex,latest">{regex%sig_x86_64} + http://archlinux32.mirror.domain.tld /iso/latest {regex%tarball_i686} cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + explicit="yes"> + cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + {regex%sig_i686} + flags="regex,latest">{regex%sig_i686} + @@ -95,7 +107,7 @@ archlinux - + {xpath%//meta/dev/website/text()}/ipxe @@ -109,7 +121,7 @@ then provide a path. e.g.: {xpath%build/paths/ssl/text()}/ca.csr --> - + @@ -121,7 +133,8 @@ be (securely) prompted for the passphrase to unlock it/add a passphrase to it. --> {xpath%../../../build/paths/pki/text()}/ca.key + keysize="4096">{xpath%../../../build/paths/pki/text()}/ca.key + domain.tld XX @@ -133,11 +146,14 @@ - {xpath%../../../build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.crt - + + {xpath%../../../build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.crt + + {xpath%//build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.key + keysize="4096">{xpath%//build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.key + some client name XX @@ -159,7 +175,9 @@ {xpath%../../../meta/dev/author/text()} {xpath%../../../meta/dev/email/text()} - for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()} + for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} + | {xpath%../../../meta/desc/text()} + @@ -168,7 +186,8 @@ /tftproot/{xpath%../../meta/names/uxname/text()} /srv/http/isos/{xpath%../../meta/names/uxname/text()} /srv/http/{xpath%../../meta/names/uxname/text()}/pubkey.asc + format="asc">/srv/http/{xpath%../../meta/names/uxname/text()}/pubkey.asc + root mirror.domain.tld From 9f74e97c45ef237edda7921b661effc78361e976 Mon Sep 17 00:00:00 2001 From: r00t Date: Thu, 24 May 2018 08:24:46 -0400 Subject: [PATCH 05/15] i should commit this. --- bdisk/bdisk.xsd | 690 ++++++++++++++++++++++++++++++- bdisk/confgen.py | 49 ++- bdisk/confparse.py | 4 +- bdisk/utils.py | 37 +- docs/examples/multi_profile.xml | 541 ++++++++++++------------ docs/examples/regen_multi.py | 37 +- docs/examples/single_profile.xml | 87 ++-- 7 files changed, 1076 insertions(+), 369 deletions(-) diff --git a/bdisk/bdisk.xsd b/bdisk/bdisk.xsd index 2ce20e5..e54c4e1 100644 --- a/bdisk/bdisk.xsd +++ b/bdisk/bdisk.xsd @@ -3,9 +3,247 @@ targetNamespace="http://bdisk.square-r00t.net/" xmlns="http://bdisk.square-r00t.net/" elementFormDefault="qualified"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -23,8 +261,9 @@ - + + + @@ -33,8 +272,12 @@ - + + + + + + @@ -43,6 +286,7 @@ + @@ -57,10 +301,30 @@ - + + + + + + + + + + + + + + + + + + - + @@ -114,29 +378,427 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bdisk/confgen.py b/bdisk/confgen.py index 5b10e2e..c6e8ed0 100755 --- a/bdisk/confgen.py +++ b/bdisk/confgen.py @@ -4,7 +4,7 @@ # Go figure. import confparse -import crypt +import datetime import getpass import os import utils @@ -134,7 +134,12 @@ class ConfGenerator(object): self.cfg = c.xml self.append = True else: - self.cfg = lxml.etree.Element('bdisk') + _ns = {None: 'http://bdisk.square-r00t.net/', + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'} + _xsi = { + '{http://www.w3.org/2001/XMLSchema-instance}schemaLocation': + 'http://bdisk.square-r00t.net bdisk.xsd'} + self.cfg = lxml.etree.Element('bdisk', nsmap = _ns, attrib = _xsi) self.append = False self.profile = lxml.etree.Element('profile') self.cfg.append(self.profile) @@ -155,6 +160,13 @@ class ConfGenerator(object): self.get_pki() self.get_gpg() self.get_sync() + # TODO: make this more specific (script? gui? web? etc.) + # and append comment to bdisk element + _comment = lxml.etree.Comment( + 'Generated {0} by BDisk configuration generator'.format( + str(datetime.datetime.now()) + ) + ) except KeyboardInterrupt: exit('\n\nCaught KeyboardInterrupt; quitting...') return() @@ -472,7 +484,7 @@ class ConfGenerator(object): print('Invalid selection. Starting over.') continue chksum.attrib['hash_algo'] = checksum_type - chksum.attrib['explicit'] = "no" + chksum.attrib['explicit'] = "false" chksum.text = checksum['full_url'] else: # Maybe it's a digest string. @@ -505,7 +517,7 @@ class ConfGenerator(object): continue else: checksum_type = checksum_type[0] - chksum.attrib['explicit'] = "yes" + chksum.attrib['explicit'] = "true" chksum.text = checksum chksum.attrib['hash_algo'] = checksum_type print('\n++ SOURCES || {0} || GPG ++'.format(arch.upper())) @@ -597,7 +609,7 @@ class ConfGenerator(object): usage = ( '{0} for yes, {1} for no...\n')) if _chk_optimizations: - build.attrib['its_full_of_stars'] = 'yes' + build.attrib['its_full_of_stars'] = 'true' print('\n++ BUILD || PATHS ++') # Thankfully, we can simplify a lot of this. _dir_strings = {'base': ('the base directory (used for files that are ' @@ -678,9 +690,9 @@ class ConfGenerator(object): self.profile.append(iso) # We have more than one arch, so we need to ask how they want to handle # it. - _ma_strings = {'yes': ('a multi-arch ISO (both architectures on one ' + _ma_strings = {'true': ('a multi-arch ISO (both architectures on one ' 'ISO)'), - 'no': ('separate image files for ' + 'false': ('separate image files for ' '{0}').format(' and '.join(_arches))} for a in _arches: _ma_strings[a] = 'only build an image file for {0}'.format(a) @@ -712,7 +724,7 @@ class ConfGenerator(object): 'option to configure it a bit later).\nWould you like to sign ' 'the ISO/USB image files with GPG?\n'), usage = ( '{0} for yes, {1} for no...\n')) - _gpg_sign = ('yes' if _gpg_input else 'no') + _gpg_sign = ('true' if _gpg_input else 'false') iso.attrib['sign'] = _gpg_sign self.profile.append(iso) return() @@ -727,21 +739,21 @@ class ConfGenerator(object): 'see the manual for more information). Would you like to ' 'build iPXE support?\n'), usage = ( '{0} for yes, {1} for no...\n')) - _ipxe = ('yes' if _ipxe else 'no') - if _ipxe == 'yes': + _ipxe = ('true' if _ipxe else 'true') + if _ipxe == 'true': print('\n++ iPXE || MINI-ISO ++') _iso = prompt.confirm_or_no(prompt = ( '\nWould you like to build a "mini-ISO" (see the manual) for ' 'bootstrapping iPXE booting from USB or optical media?\n'), usage = ('{0} for yes, {1} for no...\n')) - ipxe.attrib['iso'] = ('yes' if _iso else 'no') + ipxe.attrib['iso'] = ('true' if _iso else 'false') print('\n++ iPXE || SIGNING ++') _sign = prompt.confirm_or_no(prompt = ( '\nBDisk can sign the mini-ISO and other relevant files for ' 'iPXE builds using GPG. Would you like to sign the iPXE build ' 'distributables? (You\'ll have the chance to configure GPG ' 'later).\n'), usage = ('{0} for yes, {1} for no...\n')) - ipxe.attrib['sign'] = ('yes' if _sign else 'no') + ipxe.attrib['sign'] = ('true' if _sign else 'false') _uri = None while not _uri: print('\n++ iPXE || URL ++') @@ -756,7 +768,7 @@ class ConfGenerator(object): else: uri = lxml.etree.SubElement(ipxe, 'uri') uri.text = _uri - if _ipxe == 'yes': + if _ipxe == 'true': self.profile.append(ipxe) return() @@ -782,7 +794,7 @@ class ConfGenerator(object): 'wish to keep persistent keys and certs), you should ' 'DEFINITELY answer no here.\n'), usage = ('{0} for yes, {1} for no...\n')) - pki.attrib['overwrite'] = ('yes' if _overwrite else 'no') + pki.attrib['overwrite'] = ('true' if _overwrite else 'false') for x in ('ca', 'client'): print('\n++ SSL/TLS PKI || {0} ++'.format(x.upper())) _x = None @@ -806,7 +818,7 @@ class ConfGenerator(object): for x in _xpaths: _x = self.profile.xpath(x) for a in _x: - if a == 'yes': + if a == 'true': _sigchk = True break if _sigchk: @@ -850,7 +862,7 @@ class ConfGenerator(object): '\nWould you like to push the key to the SKS keyserver pool ' '(making it much easier for end-users to look it up)?\n'), usage = ('{0} for yes, {1} for no...\n')) - gpg.attrib['publish'] = ('yes' if _gpgpublish else 'no') + gpg.attrib['publish'] = ('true' if _gpgpublish else 'false') print('\n++ GPG || PASSWORD HANDLING ++') _gpgpass_prompt = prompt.confirm_or_no(prompt = ( '\nWould you like BDisk to prompt you for a passphrase? If not, ' @@ -858,7 +870,8 @@ class ConfGenerator(object): 'the configuration (HIGHLY unrecommended) or use a blank ' 'passphrase (also HIGHLY unrecommended).\n'), usage = ('{0} for yes, {1} for no...\n')) - gpg.attrib['prompt_passphrase'] = ('yes' if _gpgpass_prompt else 'no') + gpg.attrib['prompt_passphrase'] = ('true' if _gpgpass_prompt else + 'false') _pass = None if not _gpgpass_prompt: while not _pass: @@ -923,7 +936,7 @@ class ConfGenerator(object): '\nWould you like to sync {0}?\n'.format(_syncs[s])), usage = ('{0} for yes, {1} for no...\n')) elem = lxml.etree.SubElement(sync, s) - elem.attrib['enabled'] = ('yes' if _item_sync_chk else 'no') + elem.attrib['enabled'] = ('true' if _item_sync_chk else 'false') if not _item_sync_chk: continue if s == 'gpg': diff --git a/bdisk/confparse.py b/bdisk/confparse.py index a551e0a..ab3c608 100644 --- a/bdisk/confparse.py +++ b/bdisk/confparse.py @@ -168,7 +168,7 @@ class Conf(object): ## PROFILE/BUILD(/PATHS) self.cfg['build'] = {'paths': {}} build = self.profile.xpath('./build')[0] - _optimize = build.get('its_full_of_stars', 'no') + _optimize = build.get('its_full_of_stars', 'false') self.cfg['build']['optimize'] = transform.xml2py(_optimize) for path in build.xpath('./paths/*'): self.cfg['build']['paths'][path.tag] = path.text @@ -185,7 +185,7 @@ class Conf(object): # We enable all features by default. elem = self.profile.xpath('./{0}'.format(x))[0] for a in self.cfg[x]: - self.cfg[x][a] = transform.xml2py(elem.get(a, 'yes')) + self.cfg[x][a] = transform.xml2py(elem.get(a, 'true')) if x == 'ipxe': self.cfg[x]['uri'] = elem.xpath('./uri/text()')[0] return() diff --git a/bdisk/utils.py b/bdisk/utils.py index 4886086..7dab775 100644 --- a/bdisk/utils.py +++ b/bdisk/utils.py @@ -15,6 +15,7 @@ import uuid import validators import zlib import lxml.etree +import lxml.objectify from bs4 import BeautifulSoup from collections import OrderedDict from dns import resolver @@ -446,12 +447,12 @@ class transform(object): def py2xml(self, value, attrib = True): if value in (False, ''): if attrib: - return("no") + return("false") else: return(None) elif isinstance(value, bool): # We handle the False case above. - return("yes") + return("true") elif isinstance(value, str): return(value) else: @@ -469,7 +470,6 @@ class transform(object): text_out = re.sub('[^\w]', '', text_out) return(text_out) - # noinspection PyDictCreation def url_to_dict(self, orig_url, no_None = False): def _getuserinfo(uinfo_str): if len(uinfo_str) == 0: @@ -659,8 +659,8 @@ class transform(object): return(acct) def xml2py(self, value, attrib = True): - yes = re.compile('^\s*(y(es)?|true|1)\s*$', re.IGNORECASE) - no = re.compile('^\s*(no?|false|0)\s*$', re.IGNORECASE) + yes = re.compile('^\s*(true|1)\s*$', re.IGNORECASE) + no = re.compile('^\s*(false|0)\s*$', re.IGNORECASE) none = re.compile('^\s*(none|)\s*$', re.IGNORECASE) if no.search(value): if attrib: @@ -819,12 +819,18 @@ class xml_supplicant(object): # This is retained so we can "refresh" the profile if needed. self.orig_profile = profile try: - self.xml = lxml.etree.fromstring(raw) + self.orig_xml = lxml.etree.fromstring(raw) + # We need to strip the naked namespace for XPath to work. + self.xml = copy.deepcopy(self.orig_xml) + self.roottree = self.xml.getroottree() + self.tree = self.roottree.getroot() + self.strip_naked_ns() except lxml.etree.XMLSyntaxError: raise ValueError('The configuration provided does not seem to be ' 'valid') self.get_profile(profile = profile) - self.xml = lxml.etree.fromstring(raw) + # This is disabled; we set it above. + #self.xml = lxml.etree.fromstring(raw) self.fmt = XPathFmt() self.max_recurse = int(self.profile.xpath( '//meta/max_recurse/text()')[0]) @@ -969,6 +975,23 @@ class xml_supplicant(object): ).format(element.text)) return(path) + def return_naked_ns(self): + # It's so stupid I have to do this. + return(self.orig_xml.nsmap) + + def strip_naked_ns(self): + # I cannot *believe* that LXML doesn't have this built-in, considering + # how common naked namespaces are. + # https://stackoverflow.com/a/18160164/733214 + for elem in self.roottree.getiterator(): + if not hasattr(elem.tag, 'find'): + continue + i = elem.tag.find('}') + if i >= 0: + elem.tag = elem.tag[i + 1:] + lxml.objectify.deannotate(self.roottree, cleanup_namespaces = True) + return() + def substitute(self, element, recurse_count = 0): if recurse_count >= self.max_recurse: return(element) diff --git a/docs/examples/multi_profile.xml b/docs/examples/multi_profile.xml index d216962..b741664 100644 --- a/docs/examples/multi_profile.xml +++ b/docs/examples/multi_profile.xml @@ -1,286 +1,285 @@ - - - - - BDisk - bdisk - - {xpath%../name/text()} - - A rescue/restore live environment. - - A. Dev Eloper - dev@domain.tld - https://domain.tld/~dev - - https://domain.tld/projname - 1.0.0 - - - 5 - + + 5 + - - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz$ - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz$ - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz\.sig$ - - - - /var/tmp/BDisk - - - - - $6$7KfIdtHTcXwVrZAC$LZGNeMNz7v5o/cYuA48FAxtZynpIwO5B1CPGXnOW5kCTVpXVt4SypRqfM.AoKkFt/O7MZZ8ySXJmxpELKmdlF1 - - {xpath%//meta/names/uxname/text()} - - - {xpath%//meta/dev/author/text()} - testpassword - - - testuser - Test User - anothertestpassword - - - - - http://archlinux.mirror.domain.tld - /iso/latest - {regex%tarball_x86_64} - sha1sums.txt - {regex%sig_x86_64} - - - http://archlinux32.mirror.domain.tld - /iso/latest - {regex%tarball_i686} - cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e - {regex%sig_i686} - - - - - {variable%bdisk_root}/base - {variable%bdisk_root}/cache - {variable%bdisk_root}/chroots - {variable%bdisk_root}/overlay - {variable%bdisk_root}/templates - /mnt/{xpath%//meta/names/uxname/text()} - {variable%bdisk_root}/distros - {variable%bdisk_root}/results - {variable%bdisk_root}/iso_overlay - {variable%bdisk_root}/http - {variable%bdisk_root}/tftp - {variable%bdisk_root}/pki - - archlinux - - - - {xpath%//meta/dev/website/text()}/ipxe - - - - - {xpath%../../../build/paths/pki/text()}/ca.crt - + + /var/tmp/BDisk + + + + + $6$7KfIdtHTcXwVrZAC$LZGNeMNz7v5o/cYuA48FAxtZynpIwO5B1CPGXnOW5kCTVpXVt4SypRqfM.AoKkFt/O7MZZ8ySXJmxpELKmdlF1 + + {xpath%//meta/names/uxname/text()} + + + {xpath%//meta/dev/author/text()} + testpassword + + + testuser + Test User + anothertestpassword + + + + + http://archlinux.mirror.domain.tld + /iso/latest + {regex%tarball_x86_64} + sha1sums.txt + {regex%sig_x86_64} + + + http://archlinux32.mirror.domain.tld + /iso/latest + {regex%tarball_i686} + cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + {regex%sig_i686} + + + + + {variable%bdisk_root}/base + {variable%bdisk_root}/cache + {variable%bdisk_root}/chroots + {variable%bdisk_root}/overlay + {variable%bdisk_root}/templates + /mnt/{xpath%//meta/names/uxname/text()} + {variable%bdisk_root}/distros + {variable%bdisk_root}/results + {variable%bdisk_root}/iso_overlay + {variable%bdisk_root}/http + {variable%bdisk_root}/tftp + {variable%bdisk_root}/pki + + archlinux + + + + {xpath%//meta/dev/website/text()}/ipxe + + + + + {xpath%../../../build/paths/pki/text()}/ca.crt + - - - - - - {xpath%../../../build/paths/pki/text()}/index.txt - {xpath%../../../build/paths/pki/text()}/serial - + + + + {xpath%../../../build/paths/pki/text()}/index.txt + {xpath%../../../build/paths/pki/text()}/serial + - {xpath%../../../build/paths/pki/text()}/ca.key - - domain.tld - XX - Some City - Some State - Some Org, Inc. - Department Name - {xpath%../../../../meta/dev/email/text()} - - - - {xpath%../../../build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.crt - - {xpath%//build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.key - - some client name - XX - Some City - Some State - Some Org, Inc. - Department Name - {xpath%../../../../meta/dev/email/text()} - - - - - - - - {xpath%../../../meta/dev/author/text()} - {xpath%../../../meta/dev/email/text()} - for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()} - - - - - /srv/http/{xpath%../../meta/names/uxname/text()} - /tftproot/{xpath%../../meta/names/uxname/text()} - /srv/http/isos/{xpath%../../meta/names/uxname/text()} - /srv/http/{xpath%../../meta/names/uxname/text()}/pubkey.asc - - root - mirror.domain.tld - 22 - ~/.ssh/id_ed25519 - - - - - - - AnotherCD - bdisk_alt - {xpath%../name/text()} - - Another rescue/restore live environment. - - Another Dev Eloper - - {xpath%//profile[@name="default"]/meta/dev/email/text()} - {xpath%//profile[@name="default"]/meta/dev/website/text()} - - https://domain.tld/projname - 0.0.1 - 5 - - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz$ - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz$ - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz\.sig$ - - - /var/tmp/BDisk - - - - atotallyinsecurepassword - - testuser - Test User - atestpassword - - - - - http://archlinux.mirror.domain.tld - /iso/latest - {regex%tarball_x86_64} - sha1sums.txt - {regex%sig_x86_64} - - - http://archlinux32.mirror.domain.tld - /iso/latest - {regex%tarball_i686} - cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e - {regex%sig_i686} - - - - - {variable%bdisk_root}/base - {variable%bdisk_root}/cache - {variable%bdisk_root}/chroots - {variable%bdisk_root}/overlay - {variable%bdisk_root}/templates - /mnt/{xpath%//meta/names/uxname/text()} - {variable%bdisk_root}/distros - {variable%bdisk_root}/results - {variable%bdisk_root}/iso_overlay - {variable%bdisk_root}/http - {variable%bdisk_root}/tftp - {variable%bdisk_root}/pki - - archlinux - - - - {xpath%//meta/dev/website/text()}/ipxe - - - - {xpath%../../../build/paths/pki/text()}/ca.crt - - {xpath%../../../build/paths/pki/text()}/index.txt - {xpath%../../../build/paths/pki/text()}/serial - {xpath%../../../build/paths/pki/text()}/ca.key - - domain.tld - XX - Some City - Some State - Some Org, Inc. - Department Name - {xpath%../../../../meta/dev/email/text()} - - - - {xpath%../../../build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.crt - - {xpath%//build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.key - - some client name - XX - Some City - Some State - Some Org, Inc. - Department Name - {xpath%../../../../meta/dev/email/text()} - - - - - - {xpath%../../../meta/dev/author/text()} - {xpath%../../../meta/dev/email/text()} - for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()} - - - - /srv/http/{xpath%../../meta/names/uxname/text()} - /tftproot/{xpath%../../meta/names/uxname/text()} - /srv/http/isos/{xpath%../../meta/names/uxname/text()} - /srv/http/{xpath%../../meta/names/uxname/text()}/pubkey.asc - - root - mirror.domain.tld - 22 - ~/.ssh/id_ed25519 - - - + + + + {xpath%../../../meta/dev/author/text()} + {xpath%../../../meta/dev/email/text()} + for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()} + + + + + /srv/http/{xpath%../../meta/names/uxname/text()} + /tftproot/{xpath%../../meta/names/uxname/text()} + /srv/http/isos/{xpath%../../meta/names/uxname/text()} + /srv/http/{xpath%../../meta/names/uxname/text()}/pubkey.asc + + root + mirror.domain.tld + 22 + ~/.ssh/id_ed25519 + + + + + + + AnotherCD + bdisk_alt + {xpath%../name/text()} + + Another rescue/restore live environment. + + Another Dev Eloper + {xpath%//profile[@name="default"]/meta/dev/email/text()} + {xpath%//profile[@name="default"]/meta/dev/website/text()} + + https://domain.tld/projname + 0.0.1 + 5 + + archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz$ + archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ + archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz$ + archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz\.sig$ + + + /var/tmp/BDisk + + + + atotallyinsecurepassword + + testuser + Test User + atestpassword + + + + + http://archlinux.mirror.domain.tld + /iso/latest + {regex%tarball_x86_64} + sha1sums.txt + {regex%sig_x86_64} + + + http://archlinux32.mirror.domain.tld + /iso/latest + {regex%tarball_i686} + cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + {regex%sig_i686} + + + + + {variable%bdisk_root}/base + {variable%bdisk_root}/cache + {variable%bdisk_root}/chroots + {variable%bdisk_root}/overlay + {variable%bdisk_root}/templates + /mnt/{xpath%//meta/names/uxname/text()} + {variable%bdisk_root}/distros + {variable%bdisk_root}/results + {variable%bdisk_root}/iso_overlay + {variable%bdisk_root}/http + {variable%bdisk_root}/tftp + {variable%bdisk_root}/pki + + archlinux + + + + {xpath%//meta/dev/website/text()}/ipxe + + + + {xpath%../../../build/paths/pki/text()}/ca.crt + + {xpath%../../../build/paths/pki/text()}/index.txt + {xpath%../../../build/paths/pki/text()}/serial + {xpath%../../../build/paths/pki/text()}/ca.key + + domain.tld + XX + Some City + Some State + Some Org, Inc. + Department Name + {xpath%../../../../meta/dev/email/text()} + + + + {xpath%../../../build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.crt + + {xpath%//build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.key + + some client name + XX + Some City + Some State + Some Org, Inc. + Department Name + {xpath%../../../../meta/dev/email/text()} + + + + + + {xpath%../../../meta/dev/author/text()} + {xpath%../../../meta/dev/email/text()} + for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()} + + + + /srv/http/{xpath%../../meta/names/uxname/text()} + /tftproot/{xpath%../../meta/names/uxname/text()} + /srv/http/isos/{xpath%../../meta/names/uxname/text()} + /srv/http/{xpath%../../meta/names/uxname/text()}/pubkey.asc + + root + mirror.domain.tld + 22 + ~/.ssh/id_ed25519 + + + diff --git a/docs/examples/regen_multi.py b/docs/examples/regen_multi.py index 2f92570..bf32799 100755 --- a/docs/examples/regen_multi.py +++ b/docs/examples/regen_multi.py @@ -1,13 +1,34 @@ #!/usr/bin/env python3.6 import copy -from lxml import etree +from lxml import etree, objectify -parser = etree.XMLParser(remove_blank_text = True) +#parser = etree.XMLParser(remove_blank_text = True) +parser = etree.XMLParser(remove_blank_text = False) + +# We need to append to a new root because you can't edit nsmap, and you can't +# xpath on an element with a naked namespace (e.g. 'xlmns="..."'). +ns = {None: 'http://bdisk.square-r00t.net/', + 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'} +xsi = {'{http://www.w3.org/2001/XMLSchema-instance}schemaLocation': + 'http://bdisk.square-r00t.net bdisk.xsd'} +new_cfg = etree.Element('bdisk', nsmap = ns, attrib = xsi) +new_cfg.text = '\n ' with open('single_profile.xml', 'rb') as f: xml = etree.fromstring(f.read(), parser) + +roottree = xml.getroottree() +for elem in roottree.getiterator(): + if not hasattr(elem.tag, 'find'): + continue + i = elem.tag.find('}') + if i >= 0: + elem.tag = elem.tag[i + 1:] +objectify.deannotate(roottree, cleanup_namespaces = True) + + single_profile = xml.xpath('/bdisk/profile[1]')[0] alt_profile = copy.deepcopy(single_profile) for c in alt_profile.xpath('//comment()'): @@ -42,18 +63,22 @@ for e in accounts.iter(): if e.tag in accounts_tags: e.text = accounts_tags[e.tag] if e.tag == 'rootpass': - e.attrib['hashed'] = 'no' + e.attrib['hashed'] = 'false' elif e.tag == 'user': - e.attrib['sudo'] = 'no' + e.attrib['sudo'] = 'false' # Delete the second user accounts.remove(accounts[2]) author = alt_profile.xpath('/profile/meta/dev/author')[0] author.addnext(etree.Comment( ' You can reference other profiles within the same configuration. ')) -xml.append(alt_profile) +#xml.append(alt_profile) + +for child in xml.xpath('/bdisk/profile'): + new_cfg.append(copy.deepcopy(child)) +new_cfg.append(alt_profile) with open('multi_profile.xml', 'wb') as f: - f.write(etree.tostring(xml, + f.write(etree.tostring(new_cfg, pretty_print = True, encoding = 'UTF-8', xml_declaration = True)) diff --git a/docs/examples/single_profile.xml b/docs/examples/single_profile.xml index fb159a3..38e05d6 100644 --- a/docs/examples/single_profile.xml +++ b/docs/examples/single_profile.xml @@ -1,11 +1,12 @@ - - BDisk + BDISK + bdisk archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz$ - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ - + archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz$ archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz\.sig$ @@ -41,56 +41,48 @@ - - $6$7KfIdtHTcXwVrZAC$LZGNeMNz7v5o/cYuA48FAxtZynpIwO5B1CPGXnOW5kCTVpXVt4SypRqfM.AoKkFt/O7MZZ8ySXJmxpELKmdlF1 - - + $6$7KfIdtHTcXwVrZAC$LZGNeMNz7v5o/cYuA48FAxtZynpIwO5B1CPGXnOW5kCTVpXVt4SypRqfM.AoKkFt/O7MZZ8ySXJmxpELKmdlF1 + {xpath%//meta/names/uxname/text()} {xpath%//meta/dev/author/text()} - testpassword - + salt="auto">testpassword - + testuser - Test User - Test User + anothertestpassword - + salt="auto">anothertestpassword http://archlinux.mirror.domain.tld /iso/latest - {regex%tarball_x86_64} + {regex%tarball_x86_64} sha1sums.txt - + explicit="false" + flags="latest">sha1sums.txt {regex%sig_x86_64} - + flags="regex latest">{regex%sig_x86_64} http://archlinux32.mirror.domain.tld /iso/latest - {regex%tarball_i686} + {regex%tarball_i686} - cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e - + explicit="true">cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e {regex%sig_i686} - + flags="regex latest">{regex%sig_i686} - + {variable%bdisk_root}/base {variable%bdisk_root}/cache @@ -107,11 +99,11 @@ archlinux - - + + {xpath%//meta/dev/website/text()}/ipxe - + {xpath%../../../build/paths/pki/text()}/ca.crt @@ -133,8 +125,7 @@ be (securely) prompted for the passphrase to unlock it/add a passphrase to it. --> {xpath%../../../build/paths/pki/text()}/ca.key - + keysize="4096">{xpath%../../../build/paths/pki/text()}/ca.key domain.tld XX @@ -146,16 +137,13 @@ - - {xpath%../../../build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.crt - + {xpath%../../../build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.crt {xpath%//build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.key - + keysize="4096">{xpath%//build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.key - some client name + website.tld XX Some City Some State @@ -169,26 +157,23 @@ blank passphrase for all operations. --> + publish="false" + prompt_passphrase="false"> {xpath%../../../meta/dev/author/text()} {xpath%../../../meta/dev/email/text()} - for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} - | {xpath%../../../meta/desc/text()} - + for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()} - /srv/http/{xpath%../../meta/names/uxname/text()} - /tftproot/{xpath%../../meta/names/uxname/text()} - /srv/http/isos/{xpath%../../meta/names/uxname/text()} - /srv/http/{xpath%../../meta/names/uxname/text()}/pubkey.asc - - + /srv/http/{xpath%../../meta/names/uxname/text()} + /tftproot/{xpath%../../meta/names/uxname/text()} + /srv/http/isos/{xpath%../../meta/names/uxname/text()} + /srv/http/{xpath%../../meta/names/uxname/text()}/pubkey.asc + root mirror.domain.tld 22 From ee653e81f67a42841c86f7797395643001fa1565 Mon Sep 17 00:00:00 2001 From: r00t Date: Sat, 26 May 2018 08:40:21 -0400 Subject: [PATCH 06/15] grrr. validation errors, but i think it's how i'm modifying the thing --- bdisk/bdisk.xsd | 133 ++++++++++++++++++++------------ bdisk/confparse.py | 50 ++++++++---- bdisk/utils.py | 10 +++ docs/examples/multi_profile.xml | 35 +++++---- docs/examples/regen_multi.py | 2 +- 5 files changed, 146 insertions(+), 84 deletions(-) diff --git a/bdisk/bdisk.xsd b/bdisk/bdisk.xsd index e54c4e1..90c6c26 100644 --- a/bdisk/bdisk.xsd +++ b/bdisk/bdisk.xsd @@ -13,7 +13,7 @@ - + @@ -23,7 +23,7 @@ - + @@ -75,7 +75,7 @@ - + @@ -90,9 +90,9 @@ - + - + @@ -105,7 +105,7 @@ - + @@ -180,6 +180,8 @@ + + @@ -234,7 +236,7 @@ - + @@ -244,7 +246,7 @@ - + @@ -275,7 +277,7 @@ - + @@ -306,14 +308,14 @@ + type="xs:normalizedString"/> + type="xs:normalizedString"/> - + + + + + + + + + + - + + + + + + + @@ -389,12 +405,20 @@ - + - + + + + + + + + + - - + + @@ -452,15 +478,17 @@ - - + + - + @@ -590,7 +618,7 @@ minOccurs="0"/> - + @@ -600,9 +628,9 @@ - + - + @@ -614,10 +642,10 @@ - - - - + + + + @@ -691,7 +719,7 @@ - + @@ -700,45 +728,45 @@ - + - + - + - + - + - + - + - - + + @@ -752,17 +780,19 @@ - + - + - + - + @@ -773,14 +803,15 @@ - + - + - + @@ -789,9 +820,9 @@ - - - + + + - + diff --git a/bdisk/confparse.py b/bdisk/confparse.py index ab3c608..ec8080f 100644 --- a/bdisk/confparse.py +++ b/bdisk/confparse.py @@ -12,7 +12,8 @@ transform = utils.transform() valid = utils.valid() class Conf(object): - def __init__(self, cfg, profile = None, validate = False): + def __init__(self, cfg, profile = None, validate_cfg = False, + xsd_file = None): """ A configuration object. @@ -40,6 +41,9 @@ class Conf(object): You can provide any combination of these (e.g. "profile={'id': 2, 'name' = 'some_profile'}"). """ + if validate_cfg == 'pre': + # Validate before attempting any other operations + self.validate() self.xml_suppl = utils.xml_supplicant(cfg, profile = profile) self.xml = self.xml_suppl.xml for e in self.xml_suppl.xml.iter(): @@ -48,12 +52,11 @@ class Conf(object): with open('/tmp/parsed.xml', 'wb') as f: f.write(lxml.etree.tostring(self.xml_suppl.xml)) self.profile = self.xml_suppl.profile - self.xsd = None + self.xsd = xsd_file self.cfg = {} - #if validate: - #if not self.validate(): # Need to write the XSD - # raise ValueError('The configuration did not pass XSD/schema ' - # 'validation') + if validate_cfg: + # Validation post-substitution + self.validate() def get_pki_obj(self, pki, pki_type): elem = {} @@ -99,7 +102,7 @@ class Conf(object): _source_item['hash_algo'] = None if item == 'sig': if elem.get('keys', False): - _keys = [i.strip() for i in elem.attrib['keys'].split(',')] + _keys = [i.strip() for i in elem.attrib['keys'].split()] _source_item['keys'] = _keys else: _source_item['keys'] = [] @@ -108,9 +111,9 @@ class Conf(object): else: _source_item['keyserver'] = None _item = elem.text - _flags = elem.get('flags', []) + _flags = elem.get('flags', '') if _flags: - for f in _flags.split(','): + for f in _flags.split(): if f.strip().lower() == 'none': continue _source_item['flags'].append(f.strip().lower()) @@ -129,10 +132,12 @@ class Conf(object): return(_source_item) def get_xsd(self): - path = os.path.join(os.path.dirname(__file__), - 'bdisk.xsd') - with open(path, 'r') as f: - xsd = f.read() + if not self.xsd: + path = os.path.join(os.path.dirname(__file__), 'bdisk.xsd') + else: + path = os.path.abspath(os.path.expanduser(self.xsd)) + with open(path, 'rb') as f: + xsd = lxml.etree.parse(f) return(xsd) def parse_accounts(self): @@ -302,5 +307,20 @@ class Conf(object): return() def validate(self): - self.xsd = etree.XMLSchema(self.get_xsd()) - return(self.xsd.validate(self.xml)) \ No newline at end of file + # TODO: perform further validations that we can't do in XSD. + # TODO: FIX ME. ALWAYS RETURNS INVALID: + # lxml.etree.DocumentInvalid: Element 'bdisk': No matching global declaration available for the validation root. + xsd = self.get_xsd() + self.xsd = etree.XMLSchema(xsd) + # This would return a bool if it validates or not. + #self.xsd.validate(self.xml) + # We want to get a more detailed exception. + #xml = self.xml_suppl.return_full().getroottree() + xml = self.xml_suppl.return_full() + with open('/tmp/bdisk.xml', 'wb') as f: + f.write(etree.tostring(xml)) + with open('/tmp/bdisk.xsd', 'wb') as f: + f.write(etree.tostring(xsd)) + self.xsd.assertValid(xml) + #print(self.xsd.validate(xml)) + return() diff --git a/bdisk/utils.py b/bdisk/utils.py index 7dab775..a057f1b 100644 --- a/bdisk/utils.py +++ b/bdisk/utils.py @@ -975,6 +975,16 @@ class xml_supplicant(object): ).format(element.text)) return(path) + def return_full(self): + #nsmap = self.return_naked_ns() + local_xml = lxml.etree.Element('bdisk', + nsmap = self.orig_xml.nsmap, + attrib = self.orig_xml.attrib) + local_xml.text = '\n ' + for elem in self.xml.xpath('/bdisk/profile'): + local_xml.append(copy.deepcopy(elem)) + return(local_xml) + def return_naked_ns(self): # It's so stupid I have to do this. return(self.orig_xml.nsmap) diff --git a/docs/examples/multi_profile.xml b/docs/examples/multi_profile.xml index b741664..bb9dcb2 100644 --- a/docs/examples/multi_profile.xml +++ b/docs/examples/multi_profile.xml @@ -4,6 +4,7 @@ BDISK + bdisk {xpath%../../../build/paths/pki/text()}/ca.crt @@ -125,7 +126,7 @@ {xpath%//build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.key - some client name + website.tld XX Some City Some State @@ -137,7 +138,7 @@ - + {xpath%../../../meta/dev/author/text()} @@ -162,7 +163,7 @@ - AnotherCD + ALTCD bdisk_alt {xpath%../name/text()} @@ -197,16 +198,16 @@ http://archlinux.mirror.domain.tld /iso/latest - {regex%tarball_x86_64} - sha1sums.txt - {regex%sig_x86_64} + {regex%tarball_x86_64} + sha1sums.txt + {regex%sig_x86_64} http://archlinux32.mirror.domain.tld /iso/latest - {regex%tarball_i686} + {regex%tarball_i686} cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e - {regex%sig_i686} + {regex%sig_i686} @@ -230,7 +231,7 @@ {xpath%//meta/dev/website/text()}/ipxe - + {xpath%../../../build/paths/pki/text()}/ca.crt @@ -252,7 +253,7 @@ {xpath%//build/paths/pki/text()}/{xpath%../../../meta/names/uxname/text()}.key - some client name + website.tld XX Some City Some State @@ -262,7 +263,7 @@ - + {xpath%../../../meta/dev/author/text()} {xpath%../../../meta/dev/email/text()} diff --git a/docs/examples/regen_multi.py b/docs/examples/regen_multi.py index bf32799..1ead8dc 100755 --- a/docs/examples/regen_multi.py +++ b/docs/examples/regen_multi.py @@ -40,7 +40,7 @@ alt_profile.attrib['name'] = 'alternate' alt_profile.attrib['id'] = '2' alt_profile.attrib['uuid'] = '2ed07c19-2071-4d66-8569-da40475ba716' -meta_tags = {'name': 'AnotherCD', +meta_tags = {'name': 'ALTCD', 'uxname': 'bdisk_alt', 'pname': '{xpath%../name/text()}', 'desc': 'Another rescue/restore live environment.', From 7c0c7bf5c08293f0d5877818a9900d18b9a3bf62 Mon Sep 17 00:00:00 2001 From: r00t Date: Sat, 26 May 2018 09:11:07 -0400 Subject: [PATCH 07/15] gorram it lxml. --- bdisk/confparse.py | 10 +--------- bdisk/utils.py | 3 ++- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/bdisk/confparse.py b/bdisk/confparse.py index ec8080f..39874b9 100644 --- a/bdisk/confparse.py +++ b/bdisk/confparse.py @@ -308,19 +308,11 @@ class Conf(object): def validate(self): # TODO: perform further validations that we can't do in XSD. - # TODO: FIX ME. ALWAYS RETURNS INVALID: - # lxml.etree.DocumentInvalid: Element 'bdisk': No matching global declaration available for the validation root. xsd = self.get_xsd() self.xsd = etree.XMLSchema(xsd) # This would return a bool if it validates or not. #self.xsd.validate(self.xml) # We want to get a more detailed exception. - #xml = self.xml_suppl.return_full().getroottree() - xml = self.xml_suppl.return_full() - with open('/tmp/bdisk.xml', 'wb') as f: - f.write(etree.tostring(xml)) - with open('/tmp/bdisk.xsd', 'wb') as f: - f.write(etree.tostring(xsd)) + xml = etree.fromstring(self.xml_suppl.return_full()) self.xsd.assertValid(xml) - #print(self.xsd.validate(xml)) return() diff --git a/bdisk/utils.py b/bdisk/utils.py index a057f1b..63045da 100644 --- a/bdisk/utils.py +++ b/bdisk/utils.py @@ -977,13 +977,14 @@ class xml_supplicant(object): def return_full(self): #nsmap = self.return_naked_ns() + # https://stackoverflow.com/a/22553145/733214 local_xml = lxml.etree.Element('bdisk', nsmap = self.orig_xml.nsmap, attrib = self.orig_xml.attrib) local_xml.text = '\n ' for elem in self.xml.xpath('/bdisk/profile'): local_xml.append(copy.deepcopy(elem)) - return(local_xml) + return(lxml.etree.tostring(local_xml)) def return_naked_ns(self): # It's so stupid I have to do this. From 0682137b2181fa35aaa4066f838135b2bb53c8f7 Mon Sep 17 00:00:00 2001 From: r00t Date: Wed, 30 May 2018 13:43:30 -0400 Subject: [PATCH 08/15] parsing, but need to finish extended value validations for confparser and then get to work actually making the stuff go --- bdisk/bdisk.xsd | 7 ++++ bdisk/confparse.py | 61 ++++++++++++++++++++++++++------ bdisk/utils.py | 33 +++++++++++++---- bin/xmllint.sh | 2 +- docs/examples/single_profile.xml | 6 ++-- 5 files changed, 88 insertions(+), 21 deletions(-) diff --git a/bdisk/bdisk.xsd b/bdisk/bdisk.xsd index 90c6c26..d06f213 100644 --- a/bdisk/bdisk.xsd +++ b/bdisk/bdisk.xsd @@ -645,6 +645,13 @@ + + + + + + + diff --git a/bdisk/confparse.py b/bdisk/confparse.py index 39874b9..d21df53 100644 --- a/bdisk/confparse.py +++ b/bdisk/confparse.py @@ -56,7 +56,7 @@ class Conf(object): self.cfg = {} if validate_cfg: # Validation post-substitution - self.validate() + self.validate(parsed = False) def get_pki_obj(self, pki, pki_type): elem = {} @@ -82,8 +82,7 @@ class Conf(object): return(elem) def get_source(self, source, item, _source): - _source_item = {'flags': [], - 'fname': None} + _source_item = {'flags': [], 'fname': None} elem = source.xpath('./{0}'.format(item))[0] if item == 'checksum': if elem.get('explicit', False): @@ -132,6 +131,8 @@ class Conf(object): return(_source_item) def get_xsd(self): + if isinstance(self.xsd, lxml.etree.XMLSchema): + return(self.xsd) if not self.xsd: path = os.path.join(os.path.dirname(__file__), 'bdisk.xsd') else: @@ -231,10 +232,12 @@ class Conf(object): for e in self.profile.xpath(_xpath): for se in e: if not isinstance(se, lxml.etree._Comment): - self.cfg[t][se.tag] = se.text + self.cfg[t][se.tag] = transform.xml2py(se.text, + attrib = False) for e in ('desc', 'uri', 'ver', 'max_recurse'): _xpath = './meta/{0}/text()'.format(e) - self.cfg[e] = self.profile.xpath(_xpath)[0] + self.cfg[e] = transform.xml2py(self.profile.xpath(_xpath)[0], + attrib = False) # HERE is where we would handle regex patterns. # But we don't, because they're in self.xml_suppl.btags['regex']. #self.cfg['regexes'] = {} @@ -249,7 +252,7 @@ class Conf(object): self.cfg['pki'] = {'clients': []} elem = self.profile.xpath('./pki')[0] self.cfg['pki']['overwrite'] = transform.xml2py( - elem.get('overwrite', 'no')) + elem.get('overwrite', 'false')) ca = elem.xpath('./ca')[0] clients = elem.xpath('./client') self.cfg['pki']['ca'] = self.get_pki_obj(ca, 'ca') @@ -266,7 +269,9 @@ class Conf(object): 'uuid': None} for a in self.cfg['profile']: if a in self.profile.attrib: - self.cfg['profile'][a] = self.profile.attrib[a] + self.cfg['profile'][a] = transform.xml2py( + self.profile.attrib[a], + attrib = True) return() def parse_sources(self): @@ -306,13 +311,49 @@ class Conf(object): attrib = False) return() - def validate(self): - # TODO: perform further validations that we can't do in XSD. + def validate(self, parsed = False): xsd = self.get_xsd() - self.xsd = etree.XMLSchema(xsd) + if not isinstance(xsd, lxml.etree.XMLSchema): + self.xsd = etree.XMLSchema(xsd) + else: + pass # This would return a bool if it validates or not. #self.xsd.validate(self.xml) # We want to get a more detailed exception. xml = etree.fromstring(self.xml_suppl.return_full()) self.xsd.assertValid(xml) + if parsed: + # TODO: perform further validations that we can't do in XSD. + # We wait until after it's parsed to evaluate because otherwise we + # can't use utils.valid(). + # We only bother with stuff that would hinder building, though - + # e.g. we don't check that profile's UUID is a valid UUID4. + # URLs + for url in (self.cfg['uri'], self.cfg['dev']['website']): + if not valid.url(url): + raise ValueError('{0} is not a valid URL.'.format(url)) + # Emails + for k in self.cfg['gpg']['keys']: + if not valid.email(k['email']): + raise ValueError( + 'GPG key {0}: {1} is not a valid email ' + 'address'.format(k['name'], k['email'])) + if not valid.email(self.cfg['dev']['email']): + raise ValueError('{0} is not a valid email address'.format( + self.cfg['dev']['email'])) + if self.cfg['pki']: + if 'subject' in self.cfg['pki']['ca']: + if not valid.email( + self.cfg['pki']['ca']['subject']['emailAddress']): + raise ValueError('{0} is not a valid email ' + 'address'.format( + self.cfg['pki']['ca']['subject']['emailAddress'])) + + if not self.cfg['pki'][x]['subject']: + continue + if not valid.email( + self.cfg['pki'][x]['subject']['emailAddress']): + raise ValueError('{0} is not a valid email ' + 'address'.format( + self.cfg['pki'][x]['subject']['email'])) return() diff --git a/bdisk/utils.py b/bdisk/utils.py index 63045da..416516e 100644 --- a/bdisk/utils.py +++ b/bdisk/utils.py @@ -77,6 +77,8 @@ class detect(object): def password_hash_salt(self, salted_hash): _hash_list = salted_hash.split('$') + if len(_hash_list) < 3: + return(None) salt = _hash_list[2] return(salt) @@ -630,10 +632,28 @@ class transform(object): if _hash: acct['hash_algo'] = _hash else: - raise ValueError( - 'Invalid salted password hash: {0}'.format( - elem.text) - ) + acct['hash_algo'] = None + # We no longer raise ValueError. Per shadow(5): + ####################################################### + # If the password field contains some string that is + # not a valid result of crypt(3), for instance ! or *, + # the user will not be able to use a unix password to + # log in (but the user may log in the system by other + # means). + # This field may be empty, in which case no passwords + # are required to authenticate as the specified login + # name. However, some applications which read the + # /etc/shadow file may decide not to permit any access + # at all if the password field is empty. + # A password field which starts with an exclamation + # mark means that the password is locked. The remaining + # characters on the line represent the password field + # before the password was locked. + ####################################################### + # raise ValueError( + # 'Invalid salted password hash: {0}'.format( + # elem.text) + # ) acct['salt_hash'] = elem.text acct['passphrase'] = None else: @@ -873,13 +893,13 @@ class xml_supplicant(object): return(cfg) def _parse_regexes(self): - for regex in self.profile.xpath('//meta/regexes/pattern'): + for regex in self.profile.xpath('./meta/regexes/pattern'): _key = 'regex%{0}'.format(regex.attrib['id']) self.btags['regex'][_key] = regex.text return() def _parse_variables(self): - for variable in self.profile.xpath('//meta/variables/variable'): + for variable in self.profile.xpath('./meta/variables/variable'): self.btags['variable'][ 'variable%{0}'.format(variable.attrib['id']) ] = variable.text @@ -976,7 +996,6 @@ class xml_supplicant(object): return(path) def return_full(self): - #nsmap = self.return_naked_ns() # https://stackoverflow.com/a/22553145/733214 local_xml = lxml.etree.Element('bdisk', nsmap = self.orig_xml.nsmap, diff --git a/bin/xmllint.sh b/bin/xmllint.sh index d9ff037..525d62f 100755 --- a/bin/xmllint.sh +++ b/bin/xmllint.sh @@ -1,3 +1,3 @@ #!/bin/bash -xmllint -schema ../bdisk/bdisk.xsd ../docs/examples/multi_profile.xml --noout +xmllint -schema /opt/dev/bdisk/bdisk/bdisk.xsd /opt/dev/bdisk/docs/examples/multi_profile.xml --noout diff --git a/docs/examples/single_profile.xml b/docs/examples/single_profile.xml index 38e05d6..02a51b4 100644 --- a/docs/examples/single_profile.xml +++ b/docs/examples/single_profile.xml @@ -43,10 +43,10 @@ $6$7KfIdtHTcXwVrZAC$LZGNeMNz7v5o/cYuA48FAxtZynpIwO5B1CPGXnOW5kCTVpXVt4SypRqfM.AoKkFt/O7MZZ8ySXJmxpELKmdlF1 - {xpath%//meta/names/uxname/text()} + {xpath%../../../meta/names/uxname/text()} - {xpath%//meta/dev/author/text()} + {xpath%../../../meta/dev/author/text()} testpassword @@ -153,7 +153,7 @@ - Date: Sat, 2 Jun 2018 01:40:14 -0400 Subject: [PATCH 09/15] committing in some prelim stuff for cross-distro guest --- bdisk/basedistro/antergos.py | 1 + bdisk/basedistro/arch.py | 1 + bdisk/basedistro/archlinux.py | 59 ++++++++++++++++++++++++ bdisk/basedistro/manjaro.py | 1 + bdisk/bdisk.xsd | 51 +++++++++++++++++++- docs/examples/single_profile.xml | 8 +++- external/aurman-2.9.37-1-any.pkg.tar.xz | Bin 0 -> 89404 bytes 7 files changed, 118 insertions(+), 3 deletions(-) create mode 120000 bdisk/basedistro/antergos.py create mode 120000 bdisk/basedistro/arch.py create mode 100644 bdisk/basedistro/archlinux.py create mode 120000 bdisk/basedistro/manjaro.py create mode 100644 external/aurman-2.9.37-1-any.pkg.tar.xz diff --git a/bdisk/basedistro/antergos.py b/bdisk/basedistro/antergos.py new file mode 120000 index 0000000..3d58414 --- /dev/null +++ b/bdisk/basedistro/antergos.py @@ -0,0 +1 @@ +archlinux.py \ No newline at end of file diff --git a/bdisk/basedistro/arch.py b/bdisk/basedistro/arch.py new file mode 120000 index 0000000..3d58414 --- /dev/null +++ b/bdisk/basedistro/arch.py @@ -0,0 +1 @@ +archlinux.py \ No newline at end of file diff --git a/bdisk/basedistro/archlinux.py b/bdisk/basedistro/archlinux.py new file mode 100644 index 0000000..15d20fd --- /dev/null +++ b/bdisk/basedistro/archlinux.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3.6 + +# Supported initsys values: +# systemd +# Possible future inclusions: +# openrc +# runit +# sinit +# s6 +# shepherd +initsys = 'systemd' + +# This will be run before the regular packages are installed. It can be +# whatever script you like, as long as it has the proper shebang and doesn't +# need additional packages installed. +pkg_mgr_prep = """#!/bin/bash + +""" + +# Special values: +# {PACKAGE} = the package name +# {VERSION} = the version specified in the attribute +# {REPO} = the repository specified in the attribute +# If check_cmds are needed to run before installing, set pre_check to True. +# Return code 0 means the package is installed already, anything else means we +# should try to install it. +#### AUR SUPPORT #### +packager = {'pre_check': False, + 'sys_update': ['/usr/bin/aurman', '-S', '-u'], + 'sync_cmd': ['/usr/bin/aurman', '-S', '-y', '-y'], + 'check_cmds': {'versioned': ['/usr/bin/pacman', + '-Q', '-s', + '{PACKAGE}'], + 'unversioned': ['/usr/bin/pacman', + '-Q', '-s', + '{PACKAGE}'] + }, + 'update_cmds': {'versioned': ['/usr/bin/pacman', + '-S', '-u', + '{PACKAGE}'], + 'unversioned': ['/usr/bin/pacman', + '-S', '-u', + '{PACKAGE}'] + }, + } + +# These are packages *required* to exist on the base guest, no questions asked. +# TODO: can this be trimmed down? +prereqs = ['arch-install-scripts', 'archiso', 'bzip2', 'coreutils', + 'customizepkg-scripting', 'cronie', 'dhclient', 'dhcp', 'dhcpcd', + 'dosfstools', 'dropbear', 'efibootmgr', 'efitools', 'efivar', + 'file', 'findutils', 'iproute2', 'iputils', 'libisoburn', + 'localepurge', 'lz4', 'lzo', 'lzop', 'mkinitcpio-nbd', + 'mkinitcpio-nfs-utils', 'mkinitcpio-utils', 'nbd', 'ms-sys', + 'mtools', 'net-tools', 'netctl', 'networkmanager', 'pv', + 'python', 'python-pyroute2', 'rsync', 'sed', 'shorewall', + 'squashfs-tools', 'sudo', 'sysfsutils', + 'syslinux', 'traceroute'] + diff --git a/bdisk/basedistro/manjaro.py b/bdisk/basedistro/manjaro.py new file mode 120000 index 0000000..3d58414 --- /dev/null +++ b/bdisk/basedistro/manjaro.py @@ -0,0 +1 @@ +archlinux.py \ No newline at end of file diff --git a/bdisk/bdisk.xsd b/bdisk/bdisk.xsd index d06f213..62f8b3f 100644 --- a/bdisk/bdisk.xsd +++ b/bdisk/bdisk.xsd @@ -502,6 +502,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -648,7 +696,8 @@ - + diff --git a/docs/examples/single_profile.xml b/docs/examples/single_profile.xml index 02a51b4..0692bb1 100644 --- a/docs/examples/single_profile.xml +++ b/docs/examples/single_profile.xml @@ -30,7 +30,8 @@ items. See the manual for more information. NO btags within the patterns is allowed. --> archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz$ - archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ + archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-x86_64\.tar\.gz\.sig$ + archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz$ archlinux-bootstrap-[0-9]{4}\.[0-9]{2}\.[0-9]{2}-i686\.tar\.gz\.sig$ @@ -76,12 +77,15 @@ /iso/latest {regex%tarball_i686} cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + explicit="true">cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e {regex%sig_i686} + + openssh + {variable%bdisk_root}/base diff --git a/external/aurman-2.9.37-1-any.pkg.tar.xz b/external/aurman-2.9.37-1-any.pkg.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..d0cc1aa36de11bf44f3ed2d24796eb8f4113a516 GIT binary patch literal 89404 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%0D=PRg_q3OFulg>g=!eYdBG06jSV~Ht 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 mW&i@ksh_CXggcWE22$BN+Su literal 0 HcmV?d00001 From 4ed9ef5f5fd694041449a5fb97d934e55c4075b3 Mon Sep 17 00:00:00 2001 From: r00t Date: Sat, 2 Jun 2018 02:18:31 -0400 Subject: [PATCH 10/15] d'oh --- external/aurman-current.pkg.tar.xz | 1 + 1 file changed, 1 insertion(+) create mode 120000 external/aurman-current.pkg.tar.xz diff --git a/external/aurman-current.pkg.tar.xz b/external/aurman-current.pkg.tar.xz new file mode 120000 index 0000000..0c09e99 --- /dev/null +++ b/external/aurman-current.pkg.tar.xz @@ -0,0 +1 @@ +aurman-2.9.37-1-any.pkg.tar.xz \ No newline at end of file From f677839194b80a0b7265d488eba867391358d7fb Mon Sep 17 00:00:00 2001 From: r00t Date: Sat, 2 Jun 2018 02:20:02 -0400 Subject: [PATCH 11/15] gorrAM IT --- external/aurman-2.9.37-1-any.pkg.tar.xz | Bin 89404 -> 0 bytes external/aurman-current.pkg.tar.xz | Bin 30 -> 89404 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 external/aurman-2.9.37-1-any.pkg.tar.xz mode change 120000 => 100644 external/aurman-current.pkg.tar.xz diff --git a/external/aurman-2.9.37-1-any.pkg.tar.xz b/external/aurman-2.9.37-1-any.pkg.tar.xz deleted file mode 100644 index d0cc1aa36de11bf44f3ed2d24796eb8f4113a516..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89404 zcmexsUKJ6=z`*kC+7>q^21Q0O1_p)_{ilncI&6LaKbApU*saxcLv7_cUPjI-6});o zwSrQQ@9$@@@oMR=`p`XzLz%l>@XL*!=nfYJo2CCxFHW=&Q<-n3*7$HEullSMr52|h zMN=w$9Q5KImbpn-?{-yi=-}Ij7$7ru6!G zZVy6SS*EDoNiejz84&d0^P1@Tg$tAg}+f&OXlYrr&Wfl zp0(XHpZM?OhntstJ@U5f@y`AC(V{9NDEIrJl(p?SlNl$h$Vsb|5}UkQW}EQWt=pDs zZ+&iQa^jwds&4x&$M@G2Hk~d`Q#@>OdYQ^Z!He5hYtGreEZW?Z>nOuj*RK_#M`OEIoq6YA z8vSm5-n7P7_D7oZUIpvV^fRulE;DV;`LXwQ;0izY(@n|-FSRQwEpOy}Y`Nt2;o0)I zrPt47SG@FDov~8yb&C9&>a$<*U7UW_E)8|KCCqC!U^dcg;?s;Ed3!I|f0oThDmz-qOLDV4cZYXL5b<l3cNxK-NT;^lsEL&5(hwQjz=34&W!cxw2V{ZNy&GMae&%TJ{%PkI+_ ze);!Qo{-Rf3;5Q@8*9nU99(N=`Ypajw{tYCMWmUO*_1)y2na({iNObJNSQ` z<2QMIEzY%^^PX&gLX_{^Xz`cv&EbIx>WefOcx>dO7YHPM7O$FXQTa*X))t!`6ARxS zHk1sSBYl|brN;Zm&OJ$YrB5#qEUAArUvP7L+vj6DcV08n{P1t%uU(A4+5R!}uWr@} zcQ~^BaZpg}{?fJcMRXr*+V%F}mGdWe^|l}AKKJzd-P<#bjMBf{d#x-M{>t&wMIXN> zOtPY8`!5^qS}0~v5&8G*q`5&C>wChwMD0?&8Xix%n-v&PXyTGrr#xFcZbqK#ysxX+ zL#78yulchxl}Arjv)Gh^p0vCSXRxMpUWsUOnP5FF>0z77Vto2q%_`NLf0C&)a zS=#*8YIEjx8JixljrM-2S6AFCzf@3f!kqIq=fYFgyK*qr&a&F~W5z;;^K%+Kj}28Kh_aSmWouZ-Q{hP66>X5j}TKZp=9O_;HTHDU~?h`pS*V{%rf5^&zTFFJgfs z&&>|jC^ricdAAQsTUApS&PRl>wigvk&CYHvUO!Rz{MpwhIjar!wm-Ksp2QJmeLcm3 z?_#msyX~hpyu5Pw|BF}4C0iDBmu5WN*I9UNqJZ@o@0s zzpdt56&ga0a(&+t!O3Masj#{IuH~uR>2GYVy2~GvzFt>!@XDu}upp1zmsjhZd0Uds z3Nu>HY~9Xt^!2N92iLaT5#*D;}>UnXHQDqGuct1W$x+E);+6c zTr2RNezfRx|9@M#WcL*o)7~shnQ!+uCQnkyUQ*vEz_OsRZ2tCVL0@C%FHhaXF6of& z&-|RBo-tsaUboV_DJQ-vy1ce%;h%iRXS2VPRo>$@_6}_s9`#?R{{NaJT5UURTU5j! z)n6Yb1e|r*mbHpQb@N?u-Wipq+p9BP{iw)$r_5RSJ1PbGT<<0bA$P;4HhD|+&?{z_ZGg)-SDME zbjs;^OYtX9pZjc|vQF8n$*i>4b@O8hYwLagZrHsO=Jvm?uB*6pb$nioQGIUHCiA`N z$AZ>&6-x4#m9IN$F!N>BqnRwE|_yd~V7o9oBh+)tCI z@U)$9xLi@{qV{>xxyF-`3oQckMBn-gSD5wg*I--9_(S}Ic>HQvBj@uk^*{Gyg|pq3 zzO3Uj`vSj%7}HYEYpN;&8$Yhv+MaglP~h%J-i5!e=(G5(pBA-Yjrr0=>1Lk)8ueVK zUsz)JyLqny@AU3!OP_+-J)4t*Hvi1+@VkCV`{n_@DBG*8Wyc*`l(|}*rp~JLe0zKM zJC98|B{Ij)Y!QDd{yym2gtE3mBe&ED?@+!^7NuAEmQAqdsc@K^cbBo`al7&g>&R)P zn%vR`g=a2{R96a?DJA)y6E?7|Fu(JC!}cb*A8)gHrL_X$rAz;9{!ro5vsis0$AyB* zFR5mn0UTV4^Y_307I#rEw=ip!kYjP~4_oknjz2_pO^uZa1LN_{;Y6 zi8&`{aI_tp^?B-~@M7mTJ-c=}e*AMZLyr##;+F9Rxk%Wz!Z~nd=u3kq?S#FkHTB~+&aX{|xI~(q*nX2<> zcz@Zdw`kgjgPlE9H*c<5dcpHc<1Xn-2GU=i*RE_%lXCgEa%WAaoQ&?3ZS29t>@POO z>IqH%oUF(#yHU?2V@Hxt;+K!kA8$<2PWg8?-b(t!KGo^x>^&P)>t{yX3@YrL&mg^j zQn^+!o2BXV6?Mu}C1zx9nh_E=o-rLY&oO$hof5FjaWU%0?gL{4;(nXMgIBYEqhrQCPb>dzg1We=W2d< zS#9G@v4Ugfn@c_GS{9tVd}Q%G`3>c}X3u}{-QV3cR(SV>ndQIMTI5N;iLL(KE__LN zZ^OCXla_tgHU#_czB?@_(e6XL)t^Jl=Cn_fNK`iXTh8pf{)@qNRhw{8!F6)!{ca1t zpATqYEc)Z2^FHk77MCdkk7U-|o3^>=q{5R$e>S~-D46g1hRaRmvW~S&>Xr@Px27Ff zv42aLt=0Dfk4i0GM^vs zOq^o&yT9*S#|_gTv-jTm?_hLu%lzb|E%h~zI`+Mq>+w5msm`0iRkeL{ISp3(oBh1~ z(PGj(c?+fBnXl)0I81olA@;>}iSD)hooQDR#ZI!CDqMV~vR-M~561RL>w>QO-A`GS zct;g&9$>wO6Twik&B&L{JDM? zQkqVAE~{5pFcbH7^;sm_!QYs4W_h2WrpivG{%^~RFBQ01ZqMam?%dA(-c?q2!I9)| z9BoEE^A2qAwq5x%q2@urtQ)P9H*Kp(-hD^QYencpf>9@2iP6a{e9dUnQ%y%OAR(crpFwUEP)&aWlEU z>3t683z}ZY@ubjR>{n>vP2tWP`8)nUpX{J@#6!(m;aDqEWQphbYk!X4{dN4C)bGEV zYT@=D^;f?CQocI<-s3;@yBBygL_U?v+&}-TfwrH81t!Oj*rsw?)e>8UG1h`y40>UyvJr7 zA5^_L{geOE=RGW$f+yp6s^97g&RK57(aG-cA@6q0!kecOB=>~Q-Ro{^z+I(rx@E_Y zk8ZI(_cV*XmA~kU{A0l?+?C7ne0h<||2sSv7r1LW{@;>#QlIe*qxQP&Z*N1^=n3TS zS#bQ4#*a^*lze^8FZ6o*bb4?1#{78`ol-V^)p9>`UvGAag@Vv&1<8+kb^E&R#+=l3 zitF=^ukQGgd(D1feAo~7w%W5+X{)ZBx9RykZ%K3DvRTfD|HpWo+}m`cqG#q3qs%wb z{IVq~S8Cn=*(X@Y)I61Zxxra~jzd+B%IWxzTi3KdGzu^LEaG~7@;1)5b7!tqU%|X< zOHkB{C^P@cn6+m=NG^4HXE1r9?5_7mjLw>N-mf?ie6jU;#f7uJ$642Xxbsf_%;^B$ z8DBmYZIrovZ2tlePY$;adltV`yYltXE{#Q}@ z<=>1RJnmz)+RQQI;FR)5cYZ|9Su-nY{|>R-M}?a0uX3V=Vh!}RK03`T#{Vw&%#Cy3 z4DCEb9HaTQ&T1$0+>T@^x=i#%%vPF@?|1Jd4&J@H(W}C1rkizwsM4sqCt3M#t+NXSYu3@|QK@>oi>R zJx8NzVsMM+%Qe@RZSa*<`$-Nvkvb% zzs_6s^vttnDNCNlOFul!$xyPqY~qHlbSdfLl^6bP^j=iAVYX_UY#Z0kI)oyD9ZW}t9{kr!dd|6JSK*fXuB22rs@5z2&Z|1$xHZaNmgL>`S zZ(GgUQ?sWORp`|AroK5HD#zl@@+s%4|9_=~pO2p1J3e{-g`-c?twegx&Drp1=h2G1 zVn)Z8ar%8s$$oyPn&obtWEXmCxqG*5>)R58?Q9tflHPxG-11eZ*7%fU#|>KxR)xsR zZHu@6sIWe;xk$t|zMA{!#B)n`uf1JTyl@)t(*+pK&UxX?fJhg1^3L;vzHPBVK=pYLnFoc{39ZQb8PVrQl-Td?|i z%KH<-Q`=uAO)2UB>YMypnDNJ+Kb-dhzTfmeBIuBzq*m&1ynA&<$2*lH5jSI4%-ywHYO~89^j20qXkwTfl3>aE$$N>1waS#e zZN3xcNgPvKx>aHm*L<(vdYTdn=^bKWk6&|NJUS!m?g=@msLaD3T_<=x&|9G8Ya3y3 zE}QkpEVr160gJxgNp5mAm~5L>uQm6{-AhT)FNHVSMjlR`w|r-+&TRg>)3suMCmrJ0 z`SR88VhirB0?UTD*_C^)_%~=x)>?L?C(NR5Lsjo$iRwqQWF}|kr~U2K->ErmtGL`2 ziLz$<*&R*Vd54t}=WZ(az4OSvw|OyA60*l^jlcRl$}3DdG%=@dc50Mwl*#H7b#cOB zUyO8r9kZ;;H2o)O6*_UF%yW`mq{W~A zpT3?})C>Q4_-SbKX*I<~Mp8$Y24~zo7TZ~I>+inK)4x04tQTB=a;jIUO8r7%uG6#6 z#-7&`d-YC9G5fXzgN=ci)c=S657qxH^H}?)a!s1fbDlp7KfYhB@ZR%H;O`0itPkoV zra6>+kKZSDcJHo;#_~g(PxU@tAAC;0^H|DawVT!#*FKTzS54aE5*PO7@UPicZ5J|c z8~>VDn{&;|>PpCCeS!Ml$9DD`PW6AZ^~|cb1{FMF)6^^C>op!5E%ZoKk#S)BA3yEf z%A9h|c^hXOJh}9O&+X`R<^O#zlslFrPPd-X?6+9c@z}ekX)h~#3mvB`Ihey? zv*61`-sENF>-OB9+w0^ww033K_~e~N;sNIimp`5>w(HRB2?d#lZCm&P z^L}lf+~>E!+e6{Sf*Y-(2}gey-n;5|-+qhS1phl7ov+$#jBomu?%n7Yf3W3ftk<^3 z!f{dsJ7>Pv)n;sYW|aEspZ2P&8?PH2XuHY#w7>V(>HXKjo|tj7`Paw&>i8yUo77(M zIXWb7zTNA<8NaVG>{2bZxU~8cx5CO(4YiBICZ;@jsXS|25`XrVTkW+b#<^)BD(hb} z_V%8*#FX)W(_~vgla)eu|8A?E^EF%R$nK9@_9iNuZZlgv-{JjME_>^gh_E9^%w{Lv zY1quY>VV`sjWaq1=Y?ndwz*$*rTWy3pg(goO9PX*&3$)Deg6BSDKVjI*7I|F@~?+6 z{L2#D&GGVTx!?Nh*PhLyToO*F>s`i18hZ1;f zOK$l^eAr`svSA^E<-Uj@hAjafCn!01l_`IppP;GucVFYuxiv+f#4kHeP(9cA)uA`> zpTGxA18sx;=-6`m^3;y0*OhTl3aQ-@1Y4-oyU~)oiLH7o@jmHQd-6r^^oPxtlL4_7vq{TkI1wc>ipuff59pyk+%U53K87$2gYVu??u2|LK+dIMDdZ)4B zRpFJAjEh-U9NMS-z&~_%-&t$7{n3T{8g_qYwaf84xAb$y?A3ijS-T4y?EN->dA4@d zyUEu|MIU^>Tofdg``l7n`!27vm)fieKZ6tJUh6q_;GK8FC*JK6^GkG=C_v?3C zD>+olm(Fpm-;tG}l|Fgz;^S|VkIwrZ;(q4yqjie=+uvmFnVG-+QOM?+rImg^S=Sx^ z^J;^1_O08$os!Pa`T0u3^0JenruTLgfu^5Z|EDe3xyHG=Y0ssmtwL9qUpCX$yXG`a z+bq)ND*JWDmm=0{b{)q&Dfr|yY9WpDvkZ-pLvuw&i=u0;#Ks<1$*Co zH4VN~r|TvEx6^8geZ(Q9{^{A}yeZMsv-%Y+pEFGQBQ14e zZ@pDW`vaw^H8J96?mC>?nyq^E^#6M|Rp%8*O`7M;Rq;*x>e`>Lj6WpY4GdT{QBQf} zF&>v{_f3*tzi{$2nDE)<-jTZ|+y3Q}^!1(0i3%-0=5OV``%AQK^3#<(2gQ8@%<7e8 zJKXxO@jA9#xW>RNSM~PJ{}jVAZ_6bsRElR`@sc?BJKkbKfIc@HSIix$o}9l=^VBya zTwUFo&-PV(WBZRC0bAAo+El~YcO-2pN6Wb)7xII&o*H~+tXB@ zZ}%#A$GYUMFJt}OF8i}BZWoHUc6{J{x?=h&Jr~ZVELC;|hohH{?=0s#{_bsk`rVkL58j?|d**B|{kX^T(^{s_uXrP`|No!+3l-&Ha zl3_9LRr$(T>icH>@!)6C-1d2aSxeG%2jznJhJCxm(|m;cef&RWDJk;hWL{*P)Ia}B zi=_5Jjffm96od0em&3k?{xTQW7%g#6k96X` z>E^2{##@z3X8i(K|!VO2bT)R0%5_hN9@)9W0)Tg_um zua0`&apAEH_pOd4_Puep{>=5sUBM@`sz~xzeeHqeE6=|+n#nPRF(Cc8?Xrmd*RA6J zEMdP?prGT)E%mCgqvCkm(zS(0Zudn#`SeJ+o$Jc&$n|I9r?0$Lv?#wDEWQKO$A9Ty}l@ENkQcxw2C@l;h-*OOf-IE;vzSQX*OUxuNt|mAv52NL%Nre&Z7kxgg{IjbTl6{U6ej~mSO@cZ)upTLo`u;yt25j6 zuD5R9<_+6VXA6G4n|1SGV+YTvl&?ZJR{N%TWC|~F++<<3IP&-Rh6SP@*_?iQygno^ zCuq2}zf1ngvnH-hK0kMUuryGs**7<-p;PR6REnCB+NEFGU4E}TQ`b1WW)$J%)%9td z7yi#{1!FPyc8OPc?Nv6ZUAI(UL}paZuyirB-k7)k(bJztY%~5ZZs9+%#n(cTt&fFI zcUs8Q*^5>`T5Q;sFgZ@jR_qK%($}BP$op2(c6`t-iV{`~JR}2V#n)ublTWs1|(r`i&{G){{RkFU^aT ziSd-5Eo!s9QHMEb8qbGMe{-6y?Rs3W!pm}RqR3L2f_syq&elzLFMPJtQ<}kOY3;$L zSr=z5>rCM>nd@=wq`)7&HIu#{)tWgaev;RzV++})pP0A2_2w+Kl$I52HhE3c+nld# zns}il(%la?1pcb@vXPFZ^k&`1;cl z&FGW1J`coAGPW$Zo-A=Kd-LB_g{@ayBkxDQKhJW@M=wwEthuvtlGLlR3oi~!wRl|r zXLTlPa@M7}hdL*3=6mm&=xkzqe&TK(wVJ&bdIWeFeSe)TJhJ58u@66_F77E=$~Q zX|*N!OwkWdLHU-GCz{j0=>D|ta?fyLo0Ro-*@uUhGm3WFop9)uKE%WJh|ylDRyyh5 z@pZp%OP`zf?QL@J$Np!>iy2??S|vSrj~NWi>jx=+!TU>x*O)0~kW4OHE!q z`O0>Sk1w2ig7|*3`&tWm^oiW9p1fpTP22kMHZz@2_?o`^k~3xa`&z>mU6J%htsw ze*fmCUjC#hXWjwz!c`Z|SJgUjWzFAMAQ3##{hUuR>m#-n*L})UmUh*tOK-8$yzAdP z|9*bK8}o~4&kI7_L=Il{epYzT3lV9}Xs2G-|x~TT}9tn?*$XRU%_}>cmr-yAmDckGWTGN{pA( z4}Oue&xA#MdZ6v=fB({UITaq+ZM4VkfS&DaN3MCnDb=p)bssHS^tt2e&eXEa$qT-& z>#S;W-EzQ6Ip?%ikEdbWy~WEn@a-<1De=39&E!V)V-+v!Kh0Y-R_iAx&nx*?Zobm` zfZI*K*M8-n-reG1X*exc-1L2d^7h{!g6kQAe%WYFUaa!PTViv=y>G7$#N`#&7;?T- zZqO{eBqrwkW{T{ejY}rqG5(@vQyAQnSP}g$f6{raw(o&Y9D8h~B6e)l+TecB!M{UA zd&aCf{@a)MEqq(gKYd^1Vg2b&VN{S=D*AJZ}OgQxPz z_-E#S4sFh^mQ}P8d2Rgs#LGR?RRm-m#Zxwk99607_MEN~^g>NWK49@_7vW3ibym;q zTL0?br7Qb$w*-|6&t&pSWaarRzs%lY*|nZ!^G+P{_Fp}_LL^@C;+xKO*Ms{*ez0tP z#1S75(~|06cl*qi?I9dhb(XIz%gX=run8Y!F6nG>KAMtQy7GdtjlFulNS(p+vZl3* zMRN`(D!uq|ZkpWV#yndXU$t;eU17?^9y9 zpnWJS&%}@K7C5`q+{i7TA6RqZa#oGa>)vD0zH^lV-fojT>=72<kc-!bww`7otp*H*1{KPP?Nv5I3~ zxx@GW-vo4RC$C*3cGfBUn{3BC(H#s?=M%0lR7Sr06W|uW_Bbo};y3-?<frodVO^K;xrMpQqCU&c z{N#6Z`|j!LVFB4y@jqT`Snb!fnQrOpbYZQ#o1?;{ina^Y5ot5(q_!01SOuE2?mu0! zHRbar!-TbwsXj%MH_6A&xcE%|tJ!k#z=E^W8SIsg=2^3-JdJQlusFPC_B_7KPIb1s zict~kxc*93C#?98;rqh;{egR3AGVp=csEGdd)PDF_LvejIVSbwsU_Z(T734Vn*(ls z)8GrbQR=+^&dj!(3_M-T=K@Yutv|?SWwq_Z?EN!1AARWyNDI%rq_ZM2?DlV+r`${jCC>BI!}fXB#w(FbzIT3RJ)V@O;p%g=&Q<#N=>XG1v5nvMU9w?jNqhEd zX+nGL!}>hSsJ7+vnB{(-vz$gn84`=6A!YOLhqAe%W`++?14&i3f4n`8Cw%+))u-KLcq zU3*eD#Z5zYRnbh}-)C9a7hdW-V&T=$#Nr~NofLZBbdux0BX_0PS*}hfoLa^7xNBjv}yBtrLM3wJPd6tmsd5`uOkn-I zx%%zt=GEVrnI*5E+f)_lkIQ|m-3CfIqW+w+Ice$t8?VS{_^{tT zA(FNrkXxYmR%X#pyG!k>Q%f6HXT~rbU1Oci!{#I4kR7hIfu;)>dwNKu?x?U%TPv}mFPH1J^ej)R;P^O^xDdbuJ*IsrT@qb$vFqjy^>S@%*{^KJ7;62vfWnA?atlf4__xd z`8_+?LG;4E(>xbSSeZ^Q{`{l-;-A2cubLkEB;GIc{9^jqr*Tc!K_mX&gyVe;w+>0T zd*87MT(|qg%m8Wkucl?E&lk?0^50jn!PR?C=?8Y%SeZW(S$ek~)WyHh%CCQM_+r?J z)4hKf4{S7_d(o_Swpx(etfhOd%@s|Vef{TB#b2+oe_acE(YC_vT1e-;rTG%fcD{L* zS6mhM@wIc`xUD~>kXfg3GNz40o&6-_RL$&;H+b@HufeRnPVB zp(qol!>aBd|9v=i`p`xnyY?`JQb8v1T^}{83U7wFeLD8(SXr&oA7LwRK2N4&Isdu- zn7GtSTV8Ee@GT2x6rDKv_}XCU#cCVPKRwGgzpM5!?^VCo)PK=y96~tVSE`FFIpD!_ zr!DK;`@M2TEjM)MR=?l#bN{P53zYsoSY~*~#-w~&MAAL)ocnUw=69oO=QU3X4y_b- zly&`CU+3&}cT+pVZ?)Q=vs=71`4!dIo+ylU{rb#zrR%XRX|Ly<$vk>))6%2cuW#JO zI{$|5@uM=nngWHz7nNH$ew@|acQV@0&~}c_gYS7;tgBAyzKmB1&oSfW+IG||HL=rd z^`g*ob>%Zo|GK%hTDj98f3heuW9Vnge>X&vGf$?gOZcmvS)VHT<1csWCzgu~Z@9?4 ztvs{fiLLIXFOhkV?s*v&#w_qq>-aETC-t*F* z$@jDJ_jZMiS+o1!Zv1OezGz?SG{tZwG4a=D@^`8z7=?bmrNGlTVWzjZ9Q*SXIsR|I z^4SL#2&6|fUKUfjnQ{4{;Je=2%ujRk7O|Bi%Er8Cm~5hE0Zn(=V}4hmUS} zxpkd}s$95ap@K~E>qnDUDg8`YHKS<%JH;ZgKU19(jf@vqOENvop2?YO$Z7Qdqw4or zb~?YNXmXvCl*u$t;pnM9n)*0!dA-;gq03_3^#Tzd8Iz{IR=8gov0(0NPe<0v5sJo> z979<>ny)rEOSo3K86rSFQ zncMEJyW022tiLObT!Q zT=8wT@;u?$vwlfDohi3|j$?qH;%uS*-e#6v?X!foy$oJM4e*Iy7rY7 zm(6kc+9Gyrh0%$!rC)Va6>Xbx*MH#lx>-}A-f5@RG;x}cZ>WgJzDvUEw-?1cx-Yuk zi*LoQmGY%8qVHGCSbU(#lV$VNJR`mH^ZfMBFv-U!)>v%*>&@VL;6n0Q0Xdsgr*EA( zEQ{Vct$!(NZn=5K-2&$~Pxxf~oX#{~KgM*1VW!B2RR+74*3Zs<=ka@2Ov$H7dw(tK z`I&NWc2rDqKKd;u?f;(#e`<}~mxQc6>N&l+F7n=%gD)rRx32zQ z6sPFLKJQ1qTl3Cv^`A5L-`}d5`!VEl(dG+D$0J?jU02+dTd$U#x4`D@%1PZxPOY5N zl5_4%)S7X2lT;K>U6&cdiL7~I6N7(Tdw#7opkyQK`*TvNn>~zly#+7m&s16d&H9O- z#iFN&Q#YiodSib}kyq_7!^20RoyXYNnhH1cH1icwL>(?J!{wQLu&{3J1o<+qP8MDH;Z>}oV z^!#|T{ZMed?X|uNvD0nwUaEzYxRPgxGW=hk@!;M|i>kxF;<)?8)YeF|YrV>kSmwSY zdTy?Vmt{@CkxiTd^K-_5&f`r(Iq`wrL&+3mFp$S`zf z`hVrn`fl5U_0Jbim2O|YC_H0!dEb$Hr_UYd$vSP-u+kvXuzMc+g2kb-AJ}~&e`x;H zG0QJl5fvn}_R;^SOaCt{RGtypZpyN}?x5wL?1d3KGsU(&-t&_|u<(&tcJCLyqaGe+ zm8rs0uXeG-E@MBDG_mE|1&P0hnBLm{ndK8z8KX4Yq&fZDz2lai-Wpo6b9X3<9~UqbMAe-v}*Z0 zmpY~c6=g|pC8oRRC9Zqw!7ZS}b?fadMaA2HlUD04sy^=+>5|eWVY8}y^?euRSyuN{ zr};9ld#m>CHEcWY&;GVmX_khu5L=MyN6wUz=jB`OZQj4_$zh8rjZXsKsz`jvR%_yX zptN>I;GLrvw(gs8M9tZMbNZHu$T-^#p^WTSaf_xnaeU?KUekF*NRnms@lzWG&MCXz z(DQ$GN&bGe>*s|nvue0l=lw8zq_rfF;pPdq6B`QiC89p>`M|hYReKrd`$~^~&X9Y* zZ3F6@Yj?)acT4}q)FH~cVv0R$UX{GA5=Vqx(EG%UZ?!d2Kdxx6$<n>Gm#NZ^5qxzf8;+pY5J}&-u!#a;FyVSqBfnFB3X7}W{9U1|DIt9!^VNaO%Zua=-K?`H|(wgldJZEe3XbIXrD81F!E4 z`_Wx^uKK{@n+qyqxtBO4zFy1n#Cu(H&RdZ#Q<Dmyu6{X?>FGqUYLY*Q|V}nzi?jli~9tTU7J~DsPuOc)NGX z${()Jv)gR<@;B6dI-jvWc$5Cgwsl(V+WT2D-+F!LeSFdK`;*kWtKv?d{;D&5hvfDn z*4*0!7|pC-b-s{UUvk^&oYkF!XOmhwWw-ED+30^2v@ zN?yIQXY%esz&`tXr96b^Ia;webYeR0AY`pcu;92NGr4xNz_5}+93J;br zY|}8*d$ZR#?@4nJ}Zu55o`vPNLpr{u^y!Bugm56w3}m?+-7*7Rtb zZj6ua{m5s>UNWTKY4f?wXd1G+Onu?xqy54CA-7vKXRsf+vF<11&wbfNT(b|leYQRz z!SbNaZb|G)3n2z)aob44iX2o5CcyP)FrmuTs-0LQU)*zMXA6J^P%NCvS$~MYXPPH{%}nEm?1L{^UlrH;FZA zHOWCAcssn~R=X_ORx$U~`i(xXmnBWt{SvWJ=(U);?&tO*L*K6(OU~E*7GvODZsIPO zJUwGY@yf^p^lqkw^%XyNeOB$dUwCR#mha=zIcpOF+}3J0O#hwd zd{6r21$nMDH_AWC&5OKmQ2Tm)(pmFeA8f9hHhjHt?fY3veRtiS4|lZ#D!xCpjr;Wc z(vr+@!K}DdzdmLi?ezM|ls8Lv(e-m4|E^EbJax1Bhf_`}pOa))`R0bFH!Eg|2OKER z^lFtlZ0!4YcI{l#i+|NU)9@s@r^_g_$39euEJ zP13uYx_#T(Pqa)E)aHE}@zxVQDDC3r5SshuWX9((s0?R z=RV7B$CCcVFW0R~T;%%WWzYAOzske4+$v95yKODJCuhR1BV;f!ZVeXmc&&pWJ^7u)~ksX$0|{kEoOhc>z1FDu_Tzw&hA;pZD8 zyq6fbN?vX}Hra|NfoIMA(|QM%ZlAGVu}$r-2&=@;{>fH(jt5q5`~GtBUEjkuCpj%X zDR97u&5`?qosKr!Wl8Omr?%-DYBXGEnRU`=?y0%oquRwCPO+rdU$ne2>&-3xv%0nq zx$EjGKKP2>QnZtpUB$Rc@m<+{(YNfazL|ctdFz9<&BIih^C;guB zTGE1HS6fNKMOn_-o3CA8nlx?xq$Qkkx&0gtH9q0h>rZsqq)M=quXUMvjdLTHTy50# zMS96|8*Nm-tzFB$B>f#*duRPLx2L{|ON8AYKD=16p4Yg-V2NIE^NG;pyNcgt6rQqw z=Orb!*3@xVqav5m+6Ox-6#hKfu+t(nLD%WQiK5j9W<5Fox4(~{IcGt{JkKD4T~ML2fyTHbYj z{S6O~-4XBaEp@QZVLov8Oxr!Vvg<{k!Z^Of2H&e+AjzaIIp^ri#TyukCO4e@w0fmM z!RzIQ^ZgBePjh!ZqPgI<*#9X-S#zE@IPTcp(iU^;L21;Q_SHQXcHEu8@4~syu{y=} zZR*C|CzKl)zj@tvPOr=|o1Jq!Qj&+4X?pnd1-Jj+Sb4|k9DCZoC$3KS^4o;qr?UjiNer~J3 zX!^UXR@iQs(aZX)_^!mFqF-g%heDM!&bEZR7rx(fa9NIaX;6|oTtGp(Ran zN`V`=WG;CcTD;5RT)X{Y{HAmNVyYjry#2Ny=J~pPhcc%gPdNWdNeGHs516V`Yk6r9rS-Yed%gtA>W{mrn>9$M$y}0I{!zur~ z|9Wb6^f75IQ@qM`QZw=XbsgKrNwW8+=U#k0CC z9hEZO57U;iZd+cz^<~-TMT{#7Cgn_<#dP+aMCzTne!4q<9m%^}baT?QrCYiFIegMz zrxm#BQpXR)!#ovHzByCOvswxZYybW#DArY#Jo3~bp<`20mu!lda8S;az$>x)JK46i zZGDpeE4@N!dXw{y3rCD{J{m2SUD7P>_x?uO^}tTgtvhBF$39;x^pQPjp$yB#!mG=j z_)Sz>1>6rN7%$u%HS^Bq+ds>nI31q4MPdI$PvHeYITCX+FYJ58dNp14>+fkDCqA&x z`TnG`tX?-3eDCnOw#yS?+Dc5b?ta4-4k_>mg zh#zvf3vbU54KIIe+El2}^xFEL=AplH?lWZ<#>d<`lKk}#2u<}E4+mhq3SW82)CIN^NVf~BuRq@$*((i@LfmrXC1#s~EGG3`&V z4tFnUT6(u8c;6Q0^Y@m>-6~wU@7@OYyZ^*hCZyjz>6PGjPG9`66-x5cuWRwt zuZ$6Ych*W$j{oAWuaBZlZxvhX&p-9=@)K^2H0Fk%@1AGmFL`a*cc^gk;kk3Qx^H|6 z-^H2IE;m!=U}D6YQ_Y)oCOPe$XTWN*tHtnScdZhadXQ$i!Oi*6XYWV42$?zOh`;CT zKl6=u^3;lVZQ{mr@4Tv>Js#$?f&J5p{_lxeE)01J**I36icLPhMF4Ntx z3aiv}7tY^MF_^H9Y2NnvJh`N93^LJH|1r4!G!4Ce+NSB56bqWhMS zc^PY+o^F4!owYtiyz}e@$+y)$_m^F}eBRCYov?k*qTnKh*p|7`5}S>9E!DGr)@AKd zSXG-YpxN_<{lSk}wYd^Tp4nnXhqz0lBa%XR`3*~)Z$2;&ouqJR+sBovkD2c8ZuLm4 zyXbw)P{xZ%U!-eG-K*epEiET(=Kk6tto?7*vxvs4!9whQOZGQPlr!(-oY`Ws(S390 z`@Kt~?*98Sd#~Z)wPEIQj`Q~h{@T6HVOf9j>|;&G{r7FzwEl(m?Xamu{_p;G-e30f z>XUtYYFN{pWM15#o7i1B5BBCf58vc)A>-$JtMeMV zaVNT>Cr;SH!XP2xyme)YYF*g(wu0G*>Wh-nPex4r`bed)M1RR|`R*XK%PkF$+JaX# zpAA`8@0GpKIjVSd^IPw*?#RAy?k97PPHpmKeVTvd{|eDdlcj#hu79Yil{#Ugfbscp(EZ%tU^BqIq(*^2_0&0R(rTlku z=rmsEpUKj&Y_78!>-U_uXKrY}EpFG$d7D?k>Fu?|_j-fu)oRhWCg->QMQ$HfKWJk8 z^0Yxs*!*=&*q8j@vF)mFM4xb-)i?6qKEYH0BL%>Gfz)hE2{Wm6&!Ett>8VBuO$RiWPhP*dE>R&SR`x+rSOUAim$te8KbJFWY@KthZklMo z-J4r46*xYaUFFmj`93n+J9~YpbaeduTPB{7f6vL`1Z7pv7 z9_KzJ>|Dqp@?yPK-~0>u3lH}#zH+djH|&wUj6y3zr_#rJ_6nWinoC@!R(}0Zy?NcQ zt}n5{Q9FA2=B-Ko_&)7}d%XI!U@E7}r&nK`)YN#6EI;n18)4PGYexRL zp8-?lSUz5Mmthr&7Y&p#nN@6JrMU6W>Fk>)1>7_ePVw%|uw2`4Sq zG&#Is%G|zi3)|}@+UMs#&k1{D%+g}STEv%QW}tBQUV~BazB^AcbOpD*x1Q9%lX0%K z1g>Ear>uf4_K3(zN@l!FZtVcr6IIG_|w-{8^0LrSbKEE zwK9j5$D^2DwPna??y}rwExh;G)aGEGc`;S2EAPMJzVz5krG208i^GjtC3j|+bU!qa zJQZ*Ha^8&wqxFS85>DIIwrJJ)xSyM4_G;g$#g@*#hvtY)y1wncI$fatH!A|G7?Mk zbu0T!zw)hD+uUNYV^LV}na=+^qf<8Lwq9SEDDZRtiBBKH&DR}#zA!L)b*SC)=+NuE z&OZ-4;jq1M+%i=5<1u$j&V;Qp3uNRK9z_eVz_X+rn-iSNs@d{QGI_&mDUwu`PTNxO3UeZy&!_s{|(=;#_=#)7aE|-R`FK zi*`E7%vmKl#pTJCpAW^}G=+)V9?ju;;ko&D{++E0l)4+5AHC3g7ABhR)f8zutLYl^ zFP;Sl6V0wh-kftq>A2cw?U%uCGF`8Ksa)UUy?v(KSx3i4_a)nFFa5m7tN*7!^GuBN z=_-S}NzrNoyjMK1z2ac#VfXYfFGIqsJzSyBx{hdM7Os2o`rXX>iFe+0E%3B4f9`cg zjkoUUmy3cT$u>u39Dn8W=9uul8@oB5$8c5tdd*b8z943w*Wx>QJ3|}!dD&(7H{HE* zdz0mYOKTmhA6=KaP*%l%x_GMU`-qGi%S5jJt9$b&?c{`OZzrv1u(^DPcgfcB0fH|*t`-&?G`<#T-7ed>Zsq$mF){DgoImXU zV9qK*t#?PgR1dIqT5~Q}n;Ik?w=dSL>iP|3;jdEh$M;z-I4$w{K3`wLuchuCoVxOc z+x?Tz>c_tG^XyKwi7NUl>Au1&&}&`kG}qcUC$v5tu6eh5KWom^-?dwR7p_xx`IR(b zm->yc*QPy>iiNE2?dbEam-#zc=F(idZ!7iBFF*UyTy(+WO}aZxbKbSeUQX$~y<^k- z&*mX(uDxzM8EapY*_vk2c;dqgQ@vm3{&|1jtyjizBlu95@M>M20!LvMJI)+4zl@jq z464uG?dvMow=ctf-MWJ93s&8{!e&_UIO*HkE&mR0D{tvIeEg{JRUgUKS3G&^UTl7} zw~vWWVQ2Nj!fSRJPu?CfzF2ARmvNVU`Fk;r$^VpBzcouuGl;FdQ1Nr^38zo@PQKO_ zn)K{)r0tQ{6T9A>bd{WWeAnk&G3LE|6~fz1?m4ZPQ+!N=IaWN~BTT>H{P%~?$~uUKH#?AQB%%ThL~foLzh3Yo~aWyEyZZU z)G4z%Z`Amm*Sd07u=3)U3CZu$wuH=NPYk=fkxMpZ&W4p+DmS0333!xT7WgM@LYl*+ zbuEI{?P-$*MUqucZFf2tzM^Y+9JzO8*-xvuGK*R_w%WyPI6 zEz^2tZo2%B^-0~jeare^yY^|nSNRh@@uq&+dQQQ$?$aZUN(vYKKD}Viitj?PyKUGn ze9cSaXTG-d=#(YV-`OROTQ>3C+qK&~hWmz1Lcy-fcLffVi=LJ$Km54-&(G6h*(<-T z{`IZq>&$)EjJlqCS~14^mRZ{!zh=&IEbl#Z zeA|&NuhXO=JQOre${y6$m0Wqs#QV^$u+{UM58CwHJK=nxVd0aoyQaaVtS7CF+-LPR z_pkVNwZcEWbM!Wa!Gr^@VPw{GZ_ZF?)!IyLMA;73 zL$=Ju4W6~PCzdf5ysGuAoLuW}H`jl1c9DU=l@_b&n+FcH%?RBXBa?mKoY6w&=1$Sr zf-ARIyDel<*rm9vwY|&VgJFuK!R;;~Yj59eZ1Xk+Zw-;OOH2ED`^d!i_ z*Fx5y{^*rs7hc}{u4oySwC}RiE}zO*-&U1=+HkJe?qFhx&`a?nO3vRO@;+#}x=&30 z(uI=SO7~h4&v%tow}!S}*4-nc>+P=M`zLG5-D2&4kcYEXb!z#JsXTMP=w6q2^Xk2e zoPFzl&w6Ft&UpAUQ~Hh9R-6le?o2E6dluHjou%z8@J#LaR+hv6)EFC-l^=zul!_j$ zU~Y>!WBtw1Y4VycN^!%caa$8)y9v@eb_0zWAE&)(KBDShlL(YFV;T{8h-uRjq{|W^MnK7yhZ; zrXs}do_4RqdJ#6+_t`?PGm;*?ZvUmKvz+6y=e;|{J2?MOn64Yd@AQRhq3)~St{g#G zEZS8o%0=x(baUL;OfJ3hnm$KU^vtr{y>AP%B_6F+aqeZl?Wb^VtNfg1-P6BTt#kg` zHvOXUI)^oHwF9DSK1@iRtN7f0`OjIB(kwi$s=qf)KcX4Hf51?0(yomLPY)b0G1k4L zQT1DbgtXxdHS$kJJaEZHy8AO5xHr%@~Pn)#UI<()V`S2ug3FPU_soo zPX_`+R$q9amb0z;t3v&^X*y9A)yr}=emxCL)*59UruH3Z`9vEM7_W1vF_xUS4whc*P7H&TtFI%s+x1--^^W49U z&P$@1MVmSLLXRHI*ve9?;q&3hy=h;MT#)YLTcZ&8=5oyLP3HbD)s#z*6rN6+w&-(h z%cHiENfoxOG=-yZlV=v!UOmcu{?8wVPc6^F#Mu z%{2(ydTn>170aZe_Rf8Cm`}_OY<lEHn~M#kDij=R`&j>+iaEkKTbvqS5IU%|ME+&-D`)?;$mrwpWj%^kM^mt zT58==I#%-S-2B?#qAR}Le17rFSD7!b)BZfty!$)3dxOlEm$T|8{W+K-y!-3SrJlkp z#)2>Z#0g)I^Z9gmzRk9^l7}W_+>jO$xw6XCQNMeIz>ah4@?3tJPW!o5zv8>h>6VFk z?zV!T#glR>y($GX=gysap+3Y96n_ZHDO75GWL20sNBa_&l3{=mo6#I7E~;`QFrs9Rh!R!f%J^2YN8X}R|y>~oG~+;Vc$P?r}r(H zTa48W=R8@$wqW^-l=yR=56?V!wO+koSB=BYbqOaH9a*0)9g*IaAk{eersmcrFAwD- zkFDITOJ99EI#qVb$EZs+w|c~{y!rD*@P}{unXn5YiVln-aT<^0f4G)J%T8;1__Y6j zqwl!~e zGM!UXYB6~D%TN8(xdRQ)U8fYr7Th;9nbmC@nfTvdVA4LGiFxa$haN2s^QZ|?v`BgW zAXR8)*r~@-&*r9htqVwDm0{ET_f-9t+y1)hQ$hQ_cAt0PZuOda(NuA_mft;1pUE1_ z>m00fS8x5ttbTr%WVR{$dxdY0g?wXQe$m`1&fNGw_kpW~2%p92X@Sn4byTPLi}VDF ztuA=Fp<*dtOVy5$w?Ai@tbLtVciSxIQ&?hUYKMhXo&NM+Qvb6%y;e!DTRnB<_w@m1 zcAvWFRm|nkwf$?!%Uv8REk(*_`fWNHe~PhgPw%B2i{lqcO^dLze&T$uHCeDX<;p9I zo03;TUhVC@U~PVZ*X&vRkG1!vhrPa1R^pd>ZT=}v;p`qCHg%bKPi36u{QE2xAQZ|o zIZ)@!)y1baxjbaJe5B_^z=6-n3zCj5tJ)@@sq3Iw*%zDeSZLba{#2ve7hRfeyH_u@ zwlEZZdS*YL8;57L#+o{>d*2VPzpeLk{ZE&P@dqCWE`Rjd_xG0B2Xq*&NF9Bsd&KV3 zG-2lZTKN%u^2{*-_m(7lQ@pma<5Sw?=U1XMp6prYto6pO=~~FPrtbA-_t*7$%|8@h zn0EcDi>%oEM43=K-u)jB#W?^s#kVWvm>zW-v_AM?PrB!zFX z@x6_^ex_tTKb;h0nsVFq$n5@11?KYpiI+c2$bMRAG-;B?e}$@*#V`I$dQe)leBalt zn}t8|1?;*e6!eORbL-}w+s2cHC-&68UNNKkQ-tDWca z_(b`Oc1auN>uDX_wf~@8*8bzqBE-BeglG7r9*f9)@<44}q4ZtLz*Cb{&pdjuZ=%ut zdyhlENJ-o}eCC6or_C2`y&R3Q=G5@!#I9%w9S5~H&8eL!x28z{NxQImb(jj*+3+v% zujUrnuC_b6k0;~Bmse->yH4%@9n>+^aqZ9P!F7^ZdPQ^0W+mD#-D0k~(B#SkoB8G$ zr{}1NJZ=`ZFuUevbM1E}gS^-DnP(eK17?PFK3?Hs{LFBvdQ{{zv&JushDUy+?(Gq( zxbfdTW64t)mRbH`cP2dg&3RDop4@@F}S?}l~j5^=RQ~e-Zs7Ia;}a3vsUdr)%fMxI%83F!6_@A3-jdZO`PjfcmJ`s>#dV} zKmV{jow!-kByHN{HJaOQhJN}H|5!5V5=X46y5)t+uf6AYFI3S{HTimV!f~&JPF{~J zm6z7$hNr9yz0wlCFluY`+RoZ5Uu!p$FP`=O@%Rbv7dVEmGf}>A@7y%|C7Zn>7v>m$ z;7wAz%2vKhc=6&?)ub|c$Cv!qt3RCMXVkQQB)ha>0(Z}~V|7;r)OzpK#qQp7?vUcM zEV=Nzj?09lJY~-PUMe%U-_|VV;tPq|dG9x!+;{C`?8l>>nsO{iXy&p4D8tYEj&6N_-E}JBB`oCBG!WCyHd<=Sj{)lVD%!N()A~VvrPMMX{ z^x)a`7B1K6k#SR|UljRTs`Y)#Ea#b4c5Lq9Zy06#9qbBPL|tTYG3cj zcqt^@(k$eY#F8%)q$kXp@LPU~&YTG|Bn)rvYenvMnk*(z|m=+1(8ABUW3nESC?N-%lU1@q$TRUDE$vM)jMH7|EJD zaxVM#P2aMh)pfFuPR^d5Q(Wh2Z(b?WZmBf54m)%OkW#xQ?+$|`*W@Tnr@NDxWc64Rv*-A zo+l!y;nr!n=yK#C&DY=U0+$6duJb(JdGqgQ0UfEFn-8X*biF0$z47yf$vbXmaj%^o zxjuMB`LWd;)t-GXvTpw{h~ALI_RCd}`_ZA?j|_KPckcVb`sV+(>G$1>`-SZ@WY2fZ zRjAiFx#}PztJngoS)NrB_Ut|5Y;)$E^t0sGljhz1aCG%a?j8-}m9sBf&zbIXdSBgq zy#wuxOo5j=lxJ23#+@yju~c`}#nAIv{dfN^3B0npZrP`uw{m%JFR(1n)px96PzYJ2 z+Pl8&RoKf}$zeaVcPu*a@BGQM8GP1rA2UqwbX%t$7w7w=#`R5q+`~Pht7qPP)ls$U zo-1Q*L%&MT{RW3vrzc;3fAHGN(4O27rf?v>WYxSqazdf9{$^(@{WjI#)!&kmd3nu= ze=8pLwfUUKl6jlscJjwu z{{wFhb!y-E9l>yM#@iGVj ziT39EN_(H~ydv~aXpQ&fu;l{(YhTY%GZd@TygSYDwS~6NkHuLPf~SrP{C_9I(z^3y z#+p9n_1%e$%Hc z>ANM;`EGM@{hD1z7`+0|oeaCcdbVZDH^Ifrw{-Z4g&mcAw6rO!wR1zqibovv9bsw* z=S8>K{5)V4E>xN(v7NKv__>EdzN`m&1q04@sKsSmV_lN6#ZG9eQm)#}o9mSoyEZE{ zOYBzBmdU)iC2Yxps3Tuaq&6vVEafn0R{c8pWUI#}Ro$7&`Cvsf&gZ3GcW1S5Wc;1;WcRzMh}rwC4;hHImL^Ak&&^%xZ2I=Y{1xZsv74^y(EU~t z^QGfLeDka;_6w%pXqfr8Tk7{YPHEo>AAZ&@Hva21S*du6tnl1DPF{O-PDMPA?f+kV z?pe9~Pt&N7>2rjN9)A3`XV3mfLwzRgPjTnl1m+x>_1ivs>(luwbvpAjFY5+KoG8o5 z@lk&D(w%X^BN>U9mxse$cm+6CP5xZQ=4PUnY^`ElKW<$na&-Rm z>uOv#<-|^LR6owYahuJeqiJIP^9AjmPp$ioY(8v#;8RdR!q zdyZZ94|9Xe4Dk?uzMno*QeRL1AvR&Jl7*4sopa}Q&Ag!*JmXjEMF+>3 z=bx0F7GJTCWvo)D8W8vreR@r}BIDN4f+lp`hJ-pZh zivN79a{4nR*T2;GZ~QAc0hbSQrc+;7ZE@SB?w@6ra>YEMN=!Y!jPEM~ z+)~3IlPXhn{al*9747@Ep3|_O z2ww9mF5}99(!jdhN8Ym0w|QqS+}Iz%z*(NSz-pI|u|mvza1*Zi})IorFy!?iLh;+fagCoz{;1lx<=Z!4Fb?^5&4MBU zzm{5wzPFbWnAmyq#mY*SO?i3C-=BYD96fO%^NcGs&v+Cz7Ou9F+O$EmL+ZC$Y2K%c z%E9I7!qXo8thm`L&n{bU;?CK#lW+6#Cz}|i^nVlHua$LHVu8=^uIjqZS$qNK7loF^ zS8)qGsj9kiNne%qMOj)#*vVHr9)|d{i*0nh=+{wy=%bYKhU?N=?qR#THr(j)s5!Lj zd`3#qdx>dFc%pgb4nEoMI>UWB`_>bWTX)B6@fF>Z>f31Z__NNARTf1~If&_lgo*CnfJ~va!#} z^4uM{{t#o`7a^U?`_8g`cyZIlbcusTyUoPkFYWqO%a3mLG~r1Uwb`sPby{%E*$?ll zcr2XfZTW8da)NBcEY_P{9!Gh7?=JrLIOz1vJHFC>Yxvq{Z`$g|y=bwGlkqn-;}4g* zl+;Z^b{M8h?OMp8P_e3 z-kZU%zTMw7&t{+d^t2FWu5ahrO!|6?+g|qPR))rBee3M9wboavO{`H5VqTrQ zpGwK*z#vgZQ|U>AkR{?>d9u6c#*>^J~y7!uI#Ega$>`T`Ip7ME#H&9 z!=*q;Z*wH`&eL3%70=Gy^gW4j>#d&)PHH7ee7ZPe-U+54Z^>F zd@K6ryp(JCVePb6rynI=U97ly-8r|~fEhCNd^)~+KY3`U zf8o1wi@BF8i{+P0K4Rv#QDDns7r_I+SRT%0D=PRg_q3OFulg>g=!eYdBG06jSV~Ht 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 mW&i@ksh_CXggcWE22$BN+Su diff --git a/external/aurman-current.pkg.tar.xz b/external/aurman-current.pkg.tar.xz deleted file mode 120000 index 0c09e99..0000000 --- a/external/aurman-current.pkg.tar.xz +++ /dev/null @@ -1 +0,0 @@ -aurman-2.9.37-1-any.pkg.tar.xz \ No newline at end of file diff --git a/external/aurman-current.pkg.tar.xz b/external/aurman-current.pkg.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..d0cc1aa36de11bf44f3ed2d24796eb8f4113a516 GIT binary patch literal 89404 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%0D=PRg_q3OFulg>g=!eYdBG06jSV~Ht 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 mW&i@ksh_CXggcWE22$BN+Su literal 0 HcmV?d00001 From 82c21f170a8df6c9f955203a72df98549d349286 Mon Sep 17 00:00:00 2001 From: r00t Date: Sat, 2 Jun 2018 04:36:21 -0400 Subject: [PATCH 12/15] more prelim distro plugin stuff --- bdisk/basedistro/archlinux.py | 38 +++++++++++++++++++++++++++- external/apacman-current.pkg.tar.xz | Bin 0 -> 55628 bytes 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 external/apacman-current.pkg.tar.xz diff --git a/bdisk/basedistro/archlinux.py b/bdisk/basedistro/archlinux.py index 15d20fd..93a62d7 100644 --- a/bdisk/basedistro/archlinux.py +++ b/bdisk/basedistro/archlinux.py @@ -10,11 +10,47 @@ # shepherd initsys = 'systemd' +def extern_prep(cfg, cur_arch = 'x86_64'): + import os + import re + mirrorlist = os.path.join(cfg['build']['paths']['chroot'], + cur_arch, + 'etc/pacman.d/mirrorlist') + with open(mirrorlist, 'r') as f: + mirrors = [] + for i in f.readlines(): + m = re.sub('^\s*#.*$', '', i.strip()) + if m != '': + mirrors.append(m) + if not mirrors: + # We do this as a fail-safe. + mirror = ('\n\n# Added by BDisk\n' + 'Server = https://arch.mirror.square-r00t.net/' + '$repo/os/$arch\n') + with open(mirrorlist, 'a') as f: + f.write(mirror) + return() + # This will be run before the regular packages are installed. It can be # whatever script you like, as long as it has the proper shebang and doesn't # need additional packages installed. +# In Arch's case, we use it for initializing the keyring and installing an AUR +# helper. pkg_mgr_prep = """#!/bin/bash +pacman -Syy +pacman-key --init +pacman-key --populate archlinux +pacman -S --noconfirm --needed base-devel multilib-devel git linux-headers \ + mercurial subversion vala xorg-server-devel +cd /tmp +sqrt="https://git.square-r00t.net/BDisk/plain/external" +# Temporary until there's another AUR helper that allows dropping privs AND +# automatically importing GPG keys. +pkg="${sqrt}/apacman-current.pkg.tar.xz?h=4.x_rewrite" +curl -sL -o apacman-current.pkg.tar.xz ${pkg} +pacman -U --noconfirm apacman-current.pkg.tar.xz +rm apacman* """ # Special values: @@ -55,5 +91,5 @@ prereqs = ['arch-install-scripts', 'archiso', 'bzip2', 'coreutils', 'mtools', 'net-tools', 'netctl', 'networkmanager', 'pv', 'python', 'python-pyroute2', 'rsync', 'sed', 'shorewall', 'squashfs-tools', 'sudo', 'sysfsutils', - 'syslinux', 'traceroute'] + 'syslinux', 'traceroute', 'vi'] diff --git a/external/apacman-current.pkg.tar.xz b/external/apacman-current.pkg.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..92917790b95974df61c81ec1627e223918bb690c GIT binary patch literal 55628 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 literal 0 HcmV?d00001 From c48c752f84585575497c4f877ee8dc05c773b994 Mon Sep 17 00:00:00 2001 From: r00t Date: Tue, 14 Aug 2018 03:49:21 -0400 Subject: [PATCH 13/15] adding some mtree parsing stuff we need for overlays --- bdisk/mtree.py | 222 ++++++++ examples/README | 8 + examples/mtree.spec | 1191 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1421 insertions(+) create mode 100755 bdisk/mtree.py create mode 100644 examples/README create mode 100644 examples/mtree.spec diff --git a/bdisk/mtree.py b/bdisk/mtree.py new file mode 100755 index 0000000..e63889c --- /dev/null +++ b/bdisk/mtree.py @@ -0,0 +1,222 @@ +#!/usr/bin/env python3 + +import argparse +import copy +import datetime +import os +import pathlib +import re + +# Parse BSD mtree spec files. +# On arch, BSD mtree is ported in the AUR as nmtree. +# TODO: add a generator class as well? +# TODO: add a checking function as well? + +class MTreeParse(object): + def __init__(self, spec): + if not isinstance(spec, (str, bytes)): + raise ValueError('spec must be a raw string of the spec or a bytes object of the string') + if isinstance(spec, bytes): + try: + spec = spec.decode('utf-8') + except UnicodeDecodeError: + raise ValueError('spec must be a utf-8 encoded set of bytes if using byte mode') + self._strptime_fmt = '%a %b %d %H:%M:%S %Y' + self.orig_spec = copy.deepcopy(spec) # For referencing in case someone wanted to write it out. + # We NOW need to handle the escaped linebreaking it does. + self._specdata = re.sub('\\\\\s+', '', spec).splitlines() + self._get_header() + self.spec = {'header': self.header, + 'paths': {}} + # Template for an item. + # Default keywords are: + # flags, gid, link, mode, nlink, size, time, type, uid + self._tplitem = { + 'type': None, # ('block', 'char', 'dir', 'fifo', 'file', 'link', 'socket') + # checksum of file (if it's a file) (int) + # On all *nix platforms, the cksum(1) utility (which is what the mtree spec uses) follows + # the POSIX standard CRC (which is NOT CRC-1/CRC-16 nor CRC32!): + # http://pubs.opengroup.org/onlinepubs/009695299/utilities/cksum.html + # For a python implementation, + # https://stackoverflow.com/questions/6835381/python-equivalent-of-unix-cksum-function + # See also crcmod (in PyPi). + 'cksum': None, + # "The device number to use for block or char file types." Should be converted to a tuple of one + # of the following: + # - (format(str), major(int), minor(int)) + # - (format(str), major(int), unit(str?), subunit(str?)) (only used on bsdos formats) + # - (number(int?), ) ("opaque" number) + # Valid formats are, per man page of mtree: + # native, 386bsd, 4bsd, bsdos, freebsd, hpux, isc, linux, netbsd, osf1, sco, solaris, sunos, + # svr3, svr4, ultrix + 'device': None, + # File flags as symbolic name. BSD-specific thing? TODO: testing on BSD system + 'flags': [], + 'ignore': False, # An mtree-internal flag to ignore hierarchy under this item + 'gid': None, # The group ID (int) + 'gname': None, # The group name (str) + 'link': None, # The link target/source, if a link. + # The MD5 checksum digest (str? hex?). "md5digest" is a synonym for this, so it's consolidated in + # as the same keyword. + 'md5': None, + # The mode (in octal) (we convert it to a python-native int for os.chmod/stat, etc.) + # May also be a symbolic value; TODO: map symbolic to octal/int. + 'mode': None, + 'nlink': None, # Number of hard links for this item. + 'optional': False, # This item may or may not be present in the compared directory for checking. + 'rmd160': None, # The RMD-160 checksum of the file. "rmd160digest" is a synonym. + 'sha1': None, # The SHA-1 sum. "sha1digest" is a synonym. + 'sha256': None, # SHA-2 256-bit checksum; "sha256digest" is a synonym. + 'sha384': None, # SHA-2 384-bit checksum; "sha384digest" is a synonym. + 'sha512': None, # SHA-2 512-bit checksum; "sha512digest" is a synonym. + 'size': None, # Size of the file in bytes (int). + 'tags': [], # mtree-internal tags (comma-separated in the mtree spec). + 'time': None, # Time the file was last modified (in Epoch fmt as float). + 'uid': None, # File owner UID (int) + 'uname': None # File owner username (str) + # And lastly, "children" is where the children files/directories go. We don't include it in the template; + # it's added programmatically. + # 'children': {} + } + # Global aspects are handled by "/set" directives. + # They are restored by an "/unset". Since they're global and stateful, they're handled as a class attribute. + self.settings = copy.deepcopy(self._tplitem) + self._parse_items() + del(self.settings, self._tplitem, self._strptime_fmt) + + + def _get_header(self): + self.header = {} + _headre = re.compile('^#\s+(user|machine|tree|date):\s') + _cmtre = re.compile('^\s*#\s*') + _blklnre = re.compile('^\s*$') + for idx, line in enumerate(self._specdata): + if _headre.search(line): # We found a header item. + l = [i.lstrip() for i in _cmtre.sub('', line).split(':', 1)] + header = l[0] + val = (l[1] if l[1] is not '(null)' else None) + if header == 'date': + val = datetime.datetime.strptime(val, self._strptime_fmt) + elif header == 'tree': + val = pathlib.PosixPath(val) + self.header[header] = val + elif _blklnre.search(line): + break # We've reached the end of the header. Otherwise... + else: # We definitely shouldn't be here, but this means the spec doesn't even have a header. + break + return() + + + def _parse_items(self): + # A pattern (compiled for performance) to match commands. + _stngsre = re.compile('^/(un)?set\s') + # Per the man page: + # "Empty lines and lines whose first non-whitespace character is a hash mark (‘#’) are ignored." + _ignre = re.compile('^(\s*(#.*)?)?$') + # The following regex is used to quickly and efficiently check for a synonymized hash name. + _hashre = re.compile('^(md5|rmd160|sha1|sha256|sha384|sha512)(digest)?$') + # The following regex is to test if we need to traverse upwards in the path. + _parentre = re.compile('^\.{,2}/?$') + # _curpath = self.header['tree'] + _curpath = pathlib.PosixPath('/') + _types = ('block', 'char', 'dir', 'fifo', 'file', 'link', 'socket') + # This parses keywords. Used by both item specs and /set. + def _kwparse(kwline): + out = {} + for i in kwline: + l = i.split('=', 1) + if len(l) < 2: + l.append(None) + k, v = l + if v == 'none': + v = None + # These are represented as octals. + if k in ('mode', ): + # TODO: handle symbolic references too (e.g. rwxrwxrwx) + if v.isdigit(): + v = int(v, 8) # Convert from the octal. This can then be used directly with os.chmod etc. + # These are represented as ints + elif k in ('uid', 'gid', 'cksum', 'nlink'): + if v.isdigit(): + v = int(v) + # These are booleans (represented as True by their presence). + elif k in ('ignore', 'optional'): + v = True + # These are lists (comma-separated). + elif k in ('flags', 'tags'): + if v: + v = [i.strip() for i in v.split(',')] + # The following are synonyms. + elif _hashre.search(k): + k = _hashre.sub('\g<1>', k) + elif k == 'time': + v = datetime.datetime.fromtimestamp(float(v)) + elif k == 'type': + if v not in _types: + raise ValueError('{0} not one of: {1}'.format(v, ', '.join(_types))) + out[k] = v + return(out) + def _unset_parse(unsetline): + out = {} + for i in unsetline: + out[i] = self._tplitem[i] + return(out) + # The Business-End (TM) + for idx, line in enumerate(self._specdata): + _fname = copy.deepcopy(_curpath) + # Skip these lines + if _ignre.search(line): + continue + l = line.split() + if _parentre.search(line): + _curpath = _curpath.parent + elif not _stngsre.search(line): + # So it's an item, not a command. + _itemsettings = copy.deepcopy(self.settings) + _itemsettings.update(_kwparse(l[1:])) + if _itemsettings['type'] == 'dir': + # SOMEONE PLEASE let me know if there's a cleaner way to do this. + _curpath = pathlib.PosixPath(os.path.normpath(_curpath.joinpath(l[0]))) + _fname = _curpath + else: + _fname = pathlib.PosixPath(os.path.normpath(_curpath.joinpath(l[0]))) + self.spec['paths'][_fname] = _itemsettings + else: + # It's a command. We can safely split on whitespace since the man page specifies the + # values are not to contain whitespace. + # /set + if l[0] == '/set': + del(l[0]) + self.settings.update(_kwparse(l)) + # /unset + else: + self.settings.update(_unset_parse(l)) + continue + return() + + +def parseArgs(): + args = argparse.ArgumentParser(description = 'An mtree parser') + # TODO: support stdin piping + args.add_argument('specfile', + help = 'The path to the spec file to parse') + return(args) + + +# Allow to be run as a CLI utility as well. +def main(): + args = vars(parseArgs().parse_args()) + import os + with open(os.path.abspath(os.path.expanduser(args['specfile']))) as f: + mt = MTreeParse(f.read()) + with open('/tmp/newspec', 'w') as f: + f.write('\n'.join(mt._specdata)) + import pprint + import inspect + del(mt.orig_spec) + del(mt._specdata) + import shutil + pprint.pprint(inspect.getmembers(mt), width = shutil.get_terminal_size()[0]) + +if __name__ == '__main__': + main() diff --git a/examples/README b/examples/README new file mode 100644 index 0000000..8bd188c --- /dev/null +++ b/examples/README @@ -0,0 +1,8 @@ +This directory contains example files/data that you may see referenced in documentation/code. + +- mtree.spec + This file is an example mtree spec sheet that one may use for an overlay. It was generated by the command "mtree -c -K all -p /home/bts". + If you're on Arch, a port of mtree can be found in the AUR under the package name "nmtree" (it's maintained by the same author as BDisk!). + If you're on Debian or Ubuntu (or forks thereof), you can find it in the "freebsd-buildutils" package. (The executable is called "fmtree"). + If you're on Gentoo, it's in sys-apps/mtree. + If you're on RHEL/CentOS, the "extras" repository has gomtree, which (although written in Go) should be able to produce mtree spec files (but this is unknown for certain). diff --git a/examples/mtree.spec b/examples/mtree.spec new file mode 100644 index 0000000..4bfb7c1 --- /dev/null +++ b/examples/mtree.spec @@ -0,0 +1,1191 @@ +# user: bts +# machine: archtest.kvm.lan +# tree: /home/bts +# date: Sun Aug 12 01:01:41 2018 + +# . +/set type=file uname=bts gname=bts mode=0755 nlink=1 flags=none +. type=dir mode=0700 nlink=15 time=1533892836.0 + .ICEauthority \ + mode=0600 size=708 time=1533892836.0 cksum=1728088622 \ + md5=467f6490fc342ce8456face75e844629 \ + rmd160=f51a71ab0060a43b1689c23a348399e80a81067f \ + sha1=acfbd33ed54ae54f41fbb63fb48b70c25aae1a9f \ + sha256=6f0c8deb9dc85a8645d6df00d351b39a603fa66d9be50f74532c0c7130525e5a \ + sha384=eab6363fbd859d23efc7d1ccb00bb8512d9ae1c086796a2466a707c8977f0b1decd80803d2e7d7528d39caa866698d13 \ + sha512=b998e3c87df1dd4ec29786f7a4a2ebc5812460d8094523db09dc9892f4f26eb662d1d2dceb900343999577e3680d0a299ece47689ead37e4d4a8f52697f62c7a + .bash_history \ + mode=0600 size=37 time=1533891009.0 cksum=4199550415 \ + md5=78ae1822a93a915c47ada82b6c056891 \ + rmd160=1bc6e4c6e5016930816f42de9868da9326b67c7a \ + sha1=4d435652d22a134f22a0f9caba494be4c3cf4c74 \ + sha256=75aab51f58822107222a86866409d0b0c0ffb5bca5f9c76b8ebdc3262be10132 \ + sha384=d882fad4cc55c40ff8d436a590763fee0a2353d939f488fcfd48ecbf1870c45a46af32e1508fdeed48aaeafe5aec9e4d \ + sha512=a11ba3a1c49f972596adf01b8c3ffa6db7b9924faf1d9c6b116d7f3a35a498a07af908497ea574ef14d6c2cb23d312311d071829d9e0ba7bf63b1a884a2fd562 + .bash_logout \ + mode=0644 size=21 time=1528102451.0 cksum=1184899666 \ + md5=42f4400ed2314bd7519c020d0187edc5 \ + rmd160=cc717ce43231530db7d82918f7cb933a4310497d \ + sha1=9fd0cfda5b85651169f8761a834941b1f6f53952 \ + sha256=4330edf340394d0dae50afb04ac2a621f106fe67fb634ec81c4bfb98be2a1eb5 \ + sha384=8b8cdafcbcd185b945d1932f6466551c6ac2211c5cf2c837440049597e20ba62875d5a24bba6c015d322ff8ba28f88cf \ + sha512=9da5cbf2044ff23f2bfb80d4dca074f0e4a753d7260ca4730de6ffde08471ca08c2fa211d3ae9e65c508f5eef8c90c862b1f0d1b16e3610aa85a6eea1bb29add + .bash_profile \ + mode=0644 size=118 time=1533887343.0 cksum=2231410758 \ + md5=eaebbf73ecafa127a567c344811a6376 \ + rmd160=a2ab0e32463506202c6ec87368f45acf3fd02302 \ + sha1=9f6b9b4c3cac8cbbd528b21a15b73fd954e4f6f6 \ + sha256=920c4e0d2496be498315a00230280f177c3ba57f62b65dfd7e1768550b97ee75 \ + sha384=b95c22c85a7d86872f903239b9eae36921bb98d84fef7e12a754f3fe8b3982763b3daaa856ec4560da7d807873b06505 \ + sha512=c40b60cb8f7c1d070a2591d54c2c4cfdb3a9906d3a224f3aeb68172b056632c72137c3db7d67fcef65ddd487c2224dd5632c1b5aa6acfc851df2d2a3484c4542 + .bashrc mode=0644 size=141 time=1533887343.0 cksum=1724252355 \ + md5=027d6bd8f5f6a06b75bb7698cb478089 \ + rmd160=14f93310fc9178989b6bcd82016fb9c343c12711 \ + sha1=a573cf76b3cdc72928add2585f68ca97b54b6d33 \ + sha256=3e22bf86ae6708df7a6bceb88c67a00118275f9c0b5268f453dd388af7c43b53 \ + sha384=7213aeab4945c3116bb8a5362de15dd720837e2b23f5c333b3672d30f7296d0383be6d9de30a6ee2b252db25d25533ab \ + sha512=e5171e7260978195878ccbc8e4ba42ecc3a10d976722b00295b895387dc797629a0f6368036856eed7cce93245a7ef5f427dd0cf4e0750a25fc621218ef0ec8f + .esd_auth mode=0600 size=16 time=1533892197.0 cksum=2537222975 \ + md5=d0ccba4b80aec29b45c30e11c99dab99 \ + rmd160=1f996245e34773c5dc27d4a6a2c8abdc6eee2bb3 \ + sha1=ebf538413698088cf006a9fb806d93c377681d93 \ + sha256=44ac8fdabeac546d34f0c07c9669b15989945524ea0c970ff3a68e5fb29f9718 \ + sha384=4aab605d0fdb33c4a2d471ac2f74a396bc9dbca302cc4927ac254fd68b33fee1e92f4aa9c690e5206268cdce10fd6bf6 \ + sha512=162b117e144ef6fc2652e7c53e67b367bd5a78652d5b5c6443db095be6080d17ccc073ca523574d32bbdc09bc9112863c2a34300822671f4137603b3e4a18002 + .hushlogin mode=0644 size=0 time=1533887343.0 cksum=4294967295 \ + md5=d41d8cd98f00b204e9800998ecf8427e \ + rmd160=9c1185a5c5e9fc54612808977ee8f548b2258d31 \ + sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 \ + sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ + sha384=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b \ + sha512=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + .profile mode=0644 size=61 time=1533887343.0 cksum=2121637737 \ + md5=f4fa4426f8fe851d550ec4133ae7a591 \ + rmd160=b6c83aa6e63ad5072e77fb66baacacd0ce86efbb \ + sha1=3cad7f9db034efb59c7b954caee1254093b7e314 \ + sha256=82ac2f2daed0a768264ba7e8a557fed3f50174763d320151bddd9ea177fb7060 \ + sha384=e5e6c1c9803feae3fc7feed97177d46b4b20e648afdbf2d2ea59236a712793a020c15c35614bb00f628350fb3107af24 \ + sha512=8645fe3f6314da589e55a8a2ff395125aa9e8d274b1e71d67697a9dec9abdd5267d5f4ed736108671ad778f3a3f89466aeb84a6e5d6598a87ceddb9d4ba3b3cc + .viminfo mode=0600 size=1351 time=1533887339.0 cksum=204212364 \ + md5=a9aa5eb942f7f94c0205d4bea5641765 \ + rmd160=5e792c16c7699711dfbf5273a49febb014daa62d \ + sha1=471f4950c354b89adca2e0e0c22e548043a0f620 \ + sha256=c8e27b7252972ece9cb8072fd7acecf4d26f342566ebb9570a37bd0a49bb00f3 \ + sha384=74658a156196de81d9abdc40c2a9fdadb0be4fbbc3d4b8702accb1113ac1dd3a4d8748b4a81f22a92e10bf5a09384bef \ + sha512=4916562ae446d86415138fd48d6058c0272546aeb92659b9a15fcdb263f17441f33899623c82b58ad79dc8ac65cddb02bb22891f53e19319dc51ee732883a4d7 + +# ./.byobu +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +.byobu type=dir mode=0755 nlink=3 time=1533887343.0 + .screenrc size=0 time=1533887343.0 cksum=4294967295 \ + md5=d41d8cd98f00b204e9800998ecf8427e \ + rmd160=9c1185a5c5e9fc54612808977ee8f548b2258d31 \ + sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 \ + sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ + sha384=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b \ + sha512=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + .tmux.conf size=0 time=1533887343.0 cksum=4294967295 \ + md5=d41d8cd98f00b204e9800998ecf8427e \ + rmd160=9c1185a5c5e9fc54612808977ee8f548b2258d31 \ + sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 \ + sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ + sha384=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b \ + sha512=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + .welcome-displayed \ + size=0 time=1533887343.0 cksum=4294967295 \ + md5=d41d8cd98f00b204e9800998ecf8427e \ + rmd160=9c1185a5c5e9fc54612808977ee8f548b2258d31 \ + sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 \ + sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ + sha384=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b \ + sha512=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + backend size=19 time=1533887343.0 cksum=3535255992 \ + md5=b9de32e8600d5615506e5212895999bc \ + rmd160=5573a8bec6c9526c2d6f32f41fa1d3ff47f13f11 \ + sha1=fa27cfbaa0e63e555cf62ea2f8401215049b6f41 \ + sha256=0d93afa2a024ee947cd2e93f16757a995242ca67c6bc2e4bfac413a97c6dc665 \ + sha384=c3b608895a47c244796077437eeef5e7c573a69e3070f3cf9cf95fbb6175feaf4e20c400e7513b24175ee64d33af98c3 \ + sha512=afc1d2bf323a2288fda11f6344b61ef7e4dc767e228ebdc520857b6e4776dd3dd4f136986e46fa5c99e305f6cb3d5da929cd817f1ddbd9dd8b709f3ea498c471 + color size=38 time=1533887343.0 cksum=2038486494 \ + md5=221bcadbadbc1b91c5539bd022922aee \ + rmd160=8b3a767a8974ad34c6c49ba8f4f0818ad31bb9a3 \ + sha1=7b96f80ebb6f621585a5a80c784d02c287e27667 \ + sha256=ea5675cbc76e84896d0d9e66f9c1e7a7a7e817dccbc723d5e72e9d53919378aa \ + sha384=20e3a9c2a8e7a1601bbe7fe7d5ff7d0be192e90c9ec8b51a6ea79b1a35c8b100de51e99ca6886de93bb932e4dea4ca2a \ + sha512=3b0d122fe4dc775514ccdd7e48e97f5ef437474c1a73374d0b638cdfd7c70909c31e9739fe64756cf1b819b74a9ab78deb76d617e813af0f907bdba396ce2a34 + color.tmux size=96 time=1533887343.0 cksum=2170335825 \ + md5=26aba37629a70cb820f0ec29c8bf6fc4 \ + rmd160=b9554a1e3762b772282cb739c29a139c757a6c8a \ + sha1=2ce6c8660fa978b7dbf6fd8702fef564a83b9b2e \ + sha256=d8d930ddaeedffaf161cea5d12351998417d0c433dd93b5c3ecd17547077af98 \ + sha384=dbca81d7eaece86e6baa59844cffaa31538b9da0e8c525c8253f890d2036eeb0ac4b3663ea3d47e86607f129929b12d7 \ + sha512=2037b8fcb93b771b6d404163d81925f5d240ee6498bd5690dd956ca992d424cdbbacc07b3529adeffd71bfc9b424daf16d18494f4d3c819a3806ffafe233b465 + datetime.tmux \ + size=45 time=1533887343.0 cksum=2706742568 \ + md5=8240377785c7f31d7ebafc146ff1aabc \ + rmd160=06cf4f17b60253123e36c4aea27332c49764d1f5 \ + sha1=93f931e68346659d11a6c90fc4ddbf0afa69db65 \ + sha256=1f968b922c32891614d6bc42f46cabb3340ae121ba8be7bfe22969cbf5485741 \ + sha384=b5e578907180807e0ee70ee8ad4f7c1a1ef7a02b4895b164003fa06ec8b6d26b8b38a88c20f2702859868bfee928c811 \ + sha512=7f57b2814be798e42cd805809e585a72dc00f7553b3eff1b6216755183be81c4447bc43043f8fbcb5f938ad981672a7e4fc30affe15c5d4f0c748427dc096ada + keybindings size=52 time=1533887343.0 cksum=554879383 \ + md5=3b208b56b29dcc53cc5ea24e5427f284 \ + rmd160=43a96cbb89c989e2194857132aa4e13610105bc9 \ + sha1=b64db055af3de45e7e73ef8eb473a8925e16a328 \ + sha256=3628c03bafa7e675e03606e444d83893ea6c1126ed4a130993e401d4ded3fa00 \ + sha384=2b659063c32affb52437988928b0bbc6a55b3b2fad0da9116a5023f0abc427d8739526c2f625193f3403851e5b5fd89d \ + sha512=9a123747298ea6d9151fad2670f5a971191bab795926329a8e85809765eddddafdfd99dc32bfe25e480575ecd7dbc3ba5e182c596f20ca3640730a9fb0951f53 + keybindings.tmux \ + size=72 time=1533887343.0 cksum=596856748 \ + md5=2319ccd3a8af838cc04bb15b186fa533 \ + rmd160=30e6da136b166be6b2b32bf55a1fe03658455522 \ + sha1=fe1c5f855ffab04cc42ddfda19aca32f98bad0fd \ + sha256=751768997b89faf43a3856b1946b6cff2219c8a0c9b579de5eae684b0f54d3ba \ + sha384=076c31298163e1826c3b329e5c535b526fa2e93fc47c5d5c2c9c33b0d245ed7a5429d3f34a4769e0da3647eb410e205f \ + sha512=194ff50620f5b0ba9e0809b6749401a833cad3bf05a0a6197b7e89a5ffd52c83dd7093a89bd84c77a0865f5e0ec9373aedf4c0ad1145aaf4ca3a14fbe3256f2b + profile size=49 time=1533887343.0 cksum=3874606283 \ + md5=4b7b504e27ce89863266136c6cf69c1f \ + rmd160=2f1bdea88098c284c3439f842ec4c5a8949ac3c7 \ + sha1=04ffef8063881c1383b187231d5d7b7a26b10d93 \ + sha256=5e4f51354894e81450e90668a5877c003bbd85b624fcbb390dcbcc9e0c49a599 \ + sha384=f5b734658a7dcbb41efb1d842bf1a674e9f07b6b676753a092b6bc662973760b3c1406cec7fd5bc49973a0dcc81d2018 \ + sha512=0c751a4a0e950fb6df6dcf9eafb28c86253788dbafe3a4b477926b4f6236c38cde05096784dd096bfee8b2153a8a284b61c3732a3267f2096e30dfa6239417d7 + profile.tmux \ + size=47 time=1533887343.0 cksum=4193456139 \ + md5=9e78cfb64247770ca75e4b107db42eca \ + rmd160=cc05e4b367b7bb45f4700ad75e930918f97bedfb \ + sha1=2614df9ef67fa4197b831789d79b7f1192f9264c \ + sha256=97439c5c95f8019a6dbb098c49dc7098f810654513770a950e9c841aceb80d1c \ + sha384=d53763d9cd6a72561d96122fc44684e72e4df4d70b6d32e902bb58c05a63803d8d2b18640dd40d7b9732794eff6a38bd \ + sha512=9930f4293f4337dc4e2d44e4b576300ab15ed053ad95aa6cc5656c1703b7914cc0866c50a39b0d9b387a394b2fd3f7f22e1ba1445020862d156f9fcb111dba97 + prompt size=94 time=1533887343.0 cksum=2599587319 \ + md5=0ad9ddd249b099cf9930823b9678e620 \ + rmd160=8dab7b8384aa8dace784c73e66a1ccdf490eadd9 \ + sha1=db22e7c7ba4efc94455acf93e19cb792c085e9f7 \ + sha256=f37e78647464978dd49199e539c7ff22be38a84fe0d2580e414b03908a2ca01a \ + sha384=61353eb6feeab321d2140b50c853d6ee39638a48486dced97bbf242857c244e1f2c7287685d8ea71a338a3092df53672 \ + sha512=17a4f6ab72fcf56eba0f34e6b93647a6fc38c8d30a471761ef336b8e56c89190068786863039a9228cedc470d7567e9cc1dfb67d5a5dad1986f002b61beff3c8 + status size=2828 time=1533887343.0 cksum=2232803247 \ + md5=44a329eb7e8989d68bb455fdf777451e \ + rmd160=82d8c48477f4fba778a5252af1255158a7560633 \ + sha1=e2d6181beb300b39724aa8c5c59f08c000c10952 \ + sha256=5dc0dd92b272e1112e205890d46a374fb73d5408546ab292edf273d5d9da5629 \ + sha384=638fd8c3ff6eb85991c8d096a96f3b90b771b0e94e41238ed3f4afcf9f6590d053a20f4abd67124b516abda727e084e8 \ + sha512=2f7af7e8b65c52c21c6eefa770d60a2446b673d75f2020fd77cbb4d307fc57a822baf484b32006a2c84428518f106cb3c8c93aced40987e59edb6a0600a3149d + statusrc size=2536 time=1533887343.0 cksum=3609469076 \ + md5=2a3b01cdd4d5ae2b34d0a0d44c29666a \ + rmd160=912f95898d4c3fd196d59d3a5e27321fafeadafb \ + sha1=fda3cd61fc951e10225996114705121308f75a38 \ + sha256=2588070e7c4405a3f34463561e8516df452d5b6389e05f491edb1eb1d521ff10 \ + sha384=62af199d31917340b55c5d7f767e348d09ded710ac734c05b66a0bb36deb49091671740a965a15eb32eed915006a42ee \ + sha512=b0bf1364a6150e5b2a530de92a6baa86911f233b13d73c5d511164d7aa7f143ff31032824ac3795f5578c8e20382103c183eb2d9e7effbd047e6b14007d4dbd0 + windows size=0 time=1533887343.0 cksum=4294967295 \ + md5=d41d8cd98f00b204e9800998ecf8427e \ + rmd160=9c1185a5c5e9fc54612808977ee8f548b2258d31 \ + sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 \ + sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ + sha384=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b \ + sha512=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + windows.tmux \ + size=0 time=1533887343.0 cksum=4294967295 \ + md5=d41d8cd98f00b204e9800998ecf8427e \ + rmd160=9c1185a5c5e9fc54612808977ee8f548b2258d31 \ + sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 \ + sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ + sha384=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b \ + sha512=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + +# ./.byobu/bin +bin type=dir mode=0755 nlink=2 time=1533887284.0 +# ./.byobu/bin +.. + +# ./.byobu +.. + + +# ./.cache +/set type=file uname=bts gname=bts mode=0755 nlink=1 flags=none +.cache type=dir mode=0700 nlink=10 time=1533892203.0 + +# ./.cache/ctrlp +ctrlp type=dir nlink=3 time=1533887303.0 + +# ./.cache/ctrlp/mru +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +mru type=dir mode=0755 nlink=2 time=1533887303.0 + cache.txt size=21 time=1533887339.0 cksum=2617362503 \ + md5=1104fb548a18bddd784d01bbeccd0a9f \ + rmd160=9b84d88d0941157f3843418d74ccc849ab8c271f \ + sha1=fd76380895df14d112d6422485b2cfaabf5ee617 \ + sha256=7b3db0ef6cb9d5eeb8907363c53c60d7b28359b754ff9c2e1c6773b62f4c12fa \ + sha384=ca474c76a8b6142d281fb2fb458419fa95d0d929ecd29fae070597ff78da7c5d4cf38784eb59dc5fe32b72c0c0f71f83 \ + sha512=64d7067048e84ce7e2ce801909527dcb60c71be55e0acbb7e34e315ebb9d99812d6626f1e4a7b76c0f7249c703f1a4d4364ed255e9ef321dc406bd578aeffba8 +# ./.cache/ctrlp/mru +.. + +# ./.cache/ctrlp +.. + + +# ./.cache/evolution +/set type=file uname=bts gname=bts mode=0755 nlink=1 flags=none +evolution type=dir mode=0700 nlink=8 time=1533892198.0 + +# ./.cache/evolution/addressbook +addressbook type=dir nlink=3 time=1533892198.0 + +# ./.cache/evolution/addressbook/trash +trash type=dir nlink=2 time=1533892198.0 +# ./.cache/evolution/addressbook/trash +.. + +# ./.cache/evolution/addressbook +.. + + +# ./.cache/evolution/calendar +calendar type=dir nlink=3 time=1533892198.0 + +# ./.cache/evolution/calendar/trash +trash type=dir nlink=2 time=1533892198.0 +# ./.cache/evolution/calendar/trash +.. + +# ./.cache/evolution/calendar +.. + + +# ./.cache/evolution/mail +mail type=dir nlink=3 time=1533892198.0 + +# ./.cache/evolution/mail/trash +trash type=dir nlink=2 time=1533892198.0 +# ./.cache/evolution/mail/trash +.. + +# ./.cache/evolution/mail +.. + + +# ./.cache/evolution/memos +memos type=dir nlink=3 time=1533892198.0 + +# ./.cache/evolution/memos/trash +trash type=dir nlink=2 time=1533892198.0 +# ./.cache/evolution/memos/trash +.. + +# ./.cache/evolution/memos +.. + + +# ./.cache/evolution/sources +sources type=dir nlink=3 time=1533892198.0 + +# ./.cache/evolution/sources/trash +trash type=dir nlink=2 time=1533892198.0 +# ./.cache/evolution/sources/trash +.. + +# ./.cache/evolution/sources +.. + + +# ./.cache/evolution/tasks +tasks type=dir nlink=3 time=1533892198.0 + +# ./.cache/evolution/tasks/trash +trash type=dir nlink=2 time=1533892198.0 +# ./.cache/evolution/tasks/trash +.. + +# ./.cache/evolution/tasks +.. + +# ./.cache/evolution +.. + + +# ./.cache/flatpak +flatpak type=dir nlink=3 time=1533892202.0 + +# ./.cache/flatpak/system-cache +system-cache type=dir nlink=3 time=1533892207.0 + +# ./.cache/flatpak/system-cache/summaries +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +summaries type=dir mode=0755 nlink=2 time=1533982908.0 + flathub size=3989440 time=1533982907.0 cksum=3357406845 \ + md5=1962cdc7e3489217e85da1ab76fea2e2 \ + rmd160=9e33530ef7195ec32fccb6ea0068baeba6b05745 \ + sha1=56ba3347d2fc7591065d8ebf944a0f2b4e5d4a53 \ + sha256=75867f0fd5ab8e53505f4e97b3accc98216cf3d13db99959f468f5fe7e7b8d73 \ + sha384=369f87758778cc79ae0ac830bb3809c453510bea0b461057001a0ef07e797c24df9cbd5f7e5db52a45519897d574576d \ + sha512=ccb8ef9c3ecef187afb1dcc3bbffbadccd4641bffbb6b02fdc934697e5236d007632eadbf790465f62a12e8f536deae6027bfb7dc13a279f0bb81e88d9f976c2 + flathub.sig size=569 time=1533982907.0 cksum=573001640 \ + md5=a2d22644c856db9cd0359cb7f421a331 \ + rmd160=71dda896293f3529b65cac9d6784dd4ecff77a49 \ + sha1=b83399a302df12959c46db9715083248889beef2 \ + sha256=c6ae865caea3496d5f88195621f73fd949788f7c818dd6b0fd3066a2d9c2f6ff \ + sha384=96ff693a3595469ccc502092ada5074da6f522ab4e47038fcb2f22c0decaf3a8ce506b65f84d7f0035e637edf484410d \ + sha512=4fd61424eade6d47479ca2625d28286d078cf274443eea0913c7d0bc0e81b74a65cc395083f4aff24deb9801e69c760db86a12fd4cfc9de5157ea934e8407c77 +# ./.cache/flatpak/system-cache/summaries +.. + +# ./.cache/flatpak/system-cache +.. + +# ./.cache/flatpak +.. + + +# ./.cache/gnome-software +/set type=file uname=bts gname=bts mode=0755 nlink=1 flags=none +gnome-software type=dir nlink=5 time=1533892261.0 + +# ./.cache/gnome-software/fwupd +fwupd type=dir nlink=3 time=1533892205.0 + +# ./.cache/gnome-software/fwupd/remotes.d +remotes.d type=dir nlink=3 time=1533892205.0 + +# ./.cache/gnome-software/fwupd/remotes.d/lvfs +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +lvfs type=dir mode=0755 nlink=2 time=1533892205.0 + metadata.xml.gz \ + size=44744 time=1533892205.0 cksum=1675012442 \ + md5=d2e80bec8d6f34c2b6f9e2bf86ebc01c \ + rmd160=0b24bfe05d7bc50119fba2f68d9b8bb71d777e5c \ + sha1=c9df690436a3502b39f1ae0f52b64a0cb9d55290 \ + sha256=c2c20af7e7e0b3766ca8710a33afba8fedf5c71ac3ae016e080fd0765d3653a8 \ + sha384=0b044a3e27753e84cb9f326c84f32dd4b7c86afc4c2eed46a2b00fc2711a6cee82eb68530d606312b2a03327847baee2 \ + sha512=fe95b7076584d52b457ccc8e36c4ac56e7cdbbe86970f61837aa70bcab746be76f7de90a2a9785ea803634cbd578ecb73878658942855e75e13dd4da87b21d38 + metadata.xml.gz.asc \ + size=490 time=1533892205.0 cksum=533219609 \ + md5=6ba8f9aede101216dcac5ea4ed9fc5e2 \ + rmd160=7e1f293347adef3e53139b352fd93dacd4fc5020 \ + sha1=d6a610b1dbfbc78e5d7ba7b563b52ddece15bf16 \ + sha256=905ef78fa581e93575bc6aaa12df8bda3b24da32a211bb63d7933a04707e5e65 \ + sha384=b4dacb0ae588635ae7f2d17905b6b9994845b5974ded28011cf3d46882d5bb0dab6eda7aa4995c399479432ba58678f4 \ + sha512=ab7c43818b6e06d7438bf9864c9586d8937a152343b17f8dadf726d511ef31c8dbe1cd4cb468447b343bdf6a84a04a7115b3ed28bd6c1690d9ef8587d6547e49 +# ./.cache/gnome-software/fwupd/remotes.d/lvfs +.. + +# ./.cache/gnome-software/fwupd/remotes.d +.. + +# ./.cache/gnome-software/fwupd +.. + + +# ./.cache/gnome-software/odrs +odrs type=dir mode=0755 nlink=2 time=1533982926.0 + ratings.json \ + size=135331 time=1533982926.0 cksum=3487833939 \ + md5=9ab456e5b36238ecea4b521623b65d8d \ + rmd160=30e66a2b92e8d864db1b5da785f36c5359fafe6e \ + sha1=5b7c619cc684ff8b58b9515e688f032c879d4fc0 \ + sha256=095a514fd8379b70463ff27b1b82d85b9d3112dcc4bc647c9dfc68ad6f162898 \ + sha384=9ba52a91195bfafd25c7a92a9a61df625fab0ad6d56077ed82322c5bdc24363462feaee97f73ff53ccced57623d4a976 \ + sha512=d7d4880779ebbf8891974ebc94f9fdb33adfbbe2eec1864f9603b27616630203e38e7b00fbf1ab01ecfa6f40033fbc01e47f27160e47765cdafc3b72bc520325 +# ./.cache/gnome-software/odrs +.. + + +# ./.cache/gnome-software/shell-extensions +shell-extensions \ + type=dir mode=0755 nlink=2 time=1533982904.0 + gnome.json size=689340 time=1533982904.0 cksum=1985329461 \ + md5=48b2556d5c40de157b8ec226f1823681 \ + rmd160=cb184d7bbf07f46150c982d7b1f9e7a96290a0bf \ + sha1=918ad9dbcacc158fb54ae38edf66e87f1734f7ca \ + sha256=a586084bde502e1b918df63272b6119c3354e9928250fd4fd72cdbbe46c2e06b \ + sha384=74620eba249416a09415d02a15b5c83c566d28e56dc1c6c0af634bd6a305b47605989cab9b02aa74be94a6f467e17407 \ + sha512=0815326e9ddc91c99f6f6897d69e1faaa34807c52b6062b89d9c9068ea42142846ddab08003f253814ab4c45503d7c21426bb3ebe7b4a8c1ed00895ffd9549e4 +# ./.cache/gnome-software/shell-extensions +.. + +# ./.cache/gnome-software +.. + + +# ./.cache/gstreamer-1.0 +/set type=file uname=bts gname=bts mode=0600 nlink=1 flags=none +gstreamer-1.0 type=dir mode=0755 nlink=2 time=1533892204.0 + registry.x86_64.bin \ + size=659022 time=1533892203.0 cksum=3598088323 \ + md5=29c7854851b972bd75ccd693966458a2 \ + rmd160=bcff2fa1593069f7add90be43683dbf32753785e \ + sha1=8b0369bf17db47b2bb8954d6435639bf0b0b4a88 \ + sha256=4125ba384bc64ca020b9cddd941abd4a23d31239bfb845ed95eb93df13e4c0da \ + sha384=81b0c2868dfa5e16b62f672ee2cb44d698c4ba667271651d8e28e3bae4d0c2844b312012b9200e6dc1ae450255666fb9 \ + sha512=c6fcbc0066e97a1eb570e14931ec475c97c90531c91fa3ea9d7aea1c09b8430c1f73cc6e9b3244c46f0990cffb2f5ce8321dcb0856de347b1ca578e25fe6c7b5 +# ./.cache/gstreamer-1.0 +.. + + +# ./.cache/libgweather +libgweather type=dir mode=0700 nlink=2 time=1533892198.0 +# ./.cache/libgweather +.. + + +# ./.cache/tracker +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +tracker type=dir mode=0755 nlink=2 time=1533892842.0 + db-locale.txt \ + size=11 time=1533892200.0 cksum=1299461343 \ + md5=95a7bb7a8d0ee402edde95bb78ef95c7 \ + rmd160=db3e01a37dc26867c6a0f90c72c8a511cb049926 \ + sha1=2f7b4e2832e68e1b002423d9459c63734eef3941 \ + sha256=65ce8c93514741c928d27fcdbe7b0a754dfcaebcb2292111cd60305dc983f51f \ + sha384=fa222c070eff0125eedaf2977fcc24e8d29da4091b6fe2bfa7b0aea06f49aeca795c99d8fb6119387659c2375a414507 \ + sha512=f4bf1e5a254e0454f9fce50b42de03559f14be007ba7abf0bebefb61ab296265b28d9ce645b961b1a1e1f9d0245b786e76227961dfac81ac85512800f66971c9 + db-version.txt \ + size=2 time=1533892200.0 cksum=2793752979 \ + md5=1ff1de774005f8da13f42943881c655f \ + rmd160=c5c50c39f9b5de2dbb00e9ee07be15b276cec45c \ + sha1=4d134bc072212ace2df385dae143139da74ec0ef \ + sha256=c2356069e9d1e79ca924378153cfbbfb4d4416b1f99d41a2940bfdb66c5319db \ + sha384=ac379cd723f549e2410050ae58541ca19f0cafbff2e83b2cbf07b5a4e20d1aa3f8060bf3c6d62980380323ba46a0a8fe \ + sha512=c0033b5f5a4815a172984d64037dd49a8663fb8b3a71e47f11ecd332c8c3819c57e1631fdf46d66c6ff0e58763a61529fefcfa2a6675e186ee901e5452fedd94 + first-index.txt \ + size=5 time=1533892217.0 cksum=812303520 \ + md5=5337810b0c500ace9c4cd745f4b8bcf5 \ + rmd160=468b466ac6f52d13fe74564648e20933784a70ce \ + sha1=d1325bb186bd83303245e504f7c6eceae7f19e44 \ + sha256=8248f7772687aff0b103b36898908deb82126337f933e49a5ac04829093c58ff \ + sha384=569c13b976df33f10c4bf03bb0a81705344be315cbc8139f86ccdacee50425bdd523452096a526fb7b5c49ffe0297793 \ + sha512=5753b285d3f7881f06c35bb16931cf2a5408f13701855d5c7b2810f34e9bb266392d80ff15253a79f89d30a9ed0eec3be0e7e81677a7dbfa1e15a3907a50b02e + last-crawl.txt \ + size=10 time=1533892217.0 cksum=3333845165 \ + md5=675af9ce63ea7511baee3181bda1c5d2 \ + rmd160=e93b2399eba53f8042bd8500ad746413fa79dd27 \ + sha1=26f4a7a8fdc27c4673c769ee3d51b4ba2172c13c \ + sha256=82b3b3c9c0d6a4db991b70917f3a03aa26d920c9cc099abf5127cde1ff0126cf \ + sha384=82417a75a071d4c2952b768380ac8802a4c467a0d2aed4630341a1db42ee22afe70b2cc59a17b53cecaa84e17a09778b \ + sha512=7ba2263c8288cc9810148f142ea17b1c0bb93ba3f2572b91e26715dfc669a0851f287ebafc41a23fb90c5c754283dcb8a610960342c12b9151d916365f48cc37 + locale-for-miner-apps.txt \ + size=11 time=1533892842.0 cksum=1299461343 \ + md5=95a7bb7a8d0ee402edde95bb78ef95c7 \ + rmd160=db3e01a37dc26867c6a0f90c72c8a511cb049926 \ + sha1=2f7b4e2832e68e1b002423d9459c63734eef3941 \ + sha256=65ce8c93514741c928d27fcdbe7b0a754dfcaebcb2292111cd60305dc983f51f \ + sha384=fa222c070eff0125eedaf2977fcc24e8d29da4091b6fe2bfa7b0aea06f49aeca795c99d8fb6119387659c2375a414507 \ + sha512=f4bf1e5a254e0454f9fce50b42de03559f14be007ba7abf0bebefb61ab296265b28d9ce645b961b1a1e1f9d0245b786e76227961dfac81ac85512800f66971c9 + meta.db size=3686400 time=1533892857.0 cksum=3661685851 \ + md5=5a85dfedeb76d31b907b4140bd5080ef \ + rmd160=545e85f228eb1398458356e55cb4ed7953e2a483 \ + sha1=31c7127cb32f4a34cb040cdfb789ca1de1c97aec \ + sha256=916ceb30e76082d79bce655aae24984ffe5441f914afb349e7a0ab49d83cd8ea \ + sha384=65b5c8ffb506598fc141b553a8c676c2f6309e2a77df1d95a4c7188f2a01a1528f2be7c069d5fbd6e001ee371c6a0f09 \ + sha512=181cdbecdeac5edd57b040164ae06bc00466618c3881afa007a10cbcee795798a0d21b24f50f08ff730b3c77dd0998b2f20ba4d622acf7526416ea7be7821ec7 + meta.db-shm size=32768 time=1533892857.0 cksum=633931712 \ + md5=237e8655541107278aec6725b19acfea \ + rmd160=ddf77adfe5f4738ebe1518f7a2ec4cf933836de1 \ + sha1=f675bc0815bef1648fc822e137771dbc983feaa7 \ + sha256=415c01ce7b157531fdb62686db0705c8a01ac3f6f457423f003211ab3c117b6a \ + sha384=56d4c22b10deb79e54446b8c191b9cf1f626b40b7a378ed28e5966f888bb2ba722de36f3d7472b2f59aba1e9aebfe315 \ + sha512=da0e8efdc9a31df4ac08efb81f9a690034383d6d6aeeb3cfab4148260b462a09d1f4138df3dddad3cc67c2d992f0dfb60fbc9b933a07e102922ad72c77897d51 + meta.db-wal size=3547352 time=1533892857.0 cksum=622514369 \ + md5=2d4a9ad980b7fc48abd801f5225b37e7 \ + rmd160=a5c3af7e225f1bf1c83a957d70fdc6cffe4b09c7 \ + sha1=10e502c8456f316a4f6543d28ec5db555f05305d \ + sha256=38612027d02a0745213e7788dfd0d56ba1940e6d2000b7edf1f96b8905fa2131 \ + sha384=bed2e959f6083ce69cbef438144bd816203da969a81a18f1da1fca40742003aacec78612d3030ada37954d0fe5e58037 \ + sha512=0dc230875e330ce2a6a7f82828f50afb415bcd7660423d7157735151512da35f01f6752023362f79477d2a82ebad2f193bcea642af62ea643a5cabb1acd9c74b + ontologies.gvdb \ + size=361550 time=1533892840.0 cksum=435789844 \ + md5=efb2f7e13f29218b07b16a8de9c87019 \ + rmd160=882bc13fa4bd74f6fddc8d651587837025034619 \ + sha1=1dfc7af25038bdad77844cee09f5fe2d98bd0f2e \ + sha256=ad08ae37ce86bc1da403eb2fb5f4da2842c49e5c94fd5ab4cee0c79adfdf7247 \ + sha384=ba5634e516dbc96d6fc78b0e105a2d942dad5449aad10397d69a43f8bf05378f23b7143916873d9a3db94edf6b055e18 \ + sha512=c5ebbbf4b51d63285a213e4da8ef470c970fac6632b8cd61eb536dd6b3bb95426cd184d0c796d1fac16784780bf469d5b23203616a45cda4d91a896b6baa0c2c + parser-version.txt \ + size=22 time=1533892201.0 cksum=185235860 \ + md5=72f18e39b0136754db8b29489359dcab \ + rmd160=007578237bf335dad7a089d349cc7554fb224e15 \ + sha1=5c6664dbdacf5b7d03baed460aedf810e55cd5a3 \ + sha256=f28a57f94a52411d9dba2cc5ca3bcc289f724a5af4d574d4d34ae8b3631abaf9 \ + sha384=ab2b2e1223e8e01929530869288dc0f4a0b5c25698440371fcf45b807ea08c5371d31131299f42694543869fd792bf29 \ + sha512=7a3bd4530d71dfd19608d3e3e519cb1f89774c3a998a1a8cb3797338a71ff8eadd8f741574e1e465fe018afbcacd2b3fad8d66024551a1ffde54041e9528784e +# ./.cache/tracker +.. + + +# ./.cache/vim +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +vim type=dir nlink=3 time=1533887303.0 + +# ./.cache/vim/swap +swap type=dir nlink=2 time=1533887339.0 +# ./.cache/vim/swap +.. + +# ./.cache/vim +.. + +# ./.cache +.. + + +# ./.config +.config type=dir nlink=9 time=1533892348.0 + monitors.xml \ + mode=0644 size=560 time=1533892348.0 cksum=2260937204 \ + md5=12fd02df41ff6d000396eca039ae2a28 \ + rmd160=e6754f40a05cd5c839b11c70db38d2551ab2da24 \ + sha1=1a4e8a8b49d0fdb1897600848f54dd2cf4ccdac7 \ + sha256=9516d2ab6121e7c120dc43d37370ac48ef461143bd5ed078a54e36e81b88240a \ + sha384=77f51944f2289e23153b6164655820cd7d5c6b60be06b611004ec319ed73fed4794375b4024f169405b3c588c98af43f \ + sha512=c9a6d1ad46e383a2829bb72ffe2e7e76e004e575bd6b44e611d122a018bcec07181e389185052b8b2fe46fc6d77e6bd9ffbac05e62ec34b38852eba4130c7fa1 + monitors.xml~ \ + mode=0644 size=560 time=1533892323.0 cksum=3824915986 \ + md5=37c1b73559d167d795edd4c68c221415 \ + rmd160=28e83036c6c24787ec93cc362edd35df554bb63c \ + sha1=f3e8be7b1f5203ca3e16e7f242a2eed288a0a2cc \ + sha256=e06163e52e831fcb2953099214b45ea3d01fbb08e8e33b62dc4f5482f09a975b \ + sha384=eee195965cb87616aa6132ea345ab2c1e8491114fd45a653a481d3e9b1f7b14aed439acdccaebb7402129acef3fdbd84 \ + sha512=b7db2c3a6ea7fe0260de4800779ce84fbc09b5c0f2e8486bcea01d89615057c738be554974c22d573a50c0a3d26b810fcf806b8324d574c84baaf0f0cb644047 + user-dirs.dirs \ + mode=0600 size=633 time=1533892142.0 cksum=3785135043 \ + md5=e96ec7012d30be266ba6e6d81e88228d \ + rmd160=72e84e6401c96bea6b05e890722daa287415e748 \ + sha1=7da04e08c59f32b0c631dfd59f72496f6d7c6f02 \ + sha256=6a0a498fde15c3747b508f4464e82f53e16c501a49f2e0c9fb114bbfbb051887 \ + sha384=ecc53b3b1f7a8e319d309301c4a2d82f5cba2b6190b454d1afcca175df5197204170a6344aacabdf46860b7e8c235b8b \ + sha512=d12408ad419e7cadba1d6a51727f2bb82c566375140f3a9d71c086eb426266438d4e84b85132f587989c7a66f0fcd7701995c3041eb99288d75339ddc8434af0 + user-dirs.locale \ + mode=0644 size=5 time=1533892142.0 cksum=1549138745 \ + md5=71095c56c641f2c4a4f189b9dfcd7a38 \ + rmd160=3252f20d06d10500a638e6b10764bf126d7bad65 \ + sha1=fa73905e89c5c67747184ab362f7d0d86a939eca \ + sha256=674ac4b0bd40c5764a1ddf4e0119e9b4ee02f743211eefcf7b27c932a4831a4b \ + sha384=732874891284dd86a6df3a16ee10461fe85e7e1194a65d9f4f14fa90a6e61312d5c47d7b1a58408ca490d1a4e50a04ed \ + sha512=b6f5072c9cb9a2c14962464beda070f272996577892afacb000903798ebac4e422d660722959bce95a6e5f54ed6ca09308245c82716dad76bfc15ff8b3b4dd36 + +# ./.config/dconf +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +dconf type=dir mode=0755 nlink=2 time=1533982902.0 + user size=3748 time=1533982901.0 cksum=598808774 \ + md5=f2772e8d168e4175fcef76c3050f7131 \ + rmd160=01389b32b9ef1292769a58bc0669ddf9d6900101 \ + sha1=9a083aa67a95dae389563f1e3a9883b7e0943fd9 \ + sha256=2fe41b3fc1342550cad7b124f292b20ee621b80ad6d93adf2c5e32cd44be0ceb \ + sha384=cb2cc1929d983dd836fc8fa915d8af3238953ebc0b7b3297987670ef31a746ffd524ba6bd7056187b48ae0cd45655058 \ + sha512=83bec9ddc39b481c8451011914f2dd18ebbf49b506e1277ddec50ca5a7b5fab89203cf98ea1433ccc08f5b4be3bcf5c0de0a6fa5391845603740589c432e6c2b +# ./.config/dconf +.. + + +# ./.config/evolution +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +evolution type=dir nlink=3 time=1533892198.0 + +# ./.config/evolution/sources +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +sources type=dir mode=0700 nlink=2 time=1533892198.0 + system-proxy.source \ + size=993 time=1533892198.0 cksum=3992040821 \ + md5=32746f7a7be67f745a4101e22022d7f3 \ + rmd160=edc2a33cea302cbaaf6502b381f07e8991971080 \ + sha1=1e1e573c8b472cba64ce6b0646c743cd16dcfeca \ + sha256=1e9d2f3fbee1cd67b58660dfd8945d2e60d72824db1561645b7d35581b8f224e \ + sha384=8a20dee35758eccefbaa91608ccda52944c2a8ee61d741b2d653fbf70cca27851e0f350b7323a0e6fc45f2893db7c71a \ + sha512=34c2f38620ad90d2ec28f01b0f7ef0427a8c4cfe23ddb411f0f22be3774ffb939bc1a6963e1bd364f8b0ed71c0eda3ba1b8fb2d1e9ee1dad9c4d3438b2f8235a +# ./.config/evolution/sources +.. + +# ./.config/evolution +.. + + +# ./.config/gnome-session +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +gnome-session type=dir nlink=3 time=1533892197.0 + +# ./.config/gnome-session/saved-session +saved-session type=dir nlink=2 time=1533892197.0 +# ./.config/gnome-session/saved-session +.. + +# ./.config/gnome-session +.. + + +# ./.config/goa-1.0 +goa-1.0 type=dir mode=0755 nlink=2 time=1533892198.0 +# ./.config/goa-1.0 +.. + + +# ./.config/gtk-3.0 +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +gtk-3.0 type=dir mode=0700 nlink=2 time=1533892840.0 + bookmarks size=127 time=1533892839.0 cksum=4055419018 \ + md5=b70ea27a8be6be1941a23013a970e1b0 \ + rmd160=1d68b8e898620d131b2820eeba02b49b0db756d8 \ + sha1=8587623c8b43874b57a570528e93066d3178a9b1 \ + sha256=215e70d99350f64ffb6bab171b418b1ee620e5d728a098534fe87963018d4263 \ + sha384=6af12d518cbcb1b8bf0707558ee490b51489298d80516626d2c9ae3c4d9479f89f5bb648ecde3b0f4db3eca028738b48 \ + sha512=9c75a71c2ba2355e39cedf2c0993ffc22e6f9af211336e8295e78487dda7734ce1fe29d8678b772aa6fd53696ce76375d42b8169b378f9381e5e505166244364 +# ./.config/gtk-3.0 +.. + + +# ./.config/ibus +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +ibus type=dir nlink=3 time=1533892198.0 + +# ./.config/ibus/bus +bus type=dir nlink=2 time=1533892198.0 +# ./.config/ibus/bus +.. + +# ./.config/ibus +.. + + +# ./.config/pulse +/set type=file uname=bts gname=bts mode=0600 nlink=1 flags=none +pulse type=dir mode=0700 nlink=2 time=1533892202.0 + 0054cfa0224449deb05473622504e07f-card-database.tdb \ + size=16384 time=1533892197.0 cksum=349238371 \ + md5=bbb103738cb7384a5464259154ebf7f1 \ + rmd160=4d17543538ea5b84ea11c7e62851a65f3f394c26 \ + sha1=9c3ae2b3c9ddf55bbf7a4480b89dde866b430e74 \ + sha256=7fd739b58dae5b867391cdb71934e57d1628f2c0a69865a24ab0d39d75923c27 \ + sha384=2450c74418b0c343efdfafe220a099f949cec0124435e15bde3fdf8d22f888229d89b60d1782bdb723d474005ea565af \ + sha512=2eac5a6eef1a51f14cf40b050a22057f3d32c9a308aef67bbd0e168100897baaa953167020b96a4b14b3b0307b578c9b98b0feb4edcfb75e9f853505f6a71389 + 0054cfa0224449deb05473622504e07f-default-sink \ + size=1 time=1533892842.0 cksum=3515105045 \ + md5=68b329da9893e34099c7d8ad5cb9c940 \ + rmd160=c0da025038ed83c687ddc430da9846ecb97f3998 \ + sha1=adc83b19e793491b1c6ea0fd8b46cd9f32e592fc \ + sha256=01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b \ + sha384=ec664e889ed6c1b2763cacf7899d95b7f347373eb982e523419feea3aa362d891b3bf025f292267a5854049091789c3e \ + sha512=be688838ca8686e5c90689bf2ab585cef1137c999b48c70b92f67a5c34dc15697b5d11c982ed6d71be1e1e7f7b4e0733884aa97c3f7a339a8ed03577cf74be09 + 0054cfa0224449deb05473622504e07f-default-source \ + size=1 time=1533892842.0 cksum=3515105045 \ + md5=68b329da9893e34099c7d8ad5cb9c940 \ + rmd160=c0da025038ed83c687ddc430da9846ecb97f3998 \ + sha1=adc83b19e793491b1c6ea0fd8b46cd9f32e592fc \ + sha256=01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b \ + sha384=ec664e889ed6c1b2763cacf7899d95b7f347373eb982e523419feea3aa362d891b3bf025f292267a5854049091789c3e \ + sha512=be688838ca8686e5c90689bf2ab585cef1137c999b48c70b92f67a5c34dc15697b5d11c982ed6d71be1e1e7f7b4e0733884aa97c3f7a339a8ed03577cf74be09 + 0054cfa0224449deb05473622504e07f-device-volumes.tdb \ + size=12288 time=1533892197.0 cksum=178495308 \ + md5=ba1d50b02007978aacdcfdf2d6124820 \ + rmd160=2befe1a2d2680bbdfb3f322fcbee82a56df983ba \ + sha1=8bffe1e59ee2ac8677eab209c2a382115b5b8dca \ + sha256=ded42ab1133ac7a4b4c355dffe2647158037e25ade23f75f6d2288dd5dd3c38a \ + sha384=4dfd013ccf94eb25b67a28ed2e63d903e644a0515d7c03037df34289e3fc02110dabf4ca6cce9d3093f9f9f95d186ec9 \ + sha512=e778d74b7ba7cf23fe16c7a0a27851169a314f308308bc5ac86480160c24fc8e0c0d83222a3803adaa13f1e2d2142093924207b3c3dc6398e4cd9c765b3953d7 + 0054cfa0224449deb05473622504e07f-stream-volumes.tdb \ + size=696 time=1533892197.0 cksum=2603747815 \ + md5=734dcdfd150ed504d29ed536dce5dfcf \ + rmd160=7f26e4a77d8dac9ef2bc96cccd96cb0560528e4d \ + sha1=647e3a6af34d93743e018fa5aab66aeb2f716d8f \ + sha256=4579a11c1145ee206796c2f5326d8ee86822c865cbb7a9503be153764526df1a \ + sha384=14cbb117f335703cb8d12b75ed8be68c00b3271a333904ef8edfe07c4862deeb72af86a6dcb2a0bda041ae974568c280 \ + sha512=a5c9f98717cecffa7ef78ac023f029c349a34496e08d6582d64476879ca5b434a66dfcd4c250bc1e3c7e610a29d18c44934dd78d38f8f89989393dfd41706783 + cookie size=256 time=1533892197.0 cksum=120835636 \ + md5=325fd991f11a7fcad7dc8e9ebbf036fb \ + rmd160=1ad702cd20eaebdfbc7ccf9aa4de2bf304b1dd77 \ + sha1=a4a950a431bbd14ecc52183a8d89877ca6f70d26 \ + sha256=530f4ac831c83d95b5438b7e52e3980504a90df845056ff5899635d2c2c16af0 \ + sha384=7e8c83c223a1124c46a6066a01ecca09e93fa2da28e006d205490d56a836d447d5bd67dd42f1fee702a1376736b054a4 \ + sha512=949f143e9400d29f481ef5dbba6a421bcf7d138828407761b06378ca3988a424c118f4a34ddc6dd2dbf71c553911187c0090295bf9bf86a361aa78343a2a7dce +# ./.config/pulse +.. + +# ./.config +.. + + +# ./.local +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +.local type=dir nlink=3 time=1533892197.0 + +# ./.local/share +share type=dir nlink=14 time=1533892204.0 + +# ./.local/share/app-info +/set type=file uname=bts gname=bts mode=0755 nlink=1 flags=none +app-info type=dir nlink=3 time=1533892204.0 + +# ./.local/share/app-info/xmls +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +xmls type=dir mode=0755 nlink=2 time=1533982904.0 + extensions-web.xml \ + size=1111654 time=1533982904.0 cksum=2919485898 \ + md5=7040c7957671ed9cf0ab832f0be03ecf \ + rmd160=b0e772249f30fb8b5280dc12a689ec2052c45853 \ + sha1=7f47eef68d49faec413a4f96fa768fa27328a420 \ + sha256=a00a65acaf4cbe6967f20efc2f214c278c5d3dbe5fab1a5189e06ba941de54df \ + sha384=d4bf2143cef6086b405b631912f03c0da2bfb939ff14521256066054667aead8be383b5d70a2928ec4dcad6fdf8d1ec9 \ + sha512=e660ab87b556d5205aa6c9bb28582c84c0cb3182c8d99c8292a439cb0e024be09365fb97a25e7e6fe94f89e3b7961372e3c9d9f889f211198588a068a91a5e3d +# ./.local/share/app-info/xmls +.. + +# ./.local/share/app-info +.. + + +# ./.local/share/applications +applications type=dir mode=0700 nlink=2 time=1533892199.0 +# ./.local/share/applications +.. + + +# ./.local/share/evolution +/set type=file uname=bts gname=bts mode=0755 nlink=1 flags=none +evolution type=dir mode=0700 nlink=7 time=1533892198.0 + +# ./.local/share/evolution/addressbook +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +addressbook type=dir mode=0755 nlink=4 time=1533892201.0 + +# ./.local/share/evolution/addressbook/system +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +system type=dir mode=0700 nlink=3 time=1533892840.0 + contacts.db size=86016 time=1533892839.0 cksum=3427469314 \ + md5=e6375479e5e41a20968232d3188d9562 \ + rmd160=71740e3d3ac9be7d419dd58686ab1fcde32ba62e \ + sha1=b69eb6fa06680d8221d727909d4e70baeeb82bb5 \ + sha256=fd52acdd98541d49090ff5f37c52160b445d9340ad0fbe7eef8b71d273368a41 \ + sha384=a4d86b5d88021c7750092a9a8f7795163449b11e2dcd54461f2e231fca91c8c84e4be3beb695cdf7efc19f879ebf03f3 \ + sha512=619346f552799642cb12987caa097e4921e1132c71163f2cc65f14f21c5e43b751e518f28ffa49d29c1d94e25e74be1528797eb43ea286598df74257cc619ccc + +# ./.local/share/evolution/addressbook/system/photos +photos type=dir mode=0700 nlink=2 time=1533892204.0 +# ./.local/share/evolution/addressbook/system/photos +.. + +# ./.local/share/evolution/addressbook/system +.. + + +# ./.local/share/evolution/addressbook/trash +trash type=dir mode=0755 nlink=2 time=1533892198.0 +# ./.local/share/evolution/addressbook/trash +.. + +# ./.local/share/evolution/addressbook +.. + + +# ./.local/share/evolution/calendar +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +calendar type=dir mode=0755 nlink=4 time=1533892201.0 + +# ./.local/share/evolution/calendar/system +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +system type=dir mode=0700 nlink=2 time=1533892201.0 + calendar.ics \ + size=173 time=1533892201.0 cksum=1042167468 \ + md5=b652f0f649ff8d20184fa6e8ea0c308e \ + rmd160=f2af8eb58fb0fe98d0c501fccee88cb59899171c \ + sha1=eb5a0cc61686e356a451d926131c6bc3a098fb5f \ + sha256=e0b677c7cc97564f27f3175fc120fc7321b67af078ff2aeb90c32f85586b1abf \ + sha384=97e392aebacd84c6f575a2e4c6b0a6e0587f8703a84b8769092a5b294f50909b50051659f339039adfc80f0250246487 \ + sha512=91f6ba15ab02d48659b5b31596ad966f9369fe1d16b831a501b34c238855a0a612cf40972c578eb8b231b5aec09452698d32db662121d6f0f8058c9f4c262ab8 +# ./.local/share/evolution/calendar/system +.. + + +# ./.local/share/evolution/calendar/trash +trash type=dir mode=0755 nlink=2 time=1533892198.0 +# ./.local/share/evolution/calendar/trash +.. + +# ./.local/share/evolution/calendar +.. + + +# ./.local/share/evolution/mail +/set type=file uname=bts gname=bts mode=0755 nlink=1 flags=none +mail type=dir nlink=3 time=1533892198.0 + +# ./.local/share/evolution/mail/trash +trash type=dir nlink=2 time=1533892198.0 +# ./.local/share/evolution/mail/trash +.. + +# ./.local/share/evolution/mail +.. + + +# ./.local/share/evolution/memos +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +memos type=dir mode=0755 nlink=4 time=1533892204.0 + +# ./.local/share/evolution/memos/system +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +system type=dir mode=0700 nlink=2 time=1533892204.0 + journal.ics size=173 time=1533892204.0 cksum=445655860 \ + md5=8197679d5902039270b1d41880df5131 \ + rmd160=d7d673eac482758c3e9ccd9297e8d22adafcfe34 \ + sha1=13dc8889710389e4a1869b83e6e149b56946a19f \ + sha256=0f703f467c8b974c8353f45d7dcd658329f6f9049ec881f7c9d536e5abc5d9ca \ + sha384=a49a2a17598592a1d5bbf8e1d17950cf394f8e38edffb95484515020838475a8fe21222ed8c80c508bd18b6e2ca529d7 \ + sha512=9329033ba290499adb51c2e6fe68bda2c7614d26ec6dabb7fdcd09fe0db4953eaa18b17830bd9ec94f267f4861bca6a19b1d1567b8ef861a52f81324f349cde4 +# ./.local/share/evolution/memos/system +.. + + +# ./.local/share/evolution/memos/trash +trash type=dir mode=0755 nlink=2 time=1533892198.0 +# ./.local/share/evolution/memos/trash +.. + +# ./.local/share/evolution/memos +.. + + +# ./.local/share/evolution/tasks +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +tasks type=dir mode=0755 nlink=4 time=1533892204.0 + +# ./.local/share/evolution/tasks/system +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +system type=dir mode=0700 nlink=2 time=1533892204.0 + tasks.ics size=173 time=1533892204.0 cksum=3068391378 \ + md5=c1912ed5ffc3a459d7a72d29a906c446 \ + rmd160=e479659f9da3792f3f86f53eabe346c26676281a \ + sha1=f20ec7cd98f80d515ae05c540493103d01a67943 \ + sha256=ec4f325c66914205e513c4822a813bd0e15dd6f216916ecb9acd9a4f45e2f8c4 \ + sha384=fa03a614501c2886bd9548e076fa8f33fce70b3c7ada5a16e0d9977a8ba024f522be9597429b71a446b6f1a188b3941c \ + sha512=708ec3644008054f4b99c0ceda08bdad226dafefbd419caa390b459f8bcc725ebc78320816a3782e65b145b8e7ebe2f90f8514193d2d6cd84b742cbabcfb46e6 +# ./.local/share/evolution/tasks/system +.. + + +# ./.local/share/evolution/tasks/trash +trash type=dir mode=0755 nlink=2 time=1533892198.0 +# ./.local/share/evolution/tasks/trash +.. + +# ./.local/share/evolution/tasks +.. + +# ./.local/share/evolution +.. + + +# ./.local/share/flatpak +/set type=file uname=bts gname=bts mode=0755 nlink=1 flags=none +flatpak type=dir nlink=4 time=1533892202.0 + .changed mode=0644 size=0 time=1533892202.0 cksum=4294967295 \ + md5=d41d8cd98f00b204e9800998ecf8427e \ + rmd160=9c1185a5c5e9fc54612808977ee8f548b2258d31 \ + sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 \ + sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ + sha384=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b \ + sha512=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + +# ./.local/share/flatpak/db +db type=dir nlink=2 time=1533892201.0 +# ./.local/share/flatpak/db +.. + + +# ./.local/share/flatpak/repo +repo type=dir nlink=7 time=1533892203.0 + config mode=0644 size=67 time=1533892202.0 cksum=4094986651 \ + md5=f71211794058ee7a86c759209a98d627 \ + rmd160=a2560445cc0ce2233f536170c0306bd4ebdc59f3 \ + sha1=ebf213b5dda387a444233db3aedfade13c07029d \ + sha256=2c42847170b4975de955e4149a5e0737babe5c5d4951d42a7a960e73c18528ea \ + sha384=aa3a68b6ec0e10c9e8a04952fd1959f26932f4d3bb6298bde9d6914def1b40ad6fc09f0da3b5553c5328bc758a2ae393 \ + sha512=e5d8b958e787b155663bedb7dc418b828c0b0f4791559b65125a492c0a8958d8b265d41cd1b209291d4116a84d639636185906b4695655ecbb70c79904ed6f61 + +# ./.local/share/flatpak/repo/extensions +extensions type=dir nlink=2 time=1533892202.0 +# ./.local/share/flatpak/repo/extensions +.. + + +# ./.local/share/flatpak/repo/objects +objects type=dir nlink=2 time=1533892202.0 +# ./.local/share/flatpak/repo/objects +.. + + +# ./.local/share/flatpak/repo/refs +refs type=dir nlink=5 time=1533892202.0 + +# ./.local/share/flatpak/repo/refs/heads +heads type=dir nlink=2 time=1533892202.0 +# ./.local/share/flatpak/repo/refs/heads +.. + + +# ./.local/share/flatpak/repo/refs/mirrors +mirrors type=dir nlink=2 time=1533892202.0 +# ./.local/share/flatpak/repo/refs/mirrors +.. + + +# ./.local/share/flatpak/repo/refs/remotes +remotes type=dir nlink=2 time=1533892202.0 +# ./.local/share/flatpak/repo/refs/remotes +.. + +# ./.local/share/flatpak/repo/refs +.. + + +# ./.local/share/flatpak/repo/state +state type=dir nlink=2 time=1533892202.0 +# ./.local/share/flatpak/repo/state +.. + + +# ./.local/share/flatpak/repo/tmp +tmp type=dir nlink=3 time=1533892202.0 + +# ./.local/share/flatpak/repo/tmp/cache +cache type=dir nlink=2 time=1533892202.0 +# ./.local/share/flatpak/repo/tmp/cache +.. + +# ./.local/share/flatpak/repo/tmp +.. + +# ./.local/share/flatpak/repo +.. + +# ./.local/share/flatpak +.. + + +# ./.local/share/gnome-settings-daemon +/set type=file uname=bts gname=bts mode=0644 nlink=1 flags=none +gnome-settings-daemon \ + type=dir mode=0755 nlink=2 time=1533892200.0 + input-sources-converted \ + size=0 time=1533892200.0 cksum=4294967295 \ + md5=d41d8cd98f00b204e9800998ecf8427e \ + rmd160=9c1185a5c5e9fc54612808977ee8f548b2258d31 \ + sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 \ + sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ + sha384=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b \ + sha512=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e +# ./.local/share/gnome-settings-daemon +.. + + +# ./.local/share/gnome-shell +gnome-shell type=dir mode=0700 nlink=2 time=1533902567.0 + application_state \ + size=202 time=1533902567.0 cksum=935551653 \ + md5=bd4d6ec5e9732cb1f29355cf83eef95c \ + rmd160=fa417fec73cf18de7e61b46e1a4dcac60a5a3269 \ + sha1=ab0d453c4b7eecc353252bcb57eaab7de2a08ac1 \ + sha256=c6bb9db54d5ce81e7b84078fee1d319ae68bd1d09b6a67410b7ac2d9b35b812e \ + sha384=1ae45c3d448a0d67e99e4cf09826f7e3ed0fab3d5d7084e4bb212b7b74d0ee626dcd9c1f4f294a34059cd756a50f499a \ + sha512=fd28018329d66d856ea1647a396938d266bd1b61bb146b3c089a059a162ee43d48a7754f6bbb87943a0bdb364bbf5fa7335d874241991ebf2a02547beff52083 +# ./.local/share/gnome-shell +.. + + +# ./.local/share/gvfs-metadata +/set type=file uname=bts gname=bts mode=0600 nlink=1 flags=none +gvfs-metadata type=dir mode=0700 nlink=2 time=1533892264.0 + home size=64 time=1533892263.0 cksum=1303115355 \ + md5=44256d920996ba3bc93084ab63b56e23 \ + rmd160=e27207934cc7294857ba609ac057c7e362b52f4c \ + sha1=2ed26009aee5ce04cab56799aed84989114cd677 \ + sha256=92cb4e85a26044194d895dbed75bc65910032a2bdca35a51b4ae71914045ad5a \ + sha384=f242c1cb662b46196cb18640f76188e4e75d9a7888dcf0bec9f3e6e1f6b8176e3c636a92b77da415c298d0da6d381730 \ + sha512=c194ae6dbf3b2afca379b85e1dfa6204307324764ced1523ed4acc878a63fe8af8835b00d138c1e0f02535c9e7bb5c21979580ad181512223ddbc52c785fc5de + home-0e821ed7.log \ + mode=0644 size=32768 time=1533892264.0 cksum=4129138632 \ + md5=9e1aeb85185e06fbb563a4f86c51c531 \ + rmd160=02005dbb5bde6a26a5fb8934f0e693937f53521d \ + sha1=8191b24587cea4f40be8e5f71ff9b7dff46e615c \ + sha256=22fe3fe144f4db1bd37c9932a455126ba0fa3dfc25a4dd1c73ab621e52453a30 \ + sha384=1d9eccc897f301804d93084127293a233ee371c0c071aadee0dba47914b72d657bc9fa6fd8da635d452b78ec198a17ca \ + sha512=8a1e553648f4f8277f355a8e54f81b18994dbd270b79a6690e844091723cb17fd1ee4f5229442f2a7500d2b76ca100299c36774cfa1b370d4cfaa9df79790369 +# ./.local/share/gvfs-metadata +.. + + +# ./.local/share/icc +icc type=dir mode=0755 nlink=2 time=1533892200.0 +# ./.local/share/icc +.. + + +# ./.local/share/keyrings +keyrings type=dir mode=0700 nlink=2 time=1533892197.0 +# ./.local/share/keyrings +.. + + +# ./.local/share/sounds +sounds type=dir mode=0700 nlink=2 time=1533892199.0 +# ./.local/share/sounds +.. + + +# ./.local/share/telepathy +/set type=file uname=bts gname=bts mode=0700 nlink=1 flags=none +telepathy type=dir nlink=3 time=1533892198.0 + +# ./.local/share/telepathy/mission-control +/set type=file uname=bts gname=bts mode=0600 nlink=1 flags=none +mission-control type=dir mode=0700 nlink=2 time=1533892198.0 + accounts.cfg \ + size=21 time=1533892198.0 cksum=3539680592 \ + md5=b00b5be521f54486ca642da7793ee116 \ + rmd160=034d037b8dd84bd6c6ae86d7f7cbcd265d77f04c \ + sha1=1db7e500fc14542d2cf007150d8edc6778a11536 \ + sha256=c0f86d64fa4389f0dac8df955a5bd252757e74075e3d40ee7cf0299d27df4141 \ + sha384=9169a7900ee434feeefa13703794a39576b7a3f54ec87618e12e549d9fcf5b05f338591085a58c8a4116cc4630354673 \ + sha512=d853b5b73b5fbefbedf4ca0ede90a3a019208eb7050cfe1ea7f3f416d2f9d0cea0001122ba8a118a8ce4496611c2e5d7cfe3ed56fbb5d2a086b3225619b0a74c +# ./.local/share/telepathy/mission-control +.. + +# ./.local/share/telepathy +.. + + +# ./.local/share/tracker +/set type=file uname=bts gname=bts mode=0755 nlink=1 flags=none +tracker type=dir nlink=3 time=1533892200.0 + +# ./.local/share/tracker/data +/set type=file uname=bts gname=bts mode=0640 nlink=1 flags=none +data type=dir mode=0755 nlink=2 time=1533892839.0 + .meta.isrunning \ + size=0 time=1533892839.0 cksum=4294967295 \ + md5=d41d8cd98f00b204e9800998ecf8427e \ + rmd160=9c1185a5c5e9fc54612808977ee8f548b2258d31 \ + sha1=da39a3ee5e6b4b0d3255bfef95601890afd80709 \ + sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ + sha384=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b \ + sha512=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e + tracker-store.journal \ + size=115355 time=1533892857.0 cksum=1685274014 \ + md5=c361129af8e96bf726d041538bfce95c \ + rmd160=92383ec12dbc1e27b54b87696e05fbf6896f17ef \ + sha1=af3d0e6438ba7af452c3d341af65ec144b48adb4 \ + sha256=897f648061b2b9b13191d5e93303a4deb75d8f4f8907c3e297b8bd73ed481562 \ + sha384=867d89a809a505e9739ce73d8f3af3d754fc8bdc1e865fa80b79c3f352ca8805d93210b6875a39f24c66c1bee1ba7e36 \ + sha512=4759a3c82cc4624fabb05966ccc7ec615bf50ba54530ff09b4d2ef472f6489d8e179751ab201512dfc3e137686d706470dc71a8e2569a125097a763b864f27f0 + tracker-store.ontology.journal \ + size=75541 time=1533892840.0 cksum=3283930654 \ + md5=7ab9783b7c36f6bb2efb71fbfc2db9e4 \ + rmd160=57c2fe3aa04119a48ed9fedeecd7526f7e51b9e2 \ + sha1=334017fa833b7bd440af20d7cc02f2a478622ff7 \ + sha256=a593460b51b74e120c443facbf3fc9c0d0c77b8bcd6c93005b445ef5641fbb04 \ + sha384=6dc06e8be20eac02d54efdd1776e0cf937f2f066c2f5fca3d7e02033457e36b718204cb678ded8f54ab194cb551be404 \ + sha512=2021a007392f09ff24ccdbe56f82b011bfdb849bb8e214d336ec98d6353bc5d0fba0b1c50c357caa151b14afa67f45ae5119290748d928dfaf7620af10c68298 +# ./.local/share/tracker/data +.. + +# ./.local/share/tracker +.. + +# ./.local/share +.. + +# ./.local +.. + + +# ./.ssh +/set type=file uname=bts gname=bts mode=0600 nlink=1 flags=none +.ssh type=dir mode=0700 nlink=2 time=1533887570.0 + authorized_keys \ + size=9040 time=1533887408.0 cksum=2601383629 \ + md5=ef306154ae6fd310e49e73f8d7dc2a0c \ + rmd160=22ca6d5a6e05bad7c5b98da847291d86c7c86d5a \ + sha1=25e550ca6450830b6597b8714fa36a3b742ea937 \ + sha256=31d9b33468ef0752cc60aa3103d1313bfe44e80a20091ce935dd47a8e469f518 \ + sha384=63b403a369b216d4f4a8cee01cde1a54270a11c60363b5cafe787c4f791601a70bc7bbaadc25215d8c7159fbdc7401f0 \ + sha512=70ae05aed2ec80896ae2284db674bd8e521053616b1b231502befb5286a717c73ba6af8a51fb79ac5252fcac9350f01a19e5501b7780cec7e46e624636c831e6 + id_ed25519 size=399 time=1533887539.0 cksum=3390307129 \ + md5=7c8e5fb99704b31d047fbbd05367dd16 \ + rmd160=7bd2c53596ff7bda12b09fb3ba030e72aa9a2fd1 \ + sha1=5747e6565056c0701799efceb3c2d1a245876f4b \ + sha256=b3d51c23e852f11c55e584269f961424c7f81cc49e8d6560e99d566804d3a84b \ + sha384=4a849c2ef55bc30267c72b0ad0dcaf21398f6617862d5eb6bc0ba3fc415bff407662fc956161dc1c828e98af2466470d \ + sha512=b40422f4c203ad85b8ff5c043d1dd1c6639cb6fbb2b8dcb9e4aff622bcc75d4a978654ed1c39f36c8ec65954f508eab740c6596ac117b7c233bf8036f0e09cc9 + id_ed25519.pub \ + mode=0644 size=93 time=1533887539.0 cksum=4046864085 \ + md5=5a68c5c7afdd393f84cbdbe192810b87 \ + rmd160=bd2335f8450d88747088c74c27d38015e2e3527f \ + sha1=efee6435defa70bc61f8fe9cb4bbd2b80d4d2320 \ + sha256=eaf28e30061448b2d20228913de13000617cbc3f9697ab8a5d19a739e0032fbb \ + sha384=7b706827a4d35d1b89d8ec43cc669fc43f8ac6e52f28eb382f6b93c00ee44e4aac651b742d44a7c383c28f25e9bd437d \ + sha512=5d8fb45499da9200284a8224c2ef04d19aaecfb7ac2edcf7a70a10cc6b5b964b1c30197a12c7b893192eeb7f75c3c24dc107fad9dcd19d607f8408703721f962 + id_rsa size=3381 time=1533887570.0 cksum=1765081168 \ + md5=304140c5d624d31330565dd3f3d26350 \ + rmd160=2f76278c026e39af4722a2359d10e52b95f5b192 \ + sha1=c02fd05b2e717f500130003dc316da00c61726d4 \ + sha256=ac50a2821bfc0c5d72232650e34aab5849c20d4b41958a0b83d2191c788ecbad \ + sha384=a397b3100bf4df5a4fcae4de1e7e6a0131db5f31fd8654dd3e12496753c61ed3a7b82fecef0b0d9f2083e14ed0a6015c \ + sha512=72600d3fc7c22aa268f412d5e49c91915f068a173126523f01778863a56a9d0bfb7717710c3a4f4f54be86dcffd09ce639661fb816a5a5bfd31c82044439b8bf + id_rsa.pub mode=0644 size=737 time=1533887570.0 cksum=3314663523 \ + md5=7e14b79d2080b8606a11f3f074faeed0 \ + rmd160=c598f851ddecc7c1f5434b57a57e24d1152caf14 \ + sha1=95191fe37fbf1c2dba188cf5d540156621b658c7 \ + sha256=628e594c229a74206b11af147f98e1a7231ce70f29a07ba76f6f50dbbff0c3b5 \ + sha384=e3464a513c89e2034f806f61e8b66f3af4d73b95467fda41941de23dd8eeaafb6e6ef523e8ee2459145d0a88896b105c \ + sha512=51a0adb421cf48cd6532dce8fef745736eb15d634ebe04968d80f6e86edf201196180121589fdbbd285d2d1532ca7708a7fde50a620bd43cf01d3bd1d9dc034d +# ./.ssh +.. + + +# ./Desktop +Desktop type=dir mode=0755 nlink=2 time=1533892142.0 +# ./Desktop +.. + + +# ./Documents +Documents type=dir mode=0755 nlink=2 time=1533892142.0 +# ./Documents +.. + + +# ./Downloads +Downloads type=dir mode=0755 nlink=2 time=1533892142.0 +# ./Downloads +.. + + +# ./Music +Music type=dir mode=0755 nlink=2 time=1533892142.0 +# ./Music +.. + + +# ./Pictures +Pictures type=dir mode=0755 nlink=2 time=1533892142.0 +# ./Pictures +.. + + +# ./Public +Public type=dir mode=0755 nlink=2 time=1533892142.0 +# ./Public +.. + + +# ./Templates +Templates type=dir mode=0755 nlink=2 time=1533892142.0 +# ./Templates +.. + + +# ./Videos +Videos type=dir mode=0755 nlink=2 time=1533892142.0 +# ./Videos +.. + From 0dd54a604d9ebff0a0375a6e518b1e052b7b5c25 Mon Sep 17 00:00:00 2001 From: r00t Date: Sun, 23 Sep 2018 07:55:58 -0400 Subject: [PATCH 14/15] checking in a ton of population --- TODO | 18 ++-- bdisk/BIOS.py | 1 + bdisk/GPG.py | 30 +++++- bdisk/basedistro/archlinux.py | 7 +- bdisk/bdisk.xsd | 11 +- bdisk/confgen.py | 2 +- bdisk/confparse.py | 59 +++++++---- bdisk/env_prep.py | 68 ++++++++++++- bdisk/main.py | 8 +- bdisk/mtree.py | 182 +++++++++++++++++++++++++++++++++- bdisk/prompt_strings.py | 23 ++++- bdisk/utils.py | 83 +++++++++++++--- 12 files changed, 426 insertions(+), 66 deletions(-) diff --git a/TODO b/TODO index 334588a..8e7d1a1 100644 --- a/TODO +++ b/TODO @@ -1,11 +1,11 @@ - write classes/functions - XML-based config -x XML syntax ---- regex btags - case-insensitive? this can be represented in-pattern: - https://stackoverflow.com/a/9655186/733214 +--- xregex btags - case-insensitive? this can be represented in-pattern: + xhttps://stackoverflow.com/a/9655186/733214 -x configuration generator ---- print end result xml config to stderr for easier redirection? or print prompts to stderr and xml to stdout? --- XSD for validation +--- xprint end result xml config to stderr for easier redirection? or print prompts to stderr and xml to stdout? +-- xXSD for validation -- Flask app for generating config? -- TKinter (or pygame?) GUI? --- https://docs.python.org/3/faq/gui.html @@ -16,12 +16,9 @@ - locking - for docs, 3.x (as of 3.10) was 2.4M. -- Need ability to write/parse mtree specs (or a similar equivalent) for applying ownerships/permissions to overlay files +- xNeed ability to write/parse mtree specs (or a similar equivalent) for applying ownerships/permissions to overlay files +-- parsing is done. writing may? come later. -- need to package: - python-hashid (https://psypanda.github.io/hashID/, - https://github.com/psypanda/hashID, - https://pypi.org/project/hashID/) - package for PyPI: # https://packaging.python.org/tutorials/distributing-packages/ @@ -37,7 +34,6 @@ BUGS.SQUARE-R00T.NET bugs/tasks: #14: Use os.path.join() for more consistency/pythonicness #24: Run as regular user? (pychroot? fakeroot?) #34: Build-time support for only building single phase of build -#36: Allow parsing pkg lists with inline comments #39: Fix UEFI #40: ISO overlay (to add e.g. memtest86+ to final ISO) -#43: Support resuming partial tarball downloads (Accept-Ranges: bytes) \ No newline at end of file +#43: Support resuming partial tarball downloads (Accept-Ranges: bytes) diff --git a/bdisk/BIOS.py b/bdisk/BIOS.py index 012fb51..cd314bb 100644 --- a/bdisk/BIOS.py +++ b/bdisk/BIOS.py @@ -1,3 +1,4 @@ import jinja2 import os import shutil + diff --git a/bdisk/GPG.py b/bdisk/GPG.py index 202b62e..72a7f80 100644 --- a/bdisk/GPG.py +++ b/bdisk/GPG.py @@ -3,6 +3,17 @@ import os import psutil import gpg.errors + +# This helps translate the input name from the conf to a string compatible with the gpg module. +_algmaps = {#'cv': 'cv{keysize}', # DISABLED, can't sign (only encrypt). Currently only 25519 + 'ed': 'ed{keysize}', # Currently only 25519 + #'elg': 'elg{}', # DISABLED, can't sign (only encrypt). 1024, 2048, 4096 + 'nist': 'nistp{keysize}', # 256, 384, 521 + 'brainpool.1': 'brainpoolP{keysize}r1', # 256, 384, 512 + 'sec.k1': 'secp{keysize}k1', # Currently only 256 + 'rsa': 'rsa{keysize}', # Variable (1024 <> 4096), but we only support 1024, 2048, 4096 + 'dsa': 'dsa{keysize}'} # Variable (768 <> 3072), but we only support 768, 2048, 3072 + # http://files.au.adversary.org/crypto/GPGMEpythonHOWTOen.html # https://www.gnupg.org/documentation/manuals/gpgme.pdf # Support ECC? https://www.gnupg.org/faq/whats-new-in-2.1.html#ecc @@ -60,7 +71,7 @@ class GPGHandler(object): self._prep_home() else: self._check_home() - self.ctx = self.get_context(home_dir = self.home) + self.ctx = self.GetContext(home_dir = self.home) def _check_home(self, home = None): if not home: @@ -94,11 +105,12 @@ class GPGHandler(object): 'write to') return() - def get_context(self, **kwargs): + def GetContext(self, **kwargs): ctx = gpg.Context(**kwargs) return(ctx) - def kill_stale_agent(self): + def KillStaleAgent(self): + # Is this even necessary since I switched to the native gpg module instead of the gpgme one? _process_list = [] # TODO: optimize; can I search by proc name? for p in psutil.process_iter(): @@ -113,7 +125,13 @@ class GPGHandler(object): # for p in plst: # psutil.Process(p).terminate() - def get_sigs(self, data_in): + def CreateKey(self, params): # TODO: explicit params + # We can't use self.ctx.create_key; it's a little limiting. + # It's a fairly thin wrapper to .op_createkey() (the C GPGME API gpgme_op_createkey) anyways. + + pass + + def GetSigs(self, data_in): key_ids = [] # Currently as of May 13, 2018 there's no way using the GPGME API to do # the equivalent of the CLI's --list-packets. @@ -131,3 +149,7 @@ class GPGHandler(object): l = [i.strip() for i in line.split(':')] key_ids.append(l[0]) return(key_ids) + + def CheckSigs(self, keys, sig_data): + try: + self.ctx.verify(sig_data) diff --git a/bdisk/basedistro/archlinux.py b/bdisk/basedistro/archlinux.py index 93a62d7..c57f006 100644 --- a/bdisk/basedistro/archlinux.py +++ b/bdisk/basedistro/archlinux.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3.6 +#!/usr/bin/env python3 # Supported initsys values: # systemd @@ -41,6 +41,7 @@ pkg_mgr_prep = """#!/bin/bash pacman -Syy pacman-key --init pacman-key --populate archlinux +pacman -S --noconfirm --needed base pacman -S --noconfirm --needed base-devel multilib-devel git linux-headers \ mercurial subversion vala xorg-server-devel cd /tmp @@ -62,8 +63,8 @@ rm apacman* # should try to install it. #### AUR SUPPORT #### packager = {'pre_check': False, - 'sys_update': ['/usr/bin/aurman', '-S', '-u'], - 'sync_cmd': ['/usr/bin/aurman', '-S', '-y', '-y'], + 'sys_update': ['/usr/bin/apacman', '-S', '-u'], + 'sync_cmd': ['/usr/bin/apacman', '-S', '-y', '-y'], 'check_cmds': {'versioned': ['/usr/bin/pacman', '-Q', '-s', '{PACKAGE}'], diff --git a/bdisk/bdisk.xsd b/bdisk/bdisk.xsd index 62f8b3f..9485a01 100644 --- a/bdisk/bdisk.xsd +++ b/bdisk/bdisk.xsd @@ -669,8 +669,17 @@ + + + + + + + + + @@ -893,4 +902,4 @@ - \ No newline at end of file + diff --git a/bdisk/confgen.py b/bdisk/confgen.py index c6e8ed0..a321ed4 100755 --- a/bdisk/confgen.py +++ b/bdisk/confgen.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3.6 +#!/usr/bin/env python3 # Ironically enough, I think building a GUI for this would be *cleaner*. # Go figure. diff --git a/bdisk/confparse.py b/bdisk/confparse.py index d21df53..6ba6616 100644 --- a/bdisk/confparse.py +++ b/bdisk/confparse.py @@ -40,6 +40,8 @@ class Conf(object): You can provide any combination of these (e.g. "profile={'id': 2, 'name' = 'some_profile'}"). + Non-greedy matching (meaning ALL attributes specified + must match). """ if validate_cfg == 'pre': # Validate before attempting any other operations @@ -57,6 +59,7 @@ class Conf(object): if validate_cfg: # Validation post-substitution self.validate(parsed = False) + # TODO: populate checksum{} with hash_algo if explicit def get_pki_obj(self, pki, pki_type): elem = {} @@ -272,6 +275,9 @@ class Conf(object): self.cfg['profile'][a] = transform.xml2py( self.profile.attrib[a], attrib = True) + # Small bug in transform.xml2py that we unfortunately can't fix, so we manually fix. + if 'id' in self.cfg['profile'] and isinstance(self.cfg['profile']['id'], bool): + self.cfg['profile']['id'] = int(self.cfg['profile']['id']) return() def parse_sources(self): @@ -323,11 +329,12 @@ class Conf(object): xml = etree.fromstring(self.xml_suppl.return_full()) self.xsd.assertValid(xml) if parsed: - # TODO: perform further validations that we can't do in XSD. # We wait until after it's parsed to evaluate because otherwise we # can't use utils.valid(). # We only bother with stuff that would hinder building, though - # e.g. we don't check that profile's UUID is a valid UUID4. + # The XSD can catch a lot of stuff, but it's not so hot with things like URI validation, + # email validation, etc. # URLs for url in (self.cfg['uri'], self.cfg['dev']['website']): if not valid.url(url): @@ -335,25 +342,41 @@ class Conf(object): # Emails for k in self.cfg['gpg']['keys']: if not valid.email(k['email']): - raise ValueError( - 'GPG key {0}: {1} is not a valid email ' - 'address'.format(k['name'], k['email'])) + raise ValueError('GPG key {0}: {1} is not a valid email address'.format(k['name'], k['email'])) if not valid.email(self.cfg['dev']['email']): - raise ValueError('{0} is not a valid email address'.format( - self.cfg['dev']['email'])) + raise ValueError('{0} is not a valid email address'.format(self.cfg['dev']['email'])) if self.cfg['pki']: if 'subject' in self.cfg['pki']['ca']: - if not valid.email( - self.cfg['pki']['ca']['subject']['emailAddress']): - raise ValueError('{0} is not a valid email ' - 'address'.format( - self.cfg['pki']['ca']['subject']['emailAddress'])) - - if not self.cfg['pki'][x]['subject']: + if not valid.email(self.cfg['pki']['ca']['subject']['emailAddress']): + raise ValueError('{0} is not a valid email address'.format( + self.cfg['pki']['ca']['subject']['emailAddress'])) + for cert in self.cfg['pki']['clients']: + if not cert['subject']: continue - if not valid.email( - self.cfg['pki'][x]['subject']['emailAddress']): - raise ValueError('{0} is not a valid email ' - 'address'.format( - self.cfg['pki'][x]['subject']['email'])) + if not valid.email(cert['subject']['emailAddress']): + raise ValueError('{0} is not a valid email address'.format(cert['subject']['email'])) + # Salts/hashes + if self.cfg['root']['salt']: + if not valid.salt_hash(self.cfg['root']['salt']): + raise ValueError('{0} is not a valid salt'.format(self.cfg['root']['salt'])) + if self.cfg['root']['hashed']: + if not valid.salt_hash_full(self.cfg['root']['salt_hash'], self.cfg['root']['hash_algo']): + raise ValueError('{0} is not a valid hash of type {1}'.format(self.cfg['root']['salt_hash'], + self.cfg['root']['hash_algo'])) + for u in self.cfg['users']: + if u['salt']: + if not valid.salt_hash(u['salt']): + raise ValueError('{0} is not a valid salt'.format(u['salt'])) + if u['hashed']: + if not valid.salt_hash_full(u['salt_hash'], u['hash_algo']): + raise ValueError('{0} is not a valid hash of type {1}'.format(u['salt_hash'], u['hash_algo'])) + # GPG Key IDs + if self.cfg['gpg']['keyid']: + if not valid.gpgkeyID(self.cfg['gpg']['keyid']): + raise ValueError('{0} is not a valid GPG Key ID/fingerprint'.format(self.cfg['gpg']['keyid'])) + for s in self.cfg['sources']: + if 'sig' in s: + for k in s['sig']['keys']: + if not valid.gpgkeyID(k): + raise ValueError('{0} is not a valid GPG Key ID/fingerprint'.format(k)) return() diff --git a/bdisk/env_prep.py b/bdisk/env_prep.py index 5dcac35..002db3e 100644 --- a/bdisk/env_prep.py +++ b/bdisk/env_prep.py @@ -1,3 +1,67 @@ -import copy -import importlib +import hashlib +import importlib # needed for the guest-os-specific stuff... import os +from . import utils +from urllib.parse import urljoin + + +def hashsum_downloader(url, filename = None): + # TODO: support "latest" and "regex" flags? or remove from specs (since the tarball can be specified by these)? + # move that to the utils.DOwnload() class? + d = utils.Download(url, progress = False) + hashes = {os.path.basename(k):v for (v, k) in [line.split() for line in d.fetch().decode('utf-8').splitlines()]} + if filename: + if filename in hashes: + return(hashes[filename]) + else: + raise KeyError('Filename {0} not in the list of hashes'.format(filename)) + return(hashes) + + +class Prepper(object): + def __init__(self, dirs, sources, gpg = None): + # dirs is a ConfParse.cfg['build']['paths'] dict of dirs + self.CreateDirs(dirs) + # TODO: set up GPG env here so we can use it to import sig key and verify sources + for idx, s in enumerate(sources): + self._download(idx) + + def CreateDirs(self, dirs): + for d in dirs: + os.makedirs(d, exist_ok = True) + return() + + + def _download(self, source_idx): + download = True + _source = self.cfg['sources'][source_idx] + _dest_dir = os.path.join(self.cfg['build']['paths']['cache'], source_idx) + _tarball = os.path.join(_dest_dir, _source['tarball']['fname']) + _remote_dir = urljoin(_source['mirror'], _source['rootpath']) + _remote_tarball = urljoin(_remote_dir + '/', _source['tarball']['fname']) + def _hash_verify(): # TODO: move to utils.valid()? + # Get a checksum. + if 'checksum' in _source: + if not _source['checksum']['explicit']: + _source['checksum']['value'] = hashsum_downloader(urljoin(_remote_dir + '/', + _source['checksum']['fname'])) + if not _source['checksum']['hash_algo']: + _source['checksum']['hash_algo'] = utils.detect.any_hash(_source['checksum']['value'], + normalize = True)[0] + _hash = hashlib.new(_source['checksum']['hash_algo']) + with open(_tarball, 'rb') as f: + # It's potentially a large file, so we chunk it 64kb at a time. + _hashbuf = f.read(64000) + while len(_hashbuf) > 0: + _hash.update(_hashbuf) + _hashbuf = f.read(64000) + if _hash.hexdigest().lower() != _source['checksum']['value'].lower(): + return(False) + return(True) + def _sig_verify(gpg_instance): # TODO: move to utils.valid()? or just use as part of the bdisk.GPG module? + pass + if os.path.isfile(_tarball): + download = _hash_verify() + download = _sig_verify() + if download: + d = utils.Download(_remote_tarball) diff --git a/bdisk/main.py b/bdisk/main.py index 40af6a6..9a54f67 100644 --- a/bdisk/main.py +++ b/bdisk/main.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3.6 +#!/usr/bin/env python3 import argparse import confparse @@ -14,8 +14,10 @@ def parseArgs(): epilog = ('https://git.square-r00t.net')) return(args) -def run(): - pass +def run(cfg): + cfg = confparse.Conf(cfg, validate_cfg = True) + cfg.parse_all() + def run_interactive(): args = vars(parseArgs().parse_args()) diff --git a/bdisk/mtree.py b/bdisk/mtree.py index e63889c..b74b730 100755 --- a/bdisk/mtree.py +++ b/bdisk/mtree.py @@ -3,15 +3,188 @@ import argparse import copy import datetime +import grp +import hashlib import os import pathlib +import platform +import pwd import re +import stat +from collections import OrderedDict +try: + import pycksum + has_cksum = True +except ImportError: + has_cksum = False # Parse BSD mtree spec files. # On arch, BSD mtree is ported in the AUR as nmtree. -# TODO: add a generator class as well? +# TODO: add a generator class as well? (in process) # TODO: add a checking function as well? +# The format used for headers +_header_strptime_fmt = '%a %b %d %H:%M:%S %Y' + +# Supported hash types (for generation). These are globally available always. +_hashtypes = ['md5', 'sha1', 'sha256', 'sha384', 'sha512'] +# If RIPEMD-160 is supported, we add it (after MD5). +if 'ripemd160' in hashlib.algorithms_available: + _hashtypes.insert(1, 'rmd160') + +# Iterative to determine which type an item is. +_stype_map = {'block': stat.S_ISBLK, + 'char': stat.S_ISCHR, + 'dir': stat.S_ISDIR, + 'fifo': stat.S_ISFIFO, + 'file': stat.S_ISREG, + 'link': stat.S_ISLNK, + 'socket': stat.S_ISSOCK} + +# Regex pattern for cleaning up an octal perm mode into a string representation. +_octre = re.compile('^0o') + +class MTreeGen(object): + def __init__(self, path): + self.path = pathlib.PosixPath(os.path.abspath(os.path.expanduser(path))) + # These are used to keep a cached copy of the info. + self._sysinfo = {'uids': {}, 'gids': {}} + self._build_header() + # We use this to keep track of where we are exactly in the tree so we can generate a full absolute path at + # any moment relative to the tree. + self._path_pointer = copy.deepcopy(self.path) + + + def paths_iterator(self): + for root, dirs, files in os.walk(self.path): + for f in files: + _fname = self.path.joinpath(f) + _stats = self._get_stats(_fname) + if not _stats: + print(('WARNING: {0} either disappeared while we were trying to parse it or ' + 'it is a broken symlink.').format(_fname)) + continue + # TODO: get /set line here? + item = ' {0} \\\n'.format(f) + _type = 'file' # TODO: stat this more accurately + _cksum = self._gen_cksum(_fname) + item += ' {0} {1} {2}\\\n'.format(_stats['size'], + _stats['time'], + ('{0} '.format(_cksum) if _cksum else '')) + # TODO: here's where the hashes would get added + # TODO: here's where we parse dirs. maybe do that before files? + # remember: mtree specs use ..'s to traverse upwards when done with a dir + for d in dirs: + _dname = self.path.joinpath(d) + _stats = self._get_stats(_dname) + if not _stats: + print(('WARNING: {0} either disappeared while we were trying to parse it or ' + 'it is a broken symlink.').format(_dname)) + continue + # TODO: get /set line here? + return() + + + def _gen_cksum(self, fpath): + if not has_cksum: + return(None) + if not os.path.isfile(fpath): + return(None) + # TODO: waiting on https://github.com/sobotklp/pycksum/issues/2 for byte iteration (because large files maybe?) + c = pycksum.Cksum() + with open(fpath, 'rb') as f: + c.add(f) + return(c.get_cksum()) + + + def _get_stats(self, path): + stats = {} + try: + _st = os.stat(path, follow_symlinks = False) + except FileNotFoundError: + # Broken symlink? Shouldn't occur since follow_symlinks is False anyways, BUT... + return(None) + # Ownership + stats['uid'] = _st.st_uid + stats['gid'] = _st.st_gid + if _st.st_uid in self._sysinfo['uids']: + stats['uname'] = self._sysinfo['uids'][_st.st_uid] + else: + _pw = pwd.getpwuid(_st.st_uid).pw_name + stats['uname'] = _pw + self._sysinfo['uids'][_st.stuid] = _pw + if _st.st_gid in self._sysinfo['gids']: + stats['gname'] = self._sysinfo['gids'][_st.st_gid] + else: + _grp = grp.getgrgid(_st.st_gid).gr_name + stats['gname'] = _grp + self._sysinfo['gids'][_st.stgid] = _grp + # Type and Mode + for t in _stype_map: + if _stype_map[t](_st.st_mode): + stats['type'] = t + # TODO: need a reliable way of parsing this. + # for instance, for /dev/autofs, _st.st_dev = 6 (os.makedev(6) confirms major is 0, minor is 6) + # but netBSD mtree (ported) says it's "0xaeb" (2795? or, as str, "®b" apparently). + # I'm guessing the kernel determines this, but where is it pulling it from/how? + # We can probably do 'format,major,minor' (or, for above, 'linux,0,6'). + # if t in ('block', 'char'): + # stats['device'] = None + # Handle symlinks. + if t == 'link': + _target = path + while os.path.islink(_target): + _target = os.path.realpath(_target) + stats['link'] = _target + break + stats['mode'] = '{0:0>4}'.format(_octre.sub('', str(oct(stat.S_IMODE(_st.st_mode))))) + stats['size'] = _st.st_size + stats['time'] = str(float(_st.st_mtime)) + stats['nlink'] = _st.st_nlink + # TODO: "flags" keyword? is that meaningful on linux? + stats['flags'] = 'none' + return(stats) + + + + def _gen_hashes(self, fpath): + hashes = OrderedDict({}) + if not os.path.isfile(fpath): + return(hashes) + _hashnums = len(_hashtypes) + for idx, h in enumerate(_hashtypes): + # Stupid naming inconsistencies. + _hashname = (h if h is not 'rmd160' else 'ripemd160') + _hasher = hashlib.new(_hashname) + with open(fpath, 'rb') as f: + # Hash 64kb at a time in case it's a huge file. TODO: is this the most ideal chunk size? + _hashbuf = f.read(64000) + while len(_hashbuf) > 0: + _hasher.update(_hashbuf) + _hashbuf = f.read(64000) + hashes[h] = _hasher.hexdigest() + return(hashes) + # if idx + 1 < _hashnums: + # hashes += ' {0}={1} \\\n'.format(h, _hasher.hexdigest()) + # else: + # hashes += ' {0}={1}\n'.format(h, _hasher.hexdigest()) + # return(hashes) + + + def _build_header(self): + self.spec = '' + _header = OrderedDict({}) + _header['user'] = pwd.getpwuid(os.geteuid()).pw_name + _header['machine'] = platform.node() + _header['tree'] = str(self.path) + _header['date'] = datetime.datetime.utcnow().strftime(_header_strptime_fmt) + for h in _header: + self.spec += '#\t{0:>7}: {1}\n'.format(h, _header[h]) + self.spec += '\n' + return() + + + class MTreeParse(object): def __init__(self, spec): if not isinstance(spec, (str, bytes)): @@ -21,7 +194,6 @@ class MTreeParse(object): spec = spec.decode('utf-8') except UnicodeDecodeError: raise ValueError('spec must be a utf-8 encoded set of bytes if using byte mode') - self._strptime_fmt = '%a %b %d %H:%M:%S %Y' self.orig_spec = copy.deepcopy(spec) # For referencing in case someone wanted to write it out. # We NOW need to handle the escaped linebreaking it does. self._specdata = re.sub('\\\\\s+', '', spec).splitlines() @@ -82,7 +254,7 @@ class MTreeParse(object): # They are restored by an "/unset". Since they're global and stateful, they're handled as a class attribute. self.settings = copy.deepcopy(self._tplitem) self._parse_items() - del(self.settings, self._tplitem, self._strptime_fmt) + del(self.settings, self._tplitem) def _get_header(self): @@ -96,7 +268,7 @@ class MTreeParse(object): header = l[0] val = (l[1] if l[1] is not '(null)' else None) if header == 'date': - val = datetime.datetime.strptime(val, self._strptime_fmt) + val = datetime.datetime.strptime(val, _header_strptime_fmt) elif header == 'tree': val = pathlib.PosixPath(val) self.header[header] = val @@ -158,6 +330,8 @@ class MTreeParse(object): return(out) def _unset_parse(unsetline): out = {} + if unsetline[1] == 'all': + return(copy.deepcopy(self._tplitem)) for i in unsetline: out[i] = self._tplitem[i] return(out) diff --git a/bdisk/prompt_strings.py b/bdisk/prompt_strings.py index 36d38cb..3a3d10a 100644 --- a/bdisk/prompt_strings.py +++ b/bdisk/prompt_strings.py @@ -11,18 +11,31 @@ class PromptStrings(object): 'attribs': { 'algo': { 'text': 'the subkey\'s encryption type/algorithm', - 'choices': ['rsa', 'dsa'], - 'default': 'rsa' + # The following can ONLY be used for encryption, not signing: elg, cv + #'choices': ['rsa', 'dsa', 'elg', 'ed', 'cv', 'nistp', 'brainpool.1', 'secp.k1'], + 'choices': ['rsa', 'dsa', 'ed', 'nist', 'brainpool.1', 'sec.k1'], + #'default': 'rsa' + 'default': 'ed' }, 'keysize': { 'text': 'the subkey\'s key size (in bits)', 'choices': { 'rsa': ['1024', '2048', '4096'], - 'dsa': ['768', '2048', '3072'] + 'dsa': ['768', '2048', '3072'], + #'elg': ['1024', '2048', '4096'], # Invalid for signing, etc. + 'ed': ['25519'], + #'cv': ['25519'], + 'nistp': ['256', '384', '521'], + 'brainpool.1': ['256', '384', '512'], + 'sec.k1': ['256'] }, 'default': { 'rsa': '4096', - 'dsa': '3072' + 'dsa': '3072', + 'ed': '25519', + 'nistp': '521', + 'brainpool.1': '512', + 'sec.k1': '256' } } }, @@ -113,4 +126,4 @@ class PromptStrings(object): 'Email: ') } } - } \ No newline at end of file + } diff --git a/bdisk/utils.py b/bdisk/utils.py index 416516e..fd82060 100644 --- a/bdisk/utils.py +++ b/bdisk/utils.py @@ -1,3 +1,5 @@ +# Yes, this is messy. They doesn't belong anywhere else, leave me alone. + import _io import copy import crypt @@ -14,6 +16,7 @@ import string import uuid import validators import zlib +import requests import lxml.etree import lxml.objectify from bs4 import BeautifulSoup @@ -30,7 +33,7 @@ passlib_schemes = ['des_crypt', 'md5_crypt', 'sha256_crypt', 'sha512_crypt'] # Build various hash digest name lists digest_schemes = list(hashlib.algorithms_available) # Provided by zlib -# TODO +# TODO? digest_schemes.append('adler32') digest_schemes.append('crc32') @@ -39,6 +42,54 @@ crypt_map = {'sha512': crypt.METHOD_SHA512, 'md5': crypt.METHOD_MD5, 'des': crypt.METHOD_CRYPT} + +class Download(object): + def __init__(self, url, progress = True, offset = None, chunksize = 1024): + self.cnt_len = None + self.head = requests.head(url, allow_redirects = True).headers + self.req_headers = {} + self.range = False + self.url = url + self.offset = offset + self.chunksize = chunksize + self.progress = progress + if 'accept-ranges' in self.head: + if self.head['accept-ranmges'].lower() != 'none': + self.range = True + if 'content-length' in self.head: + try: + self.cnt_len = int(self.head['content-length']) + except TypeError: + pass + if self.cnt_len and self.offset and self.range: + if not self.offset <= self.cnt_len: + raise ValueError(('The offset requested ({0}) is greater than ' + 'the content-length value').format(self.offset, self.cnt_len)) + self.req_headers['range'] = 'bytes={0}-'.format(self.offset) + + def fetch(self): + if not self.progress: + self.req = requests.get(self.url, allow_redirects = True, headers = self.req_headers) + self.bytes_obj = self.req.content + else: + self.req = requests.get(self.url, allow_redirects = True, stream = True, headers = self.req_headers) + self.bytes_obj = bytes() + _bytelen = 0 + # TODO: better handling for logging instead of print()s? + for chunk in self.req.iter_content(chunk_size = self.chunksize): + self.bytes_obj += chunk + if self.cnt_len: + print('\033[F') + print('{0:.2f}'.format((_bytelen / float(self.head['content-length'])) * 100), + end = '%', + flush = True) + _bytelen += self.chunksize + else: + print('.', end = '') + print() + return(self.bytes_obj) + + class XPathFmt(string.Formatter): def get_field(self, field_name, args, kwargs): vals = self.get_value(field_name, args, kwargs), field_name @@ -50,18 +101,19 @@ class detect(object): def __init__(self): pass - def any_hash(self, hash_str): + def any_hash(self, hash_str, normalize = False): h = hashid.HashID() hashes = [] for i in h.identifyHash(hash_str): if i.extended: continue x = i.name - if x.lower() in ('crc-32', 'ripemd-160', 'sha-1', 'sha-224', - 'sha-256', 'sha-384', 'sha-512'): + if x.lower() in ('crc-32', 'ripemd-160', 'sha-1', 'sha-224', 'sha-256', 'sha-384', 'sha-512'): # Gorram you, c0re. x = re.sub('-', '', x.lower()) - _hashes = [h.lower() for h in digest_schemes] + _hashes = [h.lower() for h in digest_schemes] # TODO: move this outside so we don't define it every invoke + if normalize: + x = re.sub('(-|crypt|\s+)', '', x.lower()) if x.lower() in sorted(list(set(_hashes))): hashes.append(x) return(hashes) @@ -83,8 +135,7 @@ class detect(object): return(salt) def remote_files(self, url_base, ptrn = None, flags = []): - with urlopen(url_base) as u: - soup = BeautifulSoup(u.read(), 'lxml') + soup = BeautifulSoup(Download(url_base, progress = False).bytes_obj, 'lxml') urls = [] if 'regex' in flags: if not isinstance(ptrn, str): @@ -113,8 +164,7 @@ class detect(object): return(urls) def gpgkeyID_from_url(self, url): - with urlopen(url) as u: - data = u.read() + data = Download(url, progress = False).bytes_obj g = GPG.GPGHandler() key_ids = g.get_sigs(data) del(g) @@ -166,7 +216,7 @@ class detect(object): # Get any easy ones out of the way first. if name in digest_schemes: return(name) - # Otherwise grab the first one that matches, in order from the . + # Otherwise grab the first one that matches _digest_re = re.compile('^{0}$'.format(name.strip()), re.IGNORECASE) for h in digest_schemes: if _digest_re.search(h): @@ -774,14 +824,19 @@ class valid(object): return(True) def salt_hash(self, salthash): - _idents = ''.join([i.ident for i in crypt_map if i.ident]) + _idents = ''.join([i.ident for i in crypt_map.values() if i.ident]) # noinspection PyStringFormat - _regex = re.compile('^(\$[{0}]\$)?[./0-9A-Za-z]{{0,16}}\$?'.format( - _idents)) + _regex = re.compile('^(\$[{0}]\$)?[./0-9A-Za-z]{{0,16}}\$?'.format(_idents)) if not _regex.search(salthash): return(False) return(True) + def salt_hash_full(self, salthash, hash_type): + h = [re.sub('-', '', i.lower()).split()[0] for i in detect.any_hash(self, salthash, normalize = True)] + if hash_type.lower() not in h: + return(False) + return(True) + def plugin_name(self, name): if len(name) == 0: return(False) @@ -1068,4 +1123,4 @@ class xml_supplicant(object): for i in selectors.items(): if i[1] and i[0] in self.selector_ids: xpath += '[@{0}="{1}"]'.format(*i) - return(xpath) \ No newline at end of file + return(xpath) From 69b6ec60d05d64a9e23e9a0707a0323f960a2936 Mon Sep 17 00:00:00 2001 From: r00t Date: Mon, 24 Sep 2018 18:05:42 -0400 Subject: [PATCH 15/15] adding stuff to GPG ... i think i *can* use ctx.create_key()! --- bdisk/GPG.py | 66 +++++++++++++++++++++++++++++++-- bdisk/bdisk.xsd | 28 ++++++++++++++ bdisk/confparse.py | 23 ++++++++---- bdisk/utils.py | 3 +- docs/examples/multi_profile.xml | 4 +- 5 files changed, 112 insertions(+), 12 deletions(-) diff --git a/bdisk/GPG.py b/bdisk/GPG.py index 72a7f80..ad10df8 100644 --- a/bdisk/GPG.py +++ b/bdisk/GPG.py @@ -1,3 +1,4 @@ +import datetime import gpg import os import psutil @@ -14,6 +15,12 @@ _algmaps = {#'cv': 'cv{keysize}', # DISABLED, can't sign (only encrypt). Curren 'rsa': 'rsa{keysize}', # Variable (1024 <> 4096), but we only support 1024, 2048, 4096 'dsa': 'dsa{keysize}'} # Variable (768 <> 3072), but we only support 768, 2048, 3072 +# This is just a helper function to get a delta from a unix epoch. +def _epoch_helper(epoch): + d = datetime.datetime.utcfromtimestamp(epoch) - datetime.datetime.utcnow() + return(abs(int(d.total_seconds()))) # Returns a positive integer even if negative... + #return(int(d.total_seconds())) + # http://files.au.adversary.org/crypto/GPGMEpythonHOWTOen.html # https://www.gnupg.org/documentation/manuals/gpgme.pdf # Support ECC? https://www.gnupg.org/faq/whats-new-in-2.1.html#ecc @@ -125,11 +132,62 @@ class GPGHandler(object): # for p in plst: # psutil.Process(p).terminate() - def CreateKey(self, params): # TODO: explicit params + def CreateKey(self, name, algo, keysize, email = None, comment = None, passwd = None, key = None, expiry = None): + algo = _algmaps[algo].format(keysize = keysize) + userid = name + userid += ' ({0})'.format(comment) if comment else '' + userid += ' <{0}>'.format(email) if email else '' + if not expiry: + expires = False + else: + expires = True + self.ctx.create_key(userid, + algorithm = algo, + expires = expires, + expires_in = _epoch_helper(expiry), + sign = True) + # Even if expires is False, it still parses the expiry... + # except OverflowError: # Only trips if expires is True and a negative expires occurred. + # raise ValueError(('Expiration epoch must be 0 (to disable) or a future time! ' + # 'The specified epoch ({0}, {1}) is in the past ' + # '(current time is {2}, {3}).').format(expiry, + # str(datetime.datetime.utcfromtimestamp(expiry)), + # datetime.datetime.utcnow().timestamp(), + # str(datetime.datetime.utcnow()))) + return(k) # We can't use self.ctx.create_key; it's a little limiting. # It's a fairly thin wrapper to .op_createkey() (the C GPGME API gpgme_op_createkey) anyways. - - pass + flags = (gpg.constants.create.SIGN | + gpg.constants.create.CERT) + if not expiry: + flags = (flags | gpg.constants.create.NOEXPIRE) + if not passwd: + flags = (flags | gpg.constants.create.NOPASSWD) + else: + # Thanks, gpg/core.py#Context.create_key()! + sys_pinentry = gpg.constants.PINENTRY_MODE_DEFAULT + old_pass_cb = getattr(self, '_passphrase_cb', None) + self.ctx.pinentry_mode = gpg.constants.PINENTRY_MODE_LOOPBACK + def passphrase_cb(hint, desc, prev_bad, hook = None): + return(passwd) + self.ctx.set_passphrase_cb(passphrase_cb) + try: + if not key: + try: + self.ctx.op_createkey(userid, algo, 0, 0, flags) + k = self.ctx.get_key(self.ctx.op_genkey_result().fpr, secret = True) + else: + if not isinstance(key, gpg.gpgme._gpgme_key): + key = self.ctx.get_key(key) + if not key: + raise ValueError('Key {0} does not exist'.format()) + #self.ctx.op_createsubkey(key, ) + finally: + if not passwd: + self.ctx.pinentry_mode = sys_pinentry + if old_pass_cb: + self.ctx.set_passphrase_cb(*old_pass_cb[1:]) + return(k) def GetSigs(self, data_in): key_ids = [] @@ -153,3 +211,5 @@ class GPGHandler(object): def CheckSigs(self, keys, sig_data): try: self.ctx.verify(sig_data) + except: + pass # TODO diff --git a/bdisk/bdisk.xsd b/bdisk/bdisk.xsd index 9485a01..4f7ab91 100644 --- a/bdisk/bdisk.xsd +++ b/bdisk/bdisk.xsd @@ -665,6 +665,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bdisk/confparse.py b/bdisk/confparse.py index 6ba6616..56abec9 100644 --- a/bdisk/confparse.py +++ b/bdisk/confparse.py @@ -1,3 +1,4 @@ +import copy import os import pprint import re @@ -210,16 +211,24 @@ class Conf(object): for attr in elem.xpath('./@*'): self.cfg['gpg'][attr.attrname] = transform.xml2py(attr) for key in elem.xpath('./key'): - _key = {'algo': 'rsa', - 'keysize': '4096', - 'expire': '0', - 'name': None, - 'email': None, - 'comment': None} + _keytpl = {'algo': 'rsa', + 'keysize': '4096'} + _key = copy.deepcopy(_keytpl) + _key['name'] = None + _key['email'] = None + _key['comment'] = None for attr in key.xpath('./@*'): _key[attr.attrname] = transform.xml2py(attr) for param in key.xpath('./*'): - _key[param.tag] = transform.xml2py(param.text, attrib = False) + if param.tag == 'subkey': + # We only support one subkey (for key generation). + if 'subkey' not in _key: + _key['subkey'] = copy.deepcopy(_keytpl) + for attr in param.xpath('./@*'): + _key['subkey'][attr.attrname] = transform.xml2py(attr) + print(_key) + else: + _key[param.tag] = transform.xml2py(param.text, attrib = False) self.cfg['gpg']['keys'].append(_key) return() diff --git a/bdisk/utils.py b/bdisk/utils.py index fd82060..5280ee1 100644 --- a/bdisk/utils.py +++ b/bdisk/utils.py @@ -135,7 +135,8 @@ class detect(object): return(salt) def remote_files(self, url_base, ptrn = None, flags = []): - soup = BeautifulSoup(Download(url_base, progress = False).bytes_obj, 'lxml') + soup = BeautifulSoup(Download(url_base, progress = False).fetch().decode('utf-8'), + 'lxml') urls = [] if 'regex' in flags: if not isinstance(ptrn, str): diff --git a/docs/examples/multi_profile.xml b/docs/examples/multi_profile.xml index bb9dcb2..6f734cd 100644 --- a/docs/examples/multi_profile.xml +++ b/docs/examples/multi_profile.xml @@ -136,13 +136,15 @@ - {xpath%../../../meta/dev/author/text()} {xpath%../../../meta/dev/email/text()} + + for {xpath%../../../meta/names/pname/text()} [autogenerated] | {xpath%../../../meta/uri/text()} | {xpath%../../../meta/desc/text()}