feat(agent): log every shell command to Diagnostics

This commit is contained in:
Carsten 2026-04-22 22:22:31 +02:00
parent 1f0ab6dd1e
commit 5a9efdd482
2 changed files with 30 additions and 1 deletions

View file

@ -8,6 +8,14 @@ defmodule ProxmoxAgent.Shell do
@spec run(String.t(), [String.t()]) :: result
def run(command, args) do
start = System.monotonic_time(:microsecond)
result = do_run(command, args)
duration_us = System.monotonic_time(:microsecond) - start
ProxmoxAgent.Diagnostics.log_command(command, args, result, duration_us)
result
end
defp do_run(command, args) do
try do
case System.cmd(command, args, stderr_to_stdout: true) do
{output, 0} -> {:ok, output}

View file

@ -1,5 +1,5 @@
defmodule ProxmoxAgent.ShellTest do
use ExUnit.Case, async: true
use ExUnit.Case, async: false
alias ProxmoxAgent.Shell
@ -16,4 +16,25 @@ defmodule ProxmoxAgent.ShellTest do
test "run/2 returns {:error, {:enoent, _}} when binary is missing" do
assert {:error, {:enoent, _}} = Shell.run("/does/not/exist/nope", [])
end
test "run/2 logs to Diagnostics when dump_dir is set" do
dir = Path.join(System.tmp_dir!(), "shell-dump-#{System.unique_integer([:positive])}")
File.mkdir_p!(dir)
:ok = ProxmoxAgent.Diagnostics.configure(dir)
{:ok, writer} = ProxmoxAgent.Diagnostics.Writer.start_link(dir: dir)
on_exit(fn ->
if Process.alive?(writer), do: GenServer.stop(writer)
Application.delete_env(:agent, :dump_dir)
File.rm_rf(dir)
end)
assert {:ok, _} = Shell.run("/bin/echo", ["diagnostics-test"])
:ok = GenServer.call(ProxmoxAgent.Diagnostics.Writer, :flush)
body = File.read!(Path.join(dir, "commands.log"))
assert body =~ "$ /bin/echo diagnostics-test"
assert body =~ "exit=0"
assert body =~ "diagnostics-test"
end
end