Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e3a66f017e | ||
|
|
9e544ad471 | ||
|
|
5f19aa527a | ||
|
|
bfd5bc5c26 | ||
|
|
2d0ec3accd | ||
|
|
0999d98225 | ||
|
|
d8dd3e133f | ||
|
|
528470c37f | ||
|
|
c03cd53853 | ||
|
|
b57fc8a29c | ||
|
|
a04ed5c3ca | ||
|
|
3ad1df14f6 | ||
|
|
d8caf12fdc | ||
|
|
5ca9d30d5f | ||
|
|
a7a71b4a46 | ||
|
|
638603ac6b | ||
|
|
1d70c15027 | ||
|
|
7a5f03d672 | ||
|
|
653c482ff7 |
@@ -338,7 +338,7 @@ class TestAPIKeyViews(TacticalTestCase):
|
||||
resp = self.client.put(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
apikey = APIKey.objects.get(pk=apikey.pk)
|
||||
self.assertEquals(apikey.name, "New Name")
|
||||
self.assertEqual(apikey.name, "New Name")
|
||||
|
||||
self.check_not_authenticated("put", url)
|
||||
|
||||
|
||||
@@ -245,7 +245,10 @@ class TestAgentViews(TacticalTestCase):
|
||||
|
||||
def test_get_agent_versions(self):
|
||||
url = "/agents/versions/"
|
||||
r = self.client.get(url)
|
||||
|
||||
with self.assertNumQueries(1):
|
||||
r = self.client.get(url)
|
||||
|
||||
self.assertEqual(r.status_code, 200)
|
||||
assert any(i["hostname"] == self.agent.hostname for i in r.json()["agents"])
|
||||
|
||||
|
||||
@@ -136,10 +136,10 @@ class GetAgents(APIView):
|
||||
else:
|
||||
agents = (
|
||||
Agent.objects.filter_by_role(request.user) # type: ignore
|
||||
.select_related("site")
|
||||
.defer(*AGENT_DEFER)
|
||||
.select_related("site__client")
|
||||
.filter(monitoring_type_filter)
|
||||
.filter(client_site_filter)
|
||||
.only("agent_id", "hostname", "site")
|
||||
)
|
||||
serializer = AgentHostnameSerializer(agents, many=True)
|
||||
|
||||
@@ -297,9 +297,9 @@ class AgentMeshCentral(APIView):
|
||||
@permission_classes([IsAuthenticated, AgentPerms])
|
||||
def get_agent_versions(request):
|
||||
agents = (
|
||||
Agent.objects.filter_by_role(request.user) # type: ignore
|
||||
.prefetch_related("site")
|
||||
.only("pk", "hostname")
|
||||
Agent.objects.defer(*AGENT_DEFER)
|
||||
.filter_by_role(request.user) # type: ignore
|
||||
.select_related("site__client")
|
||||
)
|
||||
return Response(
|
||||
{
|
||||
|
||||
@@ -70,8 +70,8 @@ class TestAlertsViews(TacticalTestCase):
|
||||
data = {"top": 3}
|
||||
resp = self.client.patch(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEquals(resp.data["alerts"], AlertSerializer(alerts, many=True).data)
|
||||
self.assertEquals(resp.data["alerts_count"], 10)
|
||||
self.assertEqual(resp.data["alerts"], AlertSerializer(alerts, many=True).data)
|
||||
self.assertEqual(resp.data["alerts_count"], 10)
|
||||
|
||||
# test filter data
|
||||
# test data and result counts
|
||||
@@ -409,15 +409,15 @@ class TestAlertTasks(TacticalTestCase):
|
||||
core.server_policy = policy
|
||||
core.save()
|
||||
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[0].pk)
|
||||
|
||||
# assign second Alert Template to as default alert template
|
||||
core.alert_template = alert_templates[1]
|
||||
core.save()
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[1].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[1].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[1].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[1].pk)
|
||||
|
||||
# assign third Alert Template to client
|
||||
workstation.client.alert_template = alert_templates[2]
|
||||
@@ -425,8 +425,8 @@ class TestAlertTasks(TacticalTestCase):
|
||||
workstation.client.save()
|
||||
server.client.save()
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[2].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[2].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[2].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[2].pk)
|
||||
|
||||
# apply policy to client and should override
|
||||
workstation.client.workstation_policy = policy
|
||||
@@ -434,8 +434,8 @@ class TestAlertTasks(TacticalTestCase):
|
||||
workstation.client.save()
|
||||
server.client.save()
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[0].pk)
|
||||
|
||||
# assign fouth Alert Template to site
|
||||
workstation.site.alert_template = alert_templates[3]
|
||||
@@ -443,8 +443,8 @@ class TestAlertTasks(TacticalTestCase):
|
||||
workstation.site.save()
|
||||
server.site.save()
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[3].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[3].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[3].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[3].pk)
|
||||
|
||||
# apply policy to site
|
||||
workstation.site.workstation_policy = policy
|
||||
@@ -452,8 +452,8 @@ class TestAlertTasks(TacticalTestCase):
|
||||
workstation.site.save()
|
||||
server.site.save()
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[0].pk)
|
||||
|
||||
# apply policy to agents
|
||||
workstation.policy = policy
|
||||
@@ -461,35 +461,35 @@ class TestAlertTasks(TacticalTestCase):
|
||||
workstation.save()
|
||||
server.save()
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[0].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[0].pk)
|
||||
|
||||
# test disabling alert template
|
||||
alert_templates[0].is_active = False
|
||||
alert_templates[0].save()
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[3].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[3].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[3].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[3].pk)
|
||||
|
||||
# test policy exclusions
|
||||
alert_templates[3].excluded_agents.set([workstation.pk])
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[2].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[3].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[2].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[3].pk)
|
||||
|
||||
# test workstation exclusions
|
||||
alert_templates[2].exclude_workstations = True
|
||||
alert_templates[2].save()
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[1].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[3].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[1].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[3].pk)
|
||||
|
||||
# test server exclusions
|
||||
alert_templates[3].exclude_servers = True
|
||||
alert_templates[3].save()
|
||||
|
||||
self.assertEquals(workstation.set_alert_template().pk, alert_templates[1].pk)
|
||||
self.assertEquals(server.set_alert_template().pk, alert_templates[2].pk)
|
||||
self.assertEqual(workstation.set_alert_template().pk, alert_templates[1].pk)
|
||||
self.assertEqual(server.set_alert_template().pk, alert_templates[2].pk)
|
||||
|
||||
@patch("agents.tasks.sleep")
|
||||
@patch("core.models.CoreSettings.send_mail")
|
||||
@@ -523,7 +523,7 @@ class TestAlertTasks(TacticalTestCase):
|
||||
# call outages task and no alert should be created
|
||||
agent_outages_task()
|
||||
|
||||
self.assertEquals(Alert.objects.count(), 0)
|
||||
self.assertEqual(Alert.objects.count(), 0)
|
||||
|
||||
# set overdue_dashboard_alert and alert should be created
|
||||
agent_dashboard_alert.overdue_dashboard_alert = True
|
||||
@@ -574,22 +574,22 @@ class TestAlertTasks(TacticalTestCase):
|
||||
agent_outages_task()
|
||||
|
||||
# should have created 6 alerts
|
||||
self.assertEquals(Alert.objects.count(), 6)
|
||||
self.assertEqual(Alert.objects.count(), 6)
|
||||
|
||||
# other specific agents should have created alerts
|
||||
self.assertEquals(Alert.objects.filter(agent=agent_dashboard_alert).count(), 1)
|
||||
self.assertEquals(Alert.objects.filter(agent=agent_text_alert).count(), 1)
|
||||
self.assertEquals(Alert.objects.filter(agent=agent_email_alert).count(), 1)
|
||||
self.assertEquals(Alert.objects.filter(agent=agent_template_email).count(), 1)
|
||||
self.assertEquals(
|
||||
self.assertEqual(Alert.objects.filter(agent=agent_dashboard_alert).count(), 1)
|
||||
self.assertEqual(Alert.objects.filter(agent=agent_text_alert).count(), 1)
|
||||
self.assertEqual(Alert.objects.filter(agent=agent_email_alert).count(), 1)
|
||||
self.assertEqual(Alert.objects.filter(agent=agent_template_email).count(), 1)
|
||||
self.assertEqual(
|
||||
Alert.objects.filter(agent=agent_template_dashboard).count(), 1
|
||||
)
|
||||
self.assertEquals(Alert.objects.filter(agent=agent_template_text).count(), 1)
|
||||
self.assertEquals(Alert.objects.filter(agent=agent_template_blank).count(), 0)
|
||||
self.assertEqual(Alert.objects.filter(agent=agent_template_text).count(), 1)
|
||||
self.assertEqual(Alert.objects.filter(agent=agent_template_blank).count(), 0)
|
||||
|
||||
# check if email and text tasks were called
|
||||
self.assertEquals(outage_email.call_count, 2)
|
||||
self.assertEquals(outage_sms.call_count, 2)
|
||||
self.assertEqual(outage_email.call_count, 2)
|
||||
self.assertEqual(outage_sms.call_count, 2)
|
||||
|
||||
outage_sms.assert_any_call(
|
||||
pk=Alert.objects.get(agent=agent_text_alert).pk, alert_interval=None
|
||||
@@ -630,7 +630,7 @@ class TestAlertTasks(TacticalTestCase):
|
||||
|
||||
# calling agent outage task again shouldn't create duplicate alerts and won't send alerts
|
||||
agent_outages_task()
|
||||
self.assertEquals(Alert.objects.count(), 6)
|
||||
self.assertEqual(Alert.objects.count(), 6)
|
||||
|
||||
# test periodic notification
|
||||
# change email/text sent to sometime in the past
|
||||
@@ -942,7 +942,7 @@ class TestAlertTasks(TacticalTestCase):
|
||||
send_email.assert_not_called()
|
||||
send_sms.assert_not_called()
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
Alert.objects.filter(assigned_check=check_template_email).count(), 1
|
||||
)
|
||||
|
||||
@@ -1244,7 +1244,7 @@ class TestAlertTasks(TacticalTestCase):
|
||||
send_email.assert_not_called()
|
||||
send_sms.assert_not_called()
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
Alert.objects.filter(assigned_task=task_template_email).count(), 1
|
||||
)
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ class TestAPIv3(TacticalTestCase):
|
||||
r = self.client.get(url)
|
||||
self.assertEqual(r.status_code, 200)
|
||||
self.assertEqual(r.data["check_interval"], 20)
|
||||
self.assertEquals(len(r.data["checks"]), 2)
|
||||
self.assertEqual(len(r.data["checks"]), 2)
|
||||
|
||||
url = "/api/v3/Maj34ACb324j234asdj2n34kASDjh34-DESKTOPTEST123/checkrunner/"
|
||||
r = self.client.get(url)
|
||||
|
||||
@@ -182,7 +182,9 @@ class RunChecks(APIView):
|
||||
ret = {
|
||||
"agent": agent.pk,
|
||||
"check_interval": agent.check_interval,
|
||||
"checks": CheckRunnerGetSerializer(checks, many=True).data,
|
||||
"checks": CheckRunnerGetSerializer(
|
||||
checks, context={"agent": agent}, many=True
|
||||
).data,
|
||||
}
|
||||
return Response(ret)
|
||||
|
||||
@@ -216,7 +218,9 @@ class CheckRunner(APIView):
|
||||
ret = {
|
||||
"agent": agent.pk,
|
||||
"check_interval": agent.check_run_interval(),
|
||||
"checks": CheckRunnerGetSerializer(run_list, many=True).data,
|
||||
"checks": CheckRunnerGetSerializer(
|
||||
run_list, context={"agent": agent}, many=True
|
||||
).data,
|
||||
}
|
||||
return Response(ret)
|
||||
|
||||
@@ -266,9 +270,9 @@ class TaskRunner(APIView):
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
def get(self, request, pk, agentid):
|
||||
_ = get_object_or_404(Agent, agent_id=agentid)
|
||||
agent = get_object_or_404(Agent, agent_id=agentid)
|
||||
task = get_object_or_404(AutomatedTask, pk=pk)
|
||||
return Response(TaskGOGetSerializer(task).data)
|
||||
return Response(TaskGOGetSerializer(task, context={"agent": agent}).data)
|
||||
|
||||
def patch(self, request, pk, agentid):
|
||||
from alerts.models import Alert
|
||||
|
||||
@@ -410,11 +410,11 @@ class TestPolicyTasks(TacticalTestCase):
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEquals(len(resp.data["server_clients"]), 1)
|
||||
self.assertEquals(len(resp.data["server_sites"]), 0)
|
||||
self.assertEquals(len(resp.data["workstation_clients"]), 1)
|
||||
self.assertEquals(len(resp.data["workstation_sites"]), 0)
|
||||
self.assertEquals(len(resp.data["agents"]), 0)
|
||||
self.assertEqual(len(resp.data["server_clients"]), 1)
|
||||
self.assertEqual(len(resp.data["server_sites"]), 0)
|
||||
self.assertEqual(len(resp.data["workstation_clients"]), 1)
|
||||
self.assertEqual(len(resp.data["workstation_sites"]), 0)
|
||||
self.assertEqual(len(resp.data["agents"]), 0)
|
||||
|
||||
# Add Site to Policy
|
||||
policy.server_sites.add(server_agents[10].site)
|
||||
@@ -422,9 +422,9 @@ class TestPolicyTasks(TacticalTestCase):
|
||||
resp = self.client.get(
|
||||
f"/automation/policies/{policy.pk}/related/", format="json"
|
||||
)
|
||||
self.assertEquals(len(resp.data["server_sites"]), 1)
|
||||
self.assertEquals(len(resp.data["workstation_sites"]), 1)
|
||||
self.assertEquals(len(resp.data["agents"]), 0)
|
||||
self.assertEqual(len(resp.data["server_sites"]), 1)
|
||||
self.assertEqual(len(resp.data["workstation_sites"]), 1)
|
||||
self.assertEqual(len(resp.data["agents"]), 0)
|
||||
|
||||
# Add Agent to Policy
|
||||
policy.agents.add(server_agents[2])
|
||||
@@ -432,7 +432,7 @@ class TestPolicyTasks(TacticalTestCase):
|
||||
resp = self.client.get(
|
||||
f"/automation/policies/{policy.pk}/related/", format="json"
|
||||
)
|
||||
self.assertEquals(len(resp.data["agents"]), 2)
|
||||
self.assertEqual(len(resp.data["agents"]), 2)
|
||||
|
||||
def test_getting_agent_policy_checks(self):
|
||||
|
||||
@@ -442,7 +442,7 @@ class TestPolicyTasks(TacticalTestCase):
|
||||
agent = baker.make_recipe("agents.agent", policy=policy)
|
||||
|
||||
# test policy assigned to agent
|
||||
self.assertEquals(len(agent.get_checks_from_policies()), 7)
|
||||
self.assertEqual(len(agent.get_checks_from_policies()), 7)
|
||||
|
||||
def test_getting_agent_policy_checks_with_enforced(self):
|
||||
# setup data
|
||||
|
||||
@@ -28,7 +28,9 @@ class GetAddPolicies(APIView):
|
||||
permission_classes = [IsAuthenticated, AutomationPolicyPerms]
|
||||
|
||||
def get(self, request):
|
||||
policies = Policy.objects.all()
|
||||
policies = Policy.objects.select_related("alert_template").prefetch_related(
|
||||
"excluded_agents", "excluded_sites", "excluded_clients"
|
||||
)
|
||||
|
||||
return Response(
|
||||
PolicyTableSerializer(
|
||||
|
||||
@@ -198,13 +198,14 @@ class TaskGOGetSerializer(serializers.ModelSerializer):
|
||||
def get_task_actions(self, obj):
|
||||
tmp = []
|
||||
actions_to_remove = []
|
||||
agent = self.context["agent"] if "agent" in self.context.keys() else obj.agent
|
||||
for action in obj.actions:
|
||||
if action["type"] == "cmd":
|
||||
tmp.append(
|
||||
{
|
||||
"type": "cmd",
|
||||
"command": Script.parse_script_args(
|
||||
agent=obj.agent,
|
||||
agent=agent,
|
||||
shell=action["shell"],
|
||||
args=[action["command"]],
|
||||
)[0],
|
||||
@@ -225,7 +226,7 @@ class TaskGOGetSerializer(serializers.ModelSerializer):
|
||||
"script_name": script.name,
|
||||
"code": script.code,
|
||||
"script_args": Script.parse_script_args(
|
||||
agent=obj.agent,
|
||||
agent=agent,
|
||||
shell=script.shell,
|
||||
args=action["script_args"],
|
||||
),
|
||||
|
||||
@@ -159,8 +159,9 @@ class CheckRunnerGetSerializer(serializers.ModelSerializer):
|
||||
if obj.check_type != "script":
|
||||
return []
|
||||
|
||||
agent = self.context["agent"] if "agent" in self.context.keys() else obj.agent
|
||||
return Script.parse_script_args(
|
||||
agent=obj.agent, shell=obj.script.shell, args=obj.script_args
|
||||
agent=agent, shell=obj.script.shell, args=obj.script_args
|
||||
)
|
||||
|
||||
class Meta:
|
||||
|
||||
@@ -842,8 +842,8 @@ class TestCheckTasks(TacticalTestCase):
|
||||
|
||||
check_result = CheckResult.objects.get(assigned_check=check, agent=self.agent)
|
||||
|
||||
self.assertEquals(check.alert_severity, "warning")
|
||||
self.assertEquals(check_result.status, "failing")
|
||||
self.assertEqual(check.alert_severity, "warning")
|
||||
self.assertEqual(check_result.status, "failing")
|
||||
|
||||
# test passing when contains
|
||||
resp = self.client.patch(url, no_logs_data, format="json")
|
||||
@@ -851,7 +851,7 @@ class TestCheckTasks(TacticalTestCase):
|
||||
|
||||
check_result = CheckResult.objects.get(assigned_check=check, agent=self.agent)
|
||||
|
||||
self.assertEquals(check_result.status, "passing")
|
||||
self.assertEqual(check_result.status, "passing")
|
||||
|
||||
# test failing when not contains and message and source
|
||||
check.fail_when = "not_contains"
|
||||
@@ -863,8 +863,8 @@ class TestCheckTasks(TacticalTestCase):
|
||||
|
||||
check_result = CheckResult.objects.get(assigned_check=check, agent=self.agent)
|
||||
|
||||
self.assertEquals(check_result.status, "failing")
|
||||
self.assertEquals(check.alert_severity, "error")
|
||||
self.assertEqual(check_result.status, "failing")
|
||||
self.assertEqual(check.alert_severity, "error")
|
||||
|
||||
# test passing when contains with source and message
|
||||
resp = self.client.patch(url, data, format="json")
|
||||
@@ -872,7 +872,7 @@ class TestCheckTasks(TacticalTestCase):
|
||||
|
||||
check_result = CheckResult.objects.get(assigned_check=check, agent=self.agent)
|
||||
|
||||
self.assertEquals(check_result.status, "passing")
|
||||
self.assertEqual(check_result.status, "passing")
|
||||
|
||||
|
||||
class TestCheckPermissions(TacticalTestCase):
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
from unittest.mock import patch
|
||||
|
||||
import requests
|
||||
from django.conf import settings
|
||||
from channels.db import database_sync_to_async
|
||||
from channels.testing import WebsocketCommunicator
|
||||
from model_bakery import baker
|
||||
@@ -11,7 +12,9 @@ from core.utils import get_core_settings
|
||||
from .consumers import DashInfo
|
||||
from .models import CustomField, GlobalKVStore, URLAction
|
||||
from .serializers import CustomFieldSerializer, KeyStoreSerializer, URLActionSerializer
|
||||
from .tasks import core_maintenance_tasks
|
||||
from .tasks import core_maintenance_tasks, handle_resolved_stuff
|
||||
from logs.models import PendingAction
|
||||
from agents.models import Agent
|
||||
|
||||
|
||||
class TestCodeSign(TacticalTestCase):
|
||||
@@ -393,6 +396,29 @@ class TestCoreTasks(TacticalTestCase):
|
||||
|
||||
self.check_not_authenticated("get", url)
|
||||
|
||||
def test_resolved_pending_agentupdate_task(self):
|
||||
online = baker.make_recipe("agents.online_agent", version="2.0.0", _quantity=20)
|
||||
offline = baker.make_recipe(
|
||||
"agents.offline_agent", version="2.0.0", _quantity=20
|
||||
)
|
||||
agents = online + offline
|
||||
for agent in agents:
|
||||
baker.make_recipe("logs.pending_agentupdate_action", agent=agent)
|
||||
|
||||
Agent.objects.update(version=settings.LATEST_AGENT_VER)
|
||||
|
||||
handle_resolved_stuff()
|
||||
|
||||
complete = PendingAction.objects.filter(
|
||||
action_type="agentupdate", status="completed"
|
||||
).count()
|
||||
old = PendingAction.objects.filter(
|
||||
action_type="agentupdate", status="pending"
|
||||
).count()
|
||||
|
||||
self.assertEqual(complete, 20)
|
||||
self.assertEqual(old, 20)
|
||||
|
||||
|
||||
class TestCorePermissions(TacticalTestCase):
|
||||
def setUp(self):
|
||||
|
||||
@@ -26,3 +26,7 @@ object_logs = Recipe(
|
||||
)
|
||||
|
||||
login_logs = Recipe("logs.AuditLog", action=cycle(login_actions), object_type="user")
|
||||
|
||||
pending_agentupdate_action = Recipe(
|
||||
"logs.PendingAction", action_type="agentupdate", status="pending"
|
||||
)
|
||||
|
||||
@@ -96,9 +96,14 @@ class PendingActions(APIView):
|
||||
def get(self, request, agent_id=None):
|
||||
if agent_id:
|
||||
agent = get_object_or_404(
|
||||
Agent.objects.defer(*AGENT_DEFER), agent_id=agent_id
|
||||
Agent.objects.defer(*AGENT_DEFER).prefetch_related("pendingactions"),
|
||||
agent_id=agent_id,
|
||||
)
|
||||
actions = (
|
||||
PendingAction.objects.filter(agent=agent)
|
||||
.select_related("agent__site", "agent__site__client")
|
||||
.defer("agent__services", "agent__wmi_detail")
|
||||
)
|
||||
actions = PendingAction.objects.filter(agent=agent)
|
||||
else:
|
||||
actions = (
|
||||
PendingAction.objects.filter_by_role(request.user) # type: ignore
|
||||
|
||||
@@ -80,7 +80,7 @@ class TestScriptViews(TacticalTestCase):
|
||||
resp = self.client.put(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
script = Script.objects.get(pk=script.pk)
|
||||
self.assertEquals(script.description, "Description Change")
|
||||
self.assertEqual(script.description, "Description Change")
|
||||
|
||||
# correct_hash = hmac.new(
|
||||
# settings.SECRET_KEY.encode(), data["script_body"].encode(), hashlib.sha256
|
||||
@@ -467,7 +467,7 @@ class TestScriptSnippetViews(TacticalTestCase):
|
||||
resp = self.client.put(url, data, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
snippet = ScriptSnippet.objects.get(pk=snippet.pk)
|
||||
self.assertEquals(snippet.name, "New Name")
|
||||
self.assertEqual(snippet.name, "New Name")
|
||||
|
||||
self.check_not_authenticated("put", url)
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ class TestServiceViews(TacticalTestCase):
|
||||
resp = self.client.get(url, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
nats_cmd.assert_called_with(data={"func": "winservices"}, timeout=10)
|
||||
self.assertEquals(Agent.objects.get(pk=agent.pk).services, nats_return)
|
||||
self.assertEqual(Agent.objects.get(pk=agent.pk).services, nats_return)
|
||||
|
||||
self.check_not_authenticated("get", url)
|
||||
|
||||
@@ -141,7 +141,7 @@ class TestServiceViews(TacticalTestCase):
|
||||
nats_cmd.assert_called_with(
|
||||
{"func": "winsvcdetail", "payload": {"name": "alg"}}, timeout=10
|
||||
)
|
||||
self.assertEquals(resp.data, nats_return)
|
||||
self.assertEqual(resp.data, nats_return)
|
||||
|
||||
self.check_not_authenticated("get", url)
|
||||
|
||||
|
||||
@@ -42,7 +42,7 @@ class TestSoftwareViews(TacticalTestCase):
|
||||
# test without agent software
|
||||
resp = self.client.get(url, format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEquals(resp.data, [])
|
||||
self.assertEqual(resp.data, [])
|
||||
|
||||
# make some software
|
||||
software = baker.make(
|
||||
@@ -60,7 +60,7 @@ class TestSoftwareViews(TacticalTestCase):
|
||||
serializer = InstalledSoftwareSerializer([software], many=True)
|
||||
resp = self.client.get(f"{base_url}/", format="json")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEquals(resp.data, serializer.data)
|
||||
self.assertEqual(resp.data, serializer.data)
|
||||
|
||||
self.check_not_authenticated("get", url)
|
||||
|
||||
|
||||
@@ -17,11 +17,11 @@ LINUX_AGENT_SCRIPT = BASE_DIR / "core" / "agent_linux.sh"
|
||||
AUTH_USER_MODEL = "accounts.User"
|
||||
|
||||
# latest release
|
||||
TRMM_VERSION = "0.13.1"
|
||||
TRMM_VERSION = "0.13.3"
|
||||
|
||||
# bump this version everytime vue code is changed
|
||||
# to alert user they need to manually refresh their browser
|
||||
APP_VER = "0.0.162"
|
||||
APP_VER = "0.0.163"
|
||||
|
||||
# https://github.com/amidaware/rmmagent
|
||||
LATEST_AGENT_VER = "2.0.3"
|
||||
@@ -95,23 +95,6 @@ if not DEBUG:
|
||||
{"DEFAULT_RENDERER_CLASSES": ("rest_framework.renderers.JSONRenderer",)}
|
||||
)
|
||||
|
||||
MIDDLEWARE = [
|
||||
"django.middleware.security.SecurityMiddleware",
|
||||
"django.contrib.sessions.middleware.SessionMiddleware",
|
||||
"corsheaders.middleware.CorsMiddleware", ##
|
||||
"tacticalrmm.middleware.LogIPMiddleware",
|
||||
"django.middleware.common.CommonMiddleware",
|
||||
"django.middleware.csrf.CsrfViewMiddleware",
|
||||
"django.contrib.auth.middleware.AuthenticationMiddleware",
|
||||
"tacticalrmm.middleware.AuditMiddleware",
|
||||
"tacticalrmm.middleware.LinuxMiddleware",
|
||||
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
||||
]
|
||||
|
||||
if DEMO:
|
||||
MIDDLEWARE += ("tacticalrmm.middleware.DemoMiddleware",)
|
||||
|
||||
|
||||
INSTALLED_APPS = [
|
||||
"django.contrib.auth",
|
||||
"django.contrib.contenttypes",
|
||||
@@ -256,11 +239,9 @@ LOGGING = {
|
||||
},
|
||||
}
|
||||
|
||||
if "AZPIPELINE" in os.environ:
|
||||
ADMIN_ENABLED = False
|
||||
|
||||
if "GHACTIONS" in os.environ:
|
||||
print("-----------------------PIPELINE----------------------------")
|
||||
print("-----------------------GHACTIONS----------------------------")
|
||||
DATABASES = {
|
||||
"default": {
|
||||
"ENGINE": "django.db.backends.postgresql",
|
||||
|
||||
@@ -74,13 +74,6 @@ EOF
|
||||
)"
|
||||
|
||||
echo "${mesh_config}" > /home/node/app/meshcentral-data/config.json
|
||||
|
||||
else
|
||||
# replace persistent mesh configuration with new ports
|
||||
sed -i 's/"Port": 443/"Port": 4443/' /home/node/app/meshcentral-data/config.json
|
||||
sed -i 's/"RedirPort": 80/"RedirPort": 8080/' /home/node/app/meshcentral-data/config.json
|
||||
sed -i "s/\"CertUrl\": \".*\"/\"CertUrl\": \"https:\/\/${NGINX_HOST_IP}:${NGINX_HOST_PORT}\"/" /home/node/app/meshcentral-data/config.json
|
||||
|
||||
fi
|
||||
|
||||
node node_modules/meshcentral --createaccount ${MESH_USER} --pass ${MESH_PASS} --email example@example.com
|
||||
|
||||
@@ -328,7 +328,12 @@ else
|
||||
echo -ne ${RED} SSL Certificate has expired or doesnt exist for $domain | tee -a checklog.log
|
||||
printf >&2 "\n\n"
|
||||
fi
|
||||
echo -ne ${YELLOW} Getting summary output of logs | tee -a checklog.log
|
||||
|
||||
tail /rmm/api/tacticalrmm/tacticalrmm/private/log/django_debug.log | tee -a checklog.log
|
||||
printf >&2 "\n\n"
|
||||
tail /rmm/api/tacticalrmm/tacticalrmm/private/log/error.log | tee -a checklog.log
|
||||
printf >&2 "\n\n"
|
||||
|
||||
printf >&2 "\n\n"
|
||||
echo -ne ${YELLOW}
|
||||
|
||||
@@ -23,7 +23,7 @@ export default function () {
|
||||
showCommunityScripts: false,
|
||||
agentDblClickAction: "",
|
||||
agentUrlAction: null,
|
||||
defaultAgentTblTab: "server",
|
||||
defaultAgentTblTab: null,
|
||||
clientTreeSort: "alphafail",
|
||||
clientTreeSplitter: 20,
|
||||
noCodeSign: false,
|
||||
|
||||
@@ -490,10 +490,12 @@ export default {
|
||||
selectedTree(newVal, oldVal) {
|
||||
if (this.clearSearchWhenSwitching) this.clearFilter();
|
||||
},
|
||||
tab(newVal, oldVal) {
|
||||
this.$store.dispatch("loadAgents");
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
getTree() {
|
||||
this.$store.dispatch("loadAgents");
|
||||
this.$store.dispatch("loadTree");
|
||||
},
|
||||
clearTreeSelected() {
|
||||
@@ -707,7 +709,6 @@ export default {
|
||||
},
|
||||
set(newVal) {
|
||||
this.$store.commit("SET_DEFAULT_AGENT_TBL_TAB", newVal);
|
||||
this.$store.dispatch("loadAgents");
|
||||
this.$store.commit("destroySubTable");
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user