The Server Log panel showed the last 200 lines of the unit's entire journal — mixing the current run with leftovers from prior starts. Resolve the unit's InactiveExitTimestamp inside the journalctl helper and pass it as journalctl --since so the panel begins at the latest unit start. Never-run units fall back to the legacy unit-only filter so -f attaches on first start. No Python changes; the helper's argv shape and sudoers grant stay identical. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
38 lines
1.7 KiB
Python
38 lines
1.7 KiB
Python
import subprocess
|
|
|
|
from conftest import LIBEXEC, env_with_fake_commands, fake_command
|
|
|
|
|
|
JOURNALCTL_HELPER = LIBEXEC / "left4me-journalctl"
|
|
|
|
|
|
def test_journalctl_helper_passes_shell_syntax_check_and_rejects_bad_args(tmp_path):
|
|
subprocess.run(["sh", "-n", str(JOURNALCTL_HELPER)], check=True)
|
|
marker = fake_command(tmp_path, "journalctl")
|
|
|
|
for args in [
|
|
["../evil", "--lines", "25", "--no-follow"],
|
|
["alpha", "--bad", "25", "--no-follow"],
|
|
["alpha", "--lines", "not-number", "--no-follow"],
|
|
["alpha", "--lines", "25", "--bad-follow"],
|
|
["bad/name", "--lines", "25", "--no-follow"],
|
|
]:
|
|
result = subprocess.run(
|
|
["sh", str(JOURNALCTL_HELPER), *args],
|
|
env=env_with_fake_commands(tmp_path),
|
|
check=False,
|
|
)
|
|
assert result.returncode != 0, f"helper accepted bad args: {args!r}"
|
|
assert not marker.exists(), f"helper invoked journalctl for: {args!r}"
|
|
|
|
script = JOURNALCTL_HELPER.read_text()
|
|
assert 'unit="left4me-server@${name}.service"' in script
|
|
# Anchors `--since` to the unit's most recent start so the panel shows
|
|
# the current run (and any post-restart lines until reload).
|
|
assert 'InactiveExitTimestamp' in script
|
|
assert 'LC_ALL=C' in script
|
|
assert 'exec "$journalctl" -u "$unit" --since "$start_time" -n "$lines" -o cat "$follow_arg"' in script
|
|
assert 'exec "$journalctl" -u "$unit" --since "$start_time" -n "$lines" -o cat' in script
|
|
# Never-started fallback keeps the legacy unit-only form.
|
|
assert 'exec "$journalctl" -u "$unit" -n "$lines" -o cat "$follow_arg"' in script
|
|
assert 'exec "$journalctl" -u "$unit" -n "$lines" -o cat' in script
|