#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ ОЦЕНКА УЩЕРБА от `find / -name 'core.*' -delete`. Шаблон предназначался для аварийных дампов `core.1234`, но совпадает и с `core.py`, `core.pyc`, `core.js` — то есть с обычными файлами модулей. Удалено 76 файлов, и часть из них были не дампами. Ищем пакеты, где `__init__.py` ссылается на `.core`, а самого `core.py` нет. Только чтение. """ import os, re, subprocess def sh(c, t=180): try: r = subprocess.run(c, shell=True, capture_output=True, text=True, timeout=t) return (r.stdout or "").strip() except Exception: return "" print("=== ПАКЕТЫ, ГДЕ core.py ПРОПАЛ ===") roots = ["/usr/lib/python3", "/usr/lib/python3.11", "/usr/local/lib", "/usr/lib/google-cloud-sdk", "/opt"] broken = [] for root in roots: if not os.path.isdir(root): continue out = sh(f"grep -rl 'from .core import' {root} --include=__init__.py 2>/dev/null | head -60") for init in out.splitlines(): d = os.path.dirname(init) if not os.path.exists(os.path.join(d, "core.py")): broken.append(d) for d in sorted(set(broken)): print(f" ❌ {d}") print(f"\nвсего пострадавших пакетов: {len(set(broken))}") print("\n=== ДРУГИЕ ПРОПАВШИЕ core.* (по ссылкам в коде) ===") out = sh("grep -rlE 'from [.]core import|from [a-z_]+[.]core import' /usr/lib/python3 " "/usr/lib/google-cloud-sdk --include=*.py 2>/dev/null | head -40") missing = set() for f in out.splitlines(): d = os.path.dirname(f) if not os.path.exists(os.path.join(d, "core.py")) and os.path.exists(os.path.join(d, "__init__.py")): missing.add(d) for d in sorted(missing - set(broken)): print(f" ⚠️ {d}") print("\n=== ЧТО РАБОТАЕТ, ЧТО НЕТ ===") checks = [ ("gcloud storage", "gcloud storage ls gs:// 2>&1 | tail -1"), ("gsutil", "gsutil version 2>&1 | tail -1"), ("pip3", "pip3 --version 2>&1 | tail -1"), ("python3 requests", "python3 -c 'import requests; print(requests.__version__)' 2>&1 | tail -1"), ("python3 psycopg2", "python3 -c 'import psycopg2; print(\"ok\")' 2>&1 | tail -1"), ("python3 urllib3", "python3 -c 'import urllib3; print(\"ok\")' 2>&1 | tail -1"), ] for name, cmd in checks: r = sh(cmd)[:64] bad = "Error" in r or "error" in r or "Traceback" in r or not r print(f" {'❌' if bad else '✅'} {name:20} {r}") print("\n=== ТОРГОВЫЕ СЕРВИСЫ ===") print(sh("systemctl list-units --type=service --state=running --no-legend --no-pager | " "grep -cE 'arena|grid|arb|caddy|postgres|grafana'") + " живых профильных сервисов") print(sh("systemctl list-units --state=failed --no-legend --no-pager | wc -l") + " упавших") print(sh("ps aux | grep -c '[p]aper_grid_bot.py'") + " грид-ботов")