#!/usr/bin/env python
# -*- coding: utf-8 -*-
# File: datamodels.py
#
# Copyright 2022 Theodoor Scholte, Costas Tyfoxylos, Jenda Brands
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
"""
Main code for datamodels.
.. _Google Python Style Guide:
http://google.github.io/styleguide/pyguide.html
"""
import logging
import json
__author__ = '''Costas Tyfoxylos <ctyfoxylos@schubergphilis.com>'''
__docformat__ = '''google'''
__date__ = '''08-04-2022'''
__copyright__ = '''Copyright 2022, Costas Tyfoxylos'''
__credits__ = ["Theodoor Scholte", "Costas Tyfoxylos", "Jenda Brands"]
__license__ = '''MIT'''
__maintainer__ = '''Costas Tyfoxylos'''
__email__ = '''<ctyfoxylos@schubergphilis.com>'''
__status__ = '''Development''' # "Prototype", "Development", "Production".
# This is the main prefix used for logging
LOGGER_BASENAME = '''datamodels'''
LOGGER = logging.getLogger(LOGGER_BASENAME)
LOGGER.addHandler(logging.NullHandler())
[docs]
class ZoneEnergyLabelingData:
"""Models the data for energy labeling to export."""
def __init__(self, filename, name, energy_label):
self.filename = filename
self._name = name
self._energy_label = energy_label
@property
def json(self):
"""Data to json."""
return json.dumps([{'Zone Name': self._name,
'Zone Energy Label': self._energy_label}],
indent=2, default=str)
[docs]
class SecurityHubFindingsData:
"""Models the data for energy labeling to export."""
def __init__(self, filename, security_hub_findings):
self.filename = filename
self._security_hub_findings = security_hub_findings
@property
def json(self):
"""Data to json."""
return json.dumps([{'Finding ID': finding.id,
'Account ID': finding.aws_account_id,
'Generator ID': finding.generator_id,
'Finding First Observed At': finding.first_observed_at,
'Finding Last Observed At': finding.last_observed_at,
'Finding Created At': finding.created_at,
'Finding Updated At': finding.updated_at,
'Severity': finding.severity,
'Title': finding.title,
'Description': finding.description,
'Remediation Text': finding.remediation_recommendation_text,
'Remediation Url': finding.remediation_recommendation_url,
'Compliance Frameworks': finding.compliance_frameworks,
'Rule ID': finding.rule_id,
'Compliance Status': finding.compliance_status,
'Workflow State': finding.workflow_status,
'Record State': finding.record_state,
'Days Open': finding.days_open
}
for finding in self._security_hub_findings], indent=2, default=str)
[docs]
class SecurityHubFindingsResourcesData:
"""Models the data for energy labeling to export."""
def __init__(self, filename, security_hub_findings):
self.filename = filename
self._security_hub_findings = security_hub_findings
@property
def json(self):
"""Data to json."""
return json.dumps([{'Finding ID': finding.id,
'Resource ID': resource.get('Id'),
'Resource Type': resource.get('Type'),
'Resource Partition': resource.get('Partition'),
'Resource Region': resource.get('Region')}
for finding in self._security_hub_findings for resource in finding.resources],
indent=2, default=str)
[docs]
class SecurityHubFindingsTypesData:
"""Models the data for energy labeling to export."""
def __init__(self, filename, security_hub_findings):
self.filename = filename
self._security_hub_findings = security_hub_findings
@property
def json(self):
"""Data to json."""
return json.dumps([{'Finding ID': finding.id,
'Finding Type': finding_type}
for finding in self._security_hub_findings for finding_type in finding.types],
indent=2, default=str)
[docs]
class LabeledAccountData:
"""Models the data for energy labeling to export."""
def __init__(self, filename, labeled_accounts):
self.filename = filename
self._labeled_account = labeled_accounts
@property
def data(self):
"""Data of an account to export."""
return {'Account ID': self._labeled_account.id,
'Account Name': self._labeled_account.name,
'Number of critical findings': self._labeled_account.energy_label.number_of_critical_findings,
'Number of high findings': self._labeled_account.energy_label.number_of_high_findings,
'Number of medium findings': self._labeled_account.energy_label.number_of_medium_findings,
'Number of low findings': self._labeled_account.energy_label.number_of_low_findings,
'Number of maximum days open': self._labeled_account.energy_label.max_days_open,
'Energy Label': self._labeled_account.energy_label.label}
@property
def json(self):
"""Data to json."""
return json.dumps(self.data, indent=2, default=str)
[docs]
class LabeledAccountsData:
"""Models the data for energy labeling to export."""
def __init__(self, filename, labeled_accounts):
self.filename = filename
self._labeled_accounts = labeled_accounts
@property
def json(self):
"""Data to json."""
return json.dumps([LabeledAccountData(self.filename, account).data
for account in self._labeled_accounts], indent=2, default=str)