Gives much more detailed output than before and can be recursive.
Fixes bug #7146
---
src/bin/secstate | 6 ++-
src/secstate/main.py | 93 +++++++++++++++++++++++++++++---------------------
src/secstate/util.py | 17 +++++++++
3 files changed, 75 insertions(+), 41 deletions(-)
diff --git a/src/bin/secstate b/src/bin/secstate
index 8e379cb..0c28ecc 100644
--- a/src/bin/secstate
+++ b/src/bin/secstate
@@ -203,14 +203,16 @@ def list_content(arguments):
parser = OptionParser(usage="secstate list [options] <string>")
parser.add_option('-r', '--recurse', action='store_true',
dest='recurse', default=False,
help="Recurse through an items content")
+ parser.add_option('-a', '--all', action='store_true',
dest='all', default=False,
+ help="Show items regardless of selection status")
(options, args) = parser.parse_args(arguments)
if args == []:
- if not sec_instance.list_content(recurse=options.recurse):
+ if not sec_instance.list_content(recurse=options.recurse, show_all=options.all):
return -1
else:
for arg in args:
- if not sec_instance.list_content(arg, options.recurse):
+ if not sec_instance.list_content(arg, options.recurse, options.all):
return -1
return 0
diff --git a/src/secstate/main.py b/src/secstate/main.py
index c3b84d7..fa85059 100644
--- a/src/secstate/main.py
+++ b/src/secstate/main.py
@@ -437,7 +437,7 @@ class Secstate:
if (title != None) and (description != None):
if (search_string in title) or (search_string in description):
print "\t%(id)s:" % {'id':id}
- print "\t\tTitle: %(title)s" %
{'title':title}
+ print "\t\tTitle: '%(title)s'" %
{'title':title}
print "\t\tDescription: %(description)s\n" %
{'description':description}
for rule in xccdf_get_items(benchmark, oscap.XCCDF_RULE):
@@ -456,7 +456,7 @@ class Secstate:
if (title != None) and (description != None):
if (search_string in title) or (search_string in description):
print "\t%(id)s:" % {'id':id}
- print "\t\tTitle: %(title)s" %
{'title':title}
+ print "\t\tTitle: '%(title)s'" %
{'title':title}
print "\t\tDescription: %(description)s\n" %
{'description':description}
oscap.xccdf_benchmark_free(benchmark)
@@ -478,7 +478,7 @@ class Secstate:
break
else:
print "%(id)s:" %
{'id':oscap.oval_definition_get_id(item)}
- print "\t%(title)s" %
{'title':oscap.oval_definition_get_title(defn)}
+ print "\t'%(title)s'" %
{'title':oscap.oval_definition_get_title(defn)}
print "\t%(desc)s" %
{'desc':oscap.oval_definition_get_description(defn)}
oscap.xccdf_benchmark_free(benchmark)
oscap.oval_definition_model_free(def_model)
@@ -488,7 +488,7 @@ class Secstate:
print "%(id)s:" % {'id':oscap.xccdf_item_get_id(item)}
titles = oscap.xccdf_item_get_title(item)
for title in oscap_text_generator(titles):
- print "\tTitle: %(title)s" %
{'title':oscap.oscap_text_get_text(title)}
+ print "\tTitle: '%(title)s'" %
{'title':oscap.oscap_text_get_text(title)}
descriptions = oscap.xccdf_item_get_description(item)
for description in oscap_text_generator(descriptions):
@@ -523,50 +523,65 @@ class Secstate:
oscap.oval_definition_model_free(def_model)
return True
- def list_content(self, arg=None, recurse=False):
- for key in self.database:
- (benchmark, oval) = self.import_content(os.path.join(self.benchmark_dir, key,
self.database[key]))
- if benchmark == None:
- self.log.error("Error loading benchmark: %(id)s" %
{'id':key})
- return False
+ def sublist(self, benchmark, def_model, arg, recurse, show_all, tabs=0):
+ tabstr = "\t" * tabs
+ selected = ""
+ item = None
+ if arg == oscap.xccdf_benchmark_get_id(benchmark):
+ item = oscap.xccdf_benchmark_to_item(benchmark)
+ else:
+ item = oscap.xccdf_benchmark_get_item(benchmark, arg)
- if arg == None:
- titles = oscap.xccdf_benchmark_get_title(benchmark)
- for title in oscap_text_generator(titles):
- print "%(id)s: %(title)s" % {'id':key,
'title':oscap.oscap_text_get_text(title)}
+ if item == None:
+ defn = oscap.oval_definition_model_get_definition(def_model, arg)
+ if defn == None:
+ return
+ print "%(indent)sDefinition - ID: %(id)s, Title:
'%(title)s'" % {'indent':tabstr, 'id':arg,
+
'title':oscap.oval_definition_get_title(defn)}
- if recurse:
- content = oscap.xccdf_benchmark_get_content(benchmark)
+ else:
+ titles = oscap.xccdf_item_get_title(item)
+ for title in oscap_text_generator(titles):
+ if show_all:
+ if oscap.xccdf_item_get_selected(item):
+ selected = "[X]"
+ else:
+ selected = "[ ]"
+
+ if not oscap.xccdf_item_get_selected(item):
+ if not recurse or (tabs == 0):
+ selected = "[ ]"
+
+ print "%(indent)s%(sel)s%(type)s - ID: %(id)s, Title:
'%(title)s'" % {'indent':tabstr, 'sel':selected,
+
'type':item_get_type_str(item), 'id':arg,
+
'title':oscap.oscap_text_get_text(title)}
+ if recurse:
+ type = oscap.xccdf_item_get_type(item)
+ if (type == oscap.XCCDF_GROUP) or (type == oscap.XCCDF_BENCHMARK):
+ content = oscap.xccdf_item_get_content(item)
for sub in xccdf_item_generator(content):
- titles = oscap.xccdf_item_get_title(sub)
- for title in oscap_text_generator(titles):
- print "\t%(id)s:\t%(title)s" %
{'id':oscap.xccdf_item_get_id(sub),
-
'title':oscap.oscap_text_get_text(title)}
+ self.sublist(benchmark, def_model, oscap.xccdf_item_get_id(sub),
recurse, show_all, tabs+1)
- else:
- item = oscap.xccdf_benchmark_get_item(benchmark, arg)
- if item == None:
- pass
- titles = oscap.xccdf_item_get_title(item)
- for title in oscap_text_generator(titles):
- print "%(id)s: %(title)s" % {'id':arg,
'title':oscap.oscap_text_get_text(title)}
+ def list_content(self, arg=None, recurse=False, show_all=False):
+ ret = False
+ for key in self.database:
- if recurse:
- type = oscap.xccdf_item_get_type(item)
- if type == oscap.XCCDF_GROUP:
- content =
oscap.xccdf_group_get_content(oscap.xccdf_item_to_group(item))
- for sub in xccdf_item_generator(content):
- titles = oscap.xccdf_item_get_title(sub)
- for title in oscap_text_generator(titles):
- print "\t%(id)s:\t%(title)s" %
{'id':oscap.xccdf_item_get_id(sub),
-
'title':oscap.oscap_text_get_text(title)}
-
+ (benchmark, def_model) = self.import_content(os.path.join(self.benchmark_dir,
key, self.database[key]))
+ if benchmark == None:
+ self.log.error("Error loading benchmark: %(id)s" %
{'id':key})
+ return False
+
+ if (arg == None) or (arg == key):
+ ret = self.sublist(benchmark, def_model, key, recurse, show_all)
+
+ else:
+ ret = self.sublist(benchmark, def_model, arg, recurse, show_all)
oscap.xccdf_benchmark_free(benchmark)
- oscap.oval_definition_model_free(oval)
+ oscap.oval_definition_model_free(def_model)
- return True
+ return ret
def get_passed_result_ids(self, xccdf_results):
if xccdf_results == None:
diff --git a/src/secstate/util.py b/src/secstate/util.py
index 5e84a4a..6856212 100644
--- a/src/secstate/util.py
+++ b/src/secstate/util.py
@@ -429,6 +429,23 @@ def xccdf_get_fixes(benchmark, ignore_ids=[]):
fixes.extend(xccdf_fix_list(oscap.xccdf_rule_get_fixes(rule)))
return fixes
+def item_get_type_str(item):
+ type = oscap.xccdf_item_get_type(item)
+ if type == oscap.XCCDF_BENCHMARK:
+ return "Benchmark"
+ elif type == oscap.XCCDF_GROUP:
+ return "Group"
+ elif type == oscap.XCCDF_RULE:
+ return "Rule"
+ elif type == oscap.XCCDF_PROFILE:
+ return "Profile"
+ elif type == oscap.XCCDF_RESULT:
+ return "TestResult"
+ elif type == oscap.XCCDF_VALUE:
+ return "Value"
+ else:
+ return "Item"
+
def parse_puppet_fixes(benchmark, ignore_ids=[]):
fixes = xccdf_get_fixes(benchmark, ignore_ids)
all_puppet = {'classes' : set(), 'environment' : "",
'parameters' : {}}
--
1.7.0.1