2017-01-17 22:58:19 +01:00
|
|
|
from datetime import datetime
|
|
|
|
import json
|
2017-01-17 21:37:47 +01:00
|
|
|
import uuid
|
|
|
|
|
2017-01-17 22:58:19 +01:00
|
|
|
import pytz
|
|
|
|
|
|
|
|
|
|
|
|
def format_datetime(dt):
|
|
|
|
# 1. Convert to UTC
|
|
|
|
# 2. Format in isoformat
|
|
|
|
# 3. Strip off "+00:00"
|
|
|
|
# 4. Add "Z"
|
|
|
|
return dt.astimezone(pytz.utc).isoformat()[:-6] + "Z"
|
|
|
|
|
|
|
|
# REQUIRED (all):
|
|
|
|
# - type
|
|
|
|
# - id
|
|
|
|
# - created
|
|
|
|
# - modified
|
|
|
|
|
2017-01-17 21:37:47 +01:00
|
|
|
|
2017-01-18 00:03:56 +01:00
|
|
|
class Indicator(object):
|
2017-01-17 22:58:19 +01:00
|
|
|
# REQUIRED (Indicator):
|
|
|
|
# - type
|
|
|
|
# - labels
|
|
|
|
# - pattern
|
|
|
|
# - valid_from
|
|
|
|
required = ['']
|
|
|
|
|
2017-01-18 00:03:56 +01:00
|
|
|
def __getitem__(self, key):
|
|
|
|
return getattr(self, key)
|
|
|
|
|
2017-01-17 22:58:19 +01:00
|
|
|
def __init__(self, type='indicator', id=None, created=None, modified=None,
|
|
|
|
labels=None, pattern=None, valid_from=None):
|
|
|
|
now = datetime.now(tz=pytz.UTC)
|
|
|
|
|
2017-01-17 23:46:00 +01:00
|
|
|
if type != 'indicator':
|
|
|
|
raise ValueError("Indicators must have type='indicator'.")
|
2017-01-17 22:58:19 +01:00
|
|
|
self.type = type
|
2017-01-17 23:46:00 +01:00
|
|
|
|
2017-01-17 22:58:19 +01:00
|
|
|
if not id:
|
2017-01-17 23:46:00 +01:00
|
|
|
id = 'indicator--' + str(uuid.uuid4())
|
|
|
|
if not id.startswith('indicator--'):
|
|
|
|
raise ValueError("Indicator id values must begin with 'indicator--'.")
|
2017-01-17 22:58:19 +01:00
|
|
|
self.id = id
|
2017-01-17 23:46:00 +01:00
|
|
|
|
2017-01-17 22:58:19 +01:00
|
|
|
self.created = created or now
|
|
|
|
self.modified = modified or now
|
2017-01-17 23:52:56 +01:00
|
|
|
|
|
|
|
if not labels:
|
|
|
|
raise ValueError("Missing required field for Indicator: 'labels'.")
|
2017-01-17 22:58:19 +01:00
|
|
|
self.labels = labels
|
2017-01-17 23:52:56 +01:00
|
|
|
|
|
|
|
if not pattern:
|
|
|
|
raise ValueError("Missing required field for Indicator: 'pattern'.")
|
2017-01-17 22:58:19 +01:00
|
|
|
self.pattern = pattern
|
|
|
|
self.valid_from = valid_from or now
|
2017-01-17 21:37:47 +01:00
|
|
|
|
2017-01-17 22:58:19 +01:00
|
|
|
def __str__(self):
|
|
|
|
# TODO: put keys in specific order. Probably need custom JSON encoder.
|
|
|
|
return json.dumps({
|
|
|
|
'type': self.type,
|
|
|
|
'id': self.id,
|
|
|
|
'created': format_datetime(self.created),
|
|
|
|
'modified': format_datetime(self.modified),
|
|
|
|
'labels': self.labels,
|
|
|
|
'pattern': self.pattern,
|
|
|
|
'valid_from': format_datetime(self.valid_from),
|
|
|
|
}, indent=4, sort_keys=True, separators=(",", ": ")) # Don't include spaces after commas.
|