From 42fe42fce52d722199f13bd2691de75e22d4ad6c Mon Sep 17 00:00:00 2001 From: zuevav Date: Mon, 5 Oct 2026 20:13:43 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D0=B7:=20=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=8E=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B8?= =?UTF-8?q?=20=D0=BF=D0=BE-=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8=20=D0=B2?= =?UTF-8?q?=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B8?= =?UTF-8?q?=20Bridge&Join=20(GRUB=20=D0=B2=20=D0=B3=D1=80=D0=B0=D1=84?= =?UTF-8?q?=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=BC=20=D1=80=D0=B5=D0=B6?= =?UTF-8?q?=D0=B8=D0=BC=D0=B5,=20=D1=82=D0=B5=D0=BC=D0=B0=20grub-theme/;?= =?UTF-8?q?=20=D0=B1=D0=B5=D0=B7=20=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8=20=E2=80=94=20=D1=82=D0=B5=20=D0=B6=D0=B5=20=D0=BF=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=82=D1=8B=20=D0=BF=D0=BE-=D0=B0=D0=BD=D0=B3?= =?UTF-8?q?=D0=BB=D0=B8=D0=B9=D1=81=D0=BA=D0=B8),=20=D0=B2=20BIOS=20=D0=BF?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=82=20=C2=AB=D0=97=D0=B0=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=B7=D0=B8=D1=82=D1=8C=D1=81=D1=8F=20=D1=81=20=D0=B6=D1=91?= =?UTF-8?q?=D1=81=D1=82=D0=BA=D0=BE=D0=B3=D0=BE=20=D0=B4=D0=B8=D1=81=D0=BA?= =?UTF-8?q?=D0=B0=C2=BB;=20=D1=8D=D0=BA=D1=80=D0=B0=D0=BD=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=81=D0=BE=D0=BB=D0=B8=20=D0=B2=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=20=D0=B6=D1=83=D1=80=D0=BD=D0=B0=D0=BB=D0=B0?= =?UTF-8?q?=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D1=89=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0=20Ubuntu=20=E2=80=94=20=D1=8D=D1=82=D0=B0=D0=BF=D1=8B=20?= =?UTF-8?q?=D0=BF=D0=BE-=D1=80=D1=83=D1=81=D1=81=D0=BA=D0=B8=20=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D0=BE=D1=81=D0=B0=20=D1=85=D0=BE=D0=B4=D0=B0?= =?UTF-8?q?=20(bj-install-progress=20=D0=B8=D0=B7=20early-commands;=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B5=20?= =?UTF-8?q?=D0=B8=D0=BB=D0=B8=20=D1=81=D0=B1=D0=BE=D0=B5=20=D1=8D=D0=BA?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D0=B0=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=89=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4=D0=B0=D1=80=D1=82=D0=BD=D1=8B=D0=B9=20=D1=8D=D0=BA=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=20Ubuntu);=20quiet=20=D0=BF=D1=80=D0=B8=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B5=20=D1=83=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D0=BE=D0=B2=D1=89=D0=B8=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- deploy/iso/bj-install-progress | 274 ++++++++++++++++++++++ deploy/iso/build-iso-ubuntu.sh | 53 ++++- deploy/iso/grub-theme/background.png | Bin 0 -> 11785 bytes deploy/iso/grub-theme/bj-mono-16.pf2 | Bin 0 -> 9293 bytes deploy/iso/grub-theme/bj-sans-16.pf2 | Bin 0 -> 9684 bytes deploy/iso/grub-theme/bj-sans-20.pf2 | Bin 0 -> 11622 bytes deploy/iso/grub-theme/bj-sans-bold-20.pf2 | Bin 0 -> 12493 bytes deploy/iso/grub-theme/bj-sans-bold-36.pf2 | Bin 0 -> 26336 bytes deploy/iso/grub-theme/make-theme.sh | 21 ++ deploy/iso/grub-theme/select_c.png | Bin 0 -> 245 bytes deploy/iso/grub-theme/select_e.png | Bin 0 -> 247 bytes deploy/iso/grub-theme/select_n.png | Bin 0 -> 250 bytes deploy/iso/grub-theme/select_ne.png | Bin 0 -> 253 bytes deploy/iso/grub-theme/select_nw.png | Bin 0 -> 253 bytes deploy/iso/grub-theme/select_s.png | Bin 0 -> 250 bytes deploy/iso/grub-theme/select_se.png | Bin 0 -> 253 bytes deploy/iso/grub-theme/select_sw.png | Bin 0 -> 253 bytes deploy/iso/grub-theme/select_w.png | Bin 0 -> 247 bytes deploy/iso/grub-theme/theme.txt | 66 ++++++ deploy/iso/ubuntu/user-data.tmpl | 6 + 20 files changed, 410 insertions(+), 10 deletions(-) create mode 100644 deploy/iso/bj-install-progress create mode 100644 deploy/iso/grub-theme/background.png create mode 100644 deploy/iso/grub-theme/bj-mono-16.pf2 create mode 100644 deploy/iso/grub-theme/bj-sans-16.pf2 create mode 100644 deploy/iso/grub-theme/bj-sans-20.pf2 create mode 100644 deploy/iso/grub-theme/bj-sans-bold-20.pf2 create mode 100644 deploy/iso/grub-theme/bj-sans-bold-36.pf2 create mode 100755 deploy/iso/grub-theme/make-theme.sh create mode 100644 deploy/iso/grub-theme/select_c.png create mode 100644 deploy/iso/grub-theme/select_e.png create mode 100644 deploy/iso/grub-theme/select_n.png create mode 100644 deploy/iso/grub-theme/select_ne.png create mode 100644 deploy/iso/grub-theme/select_nw.png create mode 100644 deploy/iso/grub-theme/select_s.png create mode 100644 deploy/iso/grub-theme/select_se.png create mode 100644 deploy/iso/grub-theme/select_sw.png create mode 100644 deploy/iso/grub-theme/select_w.png create mode 100644 deploy/iso/grub-theme/theme.txt diff --git a/deploy/iso/bj-install-progress b/deploy/iso/bj-install-progress new file mode 100644 index 0000000..b713e8c --- /dev/null +++ b/deploy/iso/bj-install-progress @@ -0,0 +1,274 @@ +#!/usr/bin/python3 +# Экран установки Bridge&Join на первой консоли — вместо технического журнала установщика Ubuntu +# («start: subiquity/Install/install/curtin_install/…»). Запускается из early-commands автоустановки +# (deploy/iso/ubuntu/user-data.tmpl) отдельной службой с выводом на tty1 и сам останавливает экран +# установщика Ubuntu (snap.subiquity.subiquity-service). Сама установка идёт как шла: этот экран только +# читает её события из журнала (SUBIQUITY_EVENT_TYPE / SUBIQUITY_CONTEXT_NAME) и состояние сервера +# установщика (/run/subiquity/server-state). +# +# Ошибка установки — экран говорит об этом и возвращает стандартный экран установщика Ubuntu (он +# показывает подробности и открывает командную строку); то же, если сам этот экран упадёт +# (обёртка в early-commands). +# +# Шрифт консоли установщика (subiquity.psf, 512 знаков): есть кириллица, рамки, ✓ ▶ ✗ █ ░ · •; +# нет ○ ◐ ⚠ ▓ — их не использовать. +# +# Проверка без установки: bj-install-progress --demo <файл событий JSON> [--html кадр.html] + +import json +import math +import os +import select +import shutil +import subprocess +import sys +import time + +STAGES = [ + # заголовок, вес в общей полосе, типичная длительность этапа (с) — для плавной полосы внутри этапа + ("Подготовка", 4, 25), + ("Разметка диска", 4, 20), + ("Копирование системы на диск", 34, 180), + ("Настройка системы и загрузчика", 32, 180), + ("Пакеты и обновления безопасности", 18, 150), + ("Компоненты Bridge&Join", 8, 20), +] +DONE_STAGE = len(STAGES) +STATE_FILE = os.environ.get("BJ_PROGRESS_STATE", "/run/subiquity/server-state") # переменная — только для проверки +CLIENT_UNIT = "snap.subiquity.subiquity-service.service" + +# цвета консоли Linux +RESET, BOLD, DIM = "\033[0m", "\033[1m", "\033[2m" +GREEN, CYAN, RED, WHITE, GREY = "\033[32m", "\033[36m", "\033[31m", "\033[97m", "\033[90m" + + +def stage_of(name, message, state): + """Этап по событию установщика (имя контекста и сообщение) и состоянию сервера; -1 — не меняет этап.""" + n, m = name or "", message or "" + if state == "DONE": + return DONE_STAGE + if state == "LATE_COMMANDS" or n.startswith("subiquity/Late/run"): + return 5 + if state == "UU_RUNNING" or "/postinstall" in n: + return 4 + if "stage-curthooks" in n or "curthooks step" in m or "swap step" in m: + return 3 + if "stage-extract" in n or "extract step" in m: + return 2 + if "stage-partitioning" in n or "partitioning step" in m or "formatting step" in m: + return 1 + return -1 + + +class Progress: + def __init__(self): + self.stage = 0 + self.stage_started = time.time() + self.started = time.time() + self.state = "" + self.error = False + self.detail = "" + + def feed(self, ev): + """Событие журнала (JSON journalctl).""" + name = ev.get("SUBIQUITY_CONTEXT_NAME", "") + msg = (ev.get("MESSAGE") or "").strip() + etype = ev.get("SUBIQUITY_EVENT_TYPE", "") + if etype == "error": + self.detail = msg[:200] + st = stage_of(name, msg, "") + self.advance(st) + if self.stage == 4 and etype == "start": + if "/install_" in name and ": installing " in msg: + self.detail = "ставится " + msg.split(": installing ", 1)[1] + elif "updates" in msg: + self.detail = "загрузка и установка обновлений безопасности" + + def advance(self, st): + if st > self.stage: + self.stage, self.stage_started, self.detail = st, time.time(), "" + + def set_state(self, state): + self.state = state + if state == "ERROR": + self.error = True + self.advance(stage_of("", "", state)) + + def percent(self): + if self.stage >= DONE_STAGE: + return 100 + done = sum(w for _, w, _ in STAGES[: self.stage]) + _, w, tau = STAGES[self.stage] + f = min(0.95, 1 - math.exp(-(time.time() - self.stage_started) / tau)) + return min(99, int(done + w * f)) + + +def mmss(sec): + sec = int(max(0, sec)) + return "%d:%02d" % (sec // 60, sec % 60) + + +def frame(p, cols, rows): + """Кадр: список строк, каждая — список кусков (текст, цвет).""" + W = 66 + inner = W - 2 + lines = [] + + def row(parts=()): + parts, text = list(parts), "" + for i, (t, c) in enumerate(parts): # строка длиннее рамки — обрезать, рамка не должна съезжать + if len(text) + len(t) > inner: + parts = parts[:i] + [(t[: inner - len(text)], c)] + text += parts[-1][0] + break + text += t + pad = inner - len(text) + lines.append([("║", GREY)] + list(parts) + [(" " * max(0, pad), ""), ("║", GREY)]) + + lines.append([("╔" + "═" * inner + "╗", GREY)]) + row() + row([(" Bridge&Join", BOLD + WHITE)]) + row([(" шлюз, объединяющий системы финансовой организации", DIM)]) + row() + row([(" Установка сервера", BOLD)]) + row() + for i, (title, _, _) in enumerate(STAGES): + if i < p.stage: + row([(" ✓ ", GREEN), (title, "")]) + elif i == p.stage and p.error: + row([(" ✗ ", RED), (title, BOLD + RED)]) + elif i == p.stage: + t = mmss(time.time() - p.stage_started) + gap = inner - 6 - len(title) - len(t) - 3 + row([(" ▶ ", CYAN), (title, BOLD + CYAN), (" " * max(1, gap), ""), (t, DIM)]) + else: + row([(" · ", GREY), (title, GREY)]) + row() + if p.error: + row([(" ✗ Установка не удалась.", BOLD + RED)]) + row([(" Сейчас откроется экран установщика Ubuntu", "")]) + row([(" с подробностями и командной строкой.", "")]) + else: + pct = p.percent() + bar_w = 46 + full = int(bar_w * pct / 100) + row([(" ", ""), ("█" * full, CYAN), ("░" * (bar_w - full), GREY), (" %3d %%" % pct, BOLD)]) + row([(" " + p.detail, DIM)] if p.detail and p.stage < DONE_STAGE else []) # подпись под полосой + row() + if p.stage >= DONE_STAGE: + row([(" ✓ Установка завершена — сервер перезагружается.", BOLD + GREEN)]) + row([(" После загрузки на этом экране будет адрес для входа.", "")]) + else: + row([(" Не выключайте сервер: он перезагрузится сам и покажет", "")]) + row([(" на этом экране адрес для входа в браузере.", "")]) + row() + lines.append([("╚" + "═" * inner + "╝", GREY)]) + foot = "прошло " + mmss(time.time() - p.started) + lines.append([(" " * max(0, (W - len(foot)) // 2) + foot, GREY)]) + # по центру экрана + left = max(0, (cols - W) // 2) + top = max(0, (rows - len(lines)) // 2) + return [[("", "")]] * top + [[(" " * left, "")] + ln for ln in lines] + + +def to_ansi(fr): + out = ["\033[H\033[2J"] + for ln in fr: + out.append("".join((c + t + RESET) if c else t for t, c in ln) + "\n") + return "".join(out) + + +def to_html(fr): + css = {GREEN: "#4e9a06", CYAN: "#06989a", RED: "#cc0000", GREY: "#888", DIM: "#9a9a9a", BOLD: "", WHITE: "#fff"} + html = [] + for ln in fr: + h = "" + for t, c in ln: + t = t.replace("&", "&").replace("<", "<") + if not c: + h += t + continue + color = next((css[k] for k in (GREEN, CYAN, RED, GREY, WHITE, DIM) if k in c), "#ddd") + weight = "700" if BOLD in c else "400" + h += '%s' % (color, weight, t) + html.append(h) + return ('' + '
'
+            + "\n".join(html) + "
") + + +def read_state(): + try: + with open(STATE_FILE) as f: + return f.read().strip() + except OSError: + return "" + + +def demo(path, html_out): + """Прогон по записанным событиям: кадр в HTML (для проверки вида без установки).""" + p = Progress() + for line in open(path, encoding="utf-8"): + line = line.strip() + if not line: + continue + ev = json.loads(line) + if "STATE" in ev: + p.set_state(ev["STATE"]) + else: + p.feed(ev) + if "ELAPSED" in ev: # сдвиг времени для наглядности кадра + p.stage_started -= ev["ELAPSED"] + p.started -= ev["ELAPSED"] * 3 + fr = frame(p, 100, 37) + if html_out: + open(html_out, "w", encoding="utf-8").write(to_html(fr)) + else: + sys.stdout.write(to_ansi(fr)) + + +def main(): + if len(sys.argv) >= 3 and sys.argv[1] == "--demo": + demo(sys.argv[2], sys.argv[4] if len(sys.argv) >= 5 and sys.argv[3] == "--html" else "") + return 0 + if "BJ_PROGRESS_STATE" not in os.environ: + # экран установщика Ubuntu больше не нужен: события читаем сами + subprocess.call(["systemctl", "stop", CLIENT_UNIT], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + for psf in ("/snap/subiquity/current/subiquity.psf",): + if os.path.exists(psf): + subprocess.call(["setfont", psf], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + sys.stdout.write("\033[?25l") # без мигающего курсора + p = Progress() + j = subprocess.Popen(["journalctl", "-o", "json", "-f", "-n", "all", "-q", + "SUBIQUITY_EVENT_TYPE=start", "SUBIQUITY_EVENT_TYPE=finish", "SUBIQUITY_EVENT_TYPE=error"], + stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, bufsize=0) + buf = b"" + error_at = 0.0 + while True: + r, _, _ = select.select([j.stdout], [], [], 1.0) + if r: + chunk = os.read(j.stdout.fileno(), 65536) + if not chunk and j.poll() is not None: + return 1 # журнал недоступен — обёртка вернёт экран установщика + buf += chunk + while b"\n" in buf: + line, buf = buf.split(b"\n", 1) + try: + p.feed(json.loads(line.decode("utf-8", "replace"))) + except ValueError: + pass + p.set_state(read_state()) + cols, rows = shutil.get_terminal_size((100, 37)) + sys.stdout.write(to_ansi(frame(p, cols, rows))) + sys.stdout.flush() + if p.error: + if not error_at: + error_at = time.time() + elif time.time() - error_at > 6: + j.terminate() + sys.stdout.write("\033[?25h\033[H\033[2J") + return 2 # обёртка запустит экран установщика Ubuntu: подробности и командная строка + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/deploy/iso/build-iso-ubuntu.sh b/deploy/iso/build-iso-ubuntu.sh index 0787882..9e3882e 100755 --- a/deploy/iso/build-iso-ubuntu.sh +++ b/deploy/iso/build-iso-ubuntu.sh @@ -28,6 +28,7 @@ mkdir -p "$WORK/bj/bundle" "$WORK/bj/validata" "$WORK/nocloud" "$WORK/grub" install -m 0755 "$INSTALLER" "$WORK/bj/bj-installer" install -m 0755 "$HERE/bj-firstboot" "$WORK/bj/bj-firstboot" +install -m 0755 "$HERE/bj-install-progress" "$WORK/bj/bj-install-progress" # экран установки на консоли cp "$HERE/bj-firstboot.service" "$WORK/bj/" install -m 0755 "$HERE/../linux/sbin/bj-welcome" "$WORK/bj/bj-welcome" install -m 0755 "$HERE/../linux/sbin/bj-network" "$WORK/bj/bj-network" @@ -91,21 +92,53 @@ HASH=$(openssl passwd -6 "$(head -c 32 /dev/urandom | base64)") sed "s#@@PASSHASH@@#$HASH#" "$HERE/ubuntu/user-data.tmpl" > "$WORK/nocloud/user-data" : > "$WORK/nocloud/meta-data" -# меню загрузки: первый пункт — установка Bridge&Join +# меню загрузки: первый пункт — установка Bridge&Join. В графическом режиме — по-русски, с оформлением +# grub-theme/ (в текстовом режиме GRUB кириллицы нет — тогда те же пункты по-английски). xorriso -osirrox on -indev "$SRC" -extract /boot/grub/grub.cfg "$WORK/grub/grub.orig" >/dev/null 2>&1 +mkdir -p "$WORK/boot/grub/themes/bj" +cp "$HERE"/grub-theme/theme.txt "$HERE"/grub-theme/*.pf2 "$HERE"/grub-theme/*.png "$WORK/boot/grub/themes/bj/" +# пункты меню: $1 — ru|en +menu() { + if [ "$1" = ru ]; then + T1="Установить Bridge&Join $VERSION — стирает весь диск"; T2="Установить Ubuntu Server вручную, без Bridge&Join" + T3="Загрузиться со следующего диска"; T4="Настройки UEFI"; T5="Проверка памяти"; T6="Загрузиться с жёсткого диска" + else + T1="Install Bridge&Join $VERSION - ERASES THE WHOLE DISK"; T2="Try or Install Ubuntu Server" + T3="Boot from next volume"; T4="UEFI Firmware Settings"; T5="Test memory"; T6="Boot from first hard disk" + fi + echo "menuentry --hotkey=b '$T1' {" + echo " set gfxpayload=keep" + echo " linux /casper/vmlinuz quiet autoinstall ds=nocloud\;s=/cdrom/nocloud/ ---" + echo " initrd /casper/initrd" + echo "}" + # прочие пункты образа Ubuntu — кроме ядра HWE (его файлы из образа удаляются); в BIOS ещё «с жёсткого + # диска» — если образ остался подключённым после установки (в UEFI для этого есть «со следующего диска») + sed '/^set timeout/d;/^loadfont/d;/^set menu_color/d' "$WORK/grub/grub.orig" \ + | awk '/^menuentry "Ubuntu Server with the HWE kernel"/{skip=1} skip&&/^}/{skip=0;next} !skip' \ + | sed "s|^menuentry \"Try or Install Ubuntu Server\"|menuentry '$(sedrepl "$T2")'|;s|^menuentry 'Boot from next volume'|menuentry '$(sedrepl "$T3")'|;s|^menuentry 'UEFI Firmware Settings'|menuentry '$(sedrepl "$T4")'|;s|^menuentry 'Test memory'|menuentry '$(sedrepl "$T6")' {\\n\\tset root=(hd0)\\n\\tchainloader +1\\n}\\nmenuentry '$(sedrepl "$T5")'|" +} +# текст для правой части s|…|…| в sed: & и | — буквально +sedrepl() { printf '%s' "$1" | sed 's/[&|\\]/\\&/g'; } { echo "set default=0" # меню ждёт выбора: выбор пункта установки и есть подтверждение стирания диска (без таймера образ, # случайно оставленный подключённым, не переустановит систему сам) echo "set timeout=-1" echo "loadfont unicode" - echo "menuentry --hotkey=b 'Install Bridge&Join $VERSION - ERASES THE WHOLE DISK' {" - echo " set gfxpayload=keep" - echo " linux /casper/vmlinuz autoinstall ds=nocloud\;s=/cdrom/nocloud/ ---" - echo " initrd /casper/initrd" - echo "}" - # пункт с ядром HWE убираем — его файлы из образа удаляются - sed '/^set timeout/d;/^loadfont/d' "$WORK/grub/grub.orig" | awk '/^menuentry "Ubuntu Server with the HWE kernel"/{skip=1} skip&&/^}/{skip=0;next} !skip' + echo "set menu_color_normal=white/black" + echo "set menu_color_highlight=black/light-gray" + echo "insmod all_video" + echo "insmod gfxterm" + echo "insmod gfxmenu" + echo "insmod png" + echo "set gfxmode=1024x768,auto" + echo "if terminal_output gfxterm; then" + for f in "$WORK"/boot/grub/themes/bj/*.pf2; do echo " loadfont /boot/grub/themes/bj/$(basename "$f")"; done + echo " set theme=/boot/grub/themes/bj/theme.txt" + menu ru + echo "else" + menu en + echo "fi" } > "$WORK/grub/grub.cfg" # md5sum.txt: установщик Ubuntu при загрузке сверяет файлы образа по этому списку (casper-md5check); @@ -121,14 +154,14 @@ xorriso -osirrox on -indev "$SRC" -extract /md5sum.txt "$WORK/md5.orig" >/dev/nu grep -E '\./casper/install-sources\.yaml$' "$WORK/md5.orig" fi echo "$(md5sum < "$WORK/grub/grub.cfg" | cut -d' ' -f1) ./boot/grub/grub.cfg" - (cd "$WORK" && find bj nocloud -type f | sort | while read -r f; do echo "$(md5sum < "$f" | cut -d' ' -f1) ./$f"; done) + (cd "$WORK" && find bj nocloud boot/grub/themes -type f | sort | while read -r f; do echo "$(md5sum < "$f" | cut -d' ' -f1) ./$f"; done) } > "$WORK/md5sum.txt" rm -f "$OUT" xorriso -indev "$SRC" -outdev "$OUT" -boot_image any replay \ -volid "BJ_UBUNTU22" \ -map "$WORK/bj" /bj -map "$WORK/nocloud" /nocloud \ - -map "$WORK/grub/grub.cfg" /boot/grub/grub.cfg \ + -map "$WORK/grub/grub.cfg" /boot/grub/grub.cfg -map "$WORK/boot/grub/themes" /boot/grub/themes \ -map "$WORK/md5sum.txt" /md5sum.txt $LMAP \ -rm_r /casper/hwe-vmlinuz /casper/hwe-initrd /casper/ubuntu-server-minimal.ubuntu-server.installer.generic-hwe.squashfs $LRM -- \ -end >/dev/null 2>"$WORK/xorriso.log" || { cat "$WORK/xorriso.log"; exit 1; } diff --git a/deploy/iso/grub-theme/background.png b/deploy/iso/grub-theme/background.png new file mode 100644 index 0000000000000000000000000000000000000000..460734bb3faa511724bdaaa6f970c876dd31b599 GIT binary patch literal 11785 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 HRmVR7Etowt literal 0 HcmV?d00001 diff --git a/deploy/iso/grub-theme/bj-sans-16.pf2 b/deploy/iso/grub-theme/bj-sans-16.pf2 new file mode 100644 index 0000000000000000000000000000000000000000..8a6fd108a152981876334c2147844cd6e2cdc1e0 GIT binary patch literal 9684 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 bkM<2>HlK(oVoe5nKoQI3voihU#h(8M+$B>) literal 0 HcmV?d00001 diff --git a/deploy/iso/grub-theme/bj-sans-20.pf2 b/deploy/iso/grub-theme/bj-sans-20.pf2 new file mode 100644 index 0000000000000000000000000000000000000000..494975ceebb642a6523dab7451a61613086e067f GIT binary patch literal 11622 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 literal 0 HcmV?d00001 diff --git a/deploy/iso/grub-theme/bj-sans-bold-20.pf2 b/deploy/iso/grub-theme/bj-sans-bold-20.pf2 new file mode 100644 index 0000000000000000000000000000000000000000..8e68063243b2ceccd44c5552e75958ecb91dfe91 GIT binary patch literal 12493 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 literal 0 HcmV?d00001 diff --git a/deploy/iso/grub-theme/bj-sans-bold-36.pf2 b/deploy/iso/grub-theme/bj-sans-bold-36.pf2 new file mode 100644 index 0000000000000000000000000000000000000000..882477436bfa296d344c865c87349a823178cebd GIT binary patch literal 26336 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

T^2f` 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 literal 0 HcmV?d00001 diff --git a/deploy/iso/grub-theme/select_e.png b/deploy/iso/grub-theme/select_e.png new file mode 100644 index 0000000000000000000000000000000000000000..f63a57786f6f33d3c8e7d47b6b53e59cf24771fc GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^EI`c2!2~4B;%3YO38XvvIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3&e-K=-cll(X z2%o2mV+hCf2$^@Yym(DTKZH0F+TJag8WRNi0dVN-jzTQVd20MrOK(2D%2O xAw~vP2Bua<=Gq3vRt5&2m7TAlXvob^$xN%nt)Z#zcNS0sgQu&X%Q~loCIF2_Kdt}( literal 0 HcmV?d00001 diff --git a/deploy/iso/grub-theme/select_n.png b/deploy/iso/grub-theme/select_n.png new file mode 100644 index 0000000000000000000000000000000000000000..e06a4aa3ebcc7eeb50d6f45b9cb9a2878d6d7a0f GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr7!2~1^>^hVS;-owJIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3&e-K=-cll(X zh@hv7V+hCf5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c$? z;_2cT!f`$M3jf|i49q?}9t`H}49@+G33bX|3xV>gC9V-ADTyViR>?)FK#IZ0z{pJ3 z&_LI~G{nfj%D~jh$V}V7*vh~lG{hqbMMG|WN@iLmZVf7&AMOD)FnGH9xvX5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c$? z;_2cT!f`$M3jf|i49q?}9t`H}49@+G33bX|3xV>gC9V-ADTyViR>?)FK#IZ0z{pJ3 z&_LI~G{nfj%D~jh$V}V7*vh~lG{hqbMMG|WN@iLmZVf7&AMOD)FnGH9xvX^hVS;-owJIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffzx4R3&e-K=-cll(X zh@hv7V+hCfzopr0Co04 AO#lD@ literal 0 HcmV?d00001 diff --git a/deploy/iso/grub-theme/select_se.png b/deploy/iso/grub-theme/select_se.png new file mode 100644 index 0000000000000000000000000000000000000000..a088a4ffb45f4f141806c9df7d1e11be31a86a23 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1SHiab83P(>5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c$? z;_2cT!f`$M3jf|i49q?}9t`H}49@+G33bX|3xV>gC9V-ADTyViR>?)FK#IZ0z{pJ3 z&_LI~G{nfj%D~jh$V}V7*vh~lG{hqbMMG|WN@iLmZVf7&AMOD)FnGH9xvX5jgR3=A9lx&I`x0{IHb9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!ItFh?!xdN1Q+aGJ{c$? z;_2cT!f`$M3jf|i49q?}9t`H}49@+G33bX|3xV>gC9V-ADTyViR>?)FK#IZ0z{pJ3 z&_LI~G{nfj%D~jh$V}V7*vh~lG{hqbMMG|WN@iLmZVf7&AMOD)FnGH9xvX2$^@Yym(DTKZH0F+TJag8WRNi0dVN-jzTQVd20MrOK(2D%2O xAw~vP2Bua<=Gq3vRt5&2m7TAlXvob^$xN%nt)Z#zcNS0sgQu&X%Q~loCIF2_Kdt}( literal 0 HcmV?d00001 diff --git a/deploy/iso/grub-theme/theme.txt b/deploy/iso/grub-theme/theme.txt new file mode 100644 index 0000000..ed0bf68 --- /dev/null +++ b/deploy/iso/grub-theme/theme.txt @@ -0,0 +1,66 @@ +# Bridge&Join — оформление меню загрузки образа (GRUB, графический режим). +# Шрифты и картинки — make-theme.sh; в шрифтах только латиница, кириллица, тире и стрелки. +title-text: "" +desktop-image: "background.png" +desktop-image-scale-method: "stretch" +desktop-color: "#0d1220" +terminal-font: "DejaVu Sans Mono Regular 16" + ++ label { + left = 0 + top = 13% + width = 100% + height = 48 + align = "center" + text = "Bridge&Join" + font = "DejaVu Sans Bold 36" + color = "#ffffff" +} ++ label { + left = 0 + top = 13%+54 + width = 100% + height = 24 + align = "center" + text = "шлюз, объединяющий системы финансовой организации" + font = "DejaVu Sans Regular 16" + color = "#8d98ad" +} ++ boot_menu { + left = 50%-380 + top = 31% + width = 760 + height = 260 + item_font = "DejaVu Sans Regular 20" + selected_item_font = "DejaVu Sans Bold 20" + item_color = "#c3cad6" + selected_item_color = "#ffffff" + item_height = 44 + item_padding = 16 + item_spacing = 6 + icon_width = 0 + icon_height = 0 + item_icon_space = 0 + selected_item_pixmap_style = "select_*.png" + scrollbar = false +} ++ label { + left = 50%-380 + top = 31%+272 + width = 760 + height = 24 + align = "center" + text = "Первый пункт устанавливает Bridge&Join и стирает весь диск сервера" + font = "DejaVu Sans Regular 16" + color = "#f0a35e" +} ++ label { + left = 0 + top = 90% + width = 100% + height = 24 + align = "center" + text = "↑ ↓ — выбрать пункт, Enter — запустить" + font = "DejaVu Sans Regular 16" + color = "#8d98ad" +} diff --git a/deploy/iso/ubuntu/user-data.tmpl b/deploy/iso/ubuntu/user-data.tmpl index 03af5fc..527a46c 100644 --- a/deploy/iso/ubuntu/user-data.tmpl +++ b/deploy/iso/ubuntu/user-data.tmpl @@ -25,6 +25,12 @@ autoinstall: layout: name: direct updates: security + # Экран установки Bridge&Join на консоли вместо технического журнала установщика Ubuntu + # (deploy/iso/bj-install-progress): этапы по-русски и полоса хода. Экран сам останавливает показ + # журнала установщика; упадёт или установка не удастся — вернётся стандартный экран Ubuntu. + # Команда всегда завершается успешно: экран не должен мешать установке. + early-commands: + - sh -c 'if command -v python3 >/dev/null && [ -f /cdrom/bj/bj-install-progress ]; then systemd-run --unit=bj-install-progress --collect -p StandardOutput=tty -p StandardError=journal -p TTYPath=/dev/tty1 -p TTYReset=yes /bin/sh -c "python3 /cdrom/bj/bj-install-progress || systemctl start snap.subiquity.subiquity-service.service" >/dev/null 2>&1; fi; true' late-commands: - mkdir -p /target/var/lib/bj /target/etc/bj /target/usr/local/sbin - cp -r /cdrom/bj/bundle /target/var/lib/bj/bundle