Загрузка данных
sudo bash <<'BASH'
set -Eeuo pipefail
export LANG=C
export DEBIAN_FRONTEND=noninteractive
export APT_LISTCHANGES_FRONTEND=none
export NEEDRESTART_MODE=a
TARGET=RUMOW11AI02V
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
BACKUP="/root/${TARGET}-before-${STAMP}"
LOG="/var/log/${TARGET}-maintenance-${STAMP}.log"
mkdir -p "$BACKUP"
exec > >(tee -a "$LOG") 2>&1
trap 'rc=$?; echo "ERROR: line $LINENO, exit $rc. Log: $LOG"; exit "$rc"' ERR
echo "========== 1. PREFLIGHT =========="
. /etc/os-release
[[ "$ID" == ubuntu && "$VERSION_ID" == 24.04 ]] || {
echo "Unsupported OS: $PRETTY_NAME"
exit 2
}
[[ $(df -Pk / | awk 'NR==2 {print $4}') -ge 1048576 ]] || {
echo "Less than 1 GiB free on /"
exit 3
}
hostname
timedatectl
df -h / /boot
echo "========== 2. BACKUP =========="
cp -a /etc/hostname /etc/hosts "$BACKUP/"
echo "Backup: $BACKUP"
wait_sync() {
local i
for ((i=0; i < $1; i++)); do
if [[ "$(timedatectl show -p NTPSynchronized --value 2>/dev/null || true)" == yes ]]; then
return 0
fi
sleep 5
done
return 1
}
echo "========== 3. FIX TIME SYNC =========="
systemctl enable --now systemd-timesyncd
systemctl restart systemd-timesyncd
if ! wait_sync 9; then
echo "Existing NTP not synchronized. Trying public NTP."
mkdir -p /etc/systemd/timesyncd.conf.d
NTP_FILE=/etc/systemd/timesyncd.conf.d/99-rumow11ai02v.conf
if [[ -e "$NTP_FILE" ]]; then
cp -a "$NTP_FILE" "$BACKUP/original-timesyncd-dropin.conf"
fi
cat > "$NTP_FILE" <<'EOF'
[Time]
NTP=ntp.ubuntu.com time.cloudflare.com
EOF
systemctl restart systemd-timesyncd
if ! wait_sync 24; then
journalctl -u systemd-timesyncd -n 35 --no-pager || true
if [[ -f "$BACKUP/original-timesyncd-dropin.conf" ]]; then
cp -a "$BACKUP/original-timesyncd-dropin.conf" "$NTP_FILE"
else
rm -f "$NTP_FILE"
fi
systemctl restart systemd-timesyncd || true
echo "ERROR: NTP synchronization failed."
echo "Previous NTP configuration restored."
echo "Upgrade and reboot cancelled."
exit 20
fi
fi
timedatectl
timedatectl timesync-status || true
echo "========== 4. CLOUD-INIT =========="
if command -v cloud-init >/dev/null 2>&1; then
mkdir -p /etc/cloud/cloud.cfg.d
CLOUD_FILE=/etc/cloud/cloud.cfg.d/99-rumow11ai02v-hostname.cfg
if [[ -e "$CLOUD_FILE" ]]; then
cp -a "$CLOUD_FILE" "$BACKUP/original-cloud-hostname.cfg"
fi
cat > "$CLOUD_FILE" <<'EOF'
#cloud-config
preserve_hostname: true
manage_etc_hosts: false
EOF
fi
echo "========== 5. SET HOSTNAME =========="
hostnamectl set-hostname "$TARGET"
sed -i -E \
'/^[[:space:]]*127\.0\.1\.1([[:space:]]|$)/d' \
/etc/hosts
printf '\n127.0.1.1\t%s\n' "$TARGET" >> /etc/hosts
hostnamectl
getent hosts "$TARGET"
echo "========== 6. APT UPDATE =========="
apt-get \
-o DPkg::Lock::Timeout=180 \
-o Acquire::Retries=3 \
-o APT::Update::Error-Mode=any \
update
echo "========== 7. UPGRADE SIMULATION =========="
apt-get \
-o DPkg::Lock::Timeout=180 \
-s dist-upgrade | tee "$BACKUP/apt-simulation.txt"
if grep -qE '^Remv[[:space:]]' "$BACKUP/apt-simulation.txt"; then
echo "ERROR: Upgrade would remove packages."
grep -E '^Remv[[:space:]]' "$BACKUP/apt-simulation.txt"
echo "Automatic upgrade cancelled."
exit 30
fi
echo "========== 8. INSTALL UPDATES =========="
apt-get \
-o DPkg::Lock::Timeout=180 \
-o Dpkg::Options::="--force-confdef" \
-o Dpkg::Options::="--force-confold" \
-y dist-upgrade
echo "========== 9. FINAL VERIFICATION =========="
if ! wait_sync 12; then
echo "ERROR: NTP not synchronized after upgrade."
echo "Reboot cancelled."
exit 40
fi
[[ "$(hostname)" == "$TARGET" ]] || {
echo "ERROR: Hostname mismatch."
exit 41
}
hostnamectl
timedatectl
timedatectl timesync-status || true
echo "========== 10. REBOOT =========="
echo "Log: $LOG"
echo "Backup: $BACKUP"
echo "Reboot scheduled in 1 minute."
shutdown -r +1 'VM maintenance: hostname, NTP, OS updates'
BASH