7ecfee524d
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
73 lines
4.5 KiB
Bash
Executable File
73 lines
4.5 KiB
Bash
Executable File
#!/bin/sh
|
||
# Сборка образа ISO Bridge&Join на основе Ubuntu 22.04 LTS Server (автоустановка).
|
||
#
|
||
# deploy/iso/build-iso-ubuntu.sh <ubuntu-22.04.x-live-server-amd64.iso> <bj-installer> <версия> <каталог релиза> <каталог Валидаты> [канал] [выходной.iso]
|
||
#
|
||
# Каталог релиза — dist с подписанным manifest.json (в образ кладётся ядро bj: установка без ключа продукта).
|
||
# Каталог Валидаты — zpki/zsdk (ПК «Валидата Клиент L» для Linux, fs.moex.com ClientL_Other.zip)
|
||
# и libldap-2.4-2 из Ubuntu 20.04 (нужна zpki, в 22.04 её нет). Ubuntu 22.04 — ОС, на которой
|
||
# «Валидата Клиент L» ставится официально (Debian 13 её установщик не принимает).
|
||
# Меню загрузки (grub, BIOS и UEFI): по умолчанию — установка Bridge&Join с автоответами.
|
||
set -eu
|
||
SRC=${1:?ubuntu-22.04.x-live-server-amd64.iso}
|
||
INSTALLER=${2:?файл bj-installer}
|
||
VERSION=${3:?версия образа}
|
||
BUNDLE=${4:?каталог релиза с manifest.json}
|
||
VALIDATA=${5:?каталог с zpki/zsdk/libldap-2.4-2}
|
||
CHANNEL=${6:-stable}
|
||
OUT=${7:-bj-ubuntu22-$VERSION.iso}
|
||
HERE=$(cd "$(dirname "$0")" && pwd)
|
||
command -v xorriso >/dev/null || { echo "нужен xorriso"; exit 1; }
|
||
WORK=$(mktemp -d); trap 'rm -rf "$WORK"' EXIT
|
||
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"
|
||
cp "$HERE/bj-firstboot.service" "$WORK/bj/"
|
||
install -m 0755 "$HERE/../linux/sbin/bj-welcome" "$WORK/bj/bj-welcome"
|
||
cp "$HERE/../systemd/bj-welcome.service" "$HERE/../systemd/bj-welcome.timer" "$WORK/bj/"
|
||
echo "$CHANNEL" > "$WORK/bj/channel"; echo "$VERSION" > "$WORK/bj/version"
|
||
|
||
# ядро bj: подписанный манифест + bj-server, bj-component-install
|
||
[ -s "$BUNDLE/manifest.json" ] || { echo "в $BUNDLE нет manifest.json"; exit 1; }
|
||
cp "$BUNDLE/manifest.json" "$WORK/bj/bundle/"
|
||
FILES=$(python3 -c 'import json,sys,base64;s=json.load(open(sys.argv[1]));m=json.loads(base64.b64decode(s["payload"]));print(" ".join(a["file"] for a in m["artifacts"] if a["name"] in ("bj-server","bj-component-install")))' "$BUNDLE/manifest.json")
|
||
[ -n "$FILES" ] || { echo "в релизе нет компонентов ядра"; exit 1; }
|
||
for f in $FILES; do cp "$BUNDLE/$f" "$WORK/bj/bundle/"; done
|
||
|
||
# Валидата
|
||
n=0; for p in zpki zsdk libldap-2.4-2; do
|
||
f=$(ls "$VALIDATA"/${p}_*.deb "$VALIDATA"/${p}-*.deb 2>/dev/null | grep -E 'amd64\.deb$' | head -1 || true)
|
||
[ -n "$f" ] || { echo "в $VALIDATA нет пакета $p"; exit 1; }
|
||
cp "$f" "$WORK/bj/validata/"; n=$((n+1))
|
||
done
|
||
|
||
# автоответы (пароль root_bj — случайный и нигде не сохраняется: настоящий задаёт bj-firstboot)
|
||
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
|
||
xorriso -osirrox on -indev "$SRC" -extract /boot/grub/grub.cfg "$WORK/grub/grub.orig" >/dev/null 2>&1
|
||
{
|
||
echo "set default=0"
|
||
echo "set timeout=10"
|
||
echo "loadfont unicode"
|
||
echo "menuentry --hotkey=b 'Install Bridge&Join $VERSION (Ubuntu 22.04)' {"
|
||
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'
|
||
} > "$WORK/grub/grub.cfg"
|
||
|
||
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 \
|
||
-rm /casper/hwe-vmlinuz /casper/hwe-initrd /casper/ubuntu-server-minimal.ubuntu-server.installer.generic-hwe.squashfs -- \
|
||
-end >/dev/null 2>"$WORK/xorriso.log" || { cat "$WORK/xorriso.log"; exit 1; }
|
||
echo "Образ собран: $OUT ($(du -h "$OUT" | cut -f1)), канал $CHANNEL; ядро: $FILES; Валидата: $n пакета"
|