| |
| import copy |
| import hashlib |
| import os |
| import re |
| import tarfile |
| |
| import urllib2 |
| import yaml |
| |
| from reclass_tools import helpers |
| |
| |
| def walkfiles(topdir, verbose=False): |
| walker = os.walk(topdir) |
| opener = open |
| prefix = '' |
| isdir = os.path.isdir(topdir) |
| |
| if isdir: |
| for dirName, subdirList, fileList in walker: |
| for filename in fileList: |
| filepath = os.path.join(dirName,filename) |
| if verbose: |
| print (prefix + filepath) |
| with OpenFile(filepath, opener) as log: |
| yield (log) |
| else: |
| if verbose: |
| print (topdir) |
| with OpenFile(topdir, opener) as log: |
| yield (log) |
| |
| |
| #def yaml_read(yaml_file): |
| # if os.path.isfile(yaml_file): |
| # with open(yaml_file, 'r') as f: |
| # return yaml.load(f) |
| # else: |
| # print("\'{}\' is not a file!".format(yaml_file)) |
| |
| |
| class OpenFile(object): |
| |
| fname = None |
| opener = None |
| readlines = None |
| fobj = None |
| |
| def __init__(self, fname, opener): |
| self.fname = fname |
| self.opener = opener |
| |
| def get_parser(self): |
| parsers = {'/lastlog': self.fake_parser, |
| '/wtmp': self.fake_parser, |
| '/btmp': self.fake_parser, |
| '/atop.log': self.fake_parser, |
| '/atop_': self.fake_parser, |
| '/atop_current': self.fake_parser, |
| '/supervisord.log': self.docker_parser, |
| '.gz': self.gz_parser, |
| '.bz2': self.gz_parser, |
| } |
| for w in parsers.keys(): |
| if w in self.fname: |
| self.readlines = parsers[w] |
| return |
| try: |
| self.fobj = self.opener(self.fname, 'r') |
| self.readlines = self.plaintext_parser |
| except IOError as e: |
| print("Error opening file {0}: {1}".format(self.fname, e)) |
| if self.fobj: |
| self.fobj.close() |
| self.fobj = None |
| self.readlines = self.fake_parser |
| |
| def plaintext_parser(self): |
| try: |
| for s in self.fobj.readlines(): |
| yield s |
| except IOError as e: |
| print("Error reading file {0}: {1}".format(self.fname, e)) |
| |
| def fake_parser(self): |
| yield '' |
| |
| def docker_parser(self): |
| yield '' |
| |
| def gz_parser(self): |
| yield '' |
| |
| def bz2_parser(self): |
| yield '' |
| |
| def __enter__(self): |
| self.get_parser() |
| return self |
| |
| def __exit__(self, x, y, z): |
| if self.fobj: |
| self.fobj.close() |
| |
| |
| def get_all_reclass_params(paths, verbose=False): |
| """Return dict with all used values for each param""" |
| _params = dict() |
| for path in paths: |
| for log in walkfiles(path, verbose): |
| if log.fname.endswith('.yml'): |
| model = helpers.yaml_read(log.fname) |
| if model is not None: |
| # Collect all params from the models |
| _param = helpers.get_nested_key(model, ['parameters', '_param']) |
| if _param: |
| for key, val in _param.items(): |
| if key in _params: |
| # Keep list values sorted |
| _params[key].append(val) |
| _params[key] = sorted(_params[key]) |
| else: |
| _params[key] = [val] |
| return _params |
| |
| |
| def remove_reclass_parameter(paths, key, |
| verbose=False, |
| pretend=False): |
| """Removes specified key from parameters from all reclass models |
| |
| :param key: string with point-separated nested objects, for |
| example: parameters.linux.network.interface |
| :rtype dict: { 'file path': {nested_key}, ...} |
| """ |
| remove_key = key.split('.') |
| found_keys = {} |
| |
| for path in paths: |
| for fyml in walkfiles(path, verbose=verbose): |
| if fyml.fname.endswith('.yml'): |
| model = helpers.yaml_read(fyml.fname) |
| if model is not None: |
| |
| # Clear linux.network.interfaces |
| nested_key = helpers.get_nested_key(model, remove_key) |
| if nested_key: |
| found_keys[fyml.fname] = copy.deepcopy(nested_key) |
| if pretend: |
| print("\n---\n# Found {0} in {1}".format('.'.join(remove_key), |
| fyml.fname)) |
| print(yaml.dump(nested_key, default_flow_style=False)) |
| else: |
| print("\n---\n# Removing {0} from {1}".format('.'.join(remove_key), |
| fyml.fname)) |
| print(yaml.dump(nested_key, default_flow_style=False)) |
| |
| helpers.remove_nested_key(model, remove_key) |
| |
| with open(fyml.fname, 'w') as f: |
| f.write( |
| yaml.dump( |
| model, default_flow_style=False |
| ) |
| ) |
| return found_keys |