summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Pokorný <jpokorny@redhat.com>2014-12-11 21:07:04 +0100
committerJan Pokorný <jpokorny@redhat.com>2014-12-11 22:41:15 +0100
commitbd2d29585cc1fe676c1076a3c33d8829bdaca8f0 (patch)
tree004880686d3a19e4560e2a9ceb020db6296725b4
parentfd4e0b44b69f3c35464461e135cf1586f7d6adfa (diff)
downloadclufter-bd2d29585cc1fe676c1076a3c33d8829bdaca8f0.tar.gz
clufter-bd2d29585cc1fe676c1076a3c33d8829bdaca8f0.tar.xz
clufter-bd2d29585cc1fe676c1076a3c33d8829bdaca8f0.zip
Integrate FancyOutput helper class
Signed-off-by: Jan Pokorný <jpokorny@redhat.com>
-rw-r--r--command.py37
-rw-r--r--commands/ccs2pcs.py13
-rw-r--r--filter.py25
-rw-r--r--main.py11
4 files changed, 58 insertions, 28 deletions
diff --git a/command.py b/command.py
index cfeb1c8..6829b36 100644
--- a/command.py
+++ b/command.py
@@ -35,7 +35,8 @@ from .utils_func import apply_aggregation_preserving_depth, \
bifilter, \
tailshake, \
zip_empty
-from .utils_prog import cli_decor, \
+from .utils_prog import FancyOutput, \
+ cli_decor, \
longopt_letters_reprio, \
defer_common
@@ -451,12 +452,16 @@ class Command(object):
)
ret(SimpleFormat.FILE, fn)
except FormatError:
- print >>stderr, "[{0:{1}}] dumping failed".format(
- flt.__class__.name, maxl
+ cmd_ctxt['svc_output'](
+ "|header:[{0:{1}}]| dumping failed"
+ .format(flt.__class__.name, maxl),
+ base='error',
+ urgent=True
)
else:
- print >>stderr, "[{0:{1}}] dump file: {2}".format(
- flt.__class__.name, maxl, fn
+ cmd_ctxt['svc_output'](
+ "|header:[{0:{1}}]| dump file: |highlight:{2}|"
+ .format(flt.__class__.name, maxl, fn)
)
continue
# output time! (INFILTER terminal listed twice in io_chain)
@@ -467,11 +472,11 @@ class Command(object):
.format(flt.__class__.name, io_decl))
# store output somewhere, which even can be useful (use as a lib)
passout['passout'] = flt_ctxt['out'](*io_decl)
- if not cmd_ctxt['quiet'] and passout is unused:
- if io_decl[0] == SimpleFormat.FILE:
- print >>stderr, "[{0:{1}}] output file: {2}".format(
- flt.__class__.name, maxl, passout['passout']
- )
+ if passout is unused and io_decl[0] == SimpleFormat.FILE:
+ cmd_ctxt['svc_output'](
+ "|header:[{0:{1}}]| output file: |highlight:{2}|"
+ .format(flt.__class__.name, maxl, passout['passout'])
+ )
map(lambda f: f.close(), magic_fds.itervalues()) # close "magic" fds
return EC.EXIT_SUCCESS # XXX some better decision?
@@ -522,7 +527,17 @@ class Command(object):
'filter_dump': getattr(opts, 'dump', ()),
'system': getattr(opts, 'sys', ''),
'system_extra': getattr(opts, 'dist', '').split(','),
- 'quiet': getattr(opts, 'quiet', False),
+ 'svc_output': FancyOutput(f=stderr,
+ quiet=getattr(opts, 'quiet',
+ False),
+ color=dict(auto=None,
+ never=False,
+ always=True)[
+ getattr(opts,
+ 'color',
+ 'auto')
+ ]
+ ),
}, bypass=True)
cmd_ctxt.ensure_filters(apply_intercalate(self._filter_chain))
io_driver = any2iter(self._fnc(cmd_ctxt, **kwargs))
diff --git a/commands/ccs2pcs.py b/commands/ccs2pcs.py
index bd71d7e..2025329 100644
--- a/commands/ccs2pcs.py
+++ b/commands/ccs2pcs.py
@@ -16,10 +16,15 @@ def _check_pacemaker_1_2(cmd_ctxt):
system_extra = cmd_ctxt.get('system_extra', 'UNKNOWN-DISTRO')
if not cluster_pcs_1_2(system, system_extra):
from sys import stderr
- print >>stderr, ("Resulting configuration will likely not be applicable"
- " to ``{0}'' system as it seems so outdated as far as"
- " Pacemaker not supporting validation schema v1.2"
- ).format(': '.join((system, system_extra)))
+ svc_output = cmd_ctxt.get('svc_output',
+ lambda s, **kwargs: stderr.write(s + '\n'))
+ svc_output("Resulting configuration will likely not be applicable to"
+ " ``{0}'' system as it seems so outdated as far as Pacemaker"
+ " not supporting validation schema v1.2"
+ .format(': '.join((system, system_extra))),
+ base="error",
+ urgent=True,
+ )
@Command.deco(('ccs2ccsflat',
diff --git a/filter.py b/filter.py
index 6c53bb7..359c668 100644
--- a/filter.py
+++ b/filter.py
@@ -458,7 +458,7 @@ class XMLFilter(Filter, MetaPlugin):
return ret, global_msgs
return validate_hook
- def _xslt_get_atom_hook(self, quiet=False, validator_specs={}, **kws):
+ def _xslt_get_atom_hook(self, validator_specs={}, **kws):
validate_hook = None
if issubclass(self._out_format, XML):
# only when out format is XML-based, we can be quite sure the
@@ -471,20 +471,21 @@ class XMLFilter(Filter, MetaPlugin):
if validator:
validate_hook = self._xslt_get_validate_hook(validator, **kws)
return (lambda ret, error_log=():
- self._xslt_atom_hook(ret, error_log, quiet, validate_hook,
- **kws))
+ self._xslt_atom_hook(ret, error_log, validate_hook, **kws))
@classmethod
- def _xslt_atom_hook(cls, ret, error_log, quiet=False, validate_hook=None,
- **kws):
+ def _xslt_atom_hook(cls, ret, error_log, validate_hook=None, **kws):
fatal = []
maxl = kws.get('maxl', 1)
+ svc_output = kws.get('svc_output',
+ lambda s, **kwargs: stderr.write(s + '\n'))
for entry in error_log:
- msg = "[{0:{1}}] XSLT: {2}".format(cls.name, maxl, entry.message)
- if entry.type != 0 or not quiet: # avoid logging (suppression)
- print >>stderr, msg
- if entry.type != 0:
- fatal.append("XSLT: " + entry.message)
+ msg = ("|header:[{0:{1}}]| |subheader:XSLT|: {2}"
+ .format(cls.name, maxl, entry.message))
+ svc_output(msg, urgent=entry.type != 0,
+ base=entry.message.startswith('WARNING:') and 'warning')
+ if entry.type != 0:
+ fatal.append("XSLT: " + entry.message)
if not fatal and validate_hook:
ret, entries = validate_hook(ret)
fatal.extend("RNG: " + ':'.join(args2tuple(str(e[0]), str(e[1]),
@@ -873,7 +874,7 @@ class XMLFilter(Filter, MetaPlugin):
def_first += '<clufter:descent-mix preserve-rest="true"/>'
xslt_atom_hook = self._xslt_get_atom_hook(**filterdict_pop(kwargs,
- 'editor', 'interactive', 'maxl', 'quiet', 'validator_specs'
+ 'editor', 'interactive', 'maxl', 'svc_output', 'validator_specs'
))
kwargs.setdefault('walk_default_first', def_first)
@@ -894,7 +895,7 @@ class XMLFilter(Filter, MetaPlugin):
"""The same as `filter_proceed_xslt`, context-aware"""
kwargs = filterdict_keep(ctxt,
'raw', 'system', 'system_extra', # <- proceed_xslt / atom_hook -v
- 'editor', 'interactive', 'maxl', 'quiet', 'validator_specs',
+ 'editor', 'interactive', 'maxl', 'svc_output', 'validator_specs',
**kwargs
)
return self.filter_proceed_xslt(in_obj, **kwargs)
diff --git a/main.py b/main.py
index 691b0cd..1e41781 100644
--- a/main.py
+++ b/main.py
@@ -43,11 +43,20 @@ opts_common = (
action='store_true',
help="refrain from unnecesary messages (usually on stderr)"
)),
+ (('--color', ), dict(
+ metavar="[WHEN]",
+ action='store',
+ dest='color',
+ default='auto',
+ type='choice',
+ choices=('auto', 'never', 'always'),
+ help="colorize messages if available [%default out of %choices]"
+ )),
(('--loglevel', ), dict(
action='store',
dest='loglevel',
default=logging.getLevelName(logging.WARNING),
- type="choice",
+ type='choice',
choices=map(logging.getLevelName,
xrange(logging.NOTSET, logging.CRITICAL + 1,
logging.DEBUG - logging.NOTSET)),