forked from p15670423/monkey
RCR:
- started the report exporter manager singleton. - added region parsing using regex -
This commit is contained in:
parent
1cedfb5c2d
commit
3ca761f492
|
@ -1,3 +1,4 @@
|
||||||
|
import re
|
||||||
import urllib2
|
import urllib2
|
||||||
|
|
||||||
__author__ = 'itay.mizeretz'
|
__author__ = 'itay.mizeretz'
|
||||||
|
@ -7,11 +8,22 @@ class AWS(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
try:
|
try:
|
||||||
self.instance_id = urllib2.urlopen('http://169.254.169.254/latest/meta-data/instance-id').read()
|
self.instance_id = urllib2.urlopen('http://169.254.169.254/latest/meta-data/instance-id').read()
|
||||||
self.region = urllib2.urlopen('http://169.254.169.254/latest/meta-data/placement/availability-zone').read()[:-1]
|
self.region = self._parse_region(urllib2.urlopen('http://169.254.169.254/latest/meta-data/placement/availability-zone').read())
|
||||||
except urllib2.URLError:
|
except urllib2.URLError:
|
||||||
self.instance_id = None
|
self.instance_id = None
|
||||||
self.region = None
|
self.region = None
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _parse_region(region_url_response):
|
||||||
|
# For a list of regions: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.RegionsAndAvailabilityZones.html
|
||||||
|
# This regex will find any AWS region format string in the response.
|
||||||
|
re_phrase = r'((?:us|eu|ap|ca|cn|sa)-[a-z]*-[0-9])'
|
||||||
|
finding = re.findall(re_phrase, region_url_response, re.IGNORECASE)
|
||||||
|
if finding:
|
||||||
|
return finding[0]
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
def get_instance_id(self):
|
def get_instance_id(self):
|
||||||
return self.instance_id
|
return self.instance_id
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ from enum import Enum
|
||||||
from six import text_type
|
from six import text_type
|
||||||
|
|
||||||
from cc.database import mongo
|
from cc.database import mongo
|
||||||
from cc.environment.environment import load_env_from_file, AWS
|
|
||||||
from cc.resources.aws_exporter import AWSExporter
|
from cc.resources.aws_exporter import AWSExporter
|
||||||
from cc.services.config import ConfigService
|
from cc.services.config import ConfigService
|
||||||
from cc.services.edge import EdgeService
|
from cc.services.edge import EdgeService
|
||||||
|
@ -677,9 +676,7 @@ class ReportService:
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def is_report_generated():
|
def is_report_generated():
|
||||||
generated_report = mongo.db.report.find_one({})
|
generated_report = mongo.db.report.find_one({})
|
||||||
if generated_report is None:
|
return generated_report is not None
|
||||||
return False
|
|
||||||
return True
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def generate_report():
|
def generate_report():
|
||||||
|
@ -734,6 +731,10 @@ class ReportService:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def is_latest_report_exists():
|
def is_latest_report_exists():
|
||||||
|
"""
|
||||||
|
This function checks if a monkey report was already generated and if it's the latest one.
|
||||||
|
:return: True if report is the latest one, False if there isn't a report or its not the latest.
|
||||||
|
"""
|
||||||
latest_report_doc = mongo.db.report.find_one({}, {'meta.latest_monkey_modifytime': 1})
|
latest_report_doc = mongo.db.report.find_one({}, {'meta.latest_monkey_modifytime': 1})
|
||||||
|
|
||||||
if latest_report_doc:
|
if latest_report_doc:
|
||||||
|
@ -755,14 +756,6 @@ class ReportService:
|
||||||
{'exploits': {'$elemMatch': {'exploiter': exploit_type, 'result': True}}},
|
{'exploits': {'$elemMatch': {'exploiter': exploit_type, 'result': True}}},
|
||||||
limit=1) > 0
|
limit=1) > 0
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_active_exporters():
|
|
||||||
# This function should be in another module in charge of building a list of active exporters
|
|
||||||
exporters_list = []
|
|
||||||
if str(load_env_from_file()) == AWS:
|
|
||||||
exporters_list.append(AWSExporter)
|
|
||||||
return exporters_list
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def export_to_exporters(report):
|
def export_to_exporters(report):
|
||||||
for exporter in ReportService.get_active_exporters():
|
for exporter in ReportService.get_active_exporters():
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
from cc.environment.environment import load_env_from_file, AWS
|
||||||
|
from cc.resources.aws_exporter import AWSExporter
|
||||||
|
import logging
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class Borg:
|
||||||
|
_shared_state = {}
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.__dict__ = self._shared_state
|
||||||
|
|
||||||
|
|
||||||
|
class ReportExporterManager(Borg):
|
||||||
|
def __init__(self):
|
||||||
|
Borg.__init__(self)
|
||||||
|
self._exporters_list = []
|
||||||
|
self._init_exporters()
|
||||||
|
|
||||||
|
def get_exporters_list(self):
|
||||||
|
return self._exporters_list
|
||||||
|
|
||||||
|
def _init_exporters(self):
|
||||||
|
self._init_aws_exporter()
|
||||||
|
|
||||||
|
def _init_aws_exporter(self):
|
||||||
|
if str(load_env_from_file()) == AWS:
|
||||||
|
self._exporters_list.append(AWSExporter)
|
||||||
|
|
||||||
|
def export(self):
|
||||||
|
try:
|
||||||
|
for exporter in self._exporters_list:
|
||||||
|
exporter().handle_report()
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception('Failed to export report')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
print ReportExporterManager().get_exporters_list()
|
||||||
|
print ReportExporterManager().get_exporters_list()
|
|
@ -14,4 +14,5 @@ netifaces
|
||||||
ipaddress
|
ipaddress
|
||||||
enum34
|
enum34
|
||||||
PyCrypto
|
PyCrypto
|
||||||
boto3
|
boto3
|
||||||
|
awscli
|
Loading…
Reference in New Issue