From 7284a8108c8dcac6ec763a550de23533ffd5d6db Mon Sep 17 00:00:00 2001 From: NW Date: Fri, 7 Aug 2026 15:20:45 +0100 Subject: [PATCH] =?UTF-8?q?=D0=91=D0=B0=D0=BD=D0=BD=D0=B5=D1=80=20BBox=20?= =?UTF-8?q?=D0=BA=D0=B0=D0=BA=20=D1=88=D0=B0=D0=B1=D0=BB=D0=BE=D0=BD=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D1=8F=20(motd/10-armbian-header.tpl):=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=81=D0=B8=D1=8F/URL=20=D0=BF=D0=BE=D0=B4=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D1=8E=D1=82=D1=81=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B5,=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 ++++++ init_system.sh | 65 +++++++++++---- install.sh | 6 +- install_scripts.sh | 49 ++++++++++++ motd/10-armbian-header.tpl | 158 +++++++++++++++++++++++++++++++++++++ 5 files changed, 284 insertions(+), 17 deletions(-) create mode 100644 motd/10-armbian-header.tpl diff --git a/README.md b/README.md index 8916141..c04b6a0 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,29 @@ | `init_system.sh` | Первичная инициализация устройства (однократно после развёртывания): обновление, базовые утилиты, Docker, hostname, баннер BBox, сброс идентификаторов | | `cleanup_system.sh` | Очистка и оптимизация: apt-кэш, логи, tmp, orphaned-пакеты, Docker-мусор; `--full` дополнительно удаляет Matrix/nginx и сбрасывает идентификаторы | | `install_scripts.sh` | Установка скриптов в `/usr/local/bin` + сервис автозапуска `bbox-firstboot.service` | +| `install.sh` | Единая команда установки из репозитория (инициализация + очистка + скрипты) | +| `motd/10-armbian-header.tpl` | Шаблон баннера входа BBox (версия и URL подставляются автоматически) | + +### 🖥️ Баннер узла — шаблон из репозитория + +При входе по SSH узел показывает баннер **BBox (bbox.wtf)**: + +``` + ___ ___ + | _ ) _ ) _____ __ + | _ \ _ \/ _ \ \ / + |___/___/\___/_\_\ + + v1.2 bbox.wtf on Orange Pi Zero2 running 6.6.36-current-sunxi64, built on Armbian Linux + Created by free people for a free world, in the name of privacy and security. +``` + +Файл хранится как **шаблон** `motd/10-armbian-header.tpl` с плейсхолдерами `__BBOX_VERSION__` и `__BBOX_URL__`. При каждой установке (`install_scripts.sh` / `init_system.sh`) баннер целиком перезаписывается из шаблона с подстановкой актуальной версии: + +- **Смена версии** → правите `BBOX_VERSION` в скриптах (единый источник), повторный запуск `install.sh` обновляет баннер на всех устройствах. +- **Обновление пакета Armbian** → дефолтный файл восстановится, но повторный `install_scripts.sh` вернёт BBox-баннер. +- Бэкап дефолтного баннера Armbian: `/etc/update-motd.d/10-armbian-header.bak`. +- Локальная копия шаблона для повторных запусков: `/usr/local/share/bbox/motd/`. ### Первичная инициализация (`init_system.sh`) diff --git a/init_system.sh b/init_system.sh index 45653cc..6107658 100755 --- a/init_system.sh +++ b/init_system.sh @@ -150,26 +150,61 @@ setup_hostname() { } # --------------------------------------------------------------------------- -# 6. Баннер BBox (MOTD) +# 6. Баннер BBox (MOTD) — шаблон из репозитория # --------------------------------------------------------------------------- -setup_motd() { - local HEADER="/etc/update-motd.d/10-armbian-header" - if [ -f "$HEADER" ] && ! grep -q "BBox" "$HEADER"; then - log "Обновление баннера входа: BBox v${BBOX_VERSION} ($BBOX_URL)" - cp "$HEADER" "${HEADER}.bak" +# Шаблон: motd/10-armbian-header.tpl с плейсхолдерами __BBOX_VERSION__ / __BBOX_URL__. +# При каждом запуске файл целиком перезаписывается из шаблона, поэтому смена +# версии в репозитории автоматически обновляет баннер на устройстве. +# --------------------------------------------------------------------------- +MOTD_HEADER="/etc/update-motd.d/10-armbian-header" +MOTD_TPL_REPO="motd/10-armbian-header.tpl" - # ASCII-баннер - sed -i 's|figlet -f small " $VENDOR"|figlet -f small " BBox"|' "$HEADER" +render_motd() { + local tpl="$1" + sed -e "s|__BBOX_VERSION__|${BBOX_VERSION}|g" \ + -e "s|__BBOX_URL__|${BBOX_URL}|g" "$tpl" +} - # Строка версии + подпись - sed -i 's|running Armbian Linux \\e\[0;92m\${KERNELID\^}\\x1B\[0m|running \\e[0;92m${KERNELID^}\\x1B[0m, built on Armbian Linux|' "$HEADER" - # Вставка строки версии/подписи после строки баннера figlet - if ! grep -q "bbox.wtf v" "$HEADER"; then - sed -i "/figlet -f small \" BBox\"/a echo -e \" \\\\e[0;92mv${BBOX_VERSION}\\\\x1B[0m ${BBOX_URL} on \$BOARD_NAME\"\necho -e \" \\\\e[0;36mCreated by free people for a free world, in the name of privacy and security.\\\\x1B[0m\"" "$HEADER" +install_motd_template() { + local tpl_src="" + local script_dir + script_dir="$(dirname "$(readlink -f "$0")")" + # Источники шаблона: + # 1) рядом со скриптом (репозиторий / временная загрузка) + # 2) в общем хранилище (после install_scripts.sh -> /usr/local/share/bbox/motd) + for candidate in \ + "$script_dir/$MOTD_TPL_REPO" \ + "$script_dir/../$MOTD_TPL_REPO" \ + "$script_dir/motd/10-armbian-header.tpl" \ + "/usr/local/share/bbox/motd/$(basename "$MOTD_TPL_REPO")" + do + if [ -f "$candidate" ]; then + tpl_src="$candidate" + break fi - log "Баннер обновлён." + done + + if [ -z "$tpl_src" ]; then + warn "Шаблон баннера не найден ($MOTD_TPL_REPO), баннер не изменён." + return 1 + fi + + # Бэкап дефолтного баннера только один раз + if [ ! -f "${MOTD_HEADER}.bak" ]; then + cp -f "$MOTD_HEADER" "${MOTD_HEADER}.bak" 2>/dev/null || true + fi + + # Запись шаблона с подстановкой версии/URL + render_motd "$tpl_src" > "$MOTD_HEADER" + chmod 755 "$MOTD_HEADER" + log "Баннер BBox установлен из шаблона: v${BBOX_VERSION} (${BBOX_URL})" +} + +setup_motd() { + if [ -f "$MOTD_HEADER" ]; then + install_motd_template else - log "Баннер BBox уже установлен или скрипт не найден." + warn "Баннер входа не найден ($MOTD_HEADER), пропуск." fi } diff --git a/install.sh b/install.sh index d5fc2dc..b2e77dc 100755 --- a/install.sh +++ b/install.sh @@ -84,12 +84,14 @@ fetch_scripts() { mkdir -p "$WORK_DIR" local base="$REPO_URL/raw/branch/$BRANCH" - local files=("init_system.sh" "cleanup_system.sh" "install_scripts.sh") + local files=("init_system.sh" "cleanup_system.sh" "install_scripts.sh" "motd/10-armbian-header.tpl") local ok=1 for f in "${files[@]}"; do if curl -fsSL "$base/$f" -o "$WORK_DIR/$f"; then - chmod +x "$WORK_DIR/$f" + case "$f" in + *.sh) chmod +x "$WORK_DIR/$f" ;; + esac log " ✓ $f загружен" else warn " ✗ не удалось загрузить $f" diff --git a/install_scripts.sh b/install_scripts.sh index 51546ad..8579b54 100755 --- a/install_scripts.sh +++ b/install_scripts.sh @@ -20,6 +20,9 @@ NC='\033[0m' BIN_DIR="/usr/local/bin" SERVICE_DIR="/etc/systemd/system" MARKER="/var/lib/bbox-firstboot-done" +MOTD_HEADER="/etc/update-motd.d/10-armbian-header" +MOTD_TPL_REPO="motd/10-armbian-header.tpl" +MOTD_SHARE_DIR="/usr/local/share/bbox/motd" log() { echo -e "${GREEN}[install-scripts]${NC} $*"; } warn() { echo -e "${YELLOW}[install-scripts][warn]${NC} $*"; } @@ -27,6 +30,10 @@ fail() { echo -e "${RED}[install-scripts][error]${NC} $*"; exit 1; } SCRIPT_SRC_DIR="$(cd "$(dirname "$(readlink -f "$0")")" && pwd)" +# Версия/URL — единый источник (должны совпадать с init_system.sh) +BBOX_VERSION="${BBOX_VERSION:-1.2}" +BBOX_URL="${BBOX_URL:-bbox.wtf}" + install_script() { local src="$1" dst="$2" if [ ! -f "$src" ]; then @@ -37,6 +44,45 @@ install_script() { log "Установлен: $dst" } +# --------------------------------------------------------------------------- +# Баннер BBox: установка из шаблона репозитория (motd/10-armbian-header.tpl) +# --------------------------------------------------------------------------- +install_motd_template() { + local tpl_src="" + for candidate in \ + "$SCRIPT_SRC_DIR/$MOTD_TPL_REPO" \ + "$SCRIPT_SRC_DIR/../$MOTD_TPL_REPO" \ + "$SCRIPT_SRC_DIR/motd/10-armbian-header.tpl" + do + if [ -f "$candidate" ]; then + tpl_src="$candidate" + break + fi + done + + if [ -z "$tpl_src" ]; then + warn "Шаблон баннера не найден ($MOTD_TPL_REPO), баннер не изменён." + return 1 + fi + + # Бэкап дефолтного баннера Armbian (один раз) + if [ -f "$MOTD_HEADER" ] && [ ! -f "${MOTD_HEADER}.bak" ]; then + cp -f "$MOTD_HEADER" "${MOTD_HEADER}.bak" + log "Бэкап дефолтного баннера: ${MOTD_HEADER}.bak" + fi + + # Подстановка версии/URL и установка + sed -e "s|__BBOX_VERSION__|${BBOX_VERSION}|g" \ + -e "s|__BBOX_URL__|${BBOX_URL}|g" "$tpl_src" > "$MOTD_HEADER" + chmod 755 "$MOTD_HEADER" + log "Баннер BBox v${BBOX_VERSION} установлен из шаблона ($tpl_src)" + + # Копия шаблона для последующих запусков init-system из /usr/local/bin + mkdir -p "$MOTD_SHARE_DIR" + install -m 0644 "$tpl_src" "$MOTD_SHARE_DIR/$(basename "$tpl_src")" + log "Шаблон баннера сохранён: $MOTD_SHARE_DIR/$(basename "$tpl_src")" +} + install_firstboot_service() { local unit="$SERVICE_DIR/bbox-firstboot.service" cat > "$unit" </dev/null; then + UPDATE_STATUS="Kernel upgrade \e[0;91mdisabled\e[0m" + else + UPDATE_STATUS="Kernel upgrade \e[0;92menabled\e[0m" + fi + UPDATE_STATUS+=" and \e[1;92m$NUM_UPDATES\e[0m package" + # Cosmetic is important + [[ $NUM_UPDATES -gt 1 ]] && UPDATE_STATUS+="s" + UPDATE_STATUS+=" available for upgrade\e[0m " +fi + +echo "" + +# Display packages status +if [[ -n $DISTRO_STATUS ]]; then + if [[ -n "${upgrade}" ]]; then + DISTRO_STATUS+=", possible distro upgrade ($upgrade)" + fi + echo -e " Packages: ${DISTRIBUTION_ID^} ${DISTRO_STATUS}" +fi + +# Display available updates +if [[ -n $UPDATE_STATUS ]]; then + echo -e " Updates: $UPDATE_STATUS" +fi + +# Display hardware support status +if [[ -n $HARDWARE_STATUS ]]; then + echo -e " Support: $HARDWARE_STATUS" +fi + +echo -en " IP addresses: \x1B[93m(LAN)\x1B[0m \x1B[92m$ip_address\x1B[0m " +if [[ -n $wan_ip_address ]]; then +echo -e "\x1B[93m(WAN)\x1B[0m $wan_ip_address" +fi +echo ""