migrate check/task result data to new table and create post update tasks to remove checks/tasks managed by policy

This commit is contained in:
sadnub
2022-04-01 19:28:09 -04:00
parent 4f5da33fd6
commit 83e63bc87c
13 changed files with 311 additions and 156 deletions

View File

@@ -1,92 +0,0 @@
# Generated by Django 3.2.12 on 2022-03-28 22:47
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agents', '0046_alter_agenthistory_command'),
('checks', '0025_auto_20210917_1954'),
('autotasks', '0029_alter_automatedtask_task_type'),
]
operations = [
migrations.RemoveField(
model_name='automatedtask',
name='execution_time',
),
migrations.RemoveField(
model_name='automatedtask',
name='last_run',
),
migrations.RemoveField(
model_name='automatedtask',
name='managed_by_policy',
),
migrations.RemoveField(
model_name='automatedtask',
name='parent_task',
),
migrations.RemoveField(
model_name='automatedtask',
name='retcode',
),
migrations.RemoveField(
model_name='automatedtask',
name='retvalue',
),
migrations.RemoveField(
model_name='automatedtask',
name='script',
),
migrations.RemoveField(
model_name='automatedtask',
name='script_args',
),
migrations.RemoveField(
model_name='automatedtask',
name='status',
),
migrations.RemoveField(
model_name='automatedtask',
name='stderr',
),
migrations.RemoveField(
model_name='automatedtask',
name='stdout',
),
migrations.RemoveField(
model_name='automatedtask',
name='sync_status',
),
migrations.RemoveField(
model_name='automatedtask',
name='timeout',
),
migrations.AlterField(
model_name='automatedtask',
name='assigned_check',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assignedtasks', to='checks.check'),
),
migrations.CreateModel(
name='TaskResult',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('retvalue', models.TextField(blank=True, null=True)),
('retcode', models.IntegerField(blank=True, null=True)),
('stdout', models.TextField(blank=True, null=True)),
('stderr', models.TextField(blank=True, null=True)),
('execution_time', models.CharField(default='0.0000', max_length=100)),
('last_run', models.DateTimeField(blank=True, null=True)),
('status', models.CharField(choices=[('passing', 'Passing'), ('failing', 'Failing'), ('pending', 'Pending')], default='pending', max_length=30)),
('sync_status', models.CharField(choices=[('synced', 'Synced With Agent'), ('notsynced', 'Waiting On Agent Checkin'), ('pendingdeletion', 'Pending Deletion on Agent'), ('initial', 'Initial Task Sync')], default='initial', max_length=100)),
('agent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='taskresults', to='agents.agent')),
('task', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='taskresults', to='autotasks.automatedtask')),
],
options={
'unique_together': {('agent', 'task')},
},
),
]

View File

@@ -0,0 +1,99 @@
# Generated by Django 3.2.12 on 2022-04-01 22:44
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("checks", "0025_auto_20210917_1954"),
("agents", "0046_alter_agenthistory_command"),
("autotasks", "0029_alter_automatedtask_task_type"),
]
operations = [
migrations.RemoveField(
model_name="automatedtask",
name="retvalue",
),
migrations.AlterField(
model_name="automatedtask",
name="assigned_check",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="assignedtasks",
to="checks.check",
),
),
migrations.AlterField(
model_name="automatedtask",
name="win_task_name",
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.CreateModel(
name="TaskResult",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("retcode", models.IntegerField(blank=True, null=True)),
("stdout", models.TextField(blank=True, null=True)),
("stderr", models.TextField(blank=True, null=True)),
("execution_time", models.CharField(default="0.0000", max_length=100)),
("last_run", models.DateTimeField(blank=True, null=True)),
(
"status",
models.CharField(
choices=[
("passing", "Passing"),
("failing", "Failing"),
("pending", "Pending"),
],
default="pending",
max_length=30,
),
),
(
"sync_status",
models.CharField(
choices=[
("synced", "Synced With Agent"),
("notsynced", "Waiting On Agent Checkin"),
("pendingdeletion", "Pending Deletion on Agent"),
("initial", "Initial Task Sync"),
],
default="initial",
max_length=100,
),
),
(
"agent",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="taskresults",
to="agents.agent",
),
),
(
"task",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="taskresults",
to="autotasks.automatedtask",
),
),
],
options={
"unique_together": {("agent", "task")},
},
),
]

View File

@@ -0,0 +1,31 @@
# Generated by Django 3.2.12 on 2022-04-01 22:49
from django.db import migrations
def migrate_task_results(apps, schema_editor):
AutomatedTask = apps.get_model("autotasks", "AutomatedTask")
TaskResult = apps.get_model("autotasks", "TaskResult")
for task in AutomatedTask.objects.exclude(agent=None):
TaskResult(
task=task,
agent=task.agent,
retcode=task.retcode,
stdout=task.stdout,
stderr=task.stderr,
execution_time=task.execution_time,
last_run=task.last_run,
status=task.status,
sync_status=task.sync_status,
).save()
class Migration(migrations.Migration):
dependencies = [
("autotasks", "0030_auto_20220401_2244"),
]
operations = [
migrations.RunPython(migrate_task_results),
]

View File

@@ -0,0 +1,45 @@
# Generated by Django 3.2.12 on 2022-04-01 23:01
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('autotasks', '0031_auto_20220401_2249'),
]
operations = [
migrations.RemoveField(
model_name='automatedtask',
name='execution_time',
),
migrations.RemoveField(
model_name='automatedtask',
name='last_run',
),
migrations.RemoveField(
model_name='automatedtask',
name='parent_task',
),
migrations.RemoveField(
model_name='automatedtask',
name='retcode',
),
migrations.RemoveField(
model_name='automatedtask',
name='status',
),
migrations.RemoveField(
model_name='automatedtask',
name='stderr',
),
migrations.RemoveField(
model_name='automatedtask',
name='stdout',
),
migrations.RemoveField(
model_name='automatedtask',
name='sync_status',
),
]

View File

@@ -6,6 +6,7 @@ from typing import TYPE_CHECKING, List, Dict, Optional, Union
from alerts.models import SEVERITY_CHOICES
from django.core.validators import MaxValueValidator, MinValueValidator
from django.contrib.postgres.fields import ArrayField
from django.utils import timezone as djangotime
from django.db import models
from django.db.models.fields import DateTimeField
@@ -105,7 +106,9 @@ class AutomatedTask(BaseAuditModel):
task_type = models.CharField(
max_length=100, choices=TASK_TYPE_CHOICES, default="manual"
)
win_task_name = models.CharField(max_length=255, unique=True, null=True, blank=True)
win_task_name = models.CharField(
max_length=255, null=True, blank=True
) # should be changed to unique=True
run_time_date = DateTimeField(null=True, blank=True)
expire_date = DateTimeField(null=True, blank=True)
@@ -139,6 +142,24 @@ class AutomatedTask(BaseAuditModel):
run_asap_after_missed = models.BooleanField(default=False) # added in agent v1.4.7
task_instance_policy = models.PositiveSmallIntegerField(blank=True, default=1)
# deprecated
managed_by_policy = models.BooleanField(default=False)
script = models.ForeignKey(
"scripts.Script",
null=True,
blank=True,
related_name="autoscript",
on_delete=models.SET_NULL,
)
script_args = ArrayField(
models.CharField(max_length=255, null=True, blank=True),
null=True,
blank=True,
default=list,
)
timeout = models.PositiveIntegerField(blank=True, default=120)
# non-database property
task_result: "Union[TaskResult, Dict]" = {}
def __str__(self):
@@ -533,7 +554,6 @@ class TaskResult(models.Model):
on_delete=models.CASCADE,
)
retvalue = models.TextField(null=True, blank=True)
retcode = models.IntegerField(null=True, blank=True)
stdout = models.TextField(null=True, blank=True)
stderr = models.TextField(null=True, blank=True)

View File

@@ -1,4 +1,4 @@
# Generated by Django 3.2.12 on 2022-03-28 22:47
# Generated by Django 3.2.12 on 2022-04-01 22:44
import django.contrib.postgres.fields
from django.db import migrations, models
@@ -18,58 +18,6 @@ class Migration(migrations.Migration):
old_name='overriden_by_policy',
new_name='overridden_by_policy',
),
migrations.RemoveField(
model_name='check',
name='execution_time',
),
migrations.RemoveField(
model_name='check',
name='extra_details',
),
migrations.RemoveField(
model_name='check',
name='fail_count',
),
migrations.RemoveField(
model_name='check',
name='history',
),
migrations.RemoveField(
model_name='check',
name='last_run',
),
migrations.RemoveField(
model_name='check',
name='managed_by_policy',
),
migrations.RemoveField(
model_name='check',
name='more_info',
),
migrations.RemoveField(
model_name='check',
name='outage_history',
),
migrations.RemoveField(
model_name='check',
name='parent_check',
),
migrations.RemoveField(
model_name='check',
name='retcode',
),
migrations.RemoveField(
model_name='check',
name='status',
),
migrations.RemoveField(
model_name='check',
name='stderr',
),
migrations.RemoveField(
model_name='check',
name='stdout',
),
migrations.AddField(
model_name='checkhistory',
name='agent_id',
@@ -91,8 +39,8 @@ class Migration(migrations.Migration):
('retcode', models.IntegerField(blank=True, null=True)),
('execution_time', models.CharField(blank=True, max_length=100, null=True)),
('history', django.contrib.postgres.fields.ArrayField(base_field=models.IntegerField(blank=True), blank=True, default=list, null=True, size=None)),
('agent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checkresults', to='agents.agent')),
('assigned_check', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checkresults', to='checks.check')),
('agent', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checkresults', to='agents.agent')),
('assigned_check', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checkresults', to='checks.check')),
],
options={
'unique_together': {('agent', 'assigned_check')},

View File

@@ -0,0 +1,35 @@
# Generated by Django 3.2.12 on 2022-04-01 22:48
from django.db import migrations
def migrate_check_results(apps, schema_editor):
Check = apps.get_model("checks", "Check")
CheckResult = apps.get_model("checks", "CheckResult")
for check in Check.objects.exclude(agent=None):
CheckResult(
assigned_check=check,
agent=check.agent,
status=check.status,
more_info=check.more_info,
last_run=check.last_run,
fail_count=check.fail_count,
outage_history=check.outage_history,
extra_detail=check.extra_details,
stdout=check.stdout,
stderr=check.stderr,
retcode=check.retcode,
execution_time=check.execution_time,
history=check.history,
).save()
class Migration(migrations.Migration):
dependencies = [
("checks", "0026_auto_20220401_2244"),
]
operations = [
migrations.RunPython(migrate_check_results),
]

View File

@@ -0,0 +1,61 @@
# Generated by Django 3.2.12 on 2022-04-01 23:01
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('checks', '0027_auto_20220401_2248'),
]
operations = [
migrations.RemoveField(
model_name='check',
name='execution_time',
),
migrations.RemoveField(
model_name='check',
name='extra_details',
),
migrations.RemoveField(
model_name='check',
name='fail_count',
),
migrations.RemoveField(
model_name='check',
name='history',
),
migrations.RemoveField(
model_name='check',
name='last_run',
),
migrations.RemoveField(
model_name='check',
name='more_info',
),
migrations.RemoveField(
model_name='check',
name='outage_history',
),
migrations.RemoveField(
model_name='check',
name='parent_check',
),
migrations.RemoveField(
model_name='check',
name='retcode',
),
migrations.RemoveField(
model_name='check',
name='status',
),
migrations.RemoveField(
model_name='check',
name='stderr',
),
migrations.RemoveField(
model_name='check',
name='stdout',
),
]

View File

@@ -164,6 +164,9 @@ class Check(BaseAuditModel):
null=True, blank=True, default=1
)
# deprecated
managed_by_policy = models.BooleanField(default=False)
check_result: "Union[CheckResult, Dict]" = {}
def __str__(self):
@@ -342,7 +345,7 @@ class CheckResult(models.Model):
status = models.CharField(
max_length=100, choices=CHECK_STATUS_CHOICES, default="pending"
)
# for memory and cpu checks where severity changes
# for memory, diskspace, script, and cpu checks where severity changes
alert_severity = models.CharField(
max_length=15,
choices=SEVERITY_CHOICES,

View File

@@ -4,6 +4,7 @@ import datetime as dt
from accounts.models import User
from agents.models import Agent
from autotasks.models import AutomatedTask
from checks.models import Check, CheckHistory
from django.core.management.base import BaseCommand
from django.utils.timezone import make_aware
from scripts.models import Script
@@ -70,6 +71,11 @@ class Command(BaseCommand):
except:
continue
# Remove policy checks and tasks on agents and check
AutomatedTask.objects.filter(managed_by_policy=True).delete()
Check.objects.filter(managed_by_policy=True).delete()
CheckHistory.objects.filter(agent_id=None).delete()
# set goarch for older windows agents
for agent in Agent.objects.defer(*AGENT_DEFER):
if not agent.goarch:

View File

@@ -395,7 +395,6 @@ SCHEDULE_CHOICES = (("daily", "Daily"), ("weekly", "Weekly"), ("monthly", "Month
)
timeout = models.PositiveIntegerField(default=120)
retcode = models.IntegerField(null=True, blank=True)
retvalue = models.TextField(null=True, blank=True)
stdout = models.TextField(null=True, blank=True)
stderr = models.TextField(null=True, blank=True)
execution_time = models.CharField(max_length=100, default="0.0000")

View File

@@ -9,7 +9,7 @@ if TYPE_CHECKING:
class PermissionQuerySet(models.QuerySet):
# filters queryset based on permissions. Works different for Agent, Client, and Site
def filter_by_role(self, user: User) -> models.QuerySet:
def filter_by_role(self, user: "User") -> "models.QuerySet":
role = user.role

View File

@@ -20,7 +20,7 @@ def _has_perm(request, perm: str) -> bool:
return request.user.role and getattr(request.user.role, perm)
def _has_perm_on_agent(user: User, agent_id: str) -> bool:
def _has_perm_on_agent(user: "User", agent_id: str) -> bool:
from agents.models import Agent
role = user.role
@@ -47,7 +47,7 @@ def _has_perm_on_agent(user: User, agent_id: str) -> bool:
return False
def _has_perm_on_client(user: User, client_id: int) -> bool:
def _has_perm_on_client(user: "User", client_id: int) -> bool:
from clients.models import Client
role = user.role
@@ -70,7 +70,7 @@ def _has_perm_on_client(user: User, client_id: int) -> bool:
return False
def _has_perm_on_site(user: User, site_id: int) -> bool:
def _has_perm_on_site(user: "User", site_id: int) -> bool:
from clients.models import Site
role = user.role
@@ -97,7 +97,7 @@ def _has_perm_on_site(user: User, site_id: int) -> bool:
return False
def _audit_log_filter(user: User) -> Q:
def _audit_log_filter(user: "User") -> Q:
role = user.role
if user.is_superuser or (role and getattr(role, "is_superuser")):
return Q()