Files
ProxMenux/scripts/global/update-pbs.sh
T

189 lines
7.4 KiB
Bash

#!/bin/bash
# ==========================================================
# Proxmox Backup Server Update Script (post-install flows)
# ==========================================================
LOCAL_SCRIPTS="/usr/local/share/proxmenux/scripts"
BASE_DIR="/usr/local/share/proxmenux"
UTILS_FILE="$BASE_DIR/utils.sh"
APT_ENV="env DEBIAN_FRONTEND=noninteractive LC_ALL=C LANG=C"
if [[ -f "$UTILS_FILE" ]]; then
source "$UTILS_FILE"
fi
if [[ -f "$LOCAL_SCRIPTS/global/pmx_journal.sh" ]]; then
source "$LOCAL_SCRIPTS/global/pmx_journal.sh"
fi
source "$LOCAL_SCRIPTS/global/common-functions.sh"
source "$LOCAL_SCRIPTS/global/repository-functions.sh"
load_language
initialize_cache
update_pbs() {
local FUNC_VERSION="1.0"
pmx_journal_context "update_pbs" "$FUNC_VERSION"
if ! pmx_is_pbs || [[ "$(pmx_platform_field supported)" != true ]]; then
msg_error "$(translate 'This operation supports PBS 3 on Debian 12 and PBS 4 on Debian 13.')"
return 1
fi
local start_time
start_time=$(date +%s)
local log_file="/var/log/proxmox-update-$(date +%Y%m%d-%H%M%S).log"
local screen_capture="/tmp/proxmenux_screen_capture_$$.txt"
local OS_CODENAME
OS_CODENAME=$(pmx_platform_field codename)
{
echo "=== ProxMenux — Proxmox Backup Server update ==="
echo "Started: $(date -Iseconds)"
echo "Host: $(hostname)"
echo "Running: proxmox-backup-server $(dpkg-query -W -f='${Version}' proxmox-backup-server 2>/dev/null)"
} > "$log_file"
if ! ensure_pbs_repositories; then
msg_error "$(translate "Failed to configure Proxmox Backup Server repositories")"
rm -f "$screen_capture"
return 1
fi
local available_space
available_space=$(df /var/cache/apt/archives | awk 'NR==2 {print int($4/1024)}')
if [ "$available_space" -lt 1024 ]; then
msg_error "$(translate "Insufficient disk space. Available:") ${available_space}MB"
return 1
fi
local update_output update_exit_code
update_output=$(apt-get -o APT::Update::Error-Mode=any update 2>&1)
update_exit_code=$?
{
echo
echo "--- apt-get update (exit $update_exit_code) ---"
printf '%s\n' "$update_output"
} >> "$log_file"
if [ $update_exit_code -ne 0 ]; then
msg_error "$(translate "APT refresh failed. Check the PBS subscription and repositories in Administration > Repositories. Log:") $log_file"
return 1
fi
msg_ok "$(translate "Package lists updated successfully")" | tee -a "$screen_capture"
local current_version available_version
current_version=$(dpkg-query -W -f='${Version}' proxmox-backup-server 2>/dev/null)
available_version=$(apt-cache policy proxmox-backup-server 2>/dev/null | awk '/Candidate:/ {print $2; exit}')
local upgradable upgradable_raw upgradable_list security_updates
upgradable_raw=$($APT_ENV apt list --upgradable 2>/dev/null \
| sed '1d' \
| sed '/^\s*$/d')
upgradable=$(printf '%s' "$upgradable_raw" | grep -c . )
security_updates=$(printf '%s\n' "$upgradable_raw" | grep -ci '\-security')
upgradable_list=$(printf '%s\n' "$upgradable_raw" | pmx_format_upgradable)
{
echo
echo "--- Packages to upgrade ($upgradable) ---"
[ "$upgradable" -gt 0 ] && printf '%s\n' "$upgradable_list"
} >> "$log_file"
local menu_text
menu_text="$(translate "System Update Information")\n\n"
menu_text+="$(translate "Current PBS Version"): $current_version\n"
if [ -n "$available_version" ] && [ "$available_version" != "$current_version" ]; then
menu_text+="$(translate "Available PBS Version"): $available_version\n"
fi
menu_text+="\n$(translate "Package Updates Available"): $upgradable\n"
menu_text+="$(translate "Security Updates"): $security_updates\n\n"
if [ "$upgradable" -eq 0 ]; then
menu_text+="$(translate "System is already up to date")"
whiptail --title "$(translate "Update Status")" --msgbox "$menu_text" 15 70
clear
show_proxmenux_logo
msg_title "$(translate "$SCRIPT_TITLE")"
cat "$screen_capture"
msg_ok "$(translate "System is already up to date. No update needed.")"
echo -e "\nSystem is already up to date." >> "$log_file"
rm -f "$screen_capture"
return 0
fi
menu_text+="$(translate "Packages to be upgraded"):\n$upgradable_list\n\n"
menu_text+="$(translate "Do you want to proceed with the system update?")"
local proceed=0
whiptail --title "$(translate "Proxmox Backup Server Update")" --scrolltext --yesno "$menu_text" 24 78 || proceed=1
clear
show_proxmenux_logo
msg_title "$(translate "$SCRIPT_TITLE")"
cat "$screen_capture"
if [ $proceed -ne 0 ]; then
msg_info2 "$(translate "Update cancelled by user")"
rm -f "$screen_capture"
return 0
fi
pmx_record_execution "Upgrade Proxmox Backup Server packages" "apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold full-upgrade"
local dpkg_mark upgrade_exit_code
dpkg_mark=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "\n--- apt full-upgrade ---" >> "$log_file"
DEBIAN_FRONTEND=noninteractive apt -y \
-o Dpkg::Options::='--force-confdef' \
-o Dpkg::Options::='--force-confold' \
full-upgrade 2> >(tee -a "$log_file" >&2)
upgrade_exit_code=$?
echo -e
{
echo
echo "--- Packages changed (exit $upgrade_exit_code) ---"
pmx_dpkg_changes_since "$dpkg_mark"
} >> "$log_file"
clear
show_proxmenux_logo
msg_title "$(translate "$SCRIPT_TITLE")"
cat "$screen_capture"
rm -f "$screen_capture"
if [ $upgrade_exit_code -ne 0 ]; then
msg_error "$(translate "System upgrade failed. Check log:") $log_file"
echo "Finished: $(date -Iseconds) — upgrade failed (exit $upgrade_exit_code)" >> "$log_file"
return 1
fi
pmx_record_execution "Remove unused packages" "apt-get -y autoremove"
apt-get -y autoremove > /dev/null 2>&1 || true
apt-get -y autoclean > /dev/null 2>&1 || true
msg_ok "$(translate "Cleanup finished")"
local end_time duration minutes seconds
end_time=$(date +%s)
duration=$((end_time - start_time))
minutes=$((duration / 60))
seconds=$((duration % 60))
echo -e "${TAB}${BGN}$(translate "====== PBS UPDATE COMPLETED ======")${CL}"
echo -e "${TAB}${GN}⏱️ $(translate "Duration")${CL}: ${BL}${minutes}m ${seconds}s${CL}"
echo -e "${TAB}${GN}📄 $(translate "Log file")${CL}: ${BL}$log_file${CL}"
echo -e "${TAB}${GN}📦 $(translate "Packages upgraded")${CL}: ${BL}$upgradable${CL}"
echo -e "${TAB}${GN}🗄️ $(translate "Proxmox Backup Server")${CL}: ${BL}$(dpkg-query -W -f='${Version}' proxmox-backup-server 2>/dev/null) (Debian $OS_CODENAME)${CL}"
{
echo
echo "Finished: $(date -Iseconds) — ${minutes}m ${seconds}s"
echo "Running: proxmox-backup-server $(dpkg-query -W -f='${Version}' proxmox-backup-server 2>/dev/null)"
} >> "$log_file"
if [ -f /var/run/reboot-required ] || [ "$(uname -r)" != "$(ls -1 /boot/vmlinuz-* 2>/dev/null | sed 's|/boot/vmlinuz-||' | sort -V | tail -1)" ]; then
msg_warn "$(translate "A newer kernel is installed. Reboot before the next backup window to use it.")"
fi
msg_ok "$(translate "Proxmox Backup Server update completed.")"
}
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
update_pbs
fi