fix uninstall for older agents

This commit is contained in:
wh1te909
2020-11-26 06:20:01 +00:00
parent 7fb11da5df
commit 0605a3b725
6 changed files with 58 additions and 51 deletions

View File

@@ -229,42 +229,43 @@ def batch_sysinfo_task():
@app.task @app.task
def uninstall_agent_task(salt_id): def uninstall_agent_task(salt_id, has_nats):
attempts = 0 attempts = 0
error = False error = False
while 1: if not has_nats:
try: while 1:
try:
r = requests.post( r = requests.post(
f"http://{settings.SALT_HOST}:8123/run", f"http://{settings.SALT_HOST}:8123/run",
json=[ json=[
{ {
"client": "local", "client": "local",
"tgt": salt_id, "tgt": salt_id,
"fun": "win_agent.uninstall_agent", "fun": "win_agent.uninstall_agent",
"timeout": 8, "timeout": 8,
"username": settings.SALT_USERNAME, "username": settings.SALT_USERNAME,
"password": settings.SALT_PASSWORD, "password": settings.SALT_PASSWORD,
"eauth": "pam", "eauth": "pam",
} }
], ],
timeout=10, timeout=10,
) )
ret = r.json()["return"][0][salt_id] ret = r.json()["return"][0][salt_id]
except Exception: except Exception:
attempts += 1
else:
if ret != "ok":
attempts += 1 attempts += 1
else: else:
attempts = 0 if ret != "ok":
attempts += 1
else:
attempts = 0
if attempts >= 10: if attempts >= 10:
error = True error = True
break break
elif attempts == 0: elif attempts == 0:
break break
if error: if error:
logger.error(f"{salt_id} uninstall failed") logger.error(f"{salt_id} uninstall failed")

View File

@@ -123,7 +123,7 @@ class TestAgentViews(TacticalTestCase):
nats_cmd.assert_called_with({"func": "uninstall"}, wait=False) nats_cmd.assert_called_with({"func": "uninstall"}, wait=False)
reload_nats.assert_called_once() reload_nats.assert_called_once()
mock_task.assert_called_with(self.agent.salt_id) mock_task.assert_called_with(self.agent.salt_id, True)
self.check_not_authenticated("delete", url) self.check_not_authenticated("delete", url)

View File

@@ -61,32 +61,32 @@ def update_agents(request):
@api_view() @api_view()
def ping(request, pk): def ping(request, pk):
agent = get_object_or_404(Agent, pk=pk) agent = get_object_or_404(Agent, pk=pk)
if not agent.has_nats: status = "offline"
return notify_error("Requires agent version 1.1.0 or greater") if agent.has_nats:
r = asyncio.run(agent.nats_cmd({"func": "ping"}, timeout=10)) r = asyncio.run(agent.nats_cmd({"func": "ping"}, timeout=5))
if r == "pong":
status = "online"
else:
r = agent.salt_api_cmd(timeout=5, func="test.ping")
if isinstance(r, bool) and r:
status = "online"
if r == "timeout" or r == "natsdown": return Response({"name": agent.hostname, "status": status})
return Response({"name": agent.hostname, "status": "offline"})
elif r == "pong":
return Response({"name": agent.hostname, "status": "online"})
return Response({"name": agent.hostname, "status": "offline"})
@api_view(["DELETE"]) @api_view(["DELETE"])
def uninstall(request): def uninstall(request):
agent = get_object_or_404(Agent, pk=request.data["pk"]) agent = get_object_or_404(Agent, pk=request.data["pk"])
if not agent.has_nats: if agent.has_nats:
return notify_error("Requires agent version 1.1.0 or greater") asyncio.run(agent.nats_cmd({"func": "uninstall"}, wait=False))
asyncio.run(agent.nats_cmd({"func": "uninstall"}, wait=False))
salt_id = agent.salt_id salt_id = agent.salt_id
name = agent.hostname name = agent.hostname
has_nats = agent.has_nats
agent.delete() agent.delete()
reload_nats() reload_nats()
uninstall_agent_task.delay(salt_id) uninstall_agent_task.delay(salt_id, has_nats)
return Response(f"{name} will now be uninstalled.") return Response(f"{name} will now be uninstalled.")
@@ -550,7 +550,7 @@ def install_agent(request):
"&&", "&&",
"timeout", "timeout",
"/t", "/t",
"20", "10",
"/nobreak", "/nobreak",
">", ">",
"NUL", "NUL",

View File

@@ -133,7 +133,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
time.Sleep(20 * time.Second) time.Sleep(10 * time.Second)
fmt.Println("Installation starting.") fmt.Println("Installation starting.")
cmd := exec.Command(tacrmm, cmdArgs...) cmd := exec.Command(tacrmm, cmdArgs...)

View File

@@ -36,7 +36,7 @@ If (Get-Service $serviceName -ErrorAction SilentlyContinue) {
Invoke-WebRequest -Uri $downloadlink -OutFile $OutPath\$output Invoke-WebRequest -Uri $downloadlink -OutFile $OutPath\$output
Start-Process -FilePath $OutPath\$output -ArgumentList ('/VERYSILENT /SUPPRESSMSGBOXES') -Wait Start-Process -FilePath $OutPath\$output -ArgumentList ('/VERYSILENT /SUPPRESSMSGBOXES') -Wait
write-host ('Extracting...') write-host ('Extracting...')
Start-Sleep -s 20 Start-Sleep -s 10
Start-Process -FilePath "C:\Program Files\TacticalAgent\tacticalrmm.exe" -ArgumentList $installArgs -Wait Start-Process -FilePath "C:\Program Files\TacticalAgent\tacticalrmm.exe" -ArgumentList $installArgs -Wait
exit 0 exit 0
} }

View File

@@ -15,7 +15,7 @@ EXE_DIR = os.path.join(BASE_DIR, "tacticalrmm/private/exe")
AUTH_USER_MODEL = "accounts.User" AUTH_USER_MODEL = "accounts.User"
# latest release # latest release
TRMM_VERSION = "0.2.0" TRMM_VERSION = "0.2.1"
# bump this version everytime vue code is changed # bump this version everytime vue code is changed
# to alert user they need to manually refresh their browser # to alert user they need to manually refresh their browser
@@ -123,9 +123,15 @@ AUTH_PASSWORD_VALIDATORS = [
{ {
"NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
}, },
{"NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",}, {
{"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",}, "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",}, },
{
"NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
},
{
"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
},
] ]