runtime: publish SUPPORT-260923-SKLADCHIK-MONITOR-RC1-EXACT-RCA-949R1
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -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)<a\b[^>]*href=[\"']([^\"']*?reports/(\d+)/?[^\"']*)[\"'][^>]*>(.*?)</a>")
|
||||
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 <li id="report-123" class="... report-open/report-assigned/report-resolved">.
|
||||
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 <POINTOPOINT,NOARP,UP,LOWER_UP>
|
||||
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
|
||||
+8
-8
File diff suppressed because one or more lines are too long
+562
-18
@@ -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 <IP_REDACTED>: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 <IP_REDACTED>: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 <URL_REDACTED>"},{"line":27,"text":" }"},{"line":28,"text":" if ($http_x_forwarded_proto = \"http\") {"},{"line":29,"text":" return 301 <URL_REDACTED>"},{"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 <IP_REDACTED>: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 <IP_REDACTED>: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 <URL_REDACTED>"},{"line":27,"text":" }"},{"line":28,"text":" if ($http_x_forwarded_proto = \"http\") {"},{"line":29,"text":" return 301 <URL_REDACTED>"},{"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)<a\b[^>]*href=[\"']([^\"']*?reports/(\d+)/?[^\"']*)[\"'][^>]*>(.*?)</a>")
|
||||
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 <li id="report-123" class="... report-open/report-assigned/report-resolved">.
|
||||
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 <POINTOPOINT,NOARP,UP,LOWER_UP>
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user