fix(orchestrator): не полагаться на мангление имени транзиентного юнита

systemd-run пропускает голое имя через unit_name_mangle_with_suffix, который
сначала проверяет, не заканчивается ли оно уже известным типом юнита. Ключ
операции — санитизированный ISO-timestamp вида `...T12-34-56.789Z`, то есть
содержит точку, и корректность имени зависела бы от того, что `.789Z` случайно
не совпало ни с одним типом systemd.

Имя передаётся с явным суффиксом `.service`: systemd-run берёт его как есть и
создаёт рядом одноимённый `.timer`, на который и рассчитывают снятие guard и
status.
This commit is contained in:
2026-08-31 01:32:35 +05:00
parent 39139e95f7
commit 0230f1ca99
2 changed files with 19 additions and 1 deletions
+9 -1
View File
@@ -447,7 +447,15 @@ async function armRollbackGuard(opId: string): Promise<void> {
await writeText(scriptPath, buildAutoRollbackScript(opId), 0o700);
const unit = rollbackUnit(opId);
await runMutatingVisible`systemd-run --unit ${unit} --on-active=${FIREWALL_ROLLBACK_DEADLINE} /bin/sh ${scriptPath}`;
// Имя передаётся С суффиксом `.service`, а не голым.
//
// Голое имя systemd-run пропускает через unit_name_mangle_with_suffix, и тот
// сначала смотрит, не заканчивается ли оно уже известным типом юнита. Ключ
// операции — санитизированный ISO-timestamp вида `...T12-34-56.789Z`, то есть
// содержит точку, и корректность имени зависела бы от того, что `.789Z`
// случайно не совпало ни с одним типом. Явный суффикс убирает эту зависимость:
// systemd-run берёт имя как есть и создаёт рядом одноимённый `.timer`.
await runMutatingVisible`systemd-run --unit ${`${unit}.service`} --on-active=${FIREWALL_ROLLBACK_DEADLINE} /bin/sh ${scriptPath}`;
info(
`firewall rollback guard armed: ${unit} fires in ${FIREWALL_ROLLBACK_DEADLINE} unless the operation disarms it`
);