示例#1
0
def test_valid_directory():
    """
    Tests valid directory function.
    """
    config = UpdateConfig("tests", "localhost")
    assert valid_directory(config.drift_detection_directory)
    config.drift_detection_directory = "temp"
    assert not valid_directory(config.drift_detection_directory)
def run_drift_detection(config):
    try:
        if not valid_directory(config.query_directory):
            logger.error("Invalid Drift Detection Directory")
            return
        state_serializer = StateSchema()
        shortcut_serializer = ShortcutSchema()
        shortcut_data = FileSystem.load(os.path.join(config.query_directory, "shortcut.json"))
        shortcut = shortcut_serializer.load(shortcut_data)
        start_state_data = FileSystem.load(
            os.path.join(
                config.query_directory, shortcut.shortcuts.get(
                    config.start_state,
                    config.start_state,
                ),
            ),
        )
        start_state = state_serializer.load(start_state_data)
        end_state_data = FileSystem.load(
            os.path.join(
                config.query_directory, shortcut.shortcuts.get(
                    config.end_state,
                    config.end_state,
                ),
            ),
        )
        end_state = state_serializer.load(end_state_data)
        new_results, missing_results = perform_drift_detection(start_state, end_state)
        report_drift_new(new_results)
        report_drift_missing(missing_results)
    except ValidationError as err:
        msg = "Unable to create DriftStates from files {},{} for \n{} in directory {}.".format(
            config.start_state,
            config.end_state,
            err.messages,
            config.query_directory,
        )
        logger.exception(msg)
    except ValueError as err:
        msg = "Unable to create DriftStates from files {},{} for \n{} in directory {}.".format(
            config.start_state,
            config.end_state,
            err,
            config.query_directory,
        )
        logger.exception(msg)
示例#3
0
def run_add_shortcut(config):
    """
    Runs add_shortcut from the command line. Does error handling.

    :type config: Config Object
    :param config: Config of adding shortcut
    :return:
    """
    if not valid_directory(config.query_directory):
        logger.error("Invalid Drift Detection Directory")
        return
    try:
        add_shortcut(FileSystem, ShortcutSchema(), config.query_directory,
                     config.shortcut, config.filename)
    except ValidationError as err:
        msg = "Could not load shortcut file from json file {} in query directory {}.".format(
            err.messages,
            config.query_directory,
        )
        logger.exception(msg)
示例#4
0
def run_add_shortcut(config):
    """
    Runs add_shortcut from the command line. Does error handling.

    :type config: Config Object
    :param config: Config of adding shortcut
    :return:
    """
    if not valid_directory(config.query_directory):
        logger.error("Invalid Drift Detection Directory")
        return
    if not os.path.isfile(os.path.join(config.query_directory,
                                       config.filename)):
        msg = "File does not exist."
        logger.error(msg)
        return
    try:
        add_shortcut(FileSystem, ShortcutSchema(), config.query_directory,
                     config.shortcut, config.filename)
    except ValidationError as err:
        msg = "Could not load report_info file from {0}.".format(err.messages)
        logger.exception(msg)
示例#5
0
def run_get_states(config):
    """
    Handles neo4j errors and then updates detectors.

    :type config: Config Object
    :param config: Config Object from CLI
    :return:
    """
    if not valid_directory(config.drift_detection_directory):
        logger.error("Invalid Drift Detection Directory")
        return
    neo4j_auth = None
    if config.neo4j_user or config.neo4j_password:
        neo4j_auth = (config.neo4j_user, config.neo4j_password)
    try:
        neo4j_driver = GraphDatabase.driver(
            config.neo4j_uri,
            auth=neo4j_auth,
        )
    except neobolt.exceptions.ServiceUnavailable as e:
        logger.debug("Error occurred during Neo4j connect.", exc_info=True)
        logger.error(
            ("Unable to connect to Neo4j using the provided URI '%s', an error occurred: '%s'. Make sure the "
             "Neo4j server is running and accessible from your network."),
            config.neo4j_uri,
            e,
        )
        return
    except neobolt.exceptions.AuthError as e:
        logger.debug("Error occurred during Neo4j auth.", exc_info=True)
        if not neo4j_auth:
            logger.error(
                ("Unable to auth to Neo4j, an error occurred: '%s'. driftdetect attempted to connect to Neo4j "
                 "without any auth. Check your Neo4j server settings to see if auth is required and, if it is, "
                 "provide driftdetect with a valid username and password."),
                e,
            )
        else:
            logger.error(
                ("Unable to auth to Neo4j, an error occurred: '%s'. driftdetect attempted to connect to Neo4j "
                 "with a username and password. Check your Neo4j server settings to see if the username and "
                 "password provided to driftdetect are valid credentials."),
                e,
            )
        return

    with neo4j_driver.session() as session:
        filename = '.'.join([str(i) for i in time.gmtime()] + ["json"])
        state_serializer = StateSchema()
        shortcut_serializer = ShortcutSchema()
        for query_directory in FileSystem.walk(
                config.drift_detection_directory):
            try:
                get_query_state(session, query_directory, state_serializer,
                                FileSystem, filename)
                add_shortcut(FileSystem, shortcut_serializer, query_directory,
                             'most-recent', filename)
            except ValidationError as err:
                msg = "Unable to create State for directory {}, with data \n{}".format(
                    query_directory,
                    err.messages,
                )
                logger.exception(msg)
            except KeyError as err:
                msg = f"Could not find {err} field in state template for directory {query_directory}."
                logger.exception(msg)
            except FileNotFoundError as err:
                logger.exception(err)
            except neobolt.exceptions.CypherSyntaxError as err:
                logger.exception(err)