Баннер BBox как шаблон из репозитория (motd/10-armbian-header.tpl): версия/URL подставляются при установке, обновление при смене версии
This commit is contained in:
23
README.md
23
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`)
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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" <<EOF
|
||||
@@ -78,6 +124,9 @@ main() {
|
||||
log "tmux-конфиг установлен в /root/.tmux.conf"
|
||||
fi
|
||||
|
||||
# Баннер BBox — всегда переустанавливается из шаблона репозитория
|
||||
install_motd_template
|
||||
|
||||
install_firstboot_service
|
||||
|
||||
log "Готово. Запуск вручную:"
|
||||
|
||||
158
motd/10-armbian-header.tpl
Normal file
158
motd/10-armbian-header.tpl
Normal file
@@ -0,0 +1,158 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Copyright (c) Authors: https://www.armbian.com/authors
|
||||
#
|
||||
# This file is licensed under the terms of the GNU General Public
|
||||
# License version 2. This program is licensed "as is" without any
|
||||
# warranty of any kind, whether express or implied.
|
||||
#
|
||||
# BBox (bbox.wtf) — модифицированная версия баннера входа Armbian.
|
||||
# ШАБЛОН. Плейсхолдеры __BBOX_VERSION__ и __BBOX_URL__ подставляются
|
||||
# скриптами установки (init_system.sh / install_scripts.sh).
|
||||
# НЕ РЕДАКТИРОВАТЬ напрямую на устройстве — правится в репозитории
|
||||
# и заменяется при переустановке.
|
||||
|
||||
THIS_SCRIPT="header"
|
||||
MOTD_DISABLE=""
|
||||
HIDE_IP_PATTERN="^dummy0|^lo|^docker"
|
||||
|
||||
# Read image configuration
|
||||
[[ -f /etc/armbian-image-release ]] && . /etc/armbian-image-release
|
||||
VENDORTEMP="${VENDOR}"
|
||||
|
||||
# Read update configuration
|
||||
[[ -f /etc/armbian-release ]] && . /etc/armbian-release
|
||||
|
||||
# Keep the VENDOR from image if its defined there
|
||||
[[ -n "${VENDORTEMP}" && "${VENDORTEMP}" != "${VENDOR}" ]] && VENDOR="${VENDORTEMP}"
|
||||
|
||||
# If VENDORPRETTYNAME is defined, used that
|
||||
[[ -n $VENDORPRETTYNAME ]] && VENDOR="$VENDORPRETTYNAME"
|
||||
|
||||
if [[ -f /etc/armbian-distribution-status ]]; then
|
||||
. /etc/armbian-distribution-status
|
||||
# Fina a way that works
|
||||
[[ -f /etc/lsb-release ]] && DISTRIBUTION_CODENAME=$(grep CODENAME /etc/lsb-release | cut -d"=" -f2)
|
||||
[[ -f /etc/lsb-release ]] && DISTRIBUTION_ID=$(grep DISTRIB_ID /etc/lsb-release | cut -d"=" -f2)
|
||||
[[ -z "$DISTRIBUTION_CODENAME" && -f /etc/os-release ]] && DISTRIBUTION_CODENAME=$(grep VERSION_CODENAME /etc/os-release | cut -d"=" -f2)
|
||||
[[ -z "$DISTRIBUTION_ID" && -f /etc/os-release ]] && DISTRIBUTION_ID=$(grep "^ID" /etc/os-release | cut -d"=" -f2)
|
||||
[[ -z "$DISTRIBUTION_CODENAME" && -x /usr/bin/lsb_release ]] && DISTRIBUTION_CODENAME=$(/usr/bin/lsb_release -c | cut -d":" -f2 | tr -d "\t")
|
||||
[[ -z "$DISTRIBUTION_ID" && -x /usr/bin/lsb_release ]] && DISTRIBUTION_ID=$(/usr/bin/lsb_release -i | cut -d":" -f2 | tr -d "\t")
|
||||
# Read Armbian distribution status
|
||||
DISTRIBUTION_STATUS=$(grep "^${DISTRIBUTION_CODENAME}" /etc/armbian-distribution-status | cut -d"=" -f2 | cut -d";" -f1)
|
||||
|
||||
# Read upgrade possibilities on stable channel
|
||||
filter=$(grep "supported" /etc/armbian-distribution-status | cut -d"=" -f1)
|
||||
upgrade=$(for j in $filter; do
|
||||
for i in $(grep "^${DISTRIBUTION_CODENAME}" /etc/armbian-distribution-status | cut -d";" -f2 | cut -d"=" -f2 | sed "s/,/ /g"); do
|
||||
if [[ $i == $j ]]; then
|
||||
echo $i
|
||||
fi
|
||||
done
|
||||
done | tail -1)
|
||||
|
||||
fi
|
||||
[[ -f /etc/default/armbian-motd ]] && . /etc/default/armbian-motd
|
||||
|
||||
for f in $MOTD_DISABLE; do
|
||||
[[ $f == $THIS_SCRIPT ]] && exit 0
|
||||
done
|
||||
|
||||
function get_wan_address() {
|
||||
curl --connect-timeout 2 -s http://whatismyip.akamai.com/
|
||||
} # get wan ip address
|
||||
|
||||
function get_ip_addresses() {
|
||||
local ips=()
|
||||
for f in /sys/class/net/*; do
|
||||
local intf=$(basename $f)
|
||||
# match only interface names "dummy0" and "lo"
|
||||
if [[ $intf =~ $HIDE_IP_PATTERN ]]; then
|
||||
continue
|
||||
else
|
||||
local tmp=$(ip -4 addr show dev $intf | grep -v "$intf:avahi" | awk '/inet/ {print $2}' | cut -d'/' -f1 | uniq)
|
||||
# add both name and IP - can be informative but becomes ugly with long persistent/predictable device names
|
||||
#[[ -n $tmp ]] && ips+=("$intf: $tmp")
|
||||
# add IP only
|
||||
[[ -n $tmp ]] && ips+=("$tmp")
|
||||
fi
|
||||
done
|
||||
echo "${ips[@]}"
|
||||
} # get_ip_addresses
|
||||
|
||||
# Read Armbian kernel version
|
||||
KERNELID=$(uname -r)
|
||||
# Get other variables
|
||||
ip_address=$(get_ip_addresses &)
|
||||
wan_ip_address=$(get_wan_address &)
|
||||
|
||||
# Display software vendor logo
|
||||
echo -e "\e[1;91m$(figlet -f small " BBox")\e[0m";
|
||||
|
||||
# Display version, board, and kernel version
|
||||
[[ $VERSION == *trunk* ]] && VERSION=$(echo -e $VERSION | cut -d"." -f1-2 | sed "s/\$/ rolling/")
|
||||
echo -e " \e[0;92mv__BBOX_VERSION__\x1B[0m __BBOX_URL__ on $BOARD_NAME running \e[0;92m${KERNELID^}\x1B[0m, built on Armbian Linux"
|
||||
echo -e " \e[0;36mCreated by free people for a free world, in the name of privacy and security.\x1B[0m"
|
||||
|
||||
# render image and board type
|
||||
if [[ "$IMAGE_TYPE" != "stable" ]]; then
|
||||
[[ "$IMAGE_TYPE" == "user-built" ]] && HARDWARE_STATUS="\e[0;91mDIY\x1B[0m (custom image)\x1B[0m"
|
||||
[[ "$IMAGE_TYPE" == "nightly" ]] && HARDWARE_STATUS="\e[0;91mfor advanced users\x1B[0m (rolling release)\x1B[0m"
|
||||
else
|
||||
[[ "$BOARD_TYPE" == "csc" || "$BOARD_TYPE" == "tvb" ]] && HARDWARE_STATUS="\e[0;91mDIY (community maintained)\x1B[0m"
|
||||
[[ "$BOARD_TYPE" == "wip" ]] && HARDWARE_STATUS="\e[0;91mfor advanced users\x1B[0m (work in progress)\x1B[0m"
|
||||
[[ "$BOARD_TYPE" == "eos" ]] && HARDWARE_STATUS="\e[0;91mend of life\x1B[0m"
|
||||
fi
|
||||
|
||||
# render distribution status
|
||||
if [[ $DISTRIBUTION_STATUS == supported ]]; then
|
||||
DISTRO_STATUS="\e[0;92mstable\e[0m ($DISTRIBUTION_CODENAME)"
|
||||
elif [[ $DISTRIBUTION_STATUS == eos ]]; then
|
||||
DISTRO_STATUS="\e[0;91mend of life\e[0m ($DISTRIBUTION_CODENAME)"
|
||||
else
|
||||
DISTRO_STATUS="\e[0;93mrolling\e[0m ($DISTRIBUTION_CODENAME)"
|
||||
fi
|
||||
|
||||
|
||||
# read packages update status
|
||||
NUM_UPDATES=0
|
||||
NUM_UPDATES_ONHOLD=0
|
||||
NUM_SECURITY_UPDATES=0
|
||||
[[ -f /var/cache/apt/archives/updates.number ]] && . /var/cache/apt/archives/updates.number
|
||||
if [[ $NUM_UPDATES -gt 0 ]]; then
|
||||
if apt-mark showhold | grep -q linux-image 2>/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 ""
|
||||
Reference in New Issue
Block a user