runtime: publish HOMELAB-SKLADCHIK-COOKIE-EXACT-LOGIC-419
This commit is contained in:
+28
-191
@@ -1,5 +1,5 @@
|
||||
CHAT_OUTPUT_BEGIN
|
||||
COMMAND_ID=HOMELAB-SKLADCHIK-COOKIE-CHECK-SOURCE-AUDIT-418
|
||||
COMMAND_ID=HOMELAB-SKLADCHIK-COOKIE-EXACT-LOGIC-419
|
||||
STATUS=OK
|
||||
RC=0
|
||||
HOST=pve01
|
||||
@@ -16,100 +16,16 @@ CHANGES_MADE=false
|
||||
SANITIZED=yes
|
||||
SECRETS_INCLUDED=no
|
||||
PRIVATE_ADDRESSES_INCLUDED=no
|
||||
RAW_EVIDENCE_SHA256=1c26f0b751c5e55421c706f56f4be25d92c17849df8a385fb66ce01144801022
|
||||
SANITIZED_OUTPUT_SHA256=8e5a54db35050a5c0010241fb0bad91fc5966530dbac76bb07426b09af51a6a1
|
||||
RAW_EVIDENCE_SHA256=63d14ea58a82bd34d78884b4db6d047e8fa64822200c7bc20a8587057f3f9e25
|
||||
SANITIZED_OUTPUT_SHA256=702451cb7bfbc7d831b17b7e062a00f5215e5dc3729bd8e3331dfe4c3dc28851
|
||||
OUTPUT_BEGIN
|
||||
DETAIL=SCRIPT_PATH=/usr/local/sbin/skladchik-reports-monitor-supervisor
|
||||
DETAIL=SCRIPT_SHA256=35c68ae0929ff3795be2bde40de334fc8e26413a3d8a620a137be90d1f2c164e
|
||||
DETAIL=SCRIPT_METADATA=BYTES:20463|MODE:755|OWNER:root:root|MTIME:2026-07-18 13:52:30.415780066 +0300
|
||||
DETAIL=RELEVANT_SOURCE_BEGIN
|
||||
DETAIL=SOURCE_LINE=0005:import os
|
||||
DETAIL=SOURCE_LINE=0006:import re
|
||||
DETAIL=SOURCE_LINE=0007:import shlex
|
||||
DETAIL=SOURCE_LINE=0008:import subprocess
|
||||
DETAIL=SOURCE_LINE=0009:import sys
|
||||
DETAIL=SOURCE_LINE=0010:from pathlib import Path
|
||||
DETAIL=SOURCE_LINE=0011:
|
||||
DETAIL=EXACT_COOKIE_LOGIC_BEGIN
|
||||
DETAIL=SOURCE_BLOCK=TOP_LEVEL_CONSTANT|LINES=12-12
|
||||
DETAIL=SOURCE_LINE=0012:EDGE = os.environ.get("SKLADCHIK_EDGE", "debian@[PRIVATE_IP]")
|
||||
DETAIL=SOURCE_LINE=0013:STATE_DIR = Path("/var/lib/skladchik-reports-monitor-supervisor")
|
||||
DETAIL=SOURCE_LINE=0014:LOG_DIR = Path("/var/log/skladchik-reports-monitor-supervisor")
|
||||
DETAIL=SOURCE_LINE=0015:HEALTH = STATE_DIR / "health.txt"
|
||||
DETAIL=SOURCE_LINE=0016:STATE = STATE_DIR / "state.env"
|
||||
DETAIL=SOURCE_LINE=0017:LOG = LOG_DIR / "supervisor.log"
|
||||
DETAIL=SOURCE_LINE=0018:
|
||||
DETAIL=SOURCE_LINE=0019:MONITOR_HEALTH_AGE_MAX = int(os.environ.get("SKLADCHIK_MONITOR_HEALTH_MAX_SECONDS", "600"))
|
||||
DETAIL=SOURCE_LINE=0020:BACKUP_HEALTH_AGE_MAX = int(os.environ.get("SKLADCHIK_BACKUP_HEALTH_MAX_SECONDS", "129600"))
|
||||
DETAIL=SOURCE_LINE=0021:RESTORE_HEALTH_AGE_MAX = int(os.environ.get("SKLADCHIK_RESTORE_HEALTH_MAX_SECONDS", "691200"))
|
||||
DETAIL=SOURCE_BLOCK=TOP_LEVEL_CONSTANT|LINES=22-22
|
||||
DETAIL=SOURCE_LINE=0022:COOKIE_EXPIRY_WARN_SECONDS = int(os.environ.get("SKLADCHIK_COOKIE_EXPIRY_WARN_SECONDS", "604800"))
|
||||
DETAIL=SOURCE_LINE=0023:
|
||||
DETAIL=SOURCE_LINE=0024:PVE_BACKUP_HEALTH = Path("/var/lib/skladchik-reports-monitor-backup/health.txt")
|
||||
DETAIL=SOURCE_LINE=0025:PVE_RESTORE_HEALTH = Path("/var/lib/skladchik-reports-monitor-backup/restore-check-health.txt")
|
||||
DETAIL=SOURCE_LINE=0026:
|
||||
DETAIL=SOURCE_LINE=0027:def now():
|
||||
DETAIL=SOURCE_LINE=0028: return _dt.datetime.now(_dt.UTC).replace(microsecond=0)
|
||||
DETAIL=SOURCE_LINE=0029:
|
||||
DETAIL=SOURCE_LINE=0030:def iso():
|
||||
DETAIL=SOURCE_LINE=0031: return now().isoformat().replace("+00:00", "Z")
|
||||
DETAIL=SOURCE_LINE=0032:
|
||||
DETAIL=SOURCE_LINE=0033:def log(msg):
|
||||
DETAIL=SOURCE_LINE=0034: LOG_DIR.mkdir(parents=True, exist_ok=True)
|
||||
DETAIL=SOURCE_LINE=0035: with LOG.open("a", encoding="utf-8") as f:
|
||||
DETAIL=SOURCE_LINE=0036: f.write(f"{iso()} {msg}\n")
|
||||
DETAIL=SOURCE_LINE=0037:
|
||||
DETAIL=SOURCE_LINE=0038:def run(cmd, timeout=45, input_text=None):
|
||||
DETAIL=SOURCE_LINE=0039: try:
|
||||
DETAIL=SOURCE_LINE=0040: p = subprocess.run(cmd, shell=True, text=True, input=input_text, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=timeout)
|
||||
DETAIL=SOURCE_LINE=0041: return p.returncode, p.stdout.strip()
|
||||
DETAIL=SOURCE_LINE=0042: except subprocess.TimeoutExpired as e:
|
||||
DETAIL=SOURCE_LINE=0043: out = e.stdout if isinstance(e.stdout, str) else ""
|
||||
DETAIL=SOURCE_LINE=0044: return 124, (out or "").strip() + "\nTIMEOUT"
|
||||
DETAIL=SOURCE_LINE=0045:
|
||||
DETAIL=SOURCE_LINE=0046:def parse_env_text(text):
|
||||
DETAIL=SOURCE_LINE=0047: d = {}
|
||||
DETAIL=SOURCE_LINE=0048: for line in (text or "").splitlines():
|
||||
DETAIL=SOURCE_LINE=0049: if not line or line.startswith("#") or "=" not in line:
|
||||
DETAIL=SOURCE_LINE=0050: continue
|
||||
DETAIL=SOURCE_LINE=0051: k, v = line.split("=", 1)
|
||||
DETAIL=SOURCE_LINE=...
|
||||
DETAIL=SOURCE_LINE=0066: dt = _dt.datetime.fromisoformat(s)
|
||||
DETAIL=SOURCE_LINE=0067: if dt.tzinfo is None:
|
||||
DETAIL=SOURCE_LINE=0068: dt = dt.replace(tzinfo=_dt.UTC)
|
||||
DETAIL=SOURCE_LINE=0069: return int((now() - dt.astimezone(_dt.UTC)).total_seconds())
|
||||
DETAIL=SOURCE_LINE=0070: except Exception:
|
||||
DETAIL=SOURCE_LINE=0071: return 999999999
|
||||
DETAIL=SOURCE_LINE=0072:
|
||||
DETAIL=SOURCE_LINE=0073:def ssh_edge(cmd, timeout=45):
|
||||
DETAIL=SOURCE_LINE=0074: q = "ssh -o BatchMode=yes -o ConnectTimeout=15 -o StrictHostKeyChecking=yes -o UserKnownHostsFile=[SENSITIVE_PATH] " + shlex.quote(EDGE) + " " + shlex.quote("sudo bash -lc " + shlex.quote(cmd))
|
||||
DETAIL=SOURCE_LINE=0075: return run(q, timeout=timeout)
|
||||
DETAIL=SOURCE_LINE=0076:
|
||||
DETAIL=SOURCE_LINE=0077:def edge_mail(subject, body):
|
||||
DETAIL=SOURCE_LINE=0078: subj_b64 = base64.b64encode(subject.encode("utf-8")).decode("ascii")
|
||||
DETAIL=SOURCE_LINE=0079: body_b64 = base64.b64encode(body.encode("utf-8")).decode("ascii")
|
||||
DETAIL=SOURCE_LINE=0080: py = (
|
||||
DETAIL=SOURCE_LINE=0081: "import base64,importlib.util;"
|
||||
DETAIL=SOURCE_LINE=0082: "spec=importlib.util.spec_from_file_location('m','/opt/skladchik-reports-monitor/monitor.py');"
|
||||
DETAIL=SOURCE_LINE=0083: "m=importlib.util.module_from_spec(spec); spec.loader.exec_module(m);"
|
||||
DETAIL=SOURCE_LINE=0084: "cfg,secrets=<REDACTED>
|
||||
DETAIL=SOURCE_LINE=0085: f"subject=base64.b64decode('{subj_b64}').decode('utf-8');"
|
||||
DETAIL=SOURCE_LINE=0086: f"body=base64.b64decode('{body_b64}').decode('utf-8');"
|
||||
DETAIL=SOURCE_LINE=0087: "ok=m.send_mail(cfg,secrets,subject,body);"
|
||||
DETAIL=SOURCE_LINE=0088: "print('MAIL_OK' if ok else 'MAIL_FALSE')"
|
||||
DETAIL=SOURCE_LINE=0089: )
|
||||
DETAIL=SOURCE_LINE=0090: rc, out = ssh_edge("python3 -c " + shlex.quote(py), timeout=60)
|
||||
DETAIL=SOURCE_LINE=0091: log(f"MAIL subject={subject!r} rc={rc} out={out!r}")
|
||||
DETAIL=SOURCE_LINE=0092: return rc == 0 and "MAIL_OK" in out
|
||||
DETAIL=SOURCE_LINE=0093:
|
||||
DETAIL=SOURCE_LINE=0094:def systemctl_props(units):
|
||||
DETAIL=SOURCE_LINE=0095: cmd = "systemctl is-enabled " + " ".join(map(shlex.quote, units)) + " 2>/dev/null || true; echo __ACTIVE__; systemctl is-active " + " ".join(map(shlex.quote, units)) + " 2>/dev/null || true"
|
||||
DETAIL=SOURCE_LINE=0096: rc, out = run(cmd, timeout=20)
|
||||
DETAIL=SOURCE_LINE=0097: parts = out.split("__ACTIVE__", 1)
|
||||
DETAIL=SOURCE_LINE=0098: enabled_lines = [x.strip() for x in parts[0].splitlines() if x.strip()]
|
||||
DETAIL=SOURCE_LINE=0099: active_lines = [x.strip() for x in parts[1].splitlines() if x.strip()] if len(parts) > 1 else []
|
||||
DETAIL=SOURCE_LINE=0100: res = {}
|
||||
DETAIL=SOURCE_LINE=0101: for i, u in enumerate(units):
|
||||
DETAIL=SOURCE_LINE=0102: res[u] = {"enabled": enabled_lines[i] if i < len(enabled_lines) else "unknown", "active": active_lines[i] if i < len(active_lines) else "unknown"}
|
||||
DETAIL=SOURCE_LINE=0103: return res
|
||||
DETAIL=SOURCE_LINE=0104:
|
||||
DETAIL=SOURCE_BLOCK=FUNCTION:gather|LINES=105-271
|
||||
DETAIL=SOURCE_LINE=0105:def gather():
|
||||
DETAIL=SOURCE_LINE=0106: facts = {}
|
||||
DETAIL=SOURCE_LINE=0107: problems = []
|
||||
@@ -277,7 +193,7 @@ DETAIL=SOURCE_LINE=0268: if p["enabled"] not in ("enabled", "disabled
|
||||
DETAIL=SOURCE_LINE=0269: problems.append(base + "_timer_unknown")
|
||||
DETAIL=SOURCE_LINE=0270:
|
||||
DETAIL=SOURCE_LINE=0271: return facts, problems
|
||||
DETAIL=SOURCE_LINE=0272:
|
||||
DETAIL=SOURCE_BLOCK=FUNCTION:render_body|LINES=273-321
|
||||
DETAIL=SOURCE_LINE=0273:def render_body(status, facts, problems, mode):
|
||||
DETAIL=SOURCE_LINE=0274: ru_status = "OK" if status == "OK" else "АВАРИЯ"
|
||||
DETAIL=SOURCE_LINE=0275: lines = [
|
||||
@@ -293,8 +209,8 @@ DETAIL=SOURCE_LINE=0284: f"- возраст health, сек: {facts.get('m
|
||||
DETAIL=SOURCE_LINE=0285: f"- автопродление авторизации: {facts.get('session_keepalive')}",
|
||||
DETAIL=SOURCE_LINE=0286: f"- cookie jar: {facts.get('cookie_jar')} / {facts.get('cookie_jar_bytes')} байт",
|
||||
DETAIL=SOURCE_LINE=0287: f"- постоянная cookie действует до UTC: {facts.get('cookie_expiry_utc') or 'не определено'}",
|
||||
DETAIL=SOURCE_LINE=0288: f"- осталось дней по cookie: <REDACTED>
|
||||
DETAIL=SOURCE_LINE=0289: f"- статус срока cookie: <REDACTED>
|
||||
DETAIL=SOURCE_LINE=0288: f"- осталось дней по cookie: {facts.get('cookie_expires_in_days') or 'не определено'}",
|
||||
DETAIL=SOURCE_LINE=0289: f"- статус срока cookie: {facts.get('cookie_expiry_status') or 'не определено'}",
|
||||
DETAIL=SOURCE_LINE=0290: f"- NetBird route: {facts.get('netbird_route')}",
|
||||
DETAIL=SOURCE_LINE=0291: "",
|
||||
DETAIL=SOURCE_LINE=0292: "Бэкап:",
|
||||
@@ -327,104 +243,25 @@ DETAIL=SOURCE_LINE=0318: "- supervisor теперь отдельно сл
|
||||
DETAIL=SOURCE_LINE=0319: "- если форум принудительно сбросит сессию, придёт отдельная тревога AUTH_REQUIRED; тогда нужно будет разово обновить вход, но это аварийный сценарий, а не ежемесячная рутина.",
|
||||
DETAIL=SOURCE_LINE=0320: ])
|
||||
DETAIL=SOURCE_LINE=0321: return "\n".join(lines)
|
||||
DETAIL=SOURCE_LINE=0322:
|
||||
DETAIL=SOURCE_LINE=0323:def write_health(status, facts, problems, mail_sent):
|
||||
DETAIL=SOURCE_LINE=0324: STATE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
DETAIL=SOURCE_LINE=0325: lines = [f"STATUS={status}", f"TS={iso()}", "problems=" + ",".join(problems), f"mail_sent={'yes' if mail_sent else 'no'}"]
|
||||
DETAIL=SOURCE_LINE=0326: for k in sorted(facts):
|
||||
DETAIL=SOURCE_LINE=0327: v = str(facts[k]).replace("\n", " ")[:500]
|
||||
DETAIL=SOURCE_LINE=0328: lines.append(f"{k}={v}")
|
||||
DETAIL=SOURCE_LINE=0329: HEALTH.write_text("\n".join(lines) + "\n", encoding="utf-8")
|
||||
DETAIL=SOURCE_LINE=0330:
|
||||
DETAIL=SOURCE_LINE=0331:def read_state():
|
||||
DETAIL=SOURCE_LINE=0332: return read_env_file(STATE)
|
||||
DETAIL=SOURCE_LINE=0333:
|
||||
DETAIL=SOURCE_LINE=0334:def write_state(status, problems):
|
||||
DETAIL=SOURCE_LINE=0335: STATE_DIR.mkdir(parents=True, exist_ok=True)
|
||||
DETAIL=SOURCE_LINE=0336: STATE.write_text(f"LAST_STATUS={status}\nLAST_PROBLEMS={','.join(problems)}\nTS={iso()}\n", encoding="utf-8")
|
||||
DETAIL=SOURCE_LINE=0337:
|
||||
DETAIL=SOURCE_LINE=0338:def main():
|
||||
DETAIL=SOURCE_LINE=0339: mode = sys.argv[1] if len(sys.argv) > 1 else "check"
|
||||
DETAIL=SOURCE_LINE=0340: if mode not in ("check", "test"):
|
||||
DETAIL=SOURCE_LINE=0341: print("usage: skladchik-reports-monitor-supervisor [check|test]", file=sys.stderr)
|
||||
DETAIL=SOURCE_LINE=0342: return 2
|
||||
DETAIL=SOURCE_LINE=0343:
|
||||
DETAIL=SOURCE_LINE=0344: facts, problems = gather()
|
||||
DETAIL=SOURCE_LINE=0345: status = "OK" if not problems else "FAIL"
|
||||
DETAIL=SOURCE_LINE=0346: old = read_state()
|
||||
DETAIL=SOURCE_LINE=0347: old_status = old.get("LAST_STATUS", "")
|
||||
DETAIL=SOURCE_LINE=0348: mail_sent = False
|
||||
DETAIL=SOURCE_LINE=0349:
|
||||
DETAIL=SOURCE_LINE=0350: if mode == "test":
|
||||
DETAIL=SOURCE_LINE=0351: mail_sent = edge_mail("Тест: надзор монитора жалоб и бэкапов", render_body(status, facts, problems, mode))
|
||||
DETAIL=SOURCE_LINE=0352: if not mail_sent:
|
||||
DETAIL=SOURCE_LINE=0353: problems.append("supervisor_mail_send_failed")
|
||||
DETAIL=SOURCE_LINE=0354: status = "FAIL"
|
||||
DETAIL=SOURCE_LINE=0355: elif status != "OK":
|
||||
DETAIL=SOURCE_LINE=0356: if old_status != "FAIL":
|
||||
DETAIL=SOURCE_LINE=0357: mail_sent = edge_mail("Авария: монитор жалоб или его бэкапы", render_body(status, facts, problems, mode))
|
||||
DETAIL=SOURCE_LINE=0358: if not mail_sent:
|
||||
DETAIL=SOURCE_LINE=0359: problems.append("supervisor_mail_send_failed")
|
||||
DETAIL=SOURCE_LINE=0360: status = "FAIL"
|
||||
DETAIL=SOURCE_LINE=0361: elif old_status == "FAIL":
|
||||
DETAIL=SOURCE_LINE=0362: mail_sent = edge_mail("Восстановлено: монитор жалоб и бэкапы снова OK", render_body(status, facts, problems, mode))
|
||||
DETAIL=SOURCE_LINE=0363:
|
||||
DETAIL=SOURCE_LINE=0364: write_health(status, facts, problems, mail_sent)
|
||||
DETAIL=SOURCE_LINE=0365: write_state(status, problems)
|
||||
DETAIL=SOURCE_LINE=0366:
|
||||
DETAIL=SOURCE_LINE=0367: print(f"SUPERVISOR_STATUS={status}")
|
||||
DETAIL=SOURCE_LINE=0368: print(f"SUPERVISOR_MAIL_SENT={'yes' if mail_sent else 'no'}")
|
||||
DETAIL=SOURCE_LINE=0369: print(f"SUPERVISOR_PROBLEMS={','.join(problems)}")
|
||||
DETAIL=SOURCE_LINE=0370: print(f"MONITOR={facts.get('monitor_status')} reports={facts.get('monitor_reports')} open={facts.get('monitor_open')} resolved={facts.get('monitor_resolved')}")
|
||||
DETAIL=SOURCE_LINE=0371: print(f"BACKUP={facts.get('backup_status')} run={facts.get('backup_run_id')}")
|
||||
DETAIL=SOURCE_LINE=0372: print(f"RESTORE={facts.get('restore_status')} run={facts.get('restore_run_id')}")
|
||||
DETAIL=SOURCE_LINE=0373: log(f"CHECK mode={mode} status={status} mail_sent={'yes' if mail_sent else 'no'} problems={problems}")
|
||||
DETAIL=SOURCE_LINE=0374: return 0 if status == "OK" else 1
|
||||
DETAIL=SOURCE_LINE=0375:
|
||||
DETAIL=SOURCE_LINE=0376:if __name__ == "__main__":
|
||||
DETAIL=SOURCE_LINE=0377: sys.exit(main())
|
||||
DETAIL=SCRIPT_TOTAL_LINES=377
|
||||
DETAIL=RELEVANT_SOURCE_END
|
||||
DETAIL=UNIT_CONTRACT_BEGIN
|
||||
DETAIL=UNIT_NAME=skladchik-reports-monitor-supervisor.service
|
||||
DETAIL=UNIT_LINE=# /etc/systemd/system/skladchik-reports-monitor-supervisor.service
|
||||
DETAIL=UNIT_LINE=[Unit]
|
||||
DETAIL=UNIT_LINE=Description=Skladchik reports monitor full supervisor
|
||||
DETAIL=UNIT_LINE=After=network-online.target
|
||||
DETAIL=UNIT_LINE=
|
||||
DETAIL=UNIT_LINE=[Service]
|
||||
DETAIL=UNIT_LINE=Type=oneshot
|
||||
DETAIL=UNIT_LINE=ExecStart=/usr/local/sbin/skladchik-reports-monitor-supervisor check
|
||||
DETAIL=UNIT_NAME=skladchik-reports-monitor-supervisor.timer
|
||||
DETAIL=UNIT_LINE=# /etc/systemd/system/skladchik-reports-monitor-supervisor.timer
|
||||
DETAIL=UNIT_LINE=[Unit]
|
||||
DETAIL=UNIT_LINE=Description=Run Skladchik reports monitor full supervisor every 10 minutes
|
||||
DETAIL=UNIT_LINE=
|
||||
DETAIL=UNIT_LINE=[Timer]
|
||||
DETAIL=UNIT_LINE=OnBootSec=5min
|
||||
DETAIL=UNIT_LINE=OnUnitActiveSec=10min
|
||||
DETAIL=UNIT_LINE=AccuracySec=30s
|
||||
DETAIL=UNIT_LINE=Persistent=false
|
||||
DETAIL=UNIT_LINE=Unit=skladchik-reports-monitor-supervisor.service
|
||||
DETAIL=UNIT_LINE=
|
||||
DETAIL=UNIT_LINE=[Install]
|
||||
DETAIL=UNIT_LINE=WantedBy=timers.target
|
||||
DETAIL=UNIT_CONTRACT_END
|
||||
DETAIL=TIMER_STATE_BEGIN
|
||||
DETAIL=TIMER_PROPERTY=Unit=skladchik-reports-monitor-supervisor.service
|
||||
DETAIL=TIMER_PROPERTY=NextElapseUSecRealtime=
|
||||
DETAIL=TIMER_PROPERTY=LastTriggerUSec=Fri 2026-07-24 11:58:38 MSK
|
||||
DETAIL=TIMER_PROPERTY=LoadState=loaded
|
||||
DETAIL=TIMER_PROPERTY=ActiveState=active
|
||||
DETAIL=TIMER_PROPERTY=SubState=waiting
|
||||
DETAIL=TIMER_ROW=Fri 2026-07-24 12:08:38 MSK 3min 34s Fri 2026-07-24 11:58:38 MSK 6min ago skladchik-reports-monitor-supervisor.timer skladchik-reports-monitor-supervisor.service
|
||||
DETAIL=TIMER_ROW=Sat 2026-07-25 04:39:05 MSK 16h Fri 2026-07-24 04:28:08 MSK 7h ago skladchik-reports-monitor-backup.timer skladchik-reports-monitor-backup.service
|
||||
DETAIL=TIMER_ROW=Sat 2026-07-25 10:15:00 MSK 22h Fri 2026-07-24 10:15:04 MSK 1h 49min ago skladchik-reports-monitor-monthly-selftest-watch.timer skladchik-reports-monitor-monthly-selftest-watch.service
|
||||
DETAIL=TIMER_ROW=Sun 2026-07-26 05:15:13 MSK 1 day 17h Sun 2026-07-19 05:11:25 MSK - skladchik-reports-monitor-backup-restore-check.timer skladchik-reports-monitor-backup-restore-check.service
|
||||
DETAIL=TIMER_STATE_END
|
||||
DETAIL=EXACT_COOKIE_LOGIC_END
|
||||
DETAIL=PVE01_TIMER_CORRELATION_BEGIN
|
||||
DETAIL=PVE01_TIMER=Fri 2026-07-24 12:08:38 MSK 1min 48s Fri 2026-07-24 11:58:38 MSK 8min ago skladchik-reports-monitor-supervisor.timer skladchik-reports-monitor-supervisor.service
|
||||
DETAIL=PVE01_TIMER=Sat 2026-07-25 04:39:05 MSK 16h Fri 2026-07-24 04:28:08 MSK 7h ago skladchik-reports-monitor-backup.timer skladchik-reports-monitor-backup.service
|
||||
DETAIL=PVE01_TIMER=Sat 2026-07-25 10:15:00 MSK 22h Fri 2026-07-24 10:15:04 MSK 1h 51min ago skladchik-reports-monitor-monthly-selftest-watch.timer skladchik-reports-monitor-monthly-selftest-watch.service
|
||||
DETAIL=PVE01_TIMER=Sun 2026-07-26 05:15:13 MSK 1 day 17h Sun 2026-07-19 05:11:25 MSK - skladchik-reports-monitor-backup-restore-check.timer skladchik-reports-monitor-backup-restore-check.service
|
||||
DETAIL=PVE01_TIMER_CORRELATION_END
|
||||
DETAIL=EDGE_TIMER_CORRELATION_BEGIN
|
||||
DETAIL=EDGE_TIMER=Fri 2026-07-24 12:06:51 MSK 1s Fri 2026-07-24 12:06:21 MSK 28s ago skladchik-reports-monitor.timer skladchik-reports-monitor.service
|
||||
DETAIL=EDGE_TIMER=Fri 2026-07-24 12:08:35 MSK 1min 45s Fri 2026-07-24 12:03:35 MSK 3min 14s ago skladchik-reports-monitor-watchdog.timer skladchik-reports-monitor-watchdog.service
|
||||
DETAIL=EDGE_TIMER=Sat 2026-07-25 09:16:28 MSK 21h Fri 2026-07-24 09:18:35 MSK 2h 48min ago skladchik-reports-monitor-heartbeat.timer skladchik-reports-monitor-heartbeat.service
|
||||
DETAIL=EDGE_TIMER=Sat 2026-07-25 09:45:00 MSK 21h Fri 2026-07-24 09:45:03 MSK 2h 21min ago skladchik-reports-monitor-age-alert.timer skladchik-reports-monitor-age-alert.service
|
||||
DETAIL=EDGE_TIMER=Mon 2026-07-27 09:35:00 MSK 2 days Mon 2026-07-20 09:35:06 MSK - skladchik-reports-monitor-weekly-summary.timer skladchik-reports-monitor-weekly-summary.service
|
||||
DETAIL=EDGE_TIMER=Sat 2026-08-01 09:25:00 MSK 1 week 0 days Fri 2026-07-10 10:28:28 MSK - skladchik-reports-monitor-event-selftest.timer skladchik-reports-monitor-event-selftest.service
|
||||
DETAIL=EDGE_TIMER_CORRELATION_END
|
||||
DETAIL=SECRET_VALUES_OUTPUT=NONE
|
||||
DETAIL=CHANGES_MADE=NO
|
||||
DETAIL=COOKIE_CHECK_SOURCE_AUDIT=PASS
|
||||
DETAIL=COOKIE_CONTENT_OUTPUT=NONE
|
||||
DETAIL=COOKIE_EXACT_LOGIC_AUDIT=PASS
|
||||
CHANGES_MADE=NO
|
||||
|
||||
OUTPUT_END
|
||||
CHAT_OUTPUT_END
|
||||
|
||||
Reference in New Issue
Block a user