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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 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 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 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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 NXZr#G00004Sz2$FrilOm 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()}