예제 #1
0
    def save(self, *args, **kw):
        from alerts.tasks import cache_agents_alert_template
        from automation.tasks import generate_agent_checks_task

        # get old client if exists
        old_client = type(self).objects.get(pk=self.pk) if self.pk else None
        super(BaseAuditModel, self).save(*args, **kw)

        # check if polcies have changed and initiate task to reapply policies if so
        if old_client:
            if (
                (old_client.server_policy != self.server_policy)
                or (old_client.workstation_policy != self.workstation_policy)
                or (
                    old_client.block_policy_inheritance != self.block_policy_inheritance
                )
            ):

                generate_agent_checks_task.delay(
                    client=self.pk,
                    create_tasks=True,
                )

            if old_client.alert_template != self.alert_template:
                cache_agents_alert_template.delay()
예제 #2
0
    def save(self, *args, **kwargs):
        from alerts.tasks import cache_agents_alert_template
        from automation.tasks import generate_agent_checks_task

        if not self.pk and CoreSettings.objects.exists():
            raise ValidationError(
                "There can only be one CoreSettings instance")

        # for install script
        if not self.pk:
            try:
                self.mesh_site = settings.MESH_SITE
                self.mesh_username = settings.MESH_USERNAME
                self.mesh_token = settings.MESH_TOKEN_KEY
            except:
                pass

        old_settings = type(self).objects.get(pk=self.pk) if self.pk else None
        super(BaseAuditModel, self).save(*args, **kwargs)

        # check if server polcies have changed and initiate task to reapply policies if so
        if (old_settings and old_settings.server_policy != self.server_policy
            ) or (old_settings and
                  old_settings.workstation_policy != self.workstation_policy):
            generate_agent_checks_task.delay(all=True, create_tasks=True)

        if old_settings and old_settings.alert_template != self.alert_template:
            cache_agents_alert_template.delay()
예제 #3
0
    def delete(self, *args, **kwargs):
        from automation.tasks import generate_agent_checks_task

        agents = list(self.related_agents().only("pk").values_list("pk",
                                                                   flat=True))
        super(BaseAuditModel, self).delete(*args, **kwargs)

        generate_agent_checks_task.delay(agents, create_tasks=True)
예제 #4
0
    def post(self, request):
        if "policy" in request.data.keys():
            from automation.tasks import generate_agent_checks_task

            generate_agent_checks_task.delay(policy=request.data["policy"],
                                             create_tasks=True)
            return Response("ok")

        else:
            return notify_error("The request was invalid")
예제 #5
0
    def post(self, request):
        from automation.tasks import generate_agent_checks_task

        policy = None
        agent = None

        # Determine if adding check to Policy or Agent
        if "policy" in request.data:
            policy = get_object_or_404(Policy, id=request.data["policy"])
            # Object used for filter and save
            parent = {"policy": policy}
        else:
            agent = get_object_or_404(Agent, pk=request.data["pk"])
            parent = {"agent": agent}

        script = None
        if "script" in request.data["check"]:
            script = get_object_or_404(Script,
                                       pk=request.data["check"]["script"])

        # set event id to 0 if wildcard because it needs to be an integer field for db
        # will be ignored anyway by the agent when doing wildcard check
        if (request.data["check"]["check_type"] == "eventlog"
                and request.data["check"]["event_id_is_wildcard"]):
            request.data["check"]["event_id"] = 0

        serializer = CheckSerializer(data=request.data["check"],
                                     partial=True,
                                     context=parent)
        serializer.is_valid(raise_exception=True)
        new_check = serializer.save(**parent, script=script)

        # Generate policy Checks
        if policy:
            generate_agent_checks_task.delay(policy=policy.pk)
        elif agent:
            checks = agent.agentchecks.filter(  # type: ignore
                check_type=new_check.check_type,
                managed_by_policy=True)

            # Should only be one
            duplicate_check = [
                check for check in checks if check.is_duplicate(new_check)
            ]

            if duplicate_check:
                policy = Check.objects.get(
                    pk=duplicate_check[0].parent_check).policy
                if policy.enforced:
                    new_check.overriden_by_policy = True
                    new_check.save()
                else:
                    duplicate_check[0].delete()

        return Response(f"{new_check.readable_desc} was added!")
예제 #6
0
    def delete(self, request, pk, sitepk):
        from automation.tasks import generate_agent_checks_task

        client = get_object_or_404(Client, pk=pk)
        agents = Agent.objects.filter(site__client=client)

        if not sitepk:
            return notify_error(
                "There needs to be a site specified to move existing agents to"
            )

        site = get_object_or_404(Site, pk=sitepk)
        agents.update(site=site)

        generate_agent_checks_task.delay(all=True, create_tasks=True)

        client.delete()
        return Response(f"{client.name} was deleted!")
예제 #7
0
    def save(self, *args, **kwargs):
        from alerts.tasks import cache_agents_alert_template
        from automation.tasks import generate_agent_checks_task

        # get old policy if exists
        old_policy = type(self).objects.get(pk=self.pk) if self.pk else None
        super(BaseAuditModel, self).save(*args, **kwargs)

        # generate agent checks only if active and enforced were changed
        if old_policy:
            if old_policy.active != self.active or old_policy.enforced != self.enforced:
                generate_agent_checks_task.delay(
                    policy=self.pk,
                    create_tasks=True,
                )

            if old_policy.alert_template != self.alert_template:
                cache_agents_alert_template.delay()
예제 #8
0
    def delete(self, request, pk):
        from automation.tasks import generate_agent_checks_task

        check = get_object_or_404(Check, pk=pk)
        check.delete()

        # Policy check deleted
        if check.policy:
            Check.objects.filter(parent_check=check.pk).delete()

            # Re-evaluate agent checks is policy was enforced
            if check.policy.enforced:
                generate_agent_checks_task.delay(policy=check.policy)

        # Agent check deleted
        elif check.agent:
            check.agent.generate_checks_from_policies()

        return Response(f"{check.readable_desc} was deleted!")
예제 #9
0
    def delete(self, request, pk, sitepk):
        from automation.tasks import generate_agent_checks_task

        site = get_object_or_404(Site, pk=pk)
        if site.client.sites.count() == 1:
            return notify_error("A client must have at least 1 site.")

        agents = Agent.objects.filter(site=site)

        if not sitepk:
            return notify_error(
                "There needs to be a site specified to move the agents to")

        agent_site = get_object_or_404(Site, pk=sitepk)

        agents.update(site=agent_site)

        generate_agent_checks_task.delay(all=True, create_tasks=True)

        site.delete()
        return Response(f"{site.name} was deleted!")