From e51b5b68fb63d1950cdcc3f92bc2aaeeda385db5 Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Thu, 29 Mar 2018 11:51:43 -0700 Subject: [PATCH 01/10] Initial work on packaging up domain-scan --- setup.cfg | 2 ++ setup.py | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 setup.cfg create mode 100644 setup.py diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..0b2360c1 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,2 @@ +[bdist_wheel] +universal = true diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..e9d264c1 --- /dev/null +++ b/setup.py @@ -0,0 +1,84 @@ +""" +setup module for domain-scan + +Based on: + +- https://packaging.python.org/distributing/ +- https://github.com/pypa/sampleproject/blob/master/setup.py +- https://github.com/dhs-ncats/pshtt/blob/master/setup.py +""" + +from setuptools import setup + +setup( + name='domain-scan', + + # Versions should comply with PEP440 + version='0.1.0-dev', + description='lightweight scan pipeline for orchestrating third party tools, at scale and (optionally) using serverless infrastructure', + + # NCATS "homepage" + url='https://18f.gsa.gov', + # The project's main homepage + download_url='https://github.com/18F/domain-scan', + + # Author details + author='GSA 18F', + # TODO: What is the right email -- author_email='ncats@hq.dhs.gov', + + license='License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication', + + # See https://pypi.python.org/pypi?%3Aaction=list_classifiers + classifiers=[ + # How mature is this project? Common values are + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + 'Development Status :: 4 - Beta', + + # Indicate who your project is intended for + 'Intended Audience :: Developers', + + # Pick your license as you wish (should match "license" above) + 'License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication', + + # Specify the Python versions you support here. In particular, ensure + # that you indicate whether you support Python 2, Python 3 or both. + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + ], + + # What does your project relate to? + keywords='https best practices', + + packages=['pshtt'], + + install_requires=[ + 'strict-rfc3339', + 'publicsuffix', + 'boto3', + 'ipython', + 'sslyze>=1.3.4,<1.4.0', + 'cryptography', + 'pyyaml', + 'requests', + 'google-cloud-bigquery', + 'google-auth-oauthlib' + ], + + extras_require={ + 'test': [ + 'pytest' + ], + }, + + # Conveniently allows one to run the CLI scripts + scripts=[ + 'gather', + 'scan', + ] +) From aeeb526bf80e24a9ccbf752f2b49a4f68382e10d Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Thu, 29 Mar 2018 12:00:29 -0700 Subject: [PATCH 02/10] Fix issue with package names --- domain_scan/__init__.py | 0 setup.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 domain_scan/__init__.py diff --git a/domain_scan/__init__.py b/domain_scan/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/setup.py b/setup.py index e9d264c1..23a01086 100644 --- a/setup.py +++ b/setup.py @@ -55,7 +55,7 @@ # What does your project relate to? keywords='https best practices', - packages=['pshtt'], + packages=['domain_scan'], install_requires=[ 'strict-rfc3339', From a935f772816be6d1ac849bb4a528903acd993b65 Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Thu, 29 Mar 2018 12:29:19 -0700 Subject: [PATCH 03/10] Fixed author email per: https://github.com/18F/domain-scan/pull/231\#discussion_r178153431 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 23a01086..ceb1b084 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ # Author details author='GSA 18F', - # TODO: What is the right email -- author_email='ncats@hq.dhs.gov', + author_email='pulse@cio.gov', license='License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication', From 6a88751ca9f5d642825a7d8830e5d4bd27967b5f Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Thu, 29 Mar 2018 12:29:26 -0700 Subject: [PATCH 04/10] Updated package keywords --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index ceb1b084..2b33fa2d 100644 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ ], # What does your project relate to? - keywords='https best practices', + keywords='https best practices web-crawling domain scanning', packages=['domain_scan'], From 2718a95d2633a9f3fe4b22c431a9e66af15a8555 Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Thu, 29 Mar 2018 13:53:34 -0700 Subject: [PATCH 05/10] Added package build dirs to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 69ee2d9c..62a30b15 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ __pycache__ scripts/pulse-results/*.json .DS_Store venv +build/ +dist/ From 1f9bb5e39af0fbf2f818398e802aebc399c8e083 Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Fri, 30 Mar 2018 13:05:49 -0700 Subject: [PATCH 06/10] Moved modules into domain_scan package module --- {gatherers => domain_scan/gatherers}/__init__.py | 0 {gatherers => domain_scan/gatherers}/censys.py | 0 {gatherers => domain_scan/gatherers}/rdns.py | 0 {gatherers => domain_scan/gatherers}/url.py | 0 {runner => domain_scan/runner}/__init__.py | 0 {runner => domain_scan/runner}/runner.py | 0 {scanners => domain_scan/scanners}/__init__.py | 0 {scanners => domain_scan/scanners}/a11y.py | 0 {scanners => domain_scan/scanners}/analytics.py | 0 {scanners => domain_scan/scanners}/csp.py | 0 {scanners => domain_scan/scanners}/headless/base.js | 0 {scanners => domain_scan/scanners}/headless/local_bridge.js | 0 {scanners => domain_scan/scanners}/headless/local_bridge.py | 0 {scanners => domain_scan/scanners}/noop.py | 0 {scanners => domain_scan/scanners}/pshtt.py | 0 {scanners => domain_scan/scanners}/sslyze.py | 0 {scanners => domain_scan/scanners}/third_parties.js | 0 {scanners => domain_scan/scanners}/third_parties.py | 0 {scanners => domain_scan/scanners}/trustymail.py | 0 {utils => domain_scan/utils}/__init__.py | 0 {utils => domain_scan/utils}/known_services.json | 0 {utils => domain_scan/utils}/utils.py | 0 22 files changed, 0 insertions(+), 0 deletions(-) rename {gatherers => domain_scan/gatherers}/__init__.py (100%) rename {gatherers => domain_scan/gatherers}/censys.py (100%) rename {gatherers => domain_scan/gatherers}/rdns.py (100%) rename {gatherers => domain_scan/gatherers}/url.py (100%) rename {runner => domain_scan/runner}/__init__.py (100%) rename {runner => domain_scan/runner}/runner.py (100%) rename {scanners => domain_scan/scanners}/__init__.py (100%) rename {scanners => domain_scan/scanners}/a11y.py (100%) rename {scanners => domain_scan/scanners}/analytics.py (100%) rename {scanners => domain_scan/scanners}/csp.py (100%) rename {scanners => domain_scan/scanners}/headless/base.js (100%) rename {scanners => domain_scan/scanners}/headless/local_bridge.js (100%) rename {scanners => domain_scan/scanners}/headless/local_bridge.py (100%) rename {scanners => domain_scan/scanners}/noop.py (100%) rename {scanners => domain_scan/scanners}/pshtt.py (100%) rename {scanners => domain_scan/scanners}/sslyze.py (100%) rename {scanners => domain_scan/scanners}/third_parties.js (100%) rename {scanners => domain_scan/scanners}/third_parties.py (100%) rename {scanners => domain_scan/scanners}/trustymail.py (100%) rename {utils => domain_scan/utils}/__init__.py (100%) rename {utils => domain_scan/utils}/known_services.json (100%) rename {utils => domain_scan/utils}/utils.py (100%) diff --git a/gatherers/__init__.py b/domain_scan/gatherers/__init__.py similarity index 100% rename from gatherers/__init__.py rename to domain_scan/gatherers/__init__.py diff --git a/gatherers/censys.py b/domain_scan/gatherers/censys.py similarity index 100% rename from gatherers/censys.py rename to domain_scan/gatherers/censys.py diff --git a/gatherers/rdns.py b/domain_scan/gatherers/rdns.py similarity index 100% rename from gatherers/rdns.py rename to domain_scan/gatherers/rdns.py diff --git a/gatherers/url.py b/domain_scan/gatherers/url.py similarity index 100% rename from gatherers/url.py rename to domain_scan/gatherers/url.py diff --git a/runner/__init__.py b/domain_scan/runner/__init__.py similarity index 100% rename from runner/__init__.py rename to domain_scan/runner/__init__.py diff --git a/runner/runner.py b/domain_scan/runner/runner.py similarity index 100% rename from runner/runner.py rename to domain_scan/runner/runner.py diff --git a/scanners/__init__.py b/domain_scan/scanners/__init__.py similarity index 100% rename from scanners/__init__.py rename to domain_scan/scanners/__init__.py diff --git a/scanners/a11y.py b/domain_scan/scanners/a11y.py similarity index 100% rename from scanners/a11y.py rename to domain_scan/scanners/a11y.py diff --git a/scanners/analytics.py b/domain_scan/scanners/analytics.py similarity index 100% rename from scanners/analytics.py rename to domain_scan/scanners/analytics.py diff --git a/scanners/csp.py b/domain_scan/scanners/csp.py similarity index 100% rename from scanners/csp.py rename to domain_scan/scanners/csp.py diff --git a/scanners/headless/base.js b/domain_scan/scanners/headless/base.js similarity index 100% rename from scanners/headless/base.js rename to domain_scan/scanners/headless/base.js diff --git a/scanners/headless/local_bridge.js b/domain_scan/scanners/headless/local_bridge.js similarity index 100% rename from scanners/headless/local_bridge.js rename to domain_scan/scanners/headless/local_bridge.js diff --git a/scanners/headless/local_bridge.py b/domain_scan/scanners/headless/local_bridge.py similarity index 100% rename from scanners/headless/local_bridge.py rename to domain_scan/scanners/headless/local_bridge.py diff --git a/scanners/noop.py b/domain_scan/scanners/noop.py similarity index 100% rename from scanners/noop.py rename to domain_scan/scanners/noop.py diff --git a/scanners/pshtt.py b/domain_scan/scanners/pshtt.py similarity index 100% rename from scanners/pshtt.py rename to domain_scan/scanners/pshtt.py diff --git a/scanners/sslyze.py b/domain_scan/scanners/sslyze.py similarity index 100% rename from scanners/sslyze.py rename to domain_scan/scanners/sslyze.py diff --git a/scanners/third_parties.js b/domain_scan/scanners/third_parties.js similarity index 100% rename from scanners/third_parties.js rename to domain_scan/scanners/third_parties.js diff --git a/scanners/third_parties.py b/domain_scan/scanners/third_parties.py similarity index 100% rename from scanners/third_parties.py rename to domain_scan/scanners/third_parties.py diff --git a/scanners/trustymail.py b/domain_scan/scanners/trustymail.py similarity index 100% rename from scanners/trustymail.py rename to domain_scan/scanners/trustymail.py diff --git a/utils/__init__.py b/domain_scan/utils/__init__.py similarity index 100% rename from utils/__init__.py rename to domain_scan/utils/__init__.py diff --git a/utils/known_services.json b/domain_scan/utils/known_services.json similarity index 100% rename from utils/known_services.json rename to domain_scan/utils/known_services.json diff --git a/utils/utils.py b/domain_scan/utils/utils.py similarity index 100% rename from utils/utils.py rename to domain_scan/utils/utils.py From 48019f4709b42218ea56a03f763f8ac1a44d790b Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Fri, 30 Mar 2018 13:06:19 -0700 Subject: [PATCH 07/10] Fixed issues with having moved package modules around --- domain_scan/gatherers/censys.py | 2 +- domain_scan/gatherers/url.py | 2 +- domain_scan/runner/runner.py | 2 +- domain_scan/scanners/a11y.py | 2 +- domain_scan/scanners/analytics.py | 2 +- domain_scan/scanners/csp.py | 2 +- domain_scan/scanners/headless/__init__.py | 0 domain_scan/scanners/headless/local_bridge.py | 2 +- domain_scan/scanners/pshtt.py | 2 +- domain_scan/scanners/sslyze.py | 2 +- domain_scan/scanners/third_parties.py | 2 +- gather | 2 +- lambda/lambda_handler.py | 3 +-- scan | 6 +++--- tests/test_utils.py | 2 +- 15 files changed, 16 insertions(+), 17 deletions(-) create mode 100644 domain_scan/scanners/headless/__init__.py diff --git a/domain_scan/gatherers/censys.py b/domain_scan/gatherers/censys.py index 0d8b7b72..7dd678d5 100755 --- a/domain_scan/gatherers/censys.py +++ b/domain_scan/gatherers/censys.py @@ -8,7 +8,7 @@ from google.oauth2 import service_account import google.api_core.exceptions -from utils import utils +from domain_scan.utils import utils # Options: # diff --git a/domain_scan/gatherers/url.py b/domain_scan/gatherers/url.py index d8ffb7cb..e274c173 100644 --- a/domain_scan/gatherers/url.py +++ b/domain_scan/gatherers/url.py @@ -2,7 +2,7 @@ import requests import logging -from utils import utils +from domain_scan.utils import utils # Gathers hostnames from a CSV at a given URL. # diff --git a/domain_scan/runner/runner.py b/domain_scan/runner/runner.py index fde4f894..371f93dc 100644 --- a/domain_scan/runner/runner.py +++ b/domain_scan/runner/runner.py @@ -1,4 +1,4 @@ -from utils import utils +from domain_scan.utils import utils def write_rows(rows, domain, base_domain, scanner, csv_writer, meta=None): diff --git a/domain_scan/scanners/a11y.py b/domain_scan/scanners/a11y.py index 031da53a..8db073f5 100644 --- a/domain_scan/scanners/a11y.py +++ b/domain_scan/scanners/a11y.py @@ -4,7 +4,7 @@ import requests import yaml -from utils import utils +from domain_scan.utils import utils workers = 3 diff --git a/domain_scan/scanners/analytics.py b/domain_scan/scanners/analytics.py index 1a032ac2..ceeaa7df 100644 --- a/domain_scan/scanners/analytics.py +++ b/domain_scan/scanners/analytics.py @@ -1,7 +1,7 @@ import logging import os -from utils import utils +from domain_scan.utils import utils # Check whether a domain is present in a CSV, set in --analytics. diff --git a/domain_scan/scanners/csp.py b/domain_scan/scanners/csp.py index 607d7c5a..2fdf4c52 100644 --- a/domain_scan/scanners/csp.py +++ b/domain_scan/scanners/csp.py @@ -1,6 +1,6 @@ import logging import requests -from scanners import utils +from domain_scan.scanners import utils ### # CSP Scanner - check the presence of CSP headers diff --git a/domain_scan/scanners/headless/__init__.py b/domain_scan/scanners/headless/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/domain_scan/scanners/headless/local_bridge.py b/domain_scan/scanners/headless/local_bridge.py index b9e701a1..f81927cc 100644 --- a/domain_scan/scanners/headless/local_bridge.py +++ b/domain_scan/scanners/headless/local_bridge.py @@ -1,7 +1,7 @@ import logging import json -from utils import utils +from domain_scan.utils import utils ### # Local Python bridge to the JS bridge to the JS scanner. diff --git a/domain_scan/scanners/pshtt.py b/domain_scan/scanners/pshtt.py index 993c5e6f..788582b2 100644 --- a/domain_scan/scanners/pshtt.py +++ b/domain_scan/scanners/pshtt.py @@ -4,7 +4,7 @@ import re from pshtt import pshtt -from utils import utils +from domain_scan.utils import utils ### # Measure a site's HTTP behavior using DHS NCATS' pshtt tool. diff --git a/domain_scan/scanners/sslyze.py b/domain_scan/scanners/sslyze.py index e9321277..0877bc0c 100644 --- a/domain_scan/scanners/sslyze.py +++ b/domain_scan/scanners/sslyze.py @@ -27,7 +27,7 @@ from cryptography.hazmat.primitives.serialization import Encoding from cryptography.hazmat.primitives.asymmetric import ec, dsa, rsa -from utils import utils +from domain_scan.utils import utils # Number of seconds to wait during sslyze connection check. # Not much patience here, and very willing to move on. diff --git a/domain_scan/scanners/third_parties.py b/domain_scan/scanners/third_parties.py index 6f76a7aa..7856ac81 100644 --- a/domain_scan/scanners/third_parties.py +++ b/domain_scan/scanners/third_parties.py @@ -1,6 +1,6 @@ import logging -from utils import utils +from domain_scan.utils import utils # Evaluate third party service usage using Chrome headless. diff --git a/gather b/gather index 63ce9a3c..0d5884aa 100755 --- a/gather +++ b/gather @@ -9,7 +9,7 @@ import requests import logging import importlib -from utils import utils +from domain_scan.utils import utils # some metadata about the scan itself start_time = utils.local_now() diff --git a/lambda/lambda_handler.py b/lambda/lambda_handler.py index c09502b4..eefcc2a5 100644 --- a/lambda/lambda_handler.py +++ b/lambda/lambda_handler.py @@ -2,7 +2,7 @@ import sys import logging -from utils import utils +from domain_scan.utils import utils # Central handler for all Lambda events. def handler(event, context): @@ -49,4 +49,3 @@ def handler(event, context): # date transform functions in one place, before Amazon's built-in # JSON serialization prepares the data for transport. return utils.from_json(utils.json_for(response)) - diff --git a/scan b/scan index 6580de59..304faba9 100755 --- a/scan +++ b/scan @@ -16,9 +16,9 @@ import boto3 import botocore from concurrent.futures import ThreadPoolExecutor -from scanners.headless.local_bridge import headless_scan -from utils import utils -from runner import runner +from domain_scan.scanners.headless.local_bridge import headless_scan +from domain_scan.utils import utils +from domain_scan.runner import runner # Default and maximum for local workers (threads) per-scanner. diff --git a/tests/test_utils.py b/tests/test_utils.py index c4e9f1b2..bc0b47c1 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -2,7 +2,7 @@ import sys import pytest from .context import utils # noqa -from utils import utils as subutils +from domain_scan.utils import utils as subutils def get_default_false_values(parser): From 1b94b59da0f642beb39d58ab6140bf75beda8356 Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Fri, 30 Mar 2018 13:07:03 -0700 Subject: [PATCH 08/10] Updated setup.py to fix issues with packaging --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 2b33fa2d..8b996223 100644 --- a/setup.py +++ b/setup.py @@ -8,13 +8,13 @@ - https://github.com/dhs-ncats/pshtt/blob/master/setup.py """ -from setuptools import setup +from setuptools import setup, find_packages setup( name='domain-scan', # Versions should comply with PEP440 - version='0.1.0-dev', + version='0.1.0-dev1', description='lightweight scan pipeline for orchestrating third party tools, at scale and (optionally) using serverless infrastructure', # NCATS "homepage" @@ -55,7 +55,7 @@ # What does your project relate to? keywords='https best practices web-crawling domain scanning', - packages=['domain_scan'], + packages=find_packages(), install_requires=[ 'strict-rfc3339', From 77c0fa3ccebd6e294a8efcb9b107071f6dd0aefe Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Mon, 2 Apr 2018 11:52:06 -0700 Subject: [PATCH 09/10] Moved new module gathererabc.py into domain_scan/ --- domain_scan/gatherers/censys.py | 2 +- {gatherers => domain_scan/gatherers}/gathererabc.py | 0 domain_scan/gatherers/rdns.py | 2 +- domain_scan/gatherers/url.py | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename {gatherers => domain_scan/gatherers}/gathererabc.py (100%) diff --git a/domain_scan/gatherers/censys.py b/domain_scan/gatherers/censys.py index fc2fdc96..0521cc78 100644 --- a/domain_scan/gatherers/censys.py +++ b/domain_scan/gatherers/censys.py @@ -8,7 +8,7 @@ from google.oauth2 import service_account import google.api_core.exceptions -from gatherers.gathererabc import Gatherer +from domain_scan.gatherers.gathererabc import Gatherer from domain_scan.utils import utils # Options: diff --git a/gatherers/gathererabc.py b/domain_scan/gatherers/gathererabc.py similarity index 100% rename from gatherers/gathererabc.py rename to domain_scan/gatherers/gathererabc.py diff --git a/domain_scan/gatherers/rdns.py b/domain_scan/gatherers/rdns.py index 6a20f812..da51fdcd 100644 --- a/domain_scan/gatherers/rdns.py +++ b/domain_scan/gatherers/rdns.py @@ -3,7 +3,7 @@ import re from typing import Generator, List, Pattern -from gatherers.gathererabc import Gatherer +from domain_scan.gatherers.gathererabc import Gatherer # Reverse DNS # diff --git a/domain_scan/gatherers/url.py b/domain_scan/gatherers/url.py index 7f8a0821..46cca50c 100644 --- a/domain_scan/gatherers/url.py +++ b/domain_scan/gatherers/url.py @@ -3,7 +3,7 @@ import requests -from gatherers.gathererabc import Gatherer +from domain_scan.gatherers.gathererabc import Gatherer from domain_scan.utils import utils From 29470390c555bd0233362bb6b502fb230ca1db71 Mon Sep 17 00:00:00 2001 From: Ian Lee Date: Sun, 8 Apr 2018 15:01:44 -0700 Subject: [PATCH 10/10] Fixed importlib module references --- gather | 4 ++-- lambda/lambda_handler.py | 2 +- scan | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gather b/gather index 6468988c..6727b80e 100755 --- a/gather +++ b/gather @@ -55,14 +55,14 @@ def run(options=None, cache_dir="./cache", results_dir="./results"): try: gatherer_module = importlib.import_module( - "gatherers.%s" % source) + "domain_scan.gatherers.%s" % source) gatherer = gatherer_module.Gatherer(suffixes, options, extra) except ImportError: # If it's not a registered module, allow it to be "hot registered" # as long as the user gave us a flag with that name that can be # used as the --url option to the URL module. if options.get(source): - gatherer_module = importlib.import_module("gatherers.url") + gatherer_module = importlib.import_module("domain_scan.gatherers.url") extra['name'] = source gatherer = gatherer_module.Gatherer(suffixes, options, extra) else: diff --git a/lambda/lambda_handler.py b/lambda/lambda_handler.py index eefcc2a5..5982af23 100644 --- a/lambda/lambda_handler.py +++ b/lambda/lambda_handler.py @@ -19,7 +19,7 @@ def handler(event, context): # Might be acceptable to let this crash the module, in Lambda. try: - scanner = importlib.import_module("scanners.%s" % name) + scanner = importlib.import_module("domain_scan.scanners.%s" % name) except ImportError: exc_type, exc_value, exc_traceback = sys.exc_info() logging.error("[%s] Scanner not found, or had an error during loading.\n\tERROR: %s\n\t%s" % (name, exc_type, exc_value)) diff --git a/scan b/scan index 304faba9..da322d78 100755 --- a/scan +++ b/scan @@ -130,7 +130,7 @@ def run(options=None): for name in options.get("scan").split(","): try: - scanner = importlib.import_module("scanners.%s" % name) + scanner = importlib.import_module("domain_scan.scanners.%s" % name) except ImportError: exc_type, exc_value, exc_traceback = sys.exc_info() logging.error("[%s] Scanner not found, or had an error during loading.\n\tERROR: %s\n\t%s" % (name, exc_type, exc_value))