From 6e3da7adc81b9c166137cb0c44e28cbf6c5574cf Mon Sep 17 00:00:00 2001 From: homelab-runtime-publisher Date: Wed, 23 Sep 2026 12:48:47 +0000 Subject: [PATCH] runtime: publish SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1 --- ...SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.json | 38 ++ ...-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.txt | 589 ++++++++++++++++++ runtime/latest.json | 16 +- runtime/latest.txt | 580 ++++++++++++++++- 4 files changed, 1197 insertions(+), 26 deletions(-) create mode 100644 runtime/history/SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.json create mode 100644 runtime/history/SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.txt diff --git a/runtime/history/SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.json b/runtime/history/SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.json new file mode 100644 index 00000000..7e546805 --- /dev/null +++ b/runtime/history/SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.json @@ -0,0 +1,38 @@ +{ + "schema_version": 1, + "channel": "homelab-runtime", + "command_id": "SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1", + "status": "OK", + "rc": 0, + "host": "pve01", + "mode": "read-only", + "component": "skladchik-monitor-rc1-exact-rca", + "started_at_utc": "2026-09-23T12:48:44Z", + "finished_at_utc": "2026-09-23T12:48:46Z", + "reference_register_checked": true, + "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", + "error_register_checked": true, + "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", + "command_sha256": "f1244eee27a42e001f70047b3e75208f6e6e7537446cbb79923772284cfbb355", + "duplicate_failed_command_blocked": false, + "block_reason": null, + "execution_started": true, + "change_declared": false, + "result_contract_valid": true, + "result_contract_status": null, + "result_contract_error": null, + "command_rc": 0, + "changes_made": false, + "rollback_started": false, + "rollback_restored": null, + "mutation_outcome": "NO_MUTATION", + "sanitized": true, + "secrets_included": false, + "private_addresses_included": false, + "raw_evidence_retained_locally": true, + "raw_evidence_sha256": "da731d0d3687f12e4894e8887244b97bd5d0742cfcefa8c54f5dad5b0d49430a", + "sanitized_output_sha256": "2a6089fa90db67c2c3c7446a49aa9fdecd5f421461c1765c3f6c952eb95e65f8", + "output_truncated_in_json": false, + "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", + "output": "SKLADCHIK949_BEGIN=true\nCOMMAND_ID=SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1\nMODE=read-only\nCOMPONENT=skladchik-monitor-rc1-exact-rca\nPREDECESSOR_948=EDGE_PYTHON_C_QUOTING_FAILED_NO_MUTATION\nMUTATION_BOUNDARY=NONE_READ_ONLY\nEDGE_PARSE_OK=true\nKNOWN_HOSTS_PARSE_OK=true\nKNOWN_HOSTS_EXISTS=true\nEDGE_RCA_RC=0\nEDGE_MONITOR_RCA_BEGIN=true\nMONITOR_PRESENT=true\nMONITOR_SHA256=bf3a47cf3c53a4efa1f49322f96203a24b9077ea64547162e64c5d3d3326d0ff\nMONITOR_BYTES=25677\nMONITOR_LINES=645\nMONITOR_AST=PASS\nFUNCTION=utc_now|start=51|end=52\nFUNCTION=log|start=55|end=58\nFUNCTION=write_health|start=61|end=67\nFUNCTION=read_env|start=70|end=84\nFUNCTION=load_config|start=87|end=104\nFUNCTION=connect_db|start=107|end=139\nFUNCTION=meta_get|start=142|end=144\nFUNCTION=meta_set|start=147|end=149\nFUNCTION=event_sent|start=152|end=153\nFUNCTION=mark_event|start=156|end=161\nFUNCTION=cookie_jar_summary|start=164|end=238\nFUNCTION=fmt_ts|start=165|end=166\nFUNCTION=fetch_reports_page|start=241|end=287\nFUNCTION=login_required|start=289|end=299\nFUNCTION=strip_tags|start=302|end=305\nFUNCTION=full_url|start=308|end=309\nFUNCTION=section_positions|start=312|end=329\nFUNCTION=parse_int|start=332|end=334\nFUNCTION=parse_reports|start=337|end=395\nFUNCTION=title_needs_detail|start=398|end=401\nFUNCTION=extract_report_detail_title|start=403|end=414\nFUNCTION=fetch_report_detail_title|start=416|end=426\nFUNCTION=smtp_ready|start=428|end=429\nFUNCTION=send_mail|start=432|end=456\nFUNCTION=status_label|start=459|end=464\nFUNCTION=report_subject|start=467|end=473\nFUNCTION=report_body|start=476|end=488\nFUNCTION=process_reports|start=491|end=539\nFUNCTION=maybe_send_auth_required|start=542|end=562\nFUNCTION=acquire_lock|start=565|end=572\nFUNCTION=run_once|start=575|end=624\nFUNCTION=show_status|start=627|end=632\nFUNCTION=main|start=635|end=641\nRELEVANT_SOURCE_BEGIN\n0002:\"\"\"Skladchik XenForo reports monitor.\n0004:Polls /reports/, stores report state in SQLite, and sends SMTP notifications for:\n0005:- new open reports;\n0006:- reports that moved from open to resolved.\n0008:Uses only Python standard library. Authentication is via a browser Cookie header\n0009:stored in /etc/skladchik-reports-monitor/secrets.env as SKLADCHIK_COOKIE.\n0013:import argparse\n0029:import urllib.error\n0030:import urllib.parse\n0031:import urllib.request\n0035:APP = \"skladchik-reports-monitor\"\n0036:CONFIG_PATH = Path(\"/etc/skladchik-reports-monitor/config.ini\")\n0037:SECRETS_PATH = Path(\"/etc/skladchik-reports-monitor/secrets.env\")\n0038:BASE_DIR = Path(\"/var/lib/skladchik-reports-monitor\")\n0039:LOG_DIR = Path(\"/var/log/skladchik-reports-monitor\")\n0041:HEALTH_PATH = BASE_DIR / \"health.txt\"\n0042:COOKIE_JAR_PATH = BASE_DIR / \"cookies.jar\"\n0044:LOCK_PATH = Path(\"/run/skladchik-reports-monitor.lock\")\n0047:class MonitorError(Exception):\n0052: return dt.datetime.now(dt.UTC).replace(microsecond=0).isoformat().replace(\"+00:00\", \"Z\")\n0061:def write_health(status: str, **kv: Any) -> None:\n0063: lines = [f\"STATUS={status}\", f\"TS={utc_now()}\"]\n0067: HEALTH_PATH.write_text(\"\\n\".join(lines) + \"\\n\", encoding=\"utf-8\")\n0073: return data\n0084: return data\n0090: \"reports_url\": \"https://v32.skladchik.org/reports/\",\n0091: \"base_url\": \"https://az52.skladchik.org\",\n0093: \"user_agent\": \"Mozilla/5.0 SkladchikReportsMonitor/1.0\",\n0104: return cfg, read_env(SECRETS_PATH)\n0111: CREATE TABLE IF NOT EXISTS reports (\n0112: report_id TEXT PRIMARY KEY,\n0115: status TEXT NOT NULL,\n0116: report_count INTEGER,\n0127: report_id TEXT,\n0139: return con\n0144: return row[0] if row else None\n0153: return con.execute(\"SELECT 1 FROM events WHERE event_key=?\", (key,)).fetchone() is not None\n0156:def mark_event(con: sqlite3.Connection, key: str, report_id: str | None, event_type: str) -> None:\n0158: \"INSERT OR IGNORE INTO events(event_key,report_id,event_type,sent_at) VALUES(?,?,?,?)\",\n0159: (key, report_id, event_type, utc_now()),\n0164:def cookie_jar_summary() -> dict[str, str]:\n0166: return dt.datetime.fromtimestamp(epoch, dt.UTC).replace(microsecond=0).isoformat().replace(\"+00:00\", \"Z\")\n0169: \"session_keepalive\": \"persistent_cookie_jar\",\n0170: \"cookie_expiry_warning_days\": \"7\",\n0173: if not COOKIE_JAR_PATH.exists():\n0175: \"cookie_jar\": \"no\",\n0176: \"cookie_jar_bytes\": \"0\",\n0177: \"cookie_persistent_count\": \"0\",\n0178: \"cookie_session_count\": \"0\",\n0179: \"cookie_expiry_status\": \"NO_COOKIE_JAR\",\n0181: return summary\n0183: st = COOKIE_JAR_PATH.stat()\n0185: \"cookie_jar\": \"yes\" if st.st_size > 0 else \"empty\",\n0186: \"cookie_jar_bytes\": str(st.st_size),\n0187: \"cookie_jar_mtime\": fmt_ts(int(st.st_mtime)),\n0193: for raw in COOKIE_JAR_PATH.read_text(encoding=\"utf-8\", errors=\"replace\").splitlines():\n0195: if not line or line.startswith(\"#\") and not line.startswith(\"#HttpOnly_\"):\n0204: except ValueError:\n0211: summary[\"cookie_persistent_count\"] = str(len(persistent))\n0212: summary[\"cookie_session_count\"] = str(session_count)\n0218: \"cookie_expiry_utc\": fmt_ts(max_exp),\n0219: \"cookie_earliest_expiry_utc\": fmt_ts(min_exp),\n0220: \"cookie_expires_in_seconds\": str(left),\n0221: \"cookie_expires_in_days\": str(max(0, left) // 86400),\n0224: status = \"EXPIRED\"\n0226: status = \"WARN\"\n0228: status = \"OK\"\n0229: summary[\"cookie_expiry_status\"] = status\n0232: \"cookie_expires_in_seconds\": \"0\",\n0233: \"cookie_expires_in_days\": \"0\",\n0234: \"cookie_expiry_status\": \"NO_PERSISTENT_COOKIE\",\n0236: return summary\n0237: except Exception as e:\n0238: return {\"session_keepalive\": \"persistent_cookie_jar\", \"cookie_jar\": \"error\", \"cookie_jar_error\": repr(e), \"cookie_expiry_status\": \"ERROR\"}\n0241:def fetch_reports_page(cfg: configparser.ConfigParser, secrets: dict[str, str]) -> tuple[str, str]:\n0242: \"\"\"Fetch reports page with a persistent curl cookie jar.\n0244: This is the important part for \"no monthly relogin\": XenForo refreshes cookies during\n0245: normal authenticated requests. The monitor now keeps /var/lib/skladchik-reports-monitor/cookies.jar\n0246: and uses it on every 30-second poll, so Set-Cookie updates are preserved instead of being\n0249: url = cfg[\"forum\"].get(\"reports_url\", \"https://v32.skladchik.org/reports/\")\n0250: user_agent = cfg[\"forum\"].get(\"user_agent\", \"Mozilla/5.0 SkladchikReportsMonitor/1.0\")\n0251: initial_cookie = [REDACTED] or secrets.get(\"COOKIE\") or \"\"\n0255: if COOKIE_JAR_PATH.exists():\n0256: os.chmod(COOKIE_JAR_PATH, 0o600)\n0257: except Exception:\n0259: with tempfile.TemporaryDirectory(prefix=\"skladchik-reports-\") as tmp:\n0260: html_path = str(Path(tmp) / \"reports.html\")\n0261: if COOKIE_JAR_PATH.exists() and COOKIE_JAR_PATH.stat().st_size > 0:\n0262: cookie_source = str(COOKIE_JAR_PATH)\n0263: elif initial_cookie:\n0264: cookie_source = initial_cookie\n0266: cookie_source = \"\"\n0268: \"curl\", \"-4\", \"-sS\", \"-L\", \"--max-redirs\", \"12\", \"--http1.1\",\n0271: \"-b\", cookie_source,\n0272: \"-c\", str(COOKIE_JAR_PATH),\n0279: if COOKIE_JAR_PATH.exists():\n0280: os.chmod(COOKIE_JAR_PATH, 0o600)\n0281: except Exception:\n0284: raise MonitorError(f\"curl_failed rc={result.returncode} stderr={result.stderr[-500:]}\")\n0287: return final_url, body.decode(\"utf-8\", errors=\"replace\")\n0289:def login_required(final_url: str, text: str) -> bool:\n0292: return (\n0293: \"/login\" in lower_url\n0294: or \"name=\\\"login\\\"\" in lower\n0295: or \"name='login'\" in lower\n0298: or (\"войти\" in lower and \"пароль\" in lower and \"/reports\" not in lower_url)\n0305: return re.sub(r\"\\s+\", \" \", html_lib.unescape(fragment)).strip()\n0309: return urllib.parse.urljoin(base_url.rstrip(\"/\") + \"/\", href)\n0329: return open_pos, closed_pos\n0334: return int(match.group(1)) if match else None\n0337:def parse_reports(text: str, cfg: configparser.ConfigParser) -> list[dict[str, Any]]:\n0338: base_url = cfg[\"forum\"].get(\"base_url\", \"https://az52.skladchik.org\")\n0341: pattern = re.compile(r\"(?is)]*href=[\\\"']([^\\\"']*?reports/(\\d+)/?[^\\\"']*)[\\\"'][^>]*>(.*?)\")\n0343: href, report_id, title_html = match.group(1), match.group(2), match.group(3)\n0345: if not title or title.lower() in {\"жалобы\", \"reports\", \"обработанные жалобы\"}:\n0349: # XenForo reports are
  • .\n0374: if \"report-resolved\" in row_class:\n0375: status = \"resolved\"\n0376: elif \"report-open\" in row_class or \"report-assigned\" in row_class:\n0377: status = \"open\"\n0379: status = \"resolved\"\n0381: status = \"open\"\n0384: report_count = parse_int(r\"Жалоб[аы]?:\\s*(\\d+)\", row_text)\n0386: results[report_id] = {\n0387: \"report_id\": report_id,\n0390: \"status\": status,\n0391: \"report_count\": report_count,\n0395: return sorted(results.values(), key=lambda x: int(x[\"report_id\"]))\n0401: return (not value) or lower.startswith((\"сегодня в \", \"вчера в \")) or bool(re.fullmatch(r\"\\d{1,2}\\s+[A-Za-zА-Яа-яЁё.]+\\s+\\d{4}\\s+в\\s+\\d{1,2}:\\d{2}\", value, flags=re.I))\n0403:def extract_report_detail_title(text: str, fallback: str) -> str:\n0413: return candidate\n0414: return fallback\n0416:def fetch_report_detail_title(cfg: configparser.ConfigParser, auth: dict[str, str], url: str, fallback: str) -> str:\n0417: old_url = cfg[\"forum\"].get(\"reports_url\", \"\")\n0419: cfg[\"forum\"][\"reports_url\"] = url\n0420: _, detail_text = fetch_reports_page(cfg, auth)\n0421: return extract_report_detail_title(detail_text, fallback)\n0422: except Exception as exc:\n0424: return fallback\n0426: cfg[\"forum\"][\"reports_url\"] = old_url\n0429: return bool(secrets.get(\"SMTP_HOST\") and secrets.get(\"SMTP_TO\") and secrets.get(\"SMTP_FROM\"))\n0435: return False\n0454: server.login(user, smtp_pass)\n0456: return True\n0459:def status_label(status: str) -> str:\n0460: if status == \"open\":\n0461: return \"Открыта / в работе\"\n0462: if status == \"resolved\":\n0463: return \"Отработана / закрыта\"\n0464: return status\n0467:def report_subject(action: str, report: dict[str, Any], title_limit: int = 140) -> str:\n0468: \"\"\"Build a useful single-line subject containing report number and title.\"\"\"\n0469: report_id = str(report.get(\"report_id\") or \"без номера\")\n0470: title = re.sub(r\"\\s+\", \" \", str(report.get(\"title\") or \"Без названия\")).strip()\n0473: return f\"{action} №{report_id}: {title}\"\n0476:def report_body(prefix: str, report: dict[str, Any]) -> str:\n0477: report_count = report.get(\"report_count\")\n0478: comment_count = report.get(\"comment_count\")\n0479: return (\n0481: f\"Номер жалобы: {report['report_id']}\\n\"\n0482: f\"Название жалобы: {report['title']}\\n\"\n0483: f\"Статус: {status_label(str(report['status']))}\\n\"\n0484: f\"Количество жалоб: {report_count if report_count is not None else 'не указано'}\\n\"\n0486: f\"Ссылка: {report['url']}\\n\"\n0491:def process_reports(con: sqlite3.Connection, cfg: configparser.ConfigParser, secrets: dict[str, str], reports: list[dict[str, Any]]) -> tuple[int, int]:\n0496: for report in reports:\n0497: row = con.execute(\"SELECT status,title FROM reports WHERE report_id=?\", (report[\"report_id\"],)).fetchone()\n0498: if title_needs_detail(str(report.get(\"title\") or \"\")):\n0500: report[\"title\"] = str(row[1])\n0502: report[\"title\"] = fetch_report_detail_title(cfg, secrets, report[\"url\"], report[\"title\"])\n0505: \"INSERT INTO reports(report_id,url,title,status,report_count,comment_count,row_text,first_seen_at,last_seen_at,resolved_at) VALUES(?,?,?,?,?,?,?,?,?,?)\",\n0507: report[\"report_id\"], report[\"url\"], report[\"title\"], report[\"status\"], report.get(\"report_count\"),\n0508: report.get(\"comment_count\"), report.get(\"row_text\", \"\"), utc_now(), utc_now(),\n0509: utc_now() if report[\"status\"] == \"resolved\" else None,\n0514: if report[\"status\"] == \"open\":\n0515: key = \"new:\" + report[\"report_id\"]\n0517: if send_mail(cfg, secrets, report_subject(\"Новая жалоба\", report), report_body(\"Появилась новая жалоба на форуме.\", report)):\n0518: mark_event(con, key, report[\"report_id\"], \"new\")\n0521: old_status = row[0]\n0522: if old_status != \"resolved\" and report[\"status\"] == \"resolved\":\n0523: key = \"resolved:\" + report[\"report_id\"]\n0525: if send_mail(cfg, secrets, report_subject(\"Жалоба отработана\", report), report_body(\"Жалоба перешла в обработанные/закрытые.\", report)):\n0526: mark_event(con, key, report[\"report_id\"], \"resolved\")\n0529: \"UPDATE reports SET url=?, title=?, status=?, report_count=?, comment_count=?, row_text=?, last_seen_at=?, resolved_at=COALESCE(resolved_at, ?) WHERE report_id=?\",\n0531: report[\"url\"], report[\"title\"], report[\"status\"], report.get(\"report_count\"), report.get(\"comment_count\"),\n0532: report.get(\"row_text\", \"\"), utc_now(), utc_now() if report[\"status\"] == \"resolved\" else None,\n0533: report[\"report_id\"],\n0539: return new_events, resolved_events\n0542:def maybe_send_auth_required(con: sqlite3.Connection, cfg: configparser.ConfigParser, secrets: dict[str, str], final_url: str) -> None:\n0548: except ValueError:\n0555: \"Сессия форума истекла или cookie неверная.\\n\"\n0556: \"Обычно перелогин не нужен: монитор продлевает сессию постоянным cookie jar.\\n\"\n0570: return f\n0571: except BlockingIOError:\n0572: return None\n0575:def run_once() -> int:\n0579: write_health(\"LOCK_BUSY\", **cookie_jar_summary())\n0580: return 0\n0584: final_url, text = fetch_reports_page(cfg, secrets)\n0585: if login_required(final_url, text):\n0586: maybe_send_auth_required(con, cfg, secrets, final_url)\n0587: write_health(\"AUTH_REQUIRED\", url=final_url, **cookie_jar_summary())\n0588: return 2\n0589: reports = parse_reports(text, cfg)\n0590: if not reports:\n0591: write_health(\"ERROR\", reason=\"no_reports_parsed\", url=final_url, **cookie_jar_summary())\n0592: log(\"ERROR no reports parsed\")\n0593: return 1\n0594: new_events, resolved_events = process_reports(con, cfg, secrets, reports)\n0595: open_count = sum(1 for r in reports if r[\"status\"] == \"open\")\n0596: resolved_count = sum(1 for r in reports if r[\"status\"] == \"resolved\")\n0597: health_extra = cookie_jar_summary()\n0598: write_health(\n0601: reports=len(reports),\n0607: **health_extra,\n0609: log(f\"OK reports={len(reports)} open={open_count} resolved={resolved_count} new={new_events} done={resolved_events}\")\n0610: return 0\n0611: except urllib.error.HTTPError as e:\n0612: write_health(\"ERROR\", error=f\"HTTPError {e.code}\", **cookie_jar_summary())\n0613: log(f\"ERROR HTTPError {e.code}\")\n0614: return 1\n0615: except Exception as e:\n0616: write_health(\"ERROR\", error=repr(e), **cookie_jar_summary())\n0618: return 1\n0623: except Exception:\n0627:def show_status() -> int:\n0628: if HEALTH_PATH.exists():\n0629: print(HEALTH_PATH.read_text(encoding=\"utf-8\"), end=\"\")\n0631: print(\"STATUS=UNKNOWN\")\n0632: return 0\n0635:def main() -> int:\n0636: parser = argparse.ArgumentParser()\n0637: parser.add_argument(\"cmd\", choices=[\"run\", \"status\"], nargs=\"?\", default=\"run\")\n0639: if args.cmd == \"status\":\n0640: return show_status()\n0641: return run_once()\n0645: raise SystemExit(main())\nRELEVANT_SOURCE_END\nSOURCE_HAS_WT0=false\nSOURCE_HAS_NETBIRD=false\nSOURCE_HAS_IP_ROUTE=false\nHEALTH_BEGIN\nHEALTH_SHA256=fbd204bcba7d8b2514552a1548d8c1773381733641150a848b9a1ad0865011d7\nHEALTH_BYTES=506\nHEALTH_MTIME=1790167712\nSTATUS=ERROR\nTS=2026-09-23T12:48:32Z\nerror=MonitorError('curl_failed rc=28 stderr=curl: (28) Connection timed out after 15003 milliseconds\\n')\nsession_keepalive=persistent_cookie_jar\ncookie_expiry_warning_days=7\ncookie_jar=yes\ncookie_jar_bytes=364\ncookie_jar_mtime=2026-09-23T12:48:32Z\ncookie_persistent_count=1\ncookie_session_count=2\ncookie_expiry_utc=2026-09-29T16:47:21Z\ncookie_earliest_expiry_utc=2026-09-29T16:47:21Z\ncookie_expires_in_seconds=532729\ncookie_expires_in_days=6\ncookie_expiry_status=WARN\nHEALTH_END\nCONFIG_KEYS_BEGIN\nCONFIG_KEY=forum.reports_url\nCONFIG_KEY=forum.base_url\nCONFIG_KEY=forum.timeout_seconds\nCONFIG_KEY=forum.user_agent\nCONFIG_KEY=email.subject_prefix\nCONFIG_KEY=email.auth_notice_min_interval_seconds\nCONFIG_KEY=monitor.baseline_no_email\nCONFIG_KEYS_END\nSECRET_KEY_NAMES_BEGIN\nSECRET_KEY=SMTP_HOST\nSECRET_KEY=SMTP_PORT\nSECRET_KEY=SMTP_TLS\nSECRET_KEY=SMTP_USER\nSECRET_KEY=SMTP_PASS\nSECRET_KEY=SMTP_FROM\nSECRET_KEY=SMTP_TO\nSECRET_KEY=SKLADCHIK_COOKIE\nSECRET_KEY_NAMES_END\nUNIT_BEGIN\nUNIT_CAT_RC=0\n# /etc/systemd/system/skladchik-reports-monitor.service\n[Unit]\nDescription=Skladchik XenForo reports monitor\nWants=network-online.target\nAfter=network-online.target\n\n[Service]\nType=oneshot\nUser=root\nGroup=root\nExecStart=/usr/bin/python3 /opt/skladchik-reports-monitor/monitor.py run\nNice=10\nIOSchedulingClass=best-effort\nIOSchedulingPriority=7\nUNIT_END\nSERVICE_STATE_BEGIN\nTIMER_ENABLED=enabled|rc=0\nTIMER_ACTIVE=active|rc=0\nSERVICE_ACTIVE=failed|rc=3\nSERVICE_RESULT=exit-code|rc=0\nSERVICE_EXEC_STATUS=1|rc=0\nSERVICE_STATE_END\nJOURNAL_BEGIN\nJOURNAL_RC=0\nSep 23 15:25:14 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:25:29 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:25:29 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:25:29 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:25:45 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:26:00 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:26:00 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:26:00 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:26:16 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:26:31 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:26:31 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:26:31 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:27:09 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:27:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:27:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:27:25 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:27:40 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:27:55 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:27:55 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:27:55 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:28:11 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:28:26 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:28:26 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:28:26 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:28:42 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:28:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:28:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:28:57 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:29:13 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:29:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:29:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:29:28 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:29:44 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:29:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:29:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:29:59 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:30:15 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:30:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:30:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:30:30 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:30:46 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:31:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:31:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:31:01 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:31:17 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:31:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:31:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:31:32 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:31:48 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:32:03 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:32:03 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:32:03 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:32:19 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:32:34 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:32:34 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:32:34 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:32:50 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:33:05 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:33:05 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:33:05 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:33:21 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:33:36 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:33:36 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:33:36 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:33:52 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:34:07 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:34:07 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:34:07 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:34:22 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:34:37 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:34:37 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:34:37 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:34:53 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:35:08 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:35:08 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:35:08 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:35:24 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:35:39 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:35:39 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:35:39 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:35:55 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:36:10 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:36:10 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:36:10 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:36:26 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:36:41 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:36:41 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:36:41 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:36:57 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:37:12 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:37:12 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:37:12 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:37:28 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:37:43 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:37:43 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:37:43 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:37:59 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:38:14 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:38:14 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:38:14 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:38:30 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:38:45 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:38:45 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:38:45 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:39:01 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:39:16 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:39:16 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:39:16 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:39:32 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:39:47 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:39:47 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:39:47 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:40:02 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:40:17 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:40:17 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:40:17 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:40:33 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:40:48 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:40:48 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:40:48 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:41:04 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:41:19 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:41:19 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:41:19 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:41:35 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:41:50 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:41:50 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:41:50 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:42:06 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:42:21 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:42:21 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:42:21 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:42:37 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:42:52 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:42:52 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:42:52 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:43:08 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:43:23 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:43:23 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:43:23 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:43:39 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:43:54 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:43:54 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:43:54 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:44:10 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:44:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:44:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:44:25 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:44:41 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:44:56 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:44:56 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:44:56 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:45:12 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:45:27 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:45:27 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:45:27 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:45:42 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:45:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:45:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:45:57 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:46:13 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:46:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:46:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:46:28 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:46:44 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:46:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:46:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:46:59 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:47:15 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:47:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:47:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:47:30 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:47:46 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:48:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:48:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:48:01 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:48:17 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:48:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:48:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:48:32 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nJOURNAL_END\nNETWORK_FACTS_BEGIN\nROUTE_RC=0\nROUTE=[PRIVATE_IP] via [PRIVATE_IP] dev eth0 src [PRIVATE_IP] uid 0 \nROUTE= cache \nLINK_RC=0\nLINK=wt0 UNKNOWN \nNETBIRD_STATUS_RC=0\nNETBIRD=Management: Disconnected, reason: rpc error: code = DeadlineExceeded desc = context deadline exceeded while waiting for connections to become ready\nNETBIRD=Signal: Disconnected, reason: rpc error: code = Unavailable desc = error reading from server: read tcp [PRIVATE_IP]:43380->[PRIVATE_IP]:443: read: connection timed out\nNETBIRD=Relays: 0/2 Available\nNETBIRD=NetBird IP: [PRIVATE_IP]/16\nNETBIRD=NetBird IPv6: [PRIVATE_IPV6]/64\nNETBIRD=Peers count: 3/11 Connected\nNETWORK_FACTS_END\nEDGE_MONITOR_RCA_END=true\nCHANGES_MADE_BY_949=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\nSKLADCHIK949_END=true\n" +} diff --git a/runtime/history/SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.txt b/runtime/history/SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.txt new file mode 100644 index 00000000..3c2a24dd --- /dev/null +++ b/runtime/history/SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1.txt @@ -0,0 +1,589 @@ +CHAT_OUTPUT_BEGIN +COMMAND_ID=SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1 +STATUS=OK +RC=0 +HOST=pve01 +MODE=read-only +COMPONENT=skladchik-monitor-rc1-exact-rca +REFERENCE_REGISTER_CHECK=OK +REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 +ERROR_REGISTER_CHECK=OK +ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 +COMMAND_SHA256=f1244eee27a42e001f70047b3e75208f6e6e7537446cbb79923772284cfbb355 +DUPLICATE_FAILED_COMMAND_BLOCKED=false +EXECUTION_STARTED=true +CHANGE_DECLARED=false +RESULT_CONTRACT_VALID=true +RESULT_CONTRACT_STATUS=NOT_APPLICABLE +RESULT_CONTRACT_ERROR=NONE +COMMAND_RC=0 +CHANGES_MADE=false +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +MUTATION_OUTCOME=NO_MUTATION +SANITIZED=yes +SECRETS_INCLUDED=no +PRIVATE_ADDRESSES_INCLUDED=no +RAW_EVIDENCE_SHA256=da731d0d3687f12e4894e8887244b97bd5d0742cfcefa8c54f5dad5b0d49430a +SANITIZED_OUTPUT_SHA256=2a6089fa90db67c2c3c7446a49aa9fdecd5f421461c1765c3f6c952eb95e65f8 +OUTPUT_BEGIN +SKLADCHIK949_BEGIN=true +COMMAND_ID=SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1 +MODE=read-only +COMPONENT=skladchik-monitor-rc1-exact-rca +PREDECESSOR_948=EDGE_PYTHON_C_QUOTING_FAILED_NO_MUTATION +MUTATION_BOUNDARY=NONE_READ_ONLY +EDGE_PARSE_OK=true +KNOWN_HOSTS_PARSE_OK=true +KNOWN_HOSTS_EXISTS=true +EDGE_RCA_RC=0 +EDGE_MONITOR_RCA_BEGIN=true +MONITOR_PRESENT=true +MONITOR_SHA256=bf3a47cf3c53a4efa1f49322f96203a24b9077ea64547162e64c5d3d3326d0ff +MONITOR_BYTES=25677 +MONITOR_LINES=645 +MONITOR_AST=PASS +FUNCTION=utc_now|start=51|end=52 +FUNCTION=log|start=55|end=58 +FUNCTION=write_health|start=61|end=67 +FUNCTION=read_env|start=70|end=84 +FUNCTION=load_config|start=87|end=104 +FUNCTION=connect_db|start=107|end=139 +FUNCTION=meta_get|start=142|end=144 +FUNCTION=meta_set|start=147|end=149 +FUNCTION=event_sent|start=152|end=153 +FUNCTION=mark_event|start=156|end=161 +FUNCTION=cookie_jar_summary|start=164|end=238 +FUNCTION=fmt_ts|start=165|end=166 +FUNCTION=fetch_reports_page|start=241|end=287 +FUNCTION=login_required|start=289|end=299 +FUNCTION=strip_tags|start=302|end=305 +FUNCTION=full_url|start=308|end=309 +FUNCTION=section_positions|start=312|end=329 +FUNCTION=parse_int|start=332|end=334 +FUNCTION=parse_reports|start=337|end=395 +FUNCTION=title_needs_detail|start=398|end=401 +FUNCTION=extract_report_detail_title|start=403|end=414 +FUNCTION=fetch_report_detail_title|start=416|end=426 +FUNCTION=smtp_ready|start=428|end=429 +FUNCTION=send_mail|start=432|end=456 +FUNCTION=status_label|start=459|end=464 +FUNCTION=report_subject|start=467|end=473 +FUNCTION=report_body|start=476|end=488 +FUNCTION=process_reports|start=491|end=539 +FUNCTION=maybe_send_auth_required|start=542|end=562 +FUNCTION=acquire_lock|start=565|end=572 +FUNCTION=run_once|start=575|end=624 +FUNCTION=show_status|start=627|end=632 +FUNCTION=main|start=635|end=641 +RELEVANT_SOURCE_BEGIN +0002:"""Skladchik XenForo reports monitor. +0004:Polls /reports/, stores report state in SQLite, and sends SMTP notifications for: +0005:- new open reports; +0006:- reports that moved from open to resolved. +0008:Uses only Python standard library. Authentication is via a browser Cookie header +0009:stored in /etc/skladchik-reports-monitor/secrets.env as SKLADCHIK_COOKIE. +0013:import argparse +0029:import urllib.error +0030:import urllib.parse +0031:import urllib.request +0035:APP = "skladchik-reports-monitor" +0036:CONFIG_PATH = Path("/etc/skladchik-reports-monitor/config.ini") +0037:SECRETS_PATH = Path("/etc/skladchik-reports-monitor/secrets.env") +0038:BASE_DIR = Path("/var/lib/skladchik-reports-monitor") +0039:LOG_DIR = Path("/var/log/skladchik-reports-monitor") +0041:HEALTH_PATH = BASE_DIR / "health.txt" +0042:COOKIE_JAR_PATH = BASE_DIR / "cookies.jar" +0044:LOCK_PATH = Path("/run/skladchik-reports-monitor.lock") +0047:class MonitorError(Exception): +0052: return dt.datetime.now(dt.UTC).replace(microsecond=0).isoformat().replace("+00:00", "Z") +0061:def write_health(status: str, **kv: Any) -> None: +0063: lines = [f"STATUS={status}", f"TS={utc_now()}"] +0067: HEALTH_PATH.write_text("\n".join(lines) + "\n", encoding="utf-8") +0073: return data +0084: return data +0090: "reports_url": "https://v32.skladchik.org/reports/", +0091: "base_url": "https://az52.skladchik.org", +0093: "user_agent": "Mozilla/5.0 SkladchikReportsMonitor/1.0", +0104: return cfg, read_env(SECRETS_PATH) +0111: CREATE TABLE IF NOT EXISTS reports ( +0112: report_id TEXT PRIMARY KEY, +0115: status TEXT NOT NULL, +0116: report_count INTEGER, +0127: report_id TEXT, +0139: return con +0144: return row[0] if row else None +0153: return con.execute("SELECT 1 FROM events WHERE event_key=?", (key,)).fetchone() is not None +0156:def mark_event(con: sqlite3.Connection, key: str, report_id: str | None, event_type: str) -> None: +0158: "INSERT OR IGNORE INTO events(event_key,report_id,event_type,sent_at) VALUES(?,?,?,?)", +0159: (key, report_id, event_type, utc_now()), +0164:def cookie_jar_summary() -> dict[str, str]: +0166: return dt.datetime.fromtimestamp(epoch, dt.UTC).replace(microsecond=0).isoformat().replace("+00:00", "Z") +0169: "session_keepalive": "persistent_cookie_jar", +0170: "cookie_expiry_warning_days": "7", +0173: if not COOKIE_JAR_PATH.exists(): +0175: "cookie_jar": "no", +0176: "cookie_jar_bytes": "0", +0177: "cookie_persistent_count": "0", +0178: "cookie_session_count": "0", +0179: "cookie_expiry_status": "NO_COOKIE_JAR", +0181: return summary +0183: st = COOKIE_JAR_PATH.stat() +0185: "cookie_jar": "yes" if st.st_size > 0 else "empty", +0186: "cookie_jar_bytes": str(st.st_size), +0187: "cookie_jar_mtime": fmt_ts(int(st.st_mtime)), +0193: for raw in COOKIE_JAR_PATH.read_text(encoding="utf-8", errors="replace").splitlines(): +0195: if not line or line.startswith("#") and not line.startswith("#HttpOnly_"): +0204: except ValueError: +0211: summary["cookie_persistent_count"] = str(len(persistent)) +0212: summary["cookie_session_count"] = str(session_count) +0218: "cookie_expiry_utc": fmt_ts(max_exp), +0219: "cookie_earliest_expiry_utc": fmt_ts(min_exp), +0220: "cookie_expires_in_seconds": str(left), +0221: "cookie_expires_in_days": str(max(0, left) // 86400), +0224: status = "EXPIRED" +0226: status = "WARN" +0228: status = "OK" +0229: summary["cookie_expiry_status"] = status +0232: "cookie_expires_in_seconds": "0", +0233: "cookie_expires_in_days": "0", +0234: "cookie_expiry_status": "NO_PERSISTENT_COOKIE", +0236: return summary +0237: except Exception as e: +0238: return {"session_keepalive": "persistent_cookie_jar", "cookie_jar": "error", "cookie_jar_error": repr(e), "cookie_expiry_status": "ERROR"} +0241:def fetch_reports_page(cfg: configparser.ConfigParser, secrets: dict[str, str]) -> tuple[str, str]: +0242: """Fetch reports page with a persistent curl cookie jar. +0244: This is the important part for "no monthly relogin": XenForo refreshes cookies during +0245: normal authenticated requests. The monitor now keeps /var/lib/skladchik-reports-monitor/cookies.jar +0246: and uses it on every 30-second poll, so Set-Cookie updates are preserved instead of being +0249: url = cfg["forum"].get("reports_url", "https://v32.skladchik.org/reports/") +0250: user_agent = cfg["forum"].get("user_agent", "Mozilla/5.0 SkladchikReportsMonitor/1.0") +0251: initial_cookie = [REDACTED] or secrets.get("COOKIE") or "" +0255: if COOKIE_JAR_PATH.exists(): +0256: os.chmod(COOKIE_JAR_PATH, 0o600) +0257: except Exception: +0259: with tempfile.TemporaryDirectory(prefix="skladchik-reports-") as tmp: +0260: html_path = str(Path(tmp) / "reports.html") +0261: if COOKIE_JAR_PATH.exists() and COOKIE_JAR_PATH.stat().st_size > 0: +0262: cookie_source = str(COOKIE_JAR_PATH) +0263: elif initial_cookie: +0264: cookie_source = initial_cookie +0266: cookie_source = "" +0268: "curl", "-4", "-sS", "-L", "--max-redirs", "12", "--http1.1", +0271: "-b", cookie_source, +0272: "-c", str(COOKIE_JAR_PATH), +0279: if COOKIE_JAR_PATH.exists(): +0280: os.chmod(COOKIE_JAR_PATH, 0o600) +0281: except Exception: +0284: raise MonitorError(f"curl_failed rc={result.returncode} stderr={result.stderr[-500:]}") +0287: return final_url, body.decode("utf-8", errors="replace") +0289:def login_required(final_url: str, text: str) -> bool: +0292: return ( +0293: "/login" in lower_url +0294: or "name=\"login\"" in lower +0295: or "name='login'" in lower +0298: or ("войти" in lower and "пароль" in lower and "/reports" not in lower_url) +0305: return re.sub(r"\s+", " ", html_lib.unescape(fragment)).strip() +0309: return urllib.parse.urljoin(base_url.rstrip("/") + "/", href) +0329: return open_pos, closed_pos +0334: return int(match.group(1)) if match else None +0337:def parse_reports(text: str, cfg: configparser.ConfigParser) -> list[dict[str, Any]]: +0338: base_url = cfg["forum"].get("base_url", "https://az52.skladchik.org") +0341: pattern = re.compile(r"(?is)]*href=[\"']([^\"']*?reports/(\d+)/?[^\"']*)[\"'][^>]*>(.*?)") +0343: href, report_id, title_html = match.group(1), match.group(2), match.group(3) +0345: if not title or title.lower() in {"жалобы", "reports", "обработанные жалобы"}: +0349: # XenForo reports are
  • . +0374: if "report-resolved" in row_class: +0375: status = "resolved" +0376: elif "report-open" in row_class or "report-assigned" in row_class: +0377: status = "open" +0379: status = "resolved" +0381: status = "open" +0384: report_count = parse_int(r"Жалоб[аы]?:\s*(\d+)", row_text) +0386: results[report_id] = { +0387: "report_id": report_id, +0390: "status": status, +0391: "report_count": report_count, +0395: return sorted(results.values(), key=lambda x: int(x["report_id"])) +0401: return (not value) or lower.startswith(("сегодня в ", "вчера в ")) or bool(re.fullmatch(r"\d{1,2}\s+[A-Za-zА-Яа-яЁё.]+\s+\d{4}\s+в\s+\d{1,2}:\d{2}", value, flags=re.I)) +0403:def extract_report_detail_title(text: str, fallback: str) -> str: +0413: return candidate +0414: return fallback +0416:def fetch_report_detail_title(cfg: configparser.ConfigParser, auth: dict[str, str], url: str, fallback: str) -> str: +0417: old_url = cfg["forum"].get("reports_url", "") +0419: cfg["forum"]["reports_url"] = url +0420: _, detail_text = fetch_reports_page(cfg, auth) +0421: return extract_report_detail_title(detail_text, fallback) +0422: except Exception as exc: +0424: return fallback +0426: cfg["forum"]["reports_url"] = old_url +0429: return bool(secrets.get("SMTP_HOST") and secrets.get("SMTP_TO") and secrets.get("SMTP_FROM")) +0435: return False +0454: server.login(user, smtp_pass) +0456: return True +0459:def status_label(status: str) -> str: +0460: if status == "open": +0461: return "Открыта / в работе" +0462: if status == "resolved": +0463: return "Отработана / закрыта" +0464: return status +0467:def report_subject(action: str, report: dict[str, Any], title_limit: int = 140) -> str: +0468: """Build a useful single-line subject containing report number and title.""" +0469: report_id = str(report.get("report_id") or "без номера") +0470: title = re.sub(r"\s+", " ", str(report.get("title") or "Без названия")).strip() +0473: return f"{action} №{report_id}: {title}" +0476:def report_body(prefix: str, report: dict[str, Any]) -> str: +0477: report_count = report.get("report_count") +0478: comment_count = report.get("comment_count") +0479: return ( +0481: f"Номер жалобы: {report['report_id']}\n" +0482: f"Название жалобы: {report['title']}\n" +0483: f"Статус: {status_label(str(report['status']))}\n" +0484: f"Количество жалоб: {report_count if report_count is not None else 'не указано'}\n" +0486: f"Ссылка: {report['url']}\n" +0491:def process_reports(con: sqlite3.Connection, cfg: configparser.ConfigParser, secrets: dict[str, str], reports: list[dict[str, Any]]) -> tuple[int, int]: +0496: for report in reports: +0497: row = con.execute("SELECT status,title FROM reports WHERE report_id=?", (report["report_id"],)).fetchone() +0498: if title_needs_detail(str(report.get("title") or "")): +0500: report["title"] = str(row[1]) +0502: report["title"] = fetch_report_detail_title(cfg, secrets, report["url"], report["title"]) +0505: "INSERT INTO reports(report_id,url,title,status,report_count,comment_count,row_text,first_seen_at,last_seen_at,resolved_at) VALUES(?,?,?,?,?,?,?,?,?,?)", +0507: report["report_id"], report["url"], report["title"], report["status"], report.get("report_count"), +0508: report.get("comment_count"), report.get("row_text", ""), utc_now(), utc_now(), +0509: utc_now() if report["status"] == "resolved" else None, +0514: if report["status"] == "open": +0515: key = "new:" + report["report_id"] +0517: if send_mail(cfg, secrets, report_subject("Новая жалоба", report), report_body("Появилась новая жалоба на форуме.", report)): +0518: mark_event(con, key, report["report_id"], "new") +0521: old_status = row[0] +0522: if old_status != "resolved" and report["status"] == "resolved": +0523: key = "resolved:" + report["report_id"] +0525: if send_mail(cfg, secrets, report_subject("Жалоба отработана", report), report_body("Жалоба перешла в обработанные/закрытые.", report)): +0526: mark_event(con, key, report["report_id"], "resolved") +0529: "UPDATE reports SET url=?, title=?, status=?, report_count=?, comment_count=?, row_text=?, last_seen_at=?, resolved_at=COALESCE(resolved_at, ?) WHERE report_id=?", +0531: report["url"], report["title"], report["status"], report.get("report_count"), report.get("comment_count"), +0532: report.get("row_text", ""), utc_now(), utc_now() if report["status"] == "resolved" else None, +0533: report["report_id"], +0539: return new_events, resolved_events +0542:def maybe_send_auth_required(con: sqlite3.Connection, cfg: configparser.ConfigParser, secrets: dict[str, str], final_url: str) -> None: +0548: except ValueError: +0555: "Сессия форума истекла или cookie неверная.\n" +0556: "Обычно перелогин не нужен: монитор продлевает сессию постоянным cookie jar.\n" +0570: return f +0571: except BlockingIOError: +0572: return None +0575:def run_once() -> int: +0579: write_health("LOCK_BUSY", **cookie_jar_summary()) +0580: return 0 +0584: final_url, text = fetch_reports_page(cfg, secrets) +0585: if login_required(final_url, text): +0586: maybe_send_auth_required(con, cfg, secrets, final_url) +0587: write_health("AUTH_REQUIRED", url=final_url, **cookie_jar_summary()) +0588: return 2 +0589: reports = parse_reports(text, cfg) +0590: if not reports: +0591: write_health("ERROR", reason="no_reports_parsed", url=final_url, **cookie_jar_summary()) +0592: log("ERROR no reports parsed") +0593: return 1 +0594: new_events, resolved_events = process_reports(con, cfg, secrets, reports) +0595: open_count = sum(1 for r in reports if r["status"] == "open") +0596: resolved_count = sum(1 for r in reports if r["status"] == "resolved") +0597: health_extra = cookie_jar_summary() +0598: write_health( +0601: reports=len(reports), +0607: **health_extra, +0609: log(f"OK reports={len(reports)} open={open_count} resolved={resolved_count} new={new_events} done={resolved_events}") +0610: return 0 +0611: except urllib.error.HTTPError as e: +0612: write_health("ERROR", error=f"HTTPError {e.code}", **cookie_jar_summary()) +0613: log(f"ERROR HTTPError {e.code}") +0614: return 1 +0615: except Exception as e: +0616: write_health("ERROR", error=repr(e), **cookie_jar_summary()) +0618: return 1 +0623: except Exception: +0627:def show_status() -> int: +0628: if HEALTH_PATH.exists(): +0629: print(HEALTH_PATH.read_text(encoding="utf-8"), end="") +0631: print("STATUS=UNKNOWN") +0632: return 0 +0635:def main() -> int: +0636: parser = argparse.ArgumentParser() +0637: parser.add_argument("cmd", choices=["run", "status"], nargs="?", default="run") +0639: if args.cmd == "status": +0640: return show_status() +0641: return run_once() +0645: raise SystemExit(main()) +RELEVANT_SOURCE_END +SOURCE_HAS_WT0=false +SOURCE_HAS_NETBIRD=false +SOURCE_HAS_IP_ROUTE=false +HEALTH_BEGIN +HEALTH_SHA256=fbd204bcba7d8b2514552a1548d8c1773381733641150a848b9a1ad0865011d7 +HEALTH_BYTES=506 +HEALTH_MTIME=1790167712 +STATUS=ERROR +TS=2026-09-23T12:48:32Z +error=MonitorError('curl_failed rc=28 stderr=curl: (28) Connection timed out after 15003 milliseconds\n') +session_keepalive=persistent_cookie_jar +cookie_expiry_warning_days=7 +cookie_jar=yes +cookie_jar_bytes=364 +cookie_jar_mtime=2026-09-23T12:48:32Z +cookie_persistent_count=1 +cookie_session_count=2 +cookie_expiry_utc=2026-09-29T16:47:21Z +cookie_earliest_expiry_utc=2026-09-29T16:47:21Z +cookie_expires_in_seconds=532729 +cookie_expires_in_days=6 +cookie_expiry_status=WARN +HEALTH_END +CONFIG_KEYS_BEGIN +CONFIG_KEY=forum.reports_url +CONFIG_KEY=forum.base_url +CONFIG_KEY=forum.timeout_seconds +CONFIG_KEY=forum.user_agent +CONFIG_KEY=email.subject_prefix +CONFIG_KEY=email.auth_notice_min_interval_seconds +CONFIG_KEY=monitor.baseline_no_email +CONFIG_KEYS_END +SECRET_KEY_NAMES_BEGIN +SECRET_KEY=SMTP_HOST +SECRET_KEY=SMTP_PORT +SECRET_KEY=SMTP_TLS +SECRET_KEY=SMTP_USER +SECRET_KEY=SMTP_PASS +SECRET_KEY=SMTP_FROM +SECRET_KEY=SMTP_TO +SECRET_KEY=SKLADCHIK_COOKIE +SECRET_KEY_NAMES_END +UNIT_BEGIN +UNIT_CAT_RC=0 +# /etc/systemd/system/skladchik-reports-monitor.service +[Unit] +Description=Skladchik XenForo reports monitor +Wants=network-online.target +After=network-online.target + +[Service] +Type=oneshot +User=root +Group=root +ExecStart=/usr/bin/python3 /opt/skladchik-reports-monitor/monitor.py run +Nice=10 +IOSchedulingClass=best-effort +IOSchedulingPriority=7 +UNIT_END +SERVICE_STATE_BEGIN +TIMER_ENABLED=enabled|rc=0 +TIMER_ACTIVE=active|rc=0 +SERVICE_ACTIVE=failed|rc=3 +SERVICE_RESULT=exit-code|rc=0 +SERVICE_EXEC_STATUS=1|rc=0 +SERVICE_STATE_END +JOURNAL_BEGIN +JOURNAL_RC=0 +Sep 23 15:25:14 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:25:29 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:25:29 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:25:29 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:25:45 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:26:00 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:26:00 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:26:00 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:26:16 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:26:31 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:26:31 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:26:31 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:27:09 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:27:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:27:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:27:25 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:27:40 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:27:55 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:27:55 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:27:55 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:28:11 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:28:26 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:28:26 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:28:26 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:28:42 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:28:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:28:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:28:57 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:29:13 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:29:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:29:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:29:28 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:29:44 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:29:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:29:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:29:59 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:30:15 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:30:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:30:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:30:30 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:30:46 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:31:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:31:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:31:01 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:31:17 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:31:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:31:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:31:32 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:31:48 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:32:03 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:32:03 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:32:03 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:32:19 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:32:34 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:32:34 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:32:34 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:32:50 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:33:05 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:33:05 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:33:05 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:33:21 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:33:36 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:33:36 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:33:36 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:33:52 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:34:07 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:34:07 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:34:07 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:34:22 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:34:37 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:34:37 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:34:37 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:34:53 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:35:08 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:35:08 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:35:08 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:35:24 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:35:39 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:35:39 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:35:39 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:35:55 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:36:10 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:36:10 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:36:10 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:36:26 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:36:41 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:36:41 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:36:41 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:36:57 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:37:12 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:37:12 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:37:12 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:37:28 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:37:43 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:37:43 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:37:43 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:37:59 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:38:14 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:38:14 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:38:14 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:38:30 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:38:45 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:38:45 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:38:45 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:39:01 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:39:16 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:39:16 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:39:16 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:39:32 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:39:47 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:39:47 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:39:47 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:40:02 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:40:17 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:40:17 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:40:17 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:40:33 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:40:48 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:40:48 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:40:48 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:41:04 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:41:19 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:41:19 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:41:19 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:41:35 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:41:50 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:41:50 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:41:50 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:42:06 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:42:21 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:42:21 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:42:21 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:42:37 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:42:52 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:42:52 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:42:52 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:43:08 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:43:23 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:43:23 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:43:23 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:43:39 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:43:54 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:43:54 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:43:54 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:44:10 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:44:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:44:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:44:25 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:44:41 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:44:56 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:44:56 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:44:56 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:45:12 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:45:27 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:45:27 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:45:27 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:45:42 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:45:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:45:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:45:57 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:46:13 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:46:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:46:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:46:28 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:46:44 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:46:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:46:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:46:59 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:47:15 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:47:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:47:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:47:30 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:47:46 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:48:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:48:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:48:01 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:48:17 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:48:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:48:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:48:32 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +JOURNAL_END +NETWORK_FACTS_BEGIN +ROUTE_RC=0 +ROUTE=[PRIVATE_IP] via [PRIVATE_IP] dev eth0 src [PRIVATE_IP] uid 0 +ROUTE= cache +LINK_RC=0 +LINK=wt0 UNKNOWN +NETBIRD_STATUS_RC=0 +NETBIRD=Management: Disconnected, reason: rpc error: code = DeadlineExceeded desc = context deadline exceeded while waiting for connections to become ready +NETBIRD=Signal: Disconnected, reason: rpc error: code = Unavailable desc = error reading from server: read tcp [PRIVATE_IP]:43380->[PRIVATE_IP]:443: read: connection timed out +NETBIRD=Relays: 0/2 Available +NETBIRD=NetBird IP: [PRIVATE_IP]/16 +NETBIRD=NetBird IPv6: [PRIVATE_IPV6]/64 +NETBIRD=Peers count: 3/11 Connected +NETWORK_FACTS_END +EDGE_MONITOR_RCA_END=true +CHANGES_MADE_BY_949=false +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} +SKLADCHIK949_END=true + +OUTPUT_END +CHAT_OUTPUT_END diff --git a/runtime/latest.json b/runtime/latest.json index 991e8c8d..7e546805 100644 --- a/runtime/latest.json +++ b/runtime/latest.json @@ -1,19 +1,19 @@ { "schema_version": 1, "channel": "homelab-runtime", - "command_id": "SUPPORT-260923-SPB-TLS-BRIDGE-NPMPLUS-RUNTIME-RCA-9196R1", + "command_id": "SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1", "status": "OK", "rc": 0, "host": "pve01", "mode": "read-only", - "component": "spb-tls-bridge-npmplus-runtime-rca", - "started_at_utc": "2026-09-23T12:47:52Z", - "finished_at_utc": "2026-09-23T12:47:55Z", + "component": "skladchik-monitor-rc1-exact-rca", + "started_at_utc": "2026-09-23T12:48:44Z", + "finished_at_utc": "2026-09-23T12:48:46Z", "reference_register_checked": true, "reference_sha256": "5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66", "error_register_checked": true, "error_register_sha256": "3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0", - "command_sha256": "ddb8ebb208b8194c670dbb45bda053cae7d0a615dc00c22ef8b7eb110a91ca2f", + "command_sha256": "f1244eee27a42e001f70047b3e75208f6e6e7537446cbb79923772284cfbb355", "duplicate_failed_command_blocked": false, "block_reason": null, "execution_started": true, @@ -30,9 +30,9 @@ "secrets_included": false, "private_addresses_included": false, "raw_evidence_retained_locally": true, - "raw_evidence_sha256": "4b9b007c3d0a9273577ab848f1ac5a4c6bc925795eb52941a4ff505b2cc7abec", - "sanitized_output_sha256": "4b9b007c3d0a9273577ab848f1ac5a4c6bc925795eb52941a4ff505b2cc7abec", + "raw_evidence_sha256": "da731d0d3687f12e4894e8887244b97bd5d0742cfcefa8c54f5dad5b0d49430a", + "sanitized_output_sha256": "2a6089fa90db67c2c3c7446a49aa9fdecd5f421461c1765c3f6c952eb95e65f8", "output_truncated_in_json": false, "full_sanitized_output_url": "https://git.gram1.ru/.well-known/homelab-runtime/latest.txt", - "output": "RCA9196_BEGIN=true\nMUTATION_BOUNDARY=READ_ONLY_VM130_RUNTIME_RCA;NO_PRODUCTION_WRITE;NO_SPB_WRITE;NO_DNS_WRITE;NO_NGINX_RELOAD\nVM130_QGA_TRANSPORT_RC=0\nVM130_QGA_STDERR_SHA16=e3b0c44298fc1c14\nVM130_QGA_EXITCODE=0\nVM130_GUEST_STDERR_SHA16=e3b0c44298fc1c14\nRCA9196={\"baseline\":{\"nginx_test_rc\":0,\"stderr_sha16\":\"9cb221b6993277a1\"},\"classification\":\"LIVE_CONFIG_DIFFERS_FROM_IMAGE\",\"container\":{\"cmd\":null,\"entrypoint\":[\"tini\",\"--\",\"entrypoint.sh\"],\"env_count\":12,\"env_names\":[\"ACME_PROFILE\",\"AUTH_REQUEST_AUTHENTIK_UPSTREAM\",\"COOKIE_SECRET\",\"DISABLE_H3_QUIC\",\"DISABLE_IPV6\",\"INITIAL_ADMIN_EMAIL\",\"INITIAL_ADMIN_PASSWORD\",\"IPV4_BINDING\",\"NODE_ENV\",\"NPM_IPV4_BINDING\",\"PATH\",\"TZ\"],\"image_sha16\":\"d16df105013397a1\",\"user\":\"\"},\"diff\":{\"image_line18\":\" ssl_certificate ;\",\"live_equals_image\":false,\"live_line18\":\" ssl_certificate /data/tls/dummycert.pem;\"},\"image\":{\"lines_1_35\":[{\"line\":1,\"text\":\"upstream npmplus {\"},{\"line\":2,\"text\":\" server unix:/run/npmplus.sock;\"},{\"line\":3,\"text\":\"}\"},{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"server {\"},{\"line\":6,\"text\":\" server_name \\\"\\\";\"},{\"line\":7,\"text\":\" listen :81 ssl;\"},{\"line\":8,\"text\":\" listen [::]:81 ssl;\"},{\"line\":9,\"text\":\" ssl_reject_handshake on;\"},{\"line\":10,\"text\":\" return 444;\"},{\"line\":11,\"text\":\"}\"},{\"line\":12,\"text\":\"\"},{\"line\":13,\"text\":\"server {\"},{\"line\":14,\"text\":\" listen :81 ssl bind reuseport deferred multipath so_keepalive=on default_server;\"},{\"line\":15,\"text\":\" listen [::]:81 ssl bind reuseport deferred multipath so_keepalive=on default_server;\"},{\"line\":16,\"text\":\"\"},{\"line\":17,\"text\":\" server_name _;\"},{\"line\":18,\"text\":\" ssl_certificate ;\"},{\"line\":19,\"text\":\" ssl_certificate_key ;\"},{\"line\":20,\"text\":\" #ssl_stapling on;\"},{\"line\":21,\"text\":\" #ssl_stapling_verify on;\"},{\"line\":22,\"text\":\" #ssl_stapling_file ;\"},{\"line\":23,\"text\":\" #ssl_certificate_compression off;\"},{\"line\":24,\"text\":\"\"},{\"line\":25,\"text\":\" if ($scheme = \\\"http\\\") {\"},{\"line\":26,\"text\":\" return 301 \"},{\"line\":27,\"text\":\" }\"},{\"line\":28,\"text\":\" if ($http_x_forwarded_proto = \\\"http\\\") {\"},{\"line\":29,\"text\":\" return 301 \"},{\"line\":30,\"text\":\" }\"},{\"line\":31,\"text\":\"\"},{\"line\":32,\"text\":\" client_max_body_size 1m;\"},{\"line\":33,\"text\":\" more_set_headers \\\"X-Frame-Options: DENY\\\";\"},{\"line\":34,\"text\":\" more_set_headers \\\"Referrer-Policy: no-referrer\\\";\"},{\"line\":35,\"text\":\" more_set_headers \\\"Cross-Origin-Opener-Policy: same-origin\\\";\"}],\"rc\":0,\"sha16\":\"cfaf1d6ee20a39b1\",\"size\":3673,\"stderr_safe\":[],\"stderr_sha16\":\"e3b0c44298fc1c14\"},\"live\":{\"lines_1_35\":[{\"line\":1,\"text\":\"upstream npmplus {\"},{\"line\":2,\"text\":\" server unix:/run/npmplus.sock;\"},{\"line\":3,\"text\":\"}\"},{\"line\":4,\"text\":\"\"},{\"line\":5,\"text\":\"server {\"},{\"line\":6,\"text\":\" server_name \\\"\\\";\"},{\"line\":7,\"text\":\" listen :81 ssl;\"},{\"line\":8,\"text\":\" #listen [::]:81 ssl;\"},{\"line\":9,\"text\":\" ssl_reject_handshake on;\"},{\"line\":10,\"text\":\" return 444;\"},{\"line\":11,\"text\":\"}\"},{\"line\":12,\"text\":\"\"},{\"line\":13,\"text\":\"server {\"},{\"line\":14,\"text\":\" listen :81 ssl bind reuseport deferred so_keepalive=on default_server;\"},{\"line\":15,\"text\":\" #listen [::]:81 ssl bind reuseport deferred so_keepalive=on default_server;\"},{\"line\":16,\"text\":\"\"},{\"line\":17,\"text\":\" server_name _;\"},{\"line\":18,\"text\":\" ssl_certificate /data/tls/dummycert.pem;\"},{\"line\":19,\"text\":\" ssl_certificate_key /data/tls/dummykey.pem;\"},{\"line\":20,\"text\":\" #ssl_stapling on;\"},{\"line\":21,\"text\":\" #ssl_stapling_verify on;\"},{\"line\":22,\"text\":\" #ssl_stapling_file ;\"},{\"line\":23,\"text\":\" #ssl_certificate_compression off;\"},{\"line\":24,\"text\":\"\"},{\"line\":25,\"text\":\" if ($scheme = \\\"http\\\") {\"},{\"line\":26,\"text\":\" return 301 \"},{\"line\":27,\"text\":\" }\"},{\"line\":28,\"text\":\" if ($http_x_forwarded_proto = \\\"http\\\") {\"},{\"line\":29,\"text\":\" return 301 \"},{\"line\":30,\"text\":\" }\"},{\"line\":31,\"text\":\"\"},{\"line\":32,\"text\":\" client_max_body_size 1m;\"},{\"line\":33,\"text\":\" more_set_headers \\\"X-Frame-Options: DENY\\\";\"},{\"line\":34,\"text\":\" more_set_headers \\\"Referrer-Policy: no-referrer\\\";\"},{\"line\":35,\"text\":\" more_set_headers \\\"Cross-Origin-Opener-Policy: same-origin\\\";\"}],\"rc\":0,\"sha16\":\"507fa874e9632e71\",\"size\":3704,\"stderr_sha16\":\"e3b0c44298fc1c14\"},\"same_env_direct_nginx\":{\"rc\":1,\"stderr_safe\":[\"nginx: [emerg] open() \\\"/data/custom_nginx/root.conf\\\" failed (2: No such file or directory) in /usr/local/nginx/conf/nginx.conf:20\",\"nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed\"],\"stderr_sha16\":\"ae9c0a07f6c00888\"}}\nRCA9196_CLASSIFICATION=LIVE_CONFIG_DIFFERS_FROM_IMAGE\nTASK_COMPLETE=true\nTASK_RESULT=PASS_SPB_TLS_BRIDGE_NPMPLUS_RUNTIME_RCA\nDECISION=READ_EXACT_9196_THEN_BUILD_RUNTIME_FAITHFUL_NGINX_TEST\nNEXT_GATE=EXACT_9196_LIVE_VS_IMAGE_NPMPLUS_CONF\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260923-SPB-TLS-BRIDGE-NPMPLUS-RUNTIME-RCA-9196R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\n" + "output": "SKLADCHIK949_BEGIN=true\nCOMMAND_ID=SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1\nMODE=read-only\nCOMPONENT=skladchik-monitor-rc1-exact-rca\nPREDECESSOR_948=EDGE_PYTHON_C_QUOTING_FAILED_NO_MUTATION\nMUTATION_BOUNDARY=NONE_READ_ONLY\nEDGE_PARSE_OK=true\nKNOWN_HOSTS_PARSE_OK=true\nKNOWN_HOSTS_EXISTS=true\nEDGE_RCA_RC=0\nEDGE_MONITOR_RCA_BEGIN=true\nMONITOR_PRESENT=true\nMONITOR_SHA256=bf3a47cf3c53a4efa1f49322f96203a24b9077ea64547162e64c5d3d3326d0ff\nMONITOR_BYTES=25677\nMONITOR_LINES=645\nMONITOR_AST=PASS\nFUNCTION=utc_now|start=51|end=52\nFUNCTION=log|start=55|end=58\nFUNCTION=write_health|start=61|end=67\nFUNCTION=read_env|start=70|end=84\nFUNCTION=load_config|start=87|end=104\nFUNCTION=connect_db|start=107|end=139\nFUNCTION=meta_get|start=142|end=144\nFUNCTION=meta_set|start=147|end=149\nFUNCTION=event_sent|start=152|end=153\nFUNCTION=mark_event|start=156|end=161\nFUNCTION=cookie_jar_summary|start=164|end=238\nFUNCTION=fmt_ts|start=165|end=166\nFUNCTION=fetch_reports_page|start=241|end=287\nFUNCTION=login_required|start=289|end=299\nFUNCTION=strip_tags|start=302|end=305\nFUNCTION=full_url|start=308|end=309\nFUNCTION=section_positions|start=312|end=329\nFUNCTION=parse_int|start=332|end=334\nFUNCTION=parse_reports|start=337|end=395\nFUNCTION=title_needs_detail|start=398|end=401\nFUNCTION=extract_report_detail_title|start=403|end=414\nFUNCTION=fetch_report_detail_title|start=416|end=426\nFUNCTION=smtp_ready|start=428|end=429\nFUNCTION=send_mail|start=432|end=456\nFUNCTION=status_label|start=459|end=464\nFUNCTION=report_subject|start=467|end=473\nFUNCTION=report_body|start=476|end=488\nFUNCTION=process_reports|start=491|end=539\nFUNCTION=maybe_send_auth_required|start=542|end=562\nFUNCTION=acquire_lock|start=565|end=572\nFUNCTION=run_once|start=575|end=624\nFUNCTION=show_status|start=627|end=632\nFUNCTION=main|start=635|end=641\nRELEVANT_SOURCE_BEGIN\n0002:\"\"\"Skladchik XenForo reports monitor.\n0004:Polls /reports/, stores report state in SQLite, and sends SMTP notifications for:\n0005:- new open reports;\n0006:- reports that moved from open to resolved.\n0008:Uses only Python standard library. Authentication is via a browser Cookie header\n0009:stored in /etc/skladchik-reports-monitor/secrets.env as SKLADCHIK_COOKIE.\n0013:import argparse\n0029:import urllib.error\n0030:import urllib.parse\n0031:import urllib.request\n0035:APP = \"skladchik-reports-monitor\"\n0036:CONFIG_PATH = Path(\"/etc/skladchik-reports-monitor/config.ini\")\n0037:SECRETS_PATH = Path(\"/etc/skladchik-reports-monitor/secrets.env\")\n0038:BASE_DIR = Path(\"/var/lib/skladchik-reports-monitor\")\n0039:LOG_DIR = Path(\"/var/log/skladchik-reports-monitor\")\n0041:HEALTH_PATH = BASE_DIR / \"health.txt\"\n0042:COOKIE_JAR_PATH = BASE_DIR / \"cookies.jar\"\n0044:LOCK_PATH = Path(\"/run/skladchik-reports-monitor.lock\")\n0047:class MonitorError(Exception):\n0052: return dt.datetime.now(dt.UTC).replace(microsecond=0).isoformat().replace(\"+00:00\", \"Z\")\n0061:def write_health(status: str, **kv: Any) -> None:\n0063: lines = [f\"STATUS={status}\", f\"TS={utc_now()}\"]\n0067: HEALTH_PATH.write_text(\"\\n\".join(lines) + \"\\n\", encoding=\"utf-8\")\n0073: return data\n0084: return data\n0090: \"reports_url\": \"https://v32.skladchik.org/reports/\",\n0091: \"base_url\": \"https://az52.skladchik.org\",\n0093: \"user_agent\": \"Mozilla/5.0 SkladchikReportsMonitor/1.0\",\n0104: return cfg, read_env(SECRETS_PATH)\n0111: CREATE TABLE IF NOT EXISTS reports (\n0112: report_id TEXT PRIMARY KEY,\n0115: status TEXT NOT NULL,\n0116: report_count INTEGER,\n0127: report_id TEXT,\n0139: return con\n0144: return row[0] if row else None\n0153: return con.execute(\"SELECT 1 FROM events WHERE event_key=?\", (key,)).fetchone() is not None\n0156:def mark_event(con: sqlite3.Connection, key: str, report_id: str | None, event_type: str) -> None:\n0158: \"INSERT OR IGNORE INTO events(event_key,report_id,event_type,sent_at) VALUES(?,?,?,?)\",\n0159: (key, report_id, event_type, utc_now()),\n0164:def cookie_jar_summary() -> dict[str, str]:\n0166: return dt.datetime.fromtimestamp(epoch, dt.UTC).replace(microsecond=0).isoformat().replace(\"+00:00\", \"Z\")\n0169: \"session_keepalive\": \"persistent_cookie_jar\",\n0170: \"cookie_expiry_warning_days\": \"7\",\n0173: if not COOKIE_JAR_PATH.exists():\n0175: \"cookie_jar\": \"no\",\n0176: \"cookie_jar_bytes\": \"0\",\n0177: \"cookie_persistent_count\": \"0\",\n0178: \"cookie_session_count\": \"0\",\n0179: \"cookie_expiry_status\": \"NO_COOKIE_JAR\",\n0181: return summary\n0183: st = COOKIE_JAR_PATH.stat()\n0185: \"cookie_jar\": \"yes\" if st.st_size > 0 else \"empty\",\n0186: \"cookie_jar_bytes\": str(st.st_size),\n0187: \"cookie_jar_mtime\": fmt_ts(int(st.st_mtime)),\n0193: for raw in COOKIE_JAR_PATH.read_text(encoding=\"utf-8\", errors=\"replace\").splitlines():\n0195: if not line or line.startswith(\"#\") and not line.startswith(\"#HttpOnly_\"):\n0204: except ValueError:\n0211: summary[\"cookie_persistent_count\"] = str(len(persistent))\n0212: summary[\"cookie_session_count\"] = str(session_count)\n0218: \"cookie_expiry_utc\": fmt_ts(max_exp),\n0219: \"cookie_earliest_expiry_utc\": fmt_ts(min_exp),\n0220: \"cookie_expires_in_seconds\": str(left),\n0221: \"cookie_expires_in_days\": str(max(0, left) // 86400),\n0224: status = \"EXPIRED\"\n0226: status = \"WARN\"\n0228: status = \"OK\"\n0229: summary[\"cookie_expiry_status\"] = status\n0232: \"cookie_expires_in_seconds\": \"0\",\n0233: \"cookie_expires_in_days\": \"0\",\n0234: \"cookie_expiry_status\": \"NO_PERSISTENT_COOKIE\",\n0236: return summary\n0237: except Exception as e:\n0238: return {\"session_keepalive\": \"persistent_cookie_jar\", \"cookie_jar\": \"error\", \"cookie_jar_error\": repr(e), \"cookie_expiry_status\": \"ERROR\"}\n0241:def fetch_reports_page(cfg: configparser.ConfigParser, secrets: dict[str, str]) -> tuple[str, str]:\n0242: \"\"\"Fetch reports page with a persistent curl cookie jar.\n0244: This is the important part for \"no monthly relogin\": XenForo refreshes cookies during\n0245: normal authenticated requests. The monitor now keeps /var/lib/skladchik-reports-monitor/cookies.jar\n0246: and uses it on every 30-second poll, so Set-Cookie updates are preserved instead of being\n0249: url = cfg[\"forum\"].get(\"reports_url\", \"https://v32.skladchik.org/reports/\")\n0250: user_agent = cfg[\"forum\"].get(\"user_agent\", \"Mozilla/5.0 SkladchikReportsMonitor/1.0\")\n0251: initial_cookie = [REDACTED] or secrets.get(\"COOKIE\") or \"\"\n0255: if COOKIE_JAR_PATH.exists():\n0256: os.chmod(COOKIE_JAR_PATH, 0o600)\n0257: except Exception:\n0259: with tempfile.TemporaryDirectory(prefix=\"skladchik-reports-\") as tmp:\n0260: html_path = str(Path(tmp) / \"reports.html\")\n0261: if COOKIE_JAR_PATH.exists() and COOKIE_JAR_PATH.stat().st_size > 0:\n0262: cookie_source = str(COOKIE_JAR_PATH)\n0263: elif initial_cookie:\n0264: cookie_source = initial_cookie\n0266: cookie_source = \"\"\n0268: \"curl\", \"-4\", \"-sS\", \"-L\", \"--max-redirs\", \"12\", \"--http1.1\",\n0271: \"-b\", cookie_source,\n0272: \"-c\", str(COOKIE_JAR_PATH),\n0279: if COOKIE_JAR_PATH.exists():\n0280: os.chmod(COOKIE_JAR_PATH, 0o600)\n0281: except Exception:\n0284: raise MonitorError(f\"curl_failed rc={result.returncode} stderr={result.stderr[-500:]}\")\n0287: return final_url, body.decode(\"utf-8\", errors=\"replace\")\n0289:def login_required(final_url: str, text: str) -> bool:\n0292: return (\n0293: \"/login\" in lower_url\n0294: or \"name=\\\"login\\\"\" in lower\n0295: or \"name='login'\" in lower\n0298: or (\"войти\" in lower and \"пароль\" in lower and \"/reports\" not in lower_url)\n0305: return re.sub(r\"\\s+\", \" \", html_lib.unescape(fragment)).strip()\n0309: return urllib.parse.urljoin(base_url.rstrip(\"/\") + \"/\", href)\n0329: return open_pos, closed_pos\n0334: return int(match.group(1)) if match else None\n0337:def parse_reports(text: str, cfg: configparser.ConfigParser) -> list[dict[str, Any]]:\n0338: base_url = cfg[\"forum\"].get(\"base_url\", \"https://az52.skladchik.org\")\n0341: pattern = re.compile(r\"(?is)]*href=[\\\"']([^\\\"']*?reports/(\\d+)/?[^\\\"']*)[\\\"'][^>]*>(.*?)\")\n0343: href, report_id, title_html = match.group(1), match.group(2), match.group(3)\n0345: if not title or title.lower() in {\"жалобы\", \"reports\", \"обработанные жалобы\"}:\n0349: # XenForo reports are
  • .\n0374: if \"report-resolved\" in row_class:\n0375: status = \"resolved\"\n0376: elif \"report-open\" in row_class or \"report-assigned\" in row_class:\n0377: status = \"open\"\n0379: status = \"resolved\"\n0381: status = \"open\"\n0384: report_count = parse_int(r\"Жалоб[аы]?:\\s*(\\d+)\", row_text)\n0386: results[report_id] = {\n0387: \"report_id\": report_id,\n0390: \"status\": status,\n0391: \"report_count\": report_count,\n0395: return sorted(results.values(), key=lambda x: int(x[\"report_id\"]))\n0401: return (not value) or lower.startswith((\"сегодня в \", \"вчера в \")) or bool(re.fullmatch(r\"\\d{1,2}\\s+[A-Za-zА-Яа-яЁё.]+\\s+\\d{4}\\s+в\\s+\\d{1,2}:\\d{2}\", value, flags=re.I))\n0403:def extract_report_detail_title(text: str, fallback: str) -> str:\n0413: return candidate\n0414: return fallback\n0416:def fetch_report_detail_title(cfg: configparser.ConfigParser, auth: dict[str, str], url: str, fallback: str) -> str:\n0417: old_url = cfg[\"forum\"].get(\"reports_url\", \"\")\n0419: cfg[\"forum\"][\"reports_url\"] = url\n0420: _, detail_text = fetch_reports_page(cfg, auth)\n0421: return extract_report_detail_title(detail_text, fallback)\n0422: except Exception as exc:\n0424: return fallback\n0426: cfg[\"forum\"][\"reports_url\"] = old_url\n0429: return bool(secrets.get(\"SMTP_HOST\") and secrets.get(\"SMTP_TO\") and secrets.get(\"SMTP_FROM\"))\n0435: return False\n0454: server.login(user, smtp_pass)\n0456: return True\n0459:def status_label(status: str) -> str:\n0460: if status == \"open\":\n0461: return \"Открыта / в работе\"\n0462: if status == \"resolved\":\n0463: return \"Отработана / закрыта\"\n0464: return status\n0467:def report_subject(action: str, report: dict[str, Any], title_limit: int = 140) -> str:\n0468: \"\"\"Build a useful single-line subject containing report number and title.\"\"\"\n0469: report_id = str(report.get(\"report_id\") or \"без номера\")\n0470: title = re.sub(r\"\\s+\", \" \", str(report.get(\"title\") or \"Без названия\")).strip()\n0473: return f\"{action} №{report_id}: {title}\"\n0476:def report_body(prefix: str, report: dict[str, Any]) -> str:\n0477: report_count = report.get(\"report_count\")\n0478: comment_count = report.get(\"comment_count\")\n0479: return (\n0481: f\"Номер жалобы: {report['report_id']}\\n\"\n0482: f\"Название жалобы: {report['title']}\\n\"\n0483: f\"Статус: {status_label(str(report['status']))}\\n\"\n0484: f\"Количество жалоб: {report_count if report_count is not None else 'не указано'}\\n\"\n0486: f\"Ссылка: {report['url']}\\n\"\n0491:def process_reports(con: sqlite3.Connection, cfg: configparser.ConfigParser, secrets: dict[str, str], reports: list[dict[str, Any]]) -> tuple[int, int]:\n0496: for report in reports:\n0497: row = con.execute(\"SELECT status,title FROM reports WHERE report_id=?\", (report[\"report_id\"],)).fetchone()\n0498: if title_needs_detail(str(report.get(\"title\") or \"\")):\n0500: report[\"title\"] = str(row[1])\n0502: report[\"title\"] = fetch_report_detail_title(cfg, secrets, report[\"url\"], report[\"title\"])\n0505: \"INSERT INTO reports(report_id,url,title,status,report_count,comment_count,row_text,first_seen_at,last_seen_at,resolved_at) VALUES(?,?,?,?,?,?,?,?,?,?)\",\n0507: report[\"report_id\"], report[\"url\"], report[\"title\"], report[\"status\"], report.get(\"report_count\"),\n0508: report.get(\"comment_count\"), report.get(\"row_text\", \"\"), utc_now(), utc_now(),\n0509: utc_now() if report[\"status\"] == \"resolved\" else None,\n0514: if report[\"status\"] == \"open\":\n0515: key = \"new:\" + report[\"report_id\"]\n0517: if send_mail(cfg, secrets, report_subject(\"Новая жалоба\", report), report_body(\"Появилась новая жалоба на форуме.\", report)):\n0518: mark_event(con, key, report[\"report_id\"], \"new\")\n0521: old_status = row[0]\n0522: if old_status != \"resolved\" and report[\"status\"] == \"resolved\":\n0523: key = \"resolved:\" + report[\"report_id\"]\n0525: if send_mail(cfg, secrets, report_subject(\"Жалоба отработана\", report), report_body(\"Жалоба перешла в обработанные/закрытые.\", report)):\n0526: mark_event(con, key, report[\"report_id\"], \"resolved\")\n0529: \"UPDATE reports SET url=?, title=?, status=?, report_count=?, comment_count=?, row_text=?, last_seen_at=?, resolved_at=COALESCE(resolved_at, ?) WHERE report_id=?\",\n0531: report[\"url\"], report[\"title\"], report[\"status\"], report.get(\"report_count\"), report.get(\"comment_count\"),\n0532: report.get(\"row_text\", \"\"), utc_now(), utc_now() if report[\"status\"] == \"resolved\" else None,\n0533: report[\"report_id\"],\n0539: return new_events, resolved_events\n0542:def maybe_send_auth_required(con: sqlite3.Connection, cfg: configparser.ConfigParser, secrets: dict[str, str], final_url: str) -> None:\n0548: except ValueError:\n0555: \"Сессия форума истекла или cookie неверная.\\n\"\n0556: \"Обычно перелогин не нужен: монитор продлевает сессию постоянным cookie jar.\\n\"\n0570: return f\n0571: except BlockingIOError:\n0572: return None\n0575:def run_once() -> int:\n0579: write_health(\"LOCK_BUSY\", **cookie_jar_summary())\n0580: return 0\n0584: final_url, text = fetch_reports_page(cfg, secrets)\n0585: if login_required(final_url, text):\n0586: maybe_send_auth_required(con, cfg, secrets, final_url)\n0587: write_health(\"AUTH_REQUIRED\", url=final_url, **cookie_jar_summary())\n0588: return 2\n0589: reports = parse_reports(text, cfg)\n0590: if not reports:\n0591: write_health(\"ERROR\", reason=\"no_reports_parsed\", url=final_url, **cookie_jar_summary())\n0592: log(\"ERROR no reports parsed\")\n0593: return 1\n0594: new_events, resolved_events = process_reports(con, cfg, secrets, reports)\n0595: open_count = sum(1 for r in reports if r[\"status\"] == \"open\")\n0596: resolved_count = sum(1 for r in reports if r[\"status\"] == \"resolved\")\n0597: health_extra = cookie_jar_summary()\n0598: write_health(\n0601: reports=len(reports),\n0607: **health_extra,\n0609: log(f\"OK reports={len(reports)} open={open_count} resolved={resolved_count} new={new_events} done={resolved_events}\")\n0610: return 0\n0611: except urllib.error.HTTPError as e:\n0612: write_health(\"ERROR\", error=f\"HTTPError {e.code}\", **cookie_jar_summary())\n0613: log(f\"ERROR HTTPError {e.code}\")\n0614: return 1\n0615: except Exception as e:\n0616: write_health(\"ERROR\", error=repr(e), **cookie_jar_summary())\n0618: return 1\n0623: except Exception:\n0627:def show_status() -> int:\n0628: if HEALTH_PATH.exists():\n0629: print(HEALTH_PATH.read_text(encoding=\"utf-8\"), end=\"\")\n0631: print(\"STATUS=UNKNOWN\")\n0632: return 0\n0635:def main() -> int:\n0636: parser = argparse.ArgumentParser()\n0637: parser.add_argument(\"cmd\", choices=[\"run\", \"status\"], nargs=\"?\", default=\"run\")\n0639: if args.cmd == \"status\":\n0640: return show_status()\n0641: return run_once()\n0645: raise SystemExit(main())\nRELEVANT_SOURCE_END\nSOURCE_HAS_WT0=false\nSOURCE_HAS_NETBIRD=false\nSOURCE_HAS_IP_ROUTE=false\nHEALTH_BEGIN\nHEALTH_SHA256=fbd204bcba7d8b2514552a1548d8c1773381733641150a848b9a1ad0865011d7\nHEALTH_BYTES=506\nHEALTH_MTIME=1790167712\nSTATUS=ERROR\nTS=2026-09-23T12:48:32Z\nerror=MonitorError('curl_failed rc=28 stderr=curl: (28) Connection timed out after 15003 milliseconds\\n')\nsession_keepalive=persistent_cookie_jar\ncookie_expiry_warning_days=7\ncookie_jar=yes\ncookie_jar_bytes=364\ncookie_jar_mtime=2026-09-23T12:48:32Z\ncookie_persistent_count=1\ncookie_session_count=2\ncookie_expiry_utc=2026-09-29T16:47:21Z\ncookie_earliest_expiry_utc=2026-09-29T16:47:21Z\ncookie_expires_in_seconds=532729\ncookie_expires_in_days=6\ncookie_expiry_status=WARN\nHEALTH_END\nCONFIG_KEYS_BEGIN\nCONFIG_KEY=forum.reports_url\nCONFIG_KEY=forum.base_url\nCONFIG_KEY=forum.timeout_seconds\nCONFIG_KEY=forum.user_agent\nCONFIG_KEY=email.subject_prefix\nCONFIG_KEY=email.auth_notice_min_interval_seconds\nCONFIG_KEY=monitor.baseline_no_email\nCONFIG_KEYS_END\nSECRET_KEY_NAMES_BEGIN\nSECRET_KEY=SMTP_HOST\nSECRET_KEY=SMTP_PORT\nSECRET_KEY=SMTP_TLS\nSECRET_KEY=SMTP_USER\nSECRET_KEY=SMTP_PASS\nSECRET_KEY=SMTP_FROM\nSECRET_KEY=SMTP_TO\nSECRET_KEY=SKLADCHIK_COOKIE\nSECRET_KEY_NAMES_END\nUNIT_BEGIN\nUNIT_CAT_RC=0\n# /etc/systemd/system/skladchik-reports-monitor.service\n[Unit]\nDescription=Skladchik XenForo reports monitor\nWants=network-online.target\nAfter=network-online.target\n\n[Service]\nType=oneshot\nUser=root\nGroup=root\nExecStart=/usr/bin/python3 /opt/skladchik-reports-monitor/monitor.py run\nNice=10\nIOSchedulingClass=best-effort\nIOSchedulingPriority=7\nUNIT_END\nSERVICE_STATE_BEGIN\nTIMER_ENABLED=enabled|rc=0\nTIMER_ACTIVE=active|rc=0\nSERVICE_ACTIVE=failed|rc=3\nSERVICE_RESULT=exit-code|rc=0\nSERVICE_EXEC_STATUS=1|rc=0\nSERVICE_STATE_END\nJOURNAL_BEGIN\nJOURNAL_RC=0\nSep 23 15:25:14 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:25:29 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:25:29 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:25:29 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:25:45 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:26:00 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:26:00 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:26:00 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:26:16 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:26:31 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:26:31 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:26:31 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:27:09 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:27:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:27:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:27:25 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:27:40 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:27:55 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:27:55 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:27:55 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:28:11 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:28:26 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:28:26 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:28:26 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:28:42 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:28:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:28:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:28:57 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:29:13 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:29:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:29:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:29:28 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:29:44 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:29:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:29:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:29:59 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:30:15 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:30:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:30:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:30:30 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:30:46 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:31:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:31:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:31:01 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:31:17 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:31:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:31:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:31:32 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:31:48 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:32:03 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:32:03 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:32:03 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:32:19 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:32:34 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:32:34 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:32:34 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:32:50 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:33:05 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:33:05 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:33:05 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:33:21 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:33:36 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:33:36 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:33:36 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:33:52 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:34:07 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:34:07 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:34:07 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:34:22 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:34:37 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:34:37 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:34:37 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:34:53 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:35:08 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:35:08 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:35:08 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:35:24 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:35:39 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:35:39 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:35:39 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:35:55 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:36:10 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:36:10 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:36:10 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:36:26 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:36:41 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:36:41 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:36:41 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:36:57 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:37:12 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:37:12 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:37:12 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:37:28 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:37:43 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:37:43 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:37:43 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:37:59 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:38:14 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:38:14 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:38:14 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:38:30 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:38:45 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:38:45 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:38:45 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:39:01 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:39:16 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:39:16 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:39:16 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:39:32 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:39:47 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:39:47 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:39:47 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:40:02 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:40:17 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:40:17 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:40:17 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:40:33 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:40:48 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:40:48 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:40:48 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:41:04 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:41:19 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:41:19 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:41:19 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:41:35 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:41:50 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:41:50 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:41:50 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:42:06 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:42:21 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:42:21 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:42:21 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:42:37 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:42:52 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:42:52 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:42:52 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:43:08 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:43:23 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:43:23 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:43:23 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:43:39 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:43:54 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:43:54 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:43:54 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:44:10 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:44:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:44:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:44:25 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:44:41 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:44:56 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:44:56 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:44:56 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:45:12 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:45:27 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:45:27 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:45:27 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:45:42 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:45:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:45:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:45:57 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:46:13 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:46:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:46:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:46:28 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:46:44 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:46:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:46:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:46:59 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:47:15 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:47:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:47:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:47:30 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:47:46 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:48:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:48:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:48:01 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nSep 23 15:48:17 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor...\nSep 23 15:48:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE\nSep 23 15:48:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'.\nSep 23 15:48:32 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor.\nJOURNAL_END\nNETWORK_FACTS_BEGIN\nROUTE_RC=0\nROUTE=[PRIVATE_IP] via [PRIVATE_IP] dev eth0 src [PRIVATE_IP] uid 0 \nROUTE= cache \nLINK_RC=0\nLINK=wt0 UNKNOWN \nNETBIRD_STATUS_RC=0\nNETBIRD=Management: Disconnected, reason: rpc error: code = DeadlineExceeded desc = context deadline exceeded while waiting for connections to become ready\nNETBIRD=Signal: Disconnected, reason: rpc error: code = Unavailable desc = error reading from server: read tcp [PRIVATE_IP]:43380->[PRIVATE_IP]:443: read: connection timed out\nNETBIRD=Relays: 0/2 Available\nNETBIRD=NetBird IP: [PRIVATE_IP]/16\nNETBIRD=NetBird IPv6: [PRIVATE_IPV6]/64\nNETBIRD=Peers count: 3/11 Connected\nNETWORK_FACTS_END\nEDGE_MONITOR_RCA_END=true\nCHANGES_MADE_BY_949=false\nROLLBACK_STARTED=false\nROLLBACK_RESTORED=null\nHOMELAB_RESULT_CONTRACT={\"version\":1,\"command_id\":\"SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1\",\"status\":\"OK\",\"changes_made\":false,\"rollback_started\":false,\"rollback_restored\":null}\nSKLADCHIK949_END=true\n" } diff --git a/runtime/latest.txt b/runtime/latest.txt index 845d58fa..3c2a24dd 100644 --- a/runtime/latest.txt +++ b/runtime/latest.txt @@ -1,15 +1,15 @@ CHAT_OUTPUT_BEGIN -COMMAND_ID=SUPPORT-260923-SPB-TLS-BRIDGE-NPMPLUS-RUNTIME-RCA-9196R1 +COMMAND_ID=SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1 STATUS=OK RC=0 HOST=pve01 MODE=read-only -COMPONENT=spb-tls-bridge-npmplus-runtime-rca +COMPONENT=skladchik-monitor-rc1-exact-rca REFERENCE_REGISTER_CHECK=OK REFERENCE_SHA256=5a3d8e5154c41cb582a4e0aca68090be1f0138918bf82131a948df326f9d8d66 ERROR_REGISTER_CHECK=OK ERROR_REGISTER_SHA256=3b09a553ec0f527ed3afeed4753f52a74ee3036045bbfb3c685e9f8af4ba7ba0 -COMMAND_SHA256=ddb8ebb208b8194c670dbb45bda053cae7d0a615dc00c22ef8b7eb110a91ca2f +COMMAND_SHA256=f1244eee27a42e001f70047b3e75208f6e6e7537446cbb79923772284cfbb355 DUPLICATE_FAILED_COMMAND_BLOCKED=false EXECUTION_STARTED=true CHANGE_DECLARED=false @@ -24,22 +24,566 @@ MUTATION_OUTCOME=NO_MUTATION SANITIZED=yes SECRETS_INCLUDED=no PRIVATE_ADDRESSES_INCLUDED=no -RAW_EVIDENCE_SHA256=4b9b007c3d0a9273577ab848f1ac5a4c6bc925795eb52941a4ff505b2cc7abec -SANITIZED_OUTPUT_SHA256=4b9b007c3d0a9273577ab848f1ac5a4c6bc925795eb52941a4ff505b2cc7abec +RAW_EVIDENCE_SHA256=da731d0d3687f12e4894e8887244b97bd5d0742cfcefa8c54f5dad5b0d49430a +SANITIZED_OUTPUT_SHA256=2a6089fa90db67c2c3c7446a49aa9fdecd5f421461c1765c3f6c952eb95e65f8 OUTPUT_BEGIN -RCA9196_BEGIN=true -MUTATION_BOUNDARY=READ_ONLY_VM130_RUNTIME_RCA;NO_PRODUCTION_WRITE;NO_SPB_WRITE;NO_DNS_WRITE;NO_NGINX_RELOAD -VM130_QGA_TRANSPORT_RC=0 -VM130_QGA_STDERR_SHA16=e3b0c44298fc1c14 -VM130_QGA_EXITCODE=0 -VM130_GUEST_STDERR_SHA16=e3b0c44298fc1c14 -RCA9196={"baseline":{"nginx_test_rc":0,"stderr_sha16":"9cb221b6993277a1"},"classification":"LIVE_CONFIG_DIFFERS_FROM_IMAGE","container":{"cmd":null,"entrypoint":["tini","--","entrypoint.sh"],"env_count":12,"env_names":["ACME_PROFILE","AUTH_REQUEST_AUTHENTIK_UPSTREAM","COOKIE_SECRET","DISABLE_H3_QUIC","DISABLE_IPV6","INITIAL_ADMIN_EMAIL","INITIAL_ADMIN_PASSWORD","IPV4_BINDING","NODE_ENV","NPM_IPV4_BINDING","PATH","TZ"],"image_sha16":"d16df105013397a1","user":""},"diff":{"image_line18":" ssl_certificate ;","live_equals_image":false,"live_line18":" ssl_certificate /data/tls/dummycert.pem;"},"image":{"lines_1_35":[{"line":1,"text":"upstream npmplus {"},{"line":2,"text":" server unix:/run/npmplus.sock;"},{"line":3,"text":"}"},{"line":4,"text":""},{"line":5,"text":"server {"},{"line":6,"text":" server_name \"\";"},{"line":7,"text":" listen :81 ssl;"},{"line":8,"text":" listen [::]:81 ssl;"},{"line":9,"text":" ssl_reject_handshake on;"},{"line":10,"text":" return 444;"},{"line":11,"text":"}"},{"line":12,"text":""},{"line":13,"text":"server {"},{"line":14,"text":" listen :81 ssl bind reuseport deferred multipath so_keepalive=on default_server;"},{"line":15,"text":" listen [::]:81 ssl bind reuseport deferred multipath so_keepalive=on default_server;"},{"line":16,"text":""},{"line":17,"text":" server_name _;"},{"line":18,"text":" ssl_certificate ;"},{"line":19,"text":" ssl_certificate_key ;"},{"line":20,"text":" #ssl_stapling on;"},{"line":21,"text":" #ssl_stapling_verify on;"},{"line":22,"text":" #ssl_stapling_file ;"},{"line":23,"text":" #ssl_certificate_compression off;"},{"line":24,"text":""},{"line":25,"text":" if ($scheme = \"http\") {"},{"line":26,"text":" return 301 "},{"line":27,"text":" }"},{"line":28,"text":" if ($http_x_forwarded_proto = \"http\") {"},{"line":29,"text":" return 301 "},{"line":30,"text":" }"},{"line":31,"text":""},{"line":32,"text":" client_max_body_size 1m;"},{"line":33,"text":" more_set_headers \"X-Frame-Options: DENY\";"},{"line":34,"text":" more_set_headers \"Referrer-Policy: no-referrer\";"},{"line":35,"text":" more_set_headers \"Cross-Origin-Opener-Policy: same-origin\";"}],"rc":0,"sha16":"cfaf1d6ee20a39b1","size":3673,"stderr_safe":[],"stderr_sha16":"e3b0c44298fc1c14"},"live":{"lines_1_35":[{"line":1,"text":"upstream npmplus {"},{"line":2,"text":" server unix:/run/npmplus.sock;"},{"line":3,"text":"}"},{"line":4,"text":""},{"line":5,"text":"server {"},{"line":6,"text":" server_name \"\";"},{"line":7,"text":" listen :81 ssl;"},{"line":8,"text":" #listen [::]:81 ssl;"},{"line":9,"text":" ssl_reject_handshake on;"},{"line":10,"text":" return 444;"},{"line":11,"text":"}"},{"line":12,"text":""},{"line":13,"text":"server {"},{"line":14,"text":" listen :81 ssl bind reuseport deferred so_keepalive=on default_server;"},{"line":15,"text":" #listen [::]:81 ssl bind reuseport deferred so_keepalive=on default_server;"},{"line":16,"text":""},{"line":17,"text":" server_name _;"},{"line":18,"text":" ssl_certificate /data/tls/dummycert.pem;"},{"line":19,"text":" ssl_certificate_key /data/tls/dummykey.pem;"},{"line":20,"text":" #ssl_stapling on;"},{"line":21,"text":" #ssl_stapling_verify on;"},{"line":22,"text":" #ssl_stapling_file ;"},{"line":23,"text":" #ssl_certificate_compression off;"},{"line":24,"text":""},{"line":25,"text":" if ($scheme = \"http\") {"},{"line":26,"text":" return 301 "},{"line":27,"text":" }"},{"line":28,"text":" if ($http_x_forwarded_proto = \"http\") {"},{"line":29,"text":" return 301 "},{"line":30,"text":" }"},{"line":31,"text":""},{"line":32,"text":" client_max_body_size 1m;"},{"line":33,"text":" more_set_headers \"X-Frame-Options: DENY\";"},{"line":34,"text":" more_set_headers \"Referrer-Policy: no-referrer\";"},{"line":35,"text":" more_set_headers \"Cross-Origin-Opener-Policy: same-origin\";"}],"rc":0,"sha16":"507fa874e9632e71","size":3704,"stderr_sha16":"e3b0c44298fc1c14"},"same_env_direct_nginx":{"rc":1,"stderr_safe":["nginx: [emerg] open() \"/data/custom_nginx/root.conf\" failed (2: No such file or directory) in /usr/local/nginx/conf/nginx.conf:20","nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed"],"stderr_sha16":"ae9c0a07f6c00888"}} -RCA9196_CLASSIFICATION=LIVE_CONFIG_DIFFERS_FROM_IMAGE -TASK_COMPLETE=true -TASK_RESULT=PASS_SPB_TLS_BRIDGE_NPMPLUS_RUNTIME_RCA -DECISION=READ_EXACT_9196_THEN_BUILD_RUNTIME_FAITHFUL_NGINX_TEST -NEXT_GATE=EXACT_9196_LIVE_VS_IMAGE_NPMPLUS_CONF -HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260923-SPB-TLS-BRIDGE-NPMPLUS-RUNTIME-RCA-9196R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} +SKLADCHIK949_BEGIN=true +COMMAND_ID=SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1 +MODE=read-only +COMPONENT=skladchik-monitor-rc1-exact-rca +PREDECESSOR_948=EDGE_PYTHON_C_QUOTING_FAILED_NO_MUTATION +MUTATION_BOUNDARY=NONE_READ_ONLY +EDGE_PARSE_OK=true +KNOWN_HOSTS_PARSE_OK=true +KNOWN_HOSTS_EXISTS=true +EDGE_RCA_RC=0 +EDGE_MONITOR_RCA_BEGIN=true +MONITOR_PRESENT=true +MONITOR_SHA256=bf3a47cf3c53a4efa1f49322f96203a24b9077ea64547162e64c5d3d3326d0ff +MONITOR_BYTES=25677 +MONITOR_LINES=645 +MONITOR_AST=PASS +FUNCTION=utc_now|start=51|end=52 +FUNCTION=log|start=55|end=58 +FUNCTION=write_health|start=61|end=67 +FUNCTION=read_env|start=70|end=84 +FUNCTION=load_config|start=87|end=104 +FUNCTION=connect_db|start=107|end=139 +FUNCTION=meta_get|start=142|end=144 +FUNCTION=meta_set|start=147|end=149 +FUNCTION=event_sent|start=152|end=153 +FUNCTION=mark_event|start=156|end=161 +FUNCTION=cookie_jar_summary|start=164|end=238 +FUNCTION=fmt_ts|start=165|end=166 +FUNCTION=fetch_reports_page|start=241|end=287 +FUNCTION=login_required|start=289|end=299 +FUNCTION=strip_tags|start=302|end=305 +FUNCTION=full_url|start=308|end=309 +FUNCTION=section_positions|start=312|end=329 +FUNCTION=parse_int|start=332|end=334 +FUNCTION=parse_reports|start=337|end=395 +FUNCTION=title_needs_detail|start=398|end=401 +FUNCTION=extract_report_detail_title|start=403|end=414 +FUNCTION=fetch_report_detail_title|start=416|end=426 +FUNCTION=smtp_ready|start=428|end=429 +FUNCTION=send_mail|start=432|end=456 +FUNCTION=status_label|start=459|end=464 +FUNCTION=report_subject|start=467|end=473 +FUNCTION=report_body|start=476|end=488 +FUNCTION=process_reports|start=491|end=539 +FUNCTION=maybe_send_auth_required|start=542|end=562 +FUNCTION=acquire_lock|start=565|end=572 +FUNCTION=run_once|start=575|end=624 +FUNCTION=show_status|start=627|end=632 +FUNCTION=main|start=635|end=641 +RELEVANT_SOURCE_BEGIN +0002:"""Skladchik XenForo reports monitor. +0004:Polls /reports/, stores report state in SQLite, and sends SMTP notifications for: +0005:- new open reports; +0006:- reports that moved from open to resolved. +0008:Uses only Python standard library. Authentication is via a browser Cookie header +0009:stored in /etc/skladchik-reports-monitor/secrets.env as SKLADCHIK_COOKIE. +0013:import argparse +0029:import urllib.error +0030:import urllib.parse +0031:import urllib.request +0035:APP = "skladchik-reports-monitor" +0036:CONFIG_PATH = Path("/etc/skladchik-reports-monitor/config.ini") +0037:SECRETS_PATH = Path("/etc/skladchik-reports-monitor/secrets.env") +0038:BASE_DIR = Path("/var/lib/skladchik-reports-monitor") +0039:LOG_DIR = Path("/var/log/skladchik-reports-monitor") +0041:HEALTH_PATH = BASE_DIR / "health.txt" +0042:COOKIE_JAR_PATH = BASE_DIR / "cookies.jar" +0044:LOCK_PATH = Path("/run/skladchik-reports-monitor.lock") +0047:class MonitorError(Exception): +0052: return dt.datetime.now(dt.UTC).replace(microsecond=0).isoformat().replace("+00:00", "Z") +0061:def write_health(status: str, **kv: Any) -> None: +0063: lines = [f"STATUS={status}", f"TS={utc_now()}"] +0067: HEALTH_PATH.write_text("\n".join(lines) + "\n", encoding="utf-8") +0073: return data +0084: return data +0090: "reports_url": "https://v32.skladchik.org/reports/", +0091: "base_url": "https://az52.skladchik.org", +0093: "user_agent": "Mozilla/5.0 SkladchikReportsMonitor/1.0", +0104: return cfg, read_env(SECRETS_PATH) +0111: CREATE TABLE IF NOT EXISTS reports ( +0112: report_id TEXT PRIMARY KEY, +0115: status TEXT NOT NULL, +0116: report_count INTEGER, +0127: report_id TEXT, +0139: return con +0144: return row[0] if row else None +0153: return con.execute("SELECT 1 FROM events WHERE event_key=?", (key,)).fetchone() is not None +0156:def mark_event(con: sqlite3.Connection, key: str, report_id: str | None, event_type: str) -> None: +0158: "INSERT OR IGNORE INTO events(event_key,report_id,event_type,sent_at) VALUES(?,?,?,?)", +0159: (key, report_id, event_type, utc_now()), +0164:def cookie_jar_summary() -> dict[str, str]: +0166: return dt.datetime.fromtimestamp(epoch, dt.UTC).replace(microsecond=0).isoformat().replace("+00:00", "Z") +0169: "session_keepalive": "persistent_cookie_jar", +0170: "cookie_expiry_warning_days": "7", +0173: if not COOKIE_JAR_PATH.exists(): +0175: "cookie_jar": "no", +0176: "cookie_jar_bytes": "0", +0177: "cookie_persistent_count": "0", +0178: "cookie_session_count": "0", +0179: "cookie_expiry_status": "NO_COOKIE_JAR", +0181: return summary +0183: st = COOKIE_JAR_PATH.stat() +0185: "cookie_jar": "yes" if st.st_size > 0 else "empty", +0186: "cookie_jar_bytes": str(st.st_size), +0187: "cookie_jar_mtime": fmt_ts(int(st.st_mtime)), +0193: for raw in COOKIE_JAR_PATH.read_text(encoding="utf-8", errors="replace").splitlines(): +0195: if not line or line.startswith("#") and not line.startswith("#HttpOnly_"): +0204: except ValueError: +0211: summary["cookie_persistent_count"] = str(len(persistent)) +0212: summary["cookie_session_count"] = str(session_count) +0218: "cookie_expiry_utc": fmt_ts(max_exp), +0219: "cookie_earliest_expiry_utc": fmt_ts(min_exp), +0220: "cookie_expires_in_seconds": str(left), +0221: "cookie_expires_in_days": str(max(0, left) // 86400), +0224: status = "EXPIRED" +0226: status = "WARN" +0228: status = "OK" +0229: summary["cookie_expiry_status"] = status +0232: "cookie_expires_in_seconds": "0", +0233: "cookie_expires_in_days": "0", +0234: "cookie_expiry_status": "NO_PERSISTENT_COOKIE", +0236: return summary +0237: except Exception as e: +0238: return {"session_keepalive": "persistent_cookie_jar", "cookie_jar": "error", "cookie_jar_error": repr(e), "cookie_expiry_status": "ERROR"} +0241:def fetch_reports_page(cfg: configparser.ConfigParser, secrets: dict[str, str]) -> tuple[str, str]: +0242: """Fetch reports page with a persistent curl cookie jar. +0244: This is the important part for "no monthly relogin": XenForo refreshes cookies during +0245: normal authenticated requests. The monitor now keeps /var/lib/skladchik-reports-monitor/cookies.jar +0246: and uses it on every 30-second poll, so Set-Cookie updates are preserved instead of being +0249: url = cfg["forum"].get("reports_url", "https://v32.skladchik.org/reports/") +0250: user_agent = cfg["forum"].get("user_agent", "Mozilla/5.0 SkladchikReportsMonitor/1.0") +0251: initial_cookie = [REDACTED] or secrets.get("COOKIE") or "" +0255: if COOKIE_JAR_PATH.exists(): +0256: os.chmod(COOKIE_JAR_PATH, 0o600) +0257: except Exception: +0259: with tempfile.TemporaryDirectory(prefix="skladchik-reports-") as tmp: +0260: html_path = str(Path(tmp) / "reports.html") +0261: if COOKIE_JAR_PATH.exists() and COOKIE_JAR_PATH.stat().st_size > 0: +0262: cookie_source = str(COOKIE_JAR_PATH) +0263: elif initial_cookie: +0264: cookie_source = initial_cookie +0266: cookie_source = "" +0268: "curl", "-4", "-sS", "-L", "--max-redirs", "12", "--http1.1", +0271: "-b", cookie_source, +0272: "-c", str(COOKIE_JAR_PATH), +0279: if COOKIE_JAR_PATH.exists(): +0280: os.chmod(COOKIE_JAR_PATH, 0o600) +0281: except Exception: +0284: raise MonitorError(f"curl_failed rc={result.returncode} stderr={result.stderr[-500:]}") +0287: return final_url, body.decode("utf-8", errors="replace") +0289:def login_required(final_url: str, text: str) -> bool: +0292: return ( +0293: "/login" in lower_url +0294: or "name=\"login\"" in lower +0295: or "name='login'" in lower +0298: or ("войти" in lower and "пароль" in lower and "/reports" not in lower_url) +0305: return re.sub(r"\s+", " ", html_lib.unescape(fragment)).strip() +0309: return urllib.parse.urljoin(base_url.rstrip("/") + "/", href) +0329: return open_pos, closed_pos +0334: return int(match.group(1)) if match else None +0337:def parse_reports(text: str, cfg: configparser.ConfigParser) -> list[dict[str, Any]]: +0338: base_url = cfg["forum"].get("base_url", "https://az52.skladchik.org") +0341: pattern = re.compile(r"(?is)]*href=[\"']([^\"']*?reports/(\d+)/?[^\"']*)[\"'][^>]*>(.*?)") +0343: href, report_id, title_html = match.group(1), match.group(2), match.group(3) +0345: if not title or title.lower() in {"жалобы", "reports", "обработанные жалобы"}: +0349: # XenForo reports are
  • . +0374: if "report-resolved" in row_class: +0375: status = "resolved" +0376: elif "report-open" in row_class or "report-assigned" in row_class: +0377: status = "open" +0379: status = "resolved" +0381: status = "open" +0384: report_count = parse_int(r"Жалоб[аы]?:\s*(\d+)", row_text) +0386: results[report_id] = { +0387: "report_id": report_id, +0390: "status": status, +0391: "report_count": report_count, +0395: return sorted(results.values(), key=lambda x: int(x["report_id"])) +0401: return (not value) or lower.startswith(("сегодня в ", "вчера в ")) or bool(re.fullmatch(r"\d{1,2}\s+[A-Za-zА-Яа-яЁё.]+\s+\d{4}\s+в\s+\d{1,2}:\d{2}", value, flags=re.I)) +0403:def extract_report_detail_title(text: str, fallback: str) -> str: +0413: return candidate +0414: return fallback +0416:def fetch_report_detail_title(cfg: configparser.ConfigParser, auth: dict[str, str], url: str, fallback: str) -> str: +0417: old_url = cfg["forum"].get("reports_url", "") +0419: cfg["forum"]["reports_url"] = url +0420: _, detail_text = fetch_reports_page(cfg, auth) +0421: return extract_report_detail_title(detail_text, fallback) +0422: except Exception as exc: +0424: return fallback +0426: cfg["forum"]["reports_url"] = old_url +0429: return bool(secrets.get("SMTP_HOST") and secrets.get("SMTP_TO") and secrets.get("SMTP_FROM")) +0435: return False +0454: server.login(user, smtp_pass) +0456: return True +0459:def status_label(status: str) -> str: +0460: if status == "open": +0461: return "Открыта / в работе" +0462: if status == "resolved": +0463: return "Отработана / закрыта" +0464: return status +0467:def report_subject(action: str, report: dict[str, Any], title_limit: int = 140) -> str: +0468: """Build a useful single-line subject containing report number and title.""" +0469: report_id = str(report.get("report_id") or "без номера") +0470: title = re.sub(r"\s+", " ", str(report.get("title") or "Без названия")).strip() +0473: return f"{action} №{report_id}: {title}" +0476:def report_body(prefix: str, report: dict[str, Any]) -> str: +0477: report_count = report.get("report_count") +0478: comment_count = report.get("comment_count") +0479: return ( +0481: f"Номер жалобы: {report['report_id']}\n" +0482: f"Название жалобы: {report['title']}\n" +0483: f"Статус: {status_label(str(report['status']))}\n" +0484: f"Количество жалоб: {report_count if report_count is not None else 'не указано'}\n" +0486: f"Ссылка: {report['url']}\n" +0491:def process_reports(con: sqlite3.Connection, cfg: configparser.ConfigParser, secrets: dict[str, str], reports: list[dict[str, Any]]) -> tuple[int, int]: +0496: for report in reports: +0497: row = con.execute("SELECT status,title FROM reports WHERE report_id=?", (report["report_id"],)).fetchone() +0498: if title_needs_detail(str(report.get("title") or "")): +0500: report["title"] = str(row[1]) +0502: report["title"] = fetch_report_detail_title(cfg, secrets, report["url"], report["title"]) +0505: "INSERT INTO reports(report_id,url,title,status,report_count,comment_count,row_text,first_seen_at,last_seen_at,resolved_at) VALUES(?,?,?,?,?,?,?,?,?,?)", +0507: report["report_id"], report["url"], report["title"], report["status"], report.get("report_count"), +0508: report.get("comment_count"), report.get("row_text", ""), utc_now(), utc_now(), +0509: utc_now() if report["status"] == "resolved" else None, +0514: if report["status"] == "open": +0515: key = "new:" + report["report_id"] +0517: if send_mail(cfg, secrets, report_subject("Новая жалоба", report), report_body("Появилась новая жалоба на форуме.", report)): +0518: mark_event(con, key, report["report_id"], "new") +0521: old_status = row[0] +0522: if old_status != "resolved" and report["status"] == "resolved": +0523: key = "resolved:" + report["report_id"] +0525: if send_mail(cfg, secrets, report_subject("Жалоба отработана", report), report_body("Жалоба перешла в обработанные/закрытые.", report)): +0526: mark_event(con, key, report["report_id"], "resolved") +0529: "UPDATE reports SET url=?, title=?, status=?, report_count=?, comment_count=?, row_text=?, last_seen_at=?, resolved_at=COALESCE(resolved_at, ?) WHERE report_id=?", +0531: report["url"], report["title"], report["status"], report.get("report_count"), report.get("comment_count"), +0532: report.get("row_text", ""), utc_now(), utc_now() if report["status"] == "resolved" else None, +0533: report["report_id"], +0539: return new_events, resolved_events +0542:def maybe_send_auth_required(con: sqlite3.Connection, cfg: configparser.ConfigParser, secrets: dict[str, str], final_url: str) -> None: +0548: except ValueError: +0555: "Сессия форума истекла или cookie неверная.\n" +0556: "Обычно перелогин не нужен: монитор продлевает сессию постоянным cookie jar.\n" +0570: return f +0571: except BlockingIOError: +0572: return None +0575:def run_once() -> int: +0579: write_health("LOCK_BUSY", **cookie_jar_summary()) +0580: return 0 +0584: final_url, text = fetch_reports_page(cfg, secrets) +0585: if login_required(final_url, text): +0586: maybe_send_auth_required(con, cfg, secrets, final_url) +0587: write_health("AUTH_REQUIRED", url=final_url, **cookie_jar_summary()) +0588: return 2 +0589: reports = parse_reports(text, cfg) +0590: if not reports: +0591: write_health("ERROR", reason="no_reports_parsed", url=final_url, **cookie_jar_summary()) +0592: log("ERROR no reports parsed") +0593: return 1 +0594: new_events, resolved_events = process_reports(con, cfg, secrets, reports) +0595: open_count = sum(1 for r in reports if r["status"] == "open") +0596: resolved_count = sum(1 for r in reports if r["status"] == "resolved") +0597: health_extra = cookie_jar_summary() +0598: write_health( +0601: reports=len(reports), +0607: **health_extra, +0609: log(f"OK reports={len(reports)} open={open_count} resolved={resolved_count} new={new_events} done={resolved_events}") +0610: return 0 +0611: except urllib.error.HTTPError as e: +0612: write_health("ERROR", error=f"HTTPError {e.code}", **cookie_jar_summary()) +0613: log(f"ERROR HTTPError {e.code}") +0614: return 1 +0615: except Exception as e: +0616: write_health("ERROR", error=repr(e), **cookie_jar_summary()) +0618: return 1 +0623: except Exception: +0627:def show_status() -> int: +0628: if HEALTH_PATH.exists(): +0629: print(HEALTH_PATH.read_text(encoding="utf-8"), end="") +0631: print("STATUS=UNKNOWN") +0632: return 0 +0635:def main() -> int: +0636: parser = argparse.ArgumentParser() +0637: parser.add_argument("cmd", choices=["run", "status"], nargs="?", default="run") +0639: if args.cmd == "status": +0640: return show_status() +0641: return run_once() +0645: raise SystemExit(main()) +RELEVANT_SOURCE_END +SOURCE_HAS_WT0=false +SOURCE_HAS_NETBIRD=false +SOURCE_HAS_IP_ROUTE=false +HEALTH_BEGIN +HEALTH_SHA256=fbd204bcba7d8b2514552a1548d8c1773381733641150a848b9a1ad0865011d7 +HEALTH_BYTES=506 +HEALTH_MTIME=1790167712 +STATUS=ERROR +TS=2026-09-23T12:48:32Z +error=MonitorError('curl_failed rc=28 stderr=curl: (28) Connection timed out after 15003 milliseconds\n') +session_keepalive=persistent_cookie_jar +cookie_expiry_warning_days=7 +cookie_jar=yes +cookie_jar_bytes=364 +cookie_jar_mtime=2026-09-23T12:48:32Z +cookie_persistent_count=1 +cookie_session_count=2 +cookie_expiry_utc=2026-09-29T16:47:21Z +cookie_earliest_expiry_utc=2026-09-29T16:47:21Z +cookie_expires_in_seconds=532729 +cookie_expires_in_days=6 +cookie_expiry_status=WARN +HEALTH_END +CONFIG_KEYS_BEGIN +CONFIG_KEY=forum.reports_url +CONFIG_KEY=forum.base_url +CONFIG_KEY=forum.timeout_seconds +CONFIG_KEY=forum.user_agent +CONFIG_KEY=email.subject_prefix +CONFIG_KEY=email.auth_notice_min_interval_seconds +CONFIG_KEY=monitor.baseline_no_email +CONFIG_KEYS_END +SECRET_KEY_NAMES_BEGIN +SECRET_KEY=SMTP_HOST +SECRET_KEY=SMTP_PORT +SECRET_KEY=SMTP_TLS +SECRET_KEY=SMTP_USER +SECRET_KEY=SMTP_PASS +SECRET_KEY=SMTP_FROM +SECRET_KEY=SMTP_TO +SECRET_KEY=SKLADCHIK_COOKIE +SECRET_KEY_NAMES_END +UNIT_BEGIN +UNIT_CAT_RC=0 +# /etc/systemd/system/skladchik-reports-monitor.service +[Unit] +Description=Skladchik XenForo reports monitor +Wants=network-online.target +After=network-online.target + +[Service] +Type=oneshot +User=root +Group=root +ExecStart=/usr/bin/python3 /opt/skladchik-reports-monitor/monitor.py run +Nice=10 +IOSchedulingClass=best-effort +IOSchedulingPriority=7 +UNIT_END +SERVICE_STATE_BEGIN +TIMER_ENABLED=enabled|rc=0 +TIMER_ACTIVE=active|rc=0 +SERVICE_ACTIVE=failed|rc=3 +SERVICE_RESULT=exit-code|rc=0 +SERVICE_EXEC_STATUS=1|rc=0 +SERVICE_STATE_END +JOURNAL_BEGIN +JOURNAL_RC=0 +Sep 23 15:25:14 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:25:29 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:25:29 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:25:29 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:25:45 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:26:00 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:26:00 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:26:00 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:26:16 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:26:31 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:26:31 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:26:31 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:27:09 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:27:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:27:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:27:25 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:27:40 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:27:55 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:27:55 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:27:55 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:28:11 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:28:26 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:28:26 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:28:26 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:28:42 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:28:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:28:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:28:57 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:29:13 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:29:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:29:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:29:28 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:29:44 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:29:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:29:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:29:59 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:30:15 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:30:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:30:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:30:30 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:30:46 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:31:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:31:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:31:01 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:31:17 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:31:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:31:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:31:32 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:31:48 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:32:03 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:32:03 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:32:03 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:32:19 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:32:34 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:32:34 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:32:34 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:32:50 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:33:05 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:33:05 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:33:05 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:33:21 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:33:36 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:33:36 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:33:36 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:33:52 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:34:07 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:34:07 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:34:07 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:34:22 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:34:37 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:34:37 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:34:37 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:34:53 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:35:08 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:35:08 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:35:08 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:35:24 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:35:39 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:35:39 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:35:39 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:35:55 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:36:10 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:36:10 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:36:10 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:36:26 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:36:41 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:36:41 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:36:41 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:36:57 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:37:12 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:37:12 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:37:12 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:37:28 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:37:43 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:37:43 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:37:43 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:37:59 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:38:14 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:38:14 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:38:14 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:38:30 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:38:45 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:38:45 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:38:45 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:39:01 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:39:16 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:39:16 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:39:16 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:39:32 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:39:47 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:39:47 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:39:47 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:40:02 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:40:17 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:40:17 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:40:17 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:40:33 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:40:48 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:40:48 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:40:48 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:41:04 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:41:19 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:41:19 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:41:19 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:41:35 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:41:50 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:41:50 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:41:50 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:42:06 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:42:21 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:42:21 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:42:21 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:42:37 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:42:52 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:42:52 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:42:52 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:43:08 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:43:23 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:43:23 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:43:23 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:43:39 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:43:54 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:43:54 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:43:54 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:44:10 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:44:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:44:25 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:44:25 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:44:41 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:44:56 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:44:56 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:44:56 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:45:12 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:45:27 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:45:27 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:45:27 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:45:42 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:45:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:45:57 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:45:57 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:46:13 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:46:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:46:28 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:46:28 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:46:44 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:46:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:46:59 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:46:59 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:47:15 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:47:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:47:30 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:47:30 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:47:46 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:48:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:48:01 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:48:01 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +Sep 23 15:48:17 edge-vm systemd[1]: Starting skladchik-reports-monitor.service - Skladchik XenForo reports monitor... +Sep 23 15:48:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Main process exited, code=exited, status=1/FAILURE +Sep 23 15:48:32 edge-vm systemd[1]: skladchik-reports-monitor.service: Failed with result 'exit-code'. +Sep 23 15:48:32 edge-vm systemd[1]: Failed to start skladchik-reports-monitor.service - Skladchik XenForo reports monitor. +JOURNAL_END +NETWORK_FACTS_BEGIN +ROUTE_RC=0 +ROUTE=[PRIVATE_IP] via [PRIVATE_IP] dev eth0 src [PRIVATE_IP] uid 0 +ROUTE= cache +LINK_RC=0 +LINK=wt0 UNKNOWN +NETBIRD_STATUS_RC=0 +NETBIRD=Management: Disconnected, reason: rpc error: code = DeadlineExceeded desc = context deadline exceeded while waiting for connections to become ready +NETBIRD=Signal: Disconnected, reason: rpc error: code = Unavailable desc = error reading from server: read tcp [PRIVATE_IP]:43380->[PRIVATE_IP]:443: read: connection timed out +NETBIRD=Relays: 0/2 Available +NETBIRD=NetBird IP: [PRIVATE_IP]/16 +NETBIRD=NetBird IPv6: [PRIVATE_IPV6]/64 +NETBIRD=Peers count: 3/11 Connected +NETWORK_FACTS_END +EDGE_MONITOR_RCA_END=true +CHANGES_MADE_BY_949=false +ROLLBACK_STARTED=false +ROLLBACK_RESTORED=null +HOMELAB_RESULT_CONTRACT={"version":1,"command_id":"SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1","status":"OK","changes_made":false,"rollback_started":false,"rollback_restored":null} +SKLADCHIK949_END=true OUTPUT_END CHAT_OUTPUT_END