Initial commit
commit
b4f1b9dd69
|
@ -0,0 +1,106 @@
|
|||
# Local exclude
|
||||
scraped/
|
||||
*.swp
|
||||
lookyloo/ete3_webserver/webapi.py
|
||||
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
env/
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
*.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
.hypothesis/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# pyenv
|
||||
.python-version
|
||||
|
||||
# celery beat schedule file
|
||||
celerybeat-schedule
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# dotenv
|
||||
.env
|
||||
|
||||
# virtualenv
|
||||
.venv
|
||||
venv/
|
||||
ENV/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
|
@ -0,0 +1,3 @@
|
|||
[submodule "pymispwarninglists/data/misp-warninglists"]
|
||||
path = pymispwarninglists/data/misp-warninglists
|
||||
url = https://github.com/MISP/misp-warninglists.git
|
|
@ -0,0 +1,19 @@
|
|||
language: python
|
||||
|
||||
cache: pip
|
||||
|
||||
python:
|
||||
- "3.6"
|
||||
- "3.6-dev"
|
||||
- "nightly"
|
||||
|
||||
install:
|
||||
- pip install coveralls codecov jsonschema
|
||||
- pip install .
|
||||
|
||||
script:
|
||||
- nosetests --with-coverage --cover-package=pymispwarninglists -d
|
||||
|
||||
after_success:
|
||||
- codecov
|
||||
- coveralls
|
|
@ -0,0 +1,11 @@
|
|||
# PyMISPWarningLists
|
||||
|
||||
[![Build Status](https://travis-ci.org/MISP/PyMISPWarningLists.svg?branch=master)](https://travis-ci.org/MISP/PyMISPWarningLists)
|
||||
[![codecov.io](https://codecov.io/github/MISP/PyMISParningLists/coverage.svg?branch=master)](https://codecov.io/github/MISP/PyMISPWarningLists?branch=master)
|
||||
|
||||
Pythonic way to work with the warning lists defined there: https://github.com/MISP/misp-warninglists
|
||||
|
||||
# Usage
|
||||
|
||||
Warning lists are represented as immutable Python dictionaries.
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from .api import WarningLists, EncodeWarningLists
|
|
@ -0,0 +1,83 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
from json import JSONEncoder
|
||||
import os
|
||||
import sys
|
||||
import collections
|
||||
from glob import glob
|
||||
|
||||
try:
|
||||
import jsonschema
|
||||
HAS_JSONSCHEMA = True
|
||||
except ImportError:
|
||||
HAS_JSONSCHEMA = False
|
||||
|
||||
|
||||
class EncodeWarningLists(JSONEncoder):
|
||||
def default(self, obj):
|
||||
try:
|
||||
return obj._json()
|
||||
except AttributeError:
|
||||
return JSONEncoder.default(self, obj)
|
||||
|
||||
|
||||
class PyMISPWarningListsError(Exception):
|
||||
def __init__(self, message):
|
||||
super(PyMISPWarningListsError, self).__init__(message)
|
||||
self.message = message
|
||||
|
||||
|
||||
class WarningList():
|
||||
|
||||
def __init__(self, warninglist):
|
||||
self.warninglist = warninglist
|
||||
self.list = self.warninglist['list']
|
||||
self.description = self.warninglist['description']
|
||||
self.version = int(self.warninglist['version'])
|
||||
self.name = self.warninglist['name']
|
||||
if self.warninglist.get('type'):
|
||||
self.type = self.warninglist['type']
|
||||
if self.warninglist.get('matching_attributes'):
|
||||
self.matching_attributes = self.warninglist['matching_attributes']
|
||||
|
||||
def _json(self):
|
||||
to_return = {'list': self.list, 'name': self.name, 'description': self.description,
|
||||
'version': self.version}
|
||||
if hasattr(self, 'type'):
|
||||
to_return['type'] = self.type
|
||||
if hasattr(self, 'matching_attributes'):
|
||||
to_return['matching_attributes'] = self.matching_attributes
|
||||
return to_return
|
||||
|
||||
|
||||
class WarningLists(collections.Mapping):
|
||||
|
||||
def __init__(self):
|
||||
self.root_dir_warninglists = os.path.join(os.path.abspath(os.path.dirname(sys.modules['pymispwarninglists'].__file__)),
|
||||
'data', 'misp-warninglists', 'lists')
|
||||
self.warninglists = {}
|
||||
for warninglist_file in glob(os.path.join(self.root_dir_warninglists, '*', 'list.json')):
|
||||
with open(warninglist_file, 'r') as f:
|
||||
warninglist = json.load(f)
|
||||
self.warninglists[warninglist['name']] = WarningList(warninglist)
|
||||
|
||||
def validate_with_schema(self):
|
||||
if not HAS_JSONSCHEMA:
|
||||
raise ImportError('jsonschema is required: pip install jsonschema')
|
||||
schema = os.path.join(os.path.abspath(os.path.dirname(sys.modules['pymispwarninglists'].__file__)),
|
||||
'data', 'misp-warninglists', 'schema.json')
|
||||
with open(schema, 'r') as f:
|
||||
loaded_schema = json.load(f)
|
||||
for w in self.warninglists.values():
|
||||
jsonschema.validate(w.warninglist, loaded_schema)
|
||||
|
||||
def __getitem__(self, name):
|
||||
return self.warninglists[name]
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self.warninglists)
|
||||
|
||||
def __len__(self):
|
||||
return len(self.warninglists)
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 095b5063f3bd427d787639e8c092ad204d13b282
|
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
from setuptools import setup
|
||||
|
||||
|
||||
setup(
|
||||
name='pymispwarninglist',
|
||||
version='0.1',
|
||||
author='Raphaël Vinot',
|
||||
author_email='raphael.vinot@circl.lu',
|
||||
maintainer='Raphaël Vinot',
|
||||
url='https://github.com/MISP/PyMISPWarningLists',
|
||||
description='Python API for the MISP warning lists.',
|
||||
packages=['pymispwarninglists'],
|
||||
classifiers=[
|
||||
'License :: OSI Approved :: BSD License',
|
||||
'Development Status :: 5 - Production/Stable',
|
||||
'Environment :: Console',
|
||||
'Intended Audience :: Science/Research',
|
||||
'Intended Audience :: Telecommunications Industry',
|
||||
'Programming Language :: Python',
|
||||
'Topic :: Security',
|
||||
'Topic :: Internet',
|
||||
],
|
||||
tests_requires=['nose'],
|
||||
test_suite='nose.collector',
|
||||
package_data={'pymispwarninglists': ['data/misp-warninglists/schema.json',
|
||||
'data/misp-warninglists/*/*.json']}
|
||||
)
|
|
@ -0,0 +1,31 @@
|
|||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import unittest
|
||||
from pymispwarninglists import WarningLists, EncodeWarningLists
|
||||
from glob import glob
|
||||
import os
|
||||
import json
|
||||
|
||||
|
||||
class TestPyMISPWarningLists(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.warninglists = WarningLists()
|
||||
|
||||
def test_dump_warninglists(self):
|
||||
warninglists_from_files = {}
|
||||
for warninglist_file in glob(os.path.join(self.warninglists.root_dir_warninglists, '*', 'list.json')):
|
||||
with open(warninglist_file, 'r') as f:
|
||||
warninglist = json.load(f)
|
||||
warninglists_from_files[warninglist['name']] = warninglist
|
||||
for name, w in self.warninglists.items():
|
||||
out = w._json()
|
||||
self.assertDictEqual(out, warninglists_from_files[w.name])
|
||||
|
||||
def test_validate_schema_warninglists(self):
|
||||
self.warninglists.validate_with_schema()
|
||||
|
||||
def test_json(self):
|
||||
for w in self.warninglists.values():
|
||||
json.dumps(w, cls=EncodeWarningLists)
|
Loading…
Reference in New Issue