Загрузка данных


#!/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 "После этого перезагрузите систему и проверьте работу."