예제 #1
0
    def test_check_job_status(self, mocked_requests_get,
                              mocked_requests_delete):
        creds = MockCredsAfterCheck()
        sim_get_content1 = {
            "results": {
                "session": "session_key",
                "userId": "1"
            }
        }
        sim_get_content2 = {"status": 5}
        sim_delete_content = {}

        # Test for job completed
        mocked_requests_get.side_effect = [
            self._generateResponse(sim_get_content1, 200),
            self._generateResponse(sim_get_content2, 200)
        ]
        mocked_requests_delete.return_value = self._generateResponse(
            sim_delete_content, 200)

        res = check_job_status(creds, 123)
        assert res is True

        # Test for job not completed
        sim_get_content2["status"] = 3
        mocked_requests_get.side_effect = [
            self._generateResponse(sim_get_content1, 200),
            self._generateResponse(sim_get_content2, 200)
        ]
        res = check_job_status(creds, 123)
        assert res is False

        # Test for job failed
        try:
            sim_get_content2["status"] = -1
            mocked_requests_get.side_effect = [
                self._generateResponse(sim_get_content1, 200),
                self._generateResponse(sim_get_content2, 200)
            ]
            res = check_job_status(creds, 123)
            assert res is False
        except ValueError:
            assert True
    def _mcafee_atd_analyze_url_function(self, event, *args, **kwargs):
        """Function: """
        report_file = None
        try:
            inputs = {}
            start_time = time.time()
            yield StatusMessage("Starting...")

            # Get the function parameters:
            incident_id = get_incident_id(**kwargs)
            artifact_id = kwargs.get("artifact_id")  # number
            url_to_analyze = kwargs.get("artifact_value")  # text
            atd_report_type = self.get_select_param(
                kwargs.get("mcafee_atd_report_type"))  # select
            atd_url_submit_type = self.get_select_param(
                kwargs.get("mcafee_atd_url_submit_type"))  # select

            log.info("incident_id: %s", incident_id)
            inputs["incident_id"] = incident_id
            if artifact_id is not None:
                log.info("artifact_id: %s", artifact_id)
                inputs["artifact_id"] = artifact_id
            if url_to_analyze is not None:
                yield StatusMessage("URL value: {}".format(url_to_analyze))
                log.info("artifact_value: $s", url_to_analyze)
                inputs["artifact_value"] = url_to_analyze
            if atd_report_type is not None:
                log.info("macfee_atd_report_type: %s", atd_report_type)
                inputs["macfee_atd_report_type"] = atd_report_type
            if atd_url_submit_type is not None:
                log.info("mcafee_atd_url_submit_type: %s", atd_url_submit_type)
                inputs["mcafee_atd_url_submit_type"] = atd_url_submit_type

            submit_type = None
            if atd_url_submit_type == "Analyze URL":
                submit_type = '1'
            elif atd_url_submit_type == "Download and analyze file from URL":
                submit_type = '3'
            else:
                yield FunctionError(
                    "atd_url_submit_type is not set correctly.")
            response = submit_url(self, url_to_analyze, submit_type)
            check_status_code(response)
            content = response.json()

            atd_job_id = content["subId"]
            files_wait = content["filesWait"]
            yield StatusMessage("File uploaded to ATD with jobId: {}".format(
                str(atd_job_id)))
            yield StatusMessage("Files waiting on: {}".format(files_wait))

            timeout_seconds = self.timeout_mins * 60
            start = time.time()
            try:
                while check_job_status(self, atd_job_id) is False:
                    yield StatusMessage(
                        "Analysis on {} is still running".format(
                            url_to_analyze))
                    check_timeout(start, self.polling_interval,
                                  timeout_seconds)

                task_id_list = get_task_id_list(self, atd_job_id)
                task_id = task_id_list[-1]
                try:
                    while check_task_status(self, task_id) is False:
                        check_timeout(start, self.polling_interval,
                                      timeout_seconds)
                except ValueError:
                    log.info(
                        "ATD analysis probably failed, please check ATD system."
                    )
                    raise FunctionError()

            except ValueError:
                yield StatusMessage(
                    "ATD analysis probably failed, please check ATD system.")
                raise FunctionError()

            yield StatusMessage("Analysis Completed")

            report_list = []
            for task_id in task_id_list:
                if atd_report_type == "pdf" or atd_report_type == "html":
                    yield StatusMessage(
                        "Obtaining {} report".format(atd_report_type))
                    report_file = create_report_file(url_to_analyze,
                                                     atd_report_type)

                report = get_atd_report(self, task_id, atd_report_type,
                                        report_file)
                # If report does not exist continue to the next task
                if not report:
                    continue

                report_list.append(report)

                if report_file is not None:
                    # Create Resilient Rest client
                    resilient_client = self.rest_client()
                    resilient_client.post_attachment(
                        "/incidents/{}/attachments/".format(incident_id),
                        report_file["report_file"],
                        filename=report_file["report_file_name"])
                    yield StatusMessage(
                        "Report added to incident {} as Attachment".format(
                            str(incident_id)))

            end_time = time.time()

            results = dict()
            results["Run Time"] = str(end_time - start_time)
            results["Inputs"] = inputs
            results["report_list"] = report_list

            yield StatusMessage("done...")
            # Produce a FunctionResult with the results
            yield FunctionResult(results)
        except Exception as e:
            log.info(e)
            yield FunctionError("Failed")
        finally:
            if report_file is not None:
                remove_dir(report_file["tmp_dir"])