#!/bin/bash # Проверка стенда «Свой среди чужих». Запуск: sudo bash check.sh ТОКЕН TOKEN="$1" URL="${QUALS_URL:-https://quals2.nkectfteam.online}" ROOT="${QUALS_ROOT:-}" if [ -z "$TOKEN" ]; then echo "Запуск: sudo bash check.sh ТОКЕН"; exit 1; fi if [ -z "$ROOT" ] && [ "$(id -u)" != "0" ]; then echo "Запустите через sudo"; exit 1; fi if ! command -v aldpro-gpupdate >/dev/null; then echo "Не найден aldpro-gpupdate: запустите на клиенте домена ALD Pro"; exit 1; fi echo "Применяю групповые политики, это может занять пару минут..." aldpro-gpupdate --gp >/dev/null 2>&1 || echo "Предупреждение: aldpro-gpupdate завершился с ошибкой" PILLAR="$(aldpro-gpupdate --gp_host_pillar 2>/dev/null)" export TOKEN URL ROOT PILLAR python3 - <<'PY' import glob, json, os, re, sys, urllib.error, urllib.request root = os.environ["ROOT"] def read(path): try: with open(root + path, encoding="utf-8", errors="replace") as f: return f.read() except OSError: return "" def lines(text, pattern): return [l.strip() for l in text.splitlines() if re.match(pattern, l)] ids = ["rbta_ldap_security_policy", "rbta_ldap_date_time_h"] + [ "rbta_ldap_custom_gp_host_kedr_" + x for x in ("banner", "usb_block", "screen_lock", "sysrq")] pillar = os.environ["PILLAR"] theme = read("/usr/share/fly-wm/theme/default.themerc") locker = [re.sub(r"\s*=\s*", "=", l) for l in lines(theme, r"\s*(LockerOn(DPMS|Lid|Sleep|Switch)|ScreenSaverDelay)\s*=")] usb = "\n".join(l for p in sorted(glob.glob(root + "/etc/modprobe.d/*.conf")) for l in lines(open(p, encoding="utf-8", errors="replace").read(), r"\s*install\s+usb-storage\b")) facts = { "login_local": "\n".join(lines(read("/etc/parsec/parsec.conf"), r"\s*login_local\b")), "chrony": "\n".join(lines(read("/etc/chrony/chrony.conf"), r"\s*(server|pool)\b")), "motd": read("/etc/motd"), "usb": usb, "locker": ";".join(locker), "sysrq": read("/proc/sys/kernel/sysrq").strip(), "gp_ids": ",".join(i for i in ids if i in pillar), } facts = {k: v[:1500] for k, v in facts.items()} req = urllib.request.Request( os.environ["URL"] + "/api/check", data=json.dumps({"facts": facts}).encode(), headers={"Content-Type": "application/json", "Authorization": "Bearer " + os.environ["TOKEN"]}, ) try: with urllib.request.urlopen(req, timeout=20) as r: data = json.load(r) except urllib.error.HTTPError as e: try: print("Ошибка:", json.load(e).get("error")) except ValueError: print("Ошибка сервера:", e.code) sys.exit(1) except OSError as e: print("Нет связи с сервером:", e) sys.exit(1) names = {t["id"]: i for i, t in enumerate(data["tasks"], 1)} for r in data["results"]: label = "Бонус" if r["id"].startswith("b") else "Задача " + str(names[r["id"]]) print(("[OK] " if r["passed"] else "[--] ") + label + ("" if r["passed"] else ": " + r["reason"])) print("Баллы:", data["score"], "из", data["max"], ("+ бонус " + str(data["bonus"])) if data["bonus"] else "") PY