import re
def get_version_from_string(text):
pattern = re.compile("^(\d+\.)*[0-9]{1,5}")
match = pattern.match(text)
return str(match.group(0))
findings = [
{
"attributes": [
{
"key": "BENCHMARK_RULE_ID",
"value": "0.0.0 Ensure permissions"
}
{
"key": "INSTANCE_ID",
"value": "i-6e0"
}
]
},
{
"attributes": [
{
"key": "BENCHMARK_RULE_ID",
"value": "0.0.1 Ensure That files"
}
{
"key": "INSTANCE_ID",
"value": "i-6e0"
}
]
},
{
"attributes": [
{
"key": "BENCHMARK_RULE_ID",
"value": "0.0.2 Ensure successful file"
}
{
"key": "INSTANCE_ID",
"value": "i-6e0"
}
]
}
]
non_compliant_instances = {}
cis_id = ""
instance = "dummy_value"
for finding in findings:
for attribute in finding.get("attributes"):
if attribute.get("key") == "INSTANCE_ID":
instance = attribute.get("value")
if instance not in non_compliant_instances:
non_compliant_instances[instance] = {"CIS_Violations": [], "CVE_ID": []}
if attribute.get("key") == "BENCHMARK_RULE_ID":
cis_id = get_version_from_string(attribute.get("value"))
non_compliant_instances[instance]["CIS_Violations"].append(cis_id)
# Actual Output:
print(non_compliant_instances)
# Work Around Starts
# Deleting first extra element
extra_cis_id = non_compliant_instances['aws'].get("CIS_Violations")
try:
del non_compliant_instances['dummy_value']
except:
print('No dummy_value found')
for ncinstance in non_compliant_instances.keys():
set1 = set(non_compliant_instances.get(ncinstance).get('CIS_Violations'))
set1.add(extra_cis_id[0])
non_compliant_instances[ncinstance]["CIS_Violations"] = sorted(set1)
# Work Around Ends
# Required Output:
print(non_compliant_instances)
Фактический вывод:
{{'dummy_value': {'CIS_Violations': ['0.0.0'], 'CVE_ID': []}, 'i-6e0': { 'CIS_Violations': ['0.0.1', '0.0.2'], 'CVE_ID': []}}
Требуемый вывод:
{'i-6e0': {' CIS_Violations ': [' 0.0.0 ',' 0.0.1 ',' 0.0.2 '],' CVE_ID ': []}}
Это происходит потому, что значение установлено в instance переменная по
if attribute.get("key") == "INSTANCE_ID":
instance = attribute.get("value")
является локальной по отношению к этому, если блок
, только если можно было объявить экземпляр переменной как stati c без OOPS ....