Загрузка данных
#!/bin/bash
# ================================================
# Astra Linux 1.7.10 — Оффлайн-обновления (версия 2.1)
# Исправлена проблема с запуском установки при перезагрузке
# ================================================
set -euo pipefail
if [ "$EUID" -ne 0 ]; then
echo "Пожалуйста, запустите скрипт от имени root (sudo ./setup-astra-update.sh)"
exit 1
fi
echo "=== Настройка оффлайн-обновлений Astra Linux 1.7.10 (v2.1) ==="
# 1. Репозитории
echo "[1/9] Настройка репозиториев..."
tee /etc/apt/sources.list.d/astra-1.7.10.list > /dev/null <<EOF
deb http://10.166.114.224/astra/alse/frozen/1.7_x86-64/1.7.10/repository-base/ 1.7_x86-64 main contrib non-free
deb http://10.166.114.224/astra/alse/frozen/1.7_x86-64/1.7.10/repository-extended/ 1.7_x86-64 main contrib non-free
deb http://10.166.114.224/astra/alse/frozen/1.7_x86-64/1.7.10/repository-update/ 1.7_x86-64 main contrib non-free
deb http://10.166.114.224/astra/alse/frozen/1.7_x86-64/1.7.10/repository-main/ 1.7_x86-64 main contrib non-free
EOF
# 2. Очистка i386
echo "[2/9] Проверка архитектуры i386..."
if [ "$(dpkg --print-architecture)" != "i386" ]; then
if [ "$(dpkg -l | grep -c ":i386" || echo 0)" -eq 0 ]; then
dpkg --remove-architecture i386 2>/dev/null || true
fi
fi
# 3. Обновление списков
echo "[3/9] apt-get update..."
apt-get update -qq || echo "Предупреждение: ошибки при обновлении списков."
# ====================== Переменные ======================
UPDATE_DIR="/var/lib/astra-update"
FLAG_PATH="/system-update"
LOGFILE="/var/log/astra-update.log"
# 4. Скрипт загрузки обновлений
echo "[4/9] Создание astra-update-download.sh..."
cat << 'EOF' > /usr/local/sbin/astra-update-download.sh
#!/bin/bash
set -euo pipefail
FLAG_PATH="/system-update"
UPDATE_DIR="/var/lib/astra-update"
LOGFILE="/var/log/astra-update.log"
exec >> "$LOGFILE" 2>&1
echo "$(date '+%Y-%m-%d %H:%M:%S') — [DOWNLOAD] Запуск"
dpkg --remove --force-remove-reinstreq kesl-gui 2>/dev/null || true
systemctl stop puppet.service 2>/dev/null || true
if [ -L "$FLAG_PATH" ] || [ -d "$FLAG_PATH" ]; then
echo "Обновление уже запланировано."
exit 0
fi
sleep 8
apt-get update -qq
UPDATES=$(apt-get -s dist-upgrade | grep -E '^(Inst|Conf)' | wc -l)
if [ "$UPDATES" -eq 0 ]; then
echo "Нет обновлений."
exit 0
fi
echo "Найдено $UPDATES обновлений. Загрузка..."
apt-get dist-upgrade --download-only -y -qq
if [ -n "$(find /var/cache/apt/archives -name '*.deb' -newer /var/cache/apt/pkgcache.bin 2>/dev/null | head -n1)" ]; then
echo "Загрузка успешна. Создаём флаг."
mkdir -p "$UPDATE_DIR"
ln -sf "$UPDATE_DIR" "$FLAG_PATH"
echo "Обновления будут установлены при следующей перезагрузке."
else
echo "Пакеты не загружены."
fi
EOF
chmod +x /usr/local/sbin/astra-update-download.sh
# 5. Скрипт установки
echo "[5/9] Создание astra-update-install.sh..."
cat << 'EOF' > /usr/local/sbin/astra-update-install.sh
#!/bin/bash
set -euo pipefail
FLAG_PATH="/system-update"
UPDATE_DIR="/var/lib/astra-update"
LOGFILE="/var/log/astra-update.log"
exec >> "$LOGFILE" 2>&1
echo "$(date '+%Y-%m-%d %H:%M:%S') — [INSTALL] === НАЧАЛО УСТАНОВКИ ==="
rm -f "$FLAG_PATH" # Защита от зацикливания
if command -v plymouth >/dev/null 2>&1; then
plymouth quit --wait 2>/dev/null || true
fi
echo -e "\033[1;33m========================================================================\033[0m"
echo -e "\033[1;33m= Пользовательское обновление системы =\033[0m"
echo -e "\033[1;33m= НЕ ВЫКЛЮЧАЙТЕ КОМПЬЮТЕР до завершения! =\033[0m"
echo -e "\033[1;33m========================================================================\033[0m"
echo ""
sleep 6
dpkg --configure -a || true
apt-get -f install -y || true
echo "Установка пакетов..."
DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y \
-o Dpkg::Options::="--force-confdef" \
-o Dpkg::Options::="--force-confold"
echo "Завершение..."
dpkg --configure -a
apt-get autoremove -y
apt-get clean
rm -rf "$UPDATE_DIR"
echo -e "\033[1;32m=== Обновление успешно завершено ===\033[0m"
echo "$(date '+%Y-%m-%d %H:%M:%S') — Обновление успешно завершено" >> "$LOGFILE"
sync
sleep 3
systemctl --force reboot
EOF
chmod +x /usr/local/sbin/astra-update-install.sh
# 6. Служба загрузки
echo "[6/9] Создание astra-update-downloader.service..."
cat << 'EOF' > /etc/systemd/system/astra-update-downloader.service
[Unit]
Description=Astra Linux Offline Update Downloader
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
TimeoutStartSec=600
ExecStart=/bin/bash /usr/local/sbin/astra-update-download.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
# 7. Служба установки (исправленная версия)
echo "[7/9] Создание astra-update-installer.service..."
cat << 'EOF' > /etc/systemd/system/astra-update-installer.service
[Unit]
Description=Astra Linux Offline Update Installer
DefaultDependencies=no
Requires=sysinit.target
After=sysinit.target
After=system-update-pre.target
Before=system-update.target
Conflicts=shutdown.target getty@tty1.service getty@tty2.service getty@tty3.service
OnFailure=shutdown.target
OnFailureJobMode=replace-irreversibly
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash /usr/local/sbin/astra-update-install.sh
StandardOutput=journal+console
StandardError=journal+console
TTYPath=/dev/tty1
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
SuccessAction=reboot
FailureAction=reboot
EOF
# 8. Финальная настройка
echo "[8/9] Применение настроек..."
mkdir -p /etc/systemd/system/system-update.target.wants
ln -sf /etc/systemd/system/astra-update-installer.service \
/etc/systemd/system/system-update.target.wants/astra-update-installer.service
systemctl daemon-reload
systemctl enable astra-update-downloader.service
# pdpl-file
if command -v pdpl-file >/dev/null 2>&1; then
pdpl-file -R 0:0:0:0 /usr/local/sbin/astra-update-download.sh
pdpl-file -R 0:0:0:0 /usr/local/sbin/astra-update-install.sh
fi
echo "[9/9] Готово!"
echo ""
echo "=== ✅ Настройка завершена (v2.1) ==="
echo "Лог: $LOGFILE"
echo ""
echo "Теперь выполните для очистки старого состояния:"
echo "rm -f /system-update"
echo "systemctl daemon-reload"
echo ""
echo "После этого перезагрузите систему и проверьте работу."