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:
@@ -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')},
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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")},
|
||||
},
|
||||
),
|
||||
]
|
||||
@@ -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),
|
||||
]
|
||||
@@ -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',
|
||||
),
|
||||
]
|
||||
@@ -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)
|
||||
|
||||
@@ -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')},
|
||||
35
api/tacticalrmm/checks/migrations/0027_auto_20220401_2248.py
Normal file
35
api/tacticalrmm/checks/migrations/0027_auto_20220401_2248.py
Normal 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),
|
||||
]
|
||||
61
api/tacticalrmm/checks/migrations/0028_auto_20220401_2301.py
Normal file
61
api/tacticalrmm/checks/migrations/0028_auto_20220401_2301.py
Normal 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',
|
||||
),
|
||||
]
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user