diff options
author | Chris St. Pierre <chris.a.st.pierre@gmail.com> | 2012-08-20 10:21:45 -0400 |
---|---|---|
committer | Chris St. Pierre <chris.a.st.pierre@gmail.com> | 2012-08-20 10:21:45 -0400 |
commit | fc518559460429af45d889132fbab1d06d92b9ff (patch) | |
tree | b56221843f53e3c6b560250041e02357952cfc8d /src | |
parent | ccdbef76a0930f97db4bd64ef80adfd4e3452429 (diff) | |
download | bcfg2-fc518559460429af45d889132fbab1d06d92b9ff.tar.gz bcfg2-fc518559460429af45d889132fbab1d06d92b9ff.tar.bz2 bcfg2-fc518559460429af45d889132fbab1d06d92b9ff.zip |
do not prompt to install entries that are not handled by any tool (#1051)
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/Bcfg2/Client/Frame.py | 75 |
1 files changed, 39 insertions, 36 deletions
diff --git a/src/lib/Bcfg2/Client/Frame.py b/src/lib/Bcfg2/Client/Frame.py index a050464e2..2218b890b 100644 --- a/src/lib/Bcfg2/Client/Frame.py +++ b/src/lib/Bcfg2/Client/Frame.py @@ -17,32 +17,6 @@ def cmpent(ent1, ent2): return cmp(ent1.get('name'), ent2.get('name')) -def promptFilter(prompt, entries): - """Filter a supplied list based on user input.""" - ret = [] - entries.sort(cmpent) - for entry in entries[:]: - if 'qtext' in entry.attrib: - iprompt = entry.get('qtext') - else: - iprompt = prompt % (entry.tag, entry.get('name')) - try: - # py3k compatibility - try: - ans = raw_input(iprompt.encode(sys.stdout.encoding, 'replace')) - except NameError: - ans = input(iprompt) - if ans in ['y', 'Y']: - ret.append(entry) - except EOFError: - # python 2.4.3 on CentOS doesn't like ^C for some reason - break - except: - print("Error while reading input") - continue - return ret - - def matches_entry(entryspec, entry): # both are (tag, name) if entryspec == entry: @@ -71,7 +45,7 @@ def passes_black_list(entry, blacklist): for be in blacklist] -class Frame: +class Frame(object): """Frame is the container for all Tool objects and state information.""" def __init__(self, config, setup, times, drivers, dryrun): self.config = config @@ -124,13 +98,13 @@ class Frame: self.logger.info([tool.name for tool in self.tools]) # find entries not handled by any tools - problems = [entry for struct in config - for entry in struct - if entry not in self.handled] + self.unhandled = [entry for struct in config + for entry in struct + if entry not in self.handled] - if problems: + if self.unhandled: self.logger.error("The following entries are not handled by any tool:") - for entry in problems: + for entry in self.unhandled: self.logger.error("%s:%s:%s" % (entry.tag, entry.get('type'), entry.get('name'))) @@ -163,6 +137,35 @@ class Frame: for entry in multi: self.logger.debug(entry) + def promptFilter(self, prompt, entries): + """Filter a supplied list based on user input.""" + ret = [] + entries.sort(cmpent) + for entry in entries[:]: + if entry in self.unhandled: + # don't prompt for entries that can't be installed + continue + if 'qtext' in entry.attrib: + iprompt = entry.get('qtext') + else: + iprompt = prompt % (entry.tag, entry.get('name')) + try: + # py3k compatibility + try: + ans = raw_input(iprompt.encode(sys.stdout.encoding, + 'replace')) + except NameError: + ans = input(iprompt) + if ans in ['y', 'Y']: + ret.append(entry) + except EOFError: + # python 2.4.3 on CentOS doesn't like ^C for some reason + break + except: + print("Error while reading input") + continue + return ret + def __getattr__(self, name): if name in ['extra', 'handled', 'modified', '__important__']: ret = [] @@ -221,7 +224,7 @@ class Frame: if t.handlesEntry(cfile) and t.canVerify(cfile)] if tl: if self.setup['interactive'] and not \ - promptFilter("Install %s: %s? (y/N):", [cfile]): + self.promptFilter("Install %s: %s? (y/N):", [cfile]): self.whitelist.remove(cfile) continue try: @@ -321,7 +324,7 @@ class Frame: (bmodified or a.get('when') == 'always'))] # now we process all "always actions" if self.setup['interactive']: - promptFilter(prompt, actions) + self.promptFilter(prompt, actions) self.DispatchInstallCalls(actions) # need to test to fail entries in whitelist @@ -339,8 +342,8 @@ class Frame: [self.whitelist.remove(ent) for ent in b_to_remv] if self.setup['interactive']: - self.whitelist = promptFilter(prompt, self.whitelist) - self.removal = promptFilter(rprompt, self.removal) + self.whitelist = self.promptFilter(prompt, self.whitelist) + self.removal = self.promptFilter(rprompt, self.removal) for entry in candidates: if entry not in self.whitelist: |