summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2013-06-05 03:29:48 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-06-05 19:26:32 +0200
commit957366cd72daf0ca5ffe8d53ce87063ffc9f9b33 (patch)
tree01c6674341b54e377855e09a98a0c92e82c74bfc
parentdaed8ee74bbaf931fd9f8db16ff4fd9a5b24de46 (diff)
downloadtools-957366cd72daf0ca5ffe8d53ce87063ffc9f9b33.tar.gz
tools-957366cd72daf0ca5ffe8d53ce87063ffc9f9b33.tar.bz2
tools-957366cd72daf0ca5ffe8d53ce87063ffc9f9b33.zip
Printer: add force argument to force to print at least an empty entry
If you execute a search with negative matching the result could contain hosts without the field. Under normal circumstances the entry is not printed, because the filter_key does not exists. To get all the matching entries an new force mode is added to print at lease an empty entry.
-rwxr-xr-xbin/hostinfo6
-rw-r--r--hostinfo/printer.py15
2 files changed, 14 insertions, 7 deletions
diff --git a/bin/hostinfo b/bin/hostinfo
index 4a48e2b..0a36f67 100755
--- a/bin/hostinfo
+++ b/bin/hostinfo
@@ -97,12 +97,14 @@ def print_search(basepath, flags, search, filter_key=None):
p = printer.Printer(data, flags)
if filter_key is not None or flags.details:
- p.info(filter_key, label=_get_label(host), maxlength=max(length))
+ p.info(filter_key, label=_get_label(host),
+ maxlength=max(length), force=True)
else:
if key is None:
print(_get_label(host))
else:
- p.info(key, label=_get_label(host), maxlength=max(length))
+ p.info(key, label=_get_label(host),
+ maxlength=max(length), force=True)
def print_info(path, flags, key=None):
data = _get_data(path)
diff --git a/hostinfo/printer.py b/hostinfo/printer.py
index 4302e04..d635d0a 100644
--- a/hostinfo/printer.py
+++ b/hostinfo/printer.py
@@ -82,14 +82,14 @@ class Printer:
return (lambda key: self._should_display(_get_full_key(prev_key, key),
filter_key))
- def _print(self, value, printer, filter_key=None, sort=None):
+ def _print(self, value, printer, filter_key=None, sort=None, force=False):
try:
value = value.strip().splitlines()
except AttributeError:
pass
if isinstance(value, dict):
- self._print_dict(value, printer, filter_key, sort)
+ self._print_dict(value, printer, filter_key, sort, force)
elif isinstance(value, list):
self._print_list(value, printer, filter_key)
elif value is None:
@@ -126,7 +126,7 @@ class Printer:
else:
self._print(value, printer, filter_key)
- def _print_dict(self, value, printer, filter_key, sort):
+ def _print_dict(self, value, printer, filter_key, sort, force):
keys = _sort_with_list(
[(key, full_key) for key in value.keys()
for full_key in [_get_full_key(printer.full_key, key)]
@@ -140,6 +140,7 @@ class Printer:
_space(filter_key, printer.full_key, printer, True)
+ found = False
for (key, full_key) in keys:
new_filter_key = None
if filter_key is not None:
@@ -148,6 +149,7 @@ class Printer:
elif full_key != filter_key:
continue
+ found = True
new_printer = prefix.Printer(full_key, printer)
if filter_key is None:
new_printer.set_label(self._get_label(key, full_key), maxlength)
@@ -155,15 +157,18 @@ class Printer:
self._print_key(full_key, value[key], new_printer, new_filter_key)
_space(filter_key, printer.full_key, new_printer)
+ if force and not found:
+ printer.pprint('')
+
def _get_label(self, key, full_key):
if full_key in self.labels:
return self.labels[full_key]
return key
- def info(self, key, label=None, maxlength=0):
+ def info(self, key, label=None, maxlength=0, force=False):
printer = prefix.Printer()
if label is not None:
printer.set_label(label, maxlength)
- self._print(self.data, printer, filter_key=key,
+ self._print(self.data, printer, filter_key=key, force=force,
sort=['hostname', 'arch', 'os', 'addresses', 'ports'])