Files
ProxmoxHelper/functions.sh

251 lines
10 KiB
Bash

#!/bin/bash
##########################
# ProxMox update tools #
# FUNCTIONS #
# @author: Bram Prieshof #
##########################
#Update Packages and Applications on CT
#CT-UpdateBoth () {
# local CTID=$1
# echo "Updating Packages and Applications for $CTID"
# CT-UpdatePackages
# CT-UpdateApplicatons
#}
##Update Packages and Applications on VM
#VM-UpdateBoth () {
# local VMID=$1
# echo "Updating Packages and Applications for $VMID"
# VM-UpdatePackages
# VM-UpdateApplicatons
#}
#Updating Packages on CT
CT-UpdatePackages () {
#If not called by UpdateBoth then set $1 as CTID
if [ -z ${CTID+x} ]; then local CTID=$1;fi
echo "Updating Packages for $CTID"
#Getting distributionname
local DIST=$(pct exec $CTID -- awk -F= '$1=="ID" { print $2 ;}' /etc/os-release)
local INSTCALL="pct exec $CTID"
#Call generic package updater
UpdatePackages
unset DIST INSTCALL
}
#Updating Packages on VM
VM-UpdatePackages () {
#If not called by UpdateBoth then set $1 as VMID
if [ -z ${VMID+x} ]; then local VMID=$1;fi
echo "Updating Packages for $VMID, No output is provided until task is completed"
#Getting distributionname
local DIST=$(qm guest exec $VMID -- awk -F= '$1=="ID" { print $2 ;}' /etc/os-release | jq '.["out-data"]')
local INSTCALL="qm guest exec $VMID --timeout 0"
#Call generic package updater
UpdatePackages
unset DIST INSTCALL
}
#Starts package manager, called by CT-UpdatePackages and VM-UpdatePackages
UpdatePackages () {
#Getting distributionname
if [[ "${DIST}" == *"ubuntu"* ]] || [[ "${DIST}" == *"debian"* ]]; then
$INSTCALL -- apt update
$INSTCALL -- sh -c "DEBIAN_FRONTEND=noninteractive apt upgrade -y -o Dpkg::Options::="--force-confold""
elif [[ "${DIST}" == *"alpine"* ]]; then
$INSTCALL -- apk update
$INSTCALL -- apk upgrade
elif [[ "${DIST}" == *"centos"* ]] || [[ "${DIST}" == *"fedora"* ]]; then
$INSTCALL -- dnf update -y
else
echo "Warning: Package manager in not supported"
#exit 100
fi
}
#Updating CT applications using /opt/ProxMoxToolKitAppUpdate.sh in CT
CT-UpdateApplicatons () {
#If not called by UpdateBoth then set $1 as CTID
if [ -z ${CTID+x} ]; then local CTID=$1;fi
#Test if CT has Applicatons update script
if pct exec $CTID -- test -f /opt/ProxMoxToolKitAppUpdate.sh ; then
echo "Updating Applications for $CTID"
pct exec $CTID -- sh /opt/ProxMoxToolKitAppUpdate.sh
else
echo "Warning: Application updates not enabled in $CTID"
#exit 102
fi
}
#Updating VM applications using /opt/ProxMoxToolKitAppUpdate.sh in VM
VM-UpdateApplicatons () {
#If not called by UpdateBoth then set $1 as VMID
if [ -z ${VMID+x} ]; then local VMID=$1;fi
#Test if VM has Applicatons update script
if [ $(qm guest exec $VMID -- test -f /opt/ProxMoxToolKitAppUpdate.sh |jq '.exitcode') == 0 ] ; then
echo "Updating Applications for $VMID, No output is provided until task is completed"
qm guest exec $VMID --timeout 0 -- sh /opt/ProxMoxToolKitAppUpdate.sh
else
echo "Warning: application updates not enabled in $VMID"
#exit 102
fi
}
#Get state of CT as exitcode (0 when running 1 when stoped and 2 if CT is existend or other error occurs)
CT-State () {
if [ -z ${CTID+x} ]; then local CTID=$1;fi
case "$(pct status $CTID 2>&1)" in
*running* )
return 0;;
*stopped* )
return 1;;
* )
return 2;;
esac
}
#Get state of VM as exitcode (0 when running 1 when stoped and 2 if VM is existend or other error occurs)
VM-State (){
if [ -z ${VMID+x} ]; then local VMID=$1;fi
case "$(qm status $VMID 2>&1)" in
*running* )
return 0;;
*stopped* )
return 1;;
* )
return 2;;
esac
}
#Upgrading Release on CT
CT-UpgradeRelease () {
#If yet set then set CTID as $1
if [ -z ${CTID+x} ]; then local CTID=$1;fi
echo "Upgrading release for $CTID"
#Getting distribution info
local DIST=$(pct exec $CTID -- awk -F= '$1=="ID" { print $2 ;}' /etc/os-release)
local RELVERSION=$(pct exec $CTID -- awk -F= '$1=="VERSION_ID" { print $2 ;}' /etc/os-release | cut -d"." -f 1,2)
local RELNAME=$(pct exec $CTID -- awk -F= '$1=="VERSION_CODENAME" { print $2 ;}' /etc/os-release)
local INSTCALL="pct exec $CTID"
local SNAPSHOTCMD="pct snapshot $CTID BeforeReleaseUpgrade --description"
local DOREBOOT=false
#Call generic release upgrader
UpgradeRelease
if $DOREBOOT; then
pct reboot $CTID
fi
unset DIST RELVERSION RELNAME INSTCALL DOREBOOT
}
#Upgrading Release on VM
VM-UpgradeRelease () {
#If yet set then set VMID as $1
if [ -z ${VMID+x} ]; then local VMID=$1;fi
echo "Upgrading release for $VMID, No output is provided until task is completed"
#Getting distribution info
local DIST=$(qm guest exec $VMID -- awk -F= '$1=="ID" { print $2 ;}' /etc/os-release | jq '.["out-data"]')
local RELVERSION=$(qm guest exec $VMID -- awk -F= '$1=="VERSION_ID" { print $2 ;}' /etc/os-release | jq '.["out-data"]' | sed 's#\\n##g' | tr -d '"' | cut -d"." -f 1,2 )
local RELNAME=$(qm guest exec $VMID -- awk -F= '$1=="VERSION_CODENAME" { print $2 ;}' /etc/os-release | jq '.["out-data"]' | sed 's#\\n##g' | tr -d '"')
local INSTCALL="qm guest exec $VMID --timeout 0"
local SNAPSHOTCMD="qm snapshot $VMID BeforeReleaseUpgrade --description"
local DOREBOOT=false
#Call generic release upgrader
UpgradeRelease
if $DOREBOOT; then
qm reboot $VMID
fi
unset DIST RELVERSION RELNAME INSTCALL
}
#Run release update, called by CT-UpgradeRelease and VM-UpgradeRelease
UpgradeRelease () {
#Getting distribution name
if [[ "${DIST}" == *"debian"* ]] && $DoDebianReleaseUpdate && [[ "${TYPE}" == "CT" ]]; then
if [ $RELNAME != $NewDebianVersion ]; then
#Create snapshot before upgrading
$SNAPSHOTCMD "Before upgrade form Debian $RELNAME to Debian $NewDebianVersion"
#Fully update current version
$INSTCALL -- apt update
$INSTCALL -- sh -c "DEBIAN_FRONTEND=noninteractive apt upgrade -y -o Dpkg::Options::="--force-confold""
$INSTCALL -- sh -c "DEBIAN_FRONTEND=noninteractive apt full-upgrade -y -o Dpkg::Options::="--force-confold""
# Update repo file(s)
$INSTCALL -- sed -i "s/$RELNAME/$NewDebianVersion/g" /etc/apt/sources.list
$INSTCALL -- sh -c "sed -i "s/$RELNAME/$NewDebianVersion/g" /etc/apt/sources.list.d/*"
# Run upgrade to new release
$INSTCALL -- apt clean
$INSTCALL -- apt update
$INSTCALL -- sh -c "DEBIAN_FRONTEND=noninteractive apt upgrade -y -o Dpkg::Options::="--force-confold""
$INSTCALL -- sh -c "DEBIAN_FRONTEND=noninteractive apt full-upgrade -y -o Dpkg::Options::="--force-confold""
$INSTCALL -- apt autoremove -y
DOREBOOT=true
else
echo "Notice: Skiped, already up-to-date"
fi
elif [[ "${DIST}" == *"debian"* ]] && $DoDebianReleaseUpdate && [[ "${TYPE}" == "VM" ]]; then
echo "Notice: Release upgrade for Debian VM's is not supported"
elif [[ "${DIST}" == *"debian"* ]]; then
echo "Notice: Release upgrade disabled for Debian"
elif [[ "${DIST}" == *"alpine"* ]] && $DoAlpineReleaseUpdate ; then
if [ $RELVERSION != $NewAlpineVersion ]; then
#Create snapshot before upgrading
$SNAPSHOTCMD "Before upgrade form Alpine $RELVERSION to Alpine $NewAlpineVersion"
#Fully update current version
$INSTCALL -- apk update
$INSTCALL -- apk upgrade
$INSTCALL -- sed -i "s/$RELVERSION/$NewAlpineVersion/g" /etc/apk/repositories
$INSTCALL -- apk update
$INSTCALL -- apk add --upgrade apk-tools
$INSTCALL -- apk upgrade --available
DOREBOOT=true
else
echo "Notice: Skiped, already up-to-date"
fi
elif [[ "${DIST}" == *"alpine"* ]]; then
echo "Notice: Release upgrade disabled for Alpine"
elif [[ "${DIST}" == *"fedora"* ]] && $DoFedoraReleaseUpdate ; then
if [ $RELVERSION != $NewFedoraVersion ]; then
#Create snapshot before upgrading
$SNAPSHOTCMD "Before upgrade form Fedora $RELVERSION to Fedora $NewFedoraVersion"
#Fully update current version
$INSTCALL -- dnf install dnf-plugin-system-upgrade remove-retired-packages symlinks clean-rpm-gpg-pubkey -y
$INSTCALL -- dnf upgrade --refresh -y
$INSTCALL -- dnf system-upgrade download --releasever=$NewFedoraVersion -y
$INSTCALL -- dnf system-upgrade reboot
echo Waiting 5 minutes for Fedora to install its update while rebooting
sleep 300
$INSTCALL -- dnf remove --duplicates -y
$INSTCALL -- dnf autoremove -y
$INSTCALL -- clean-rpm-gpg-pubkey
$INSTCALL -- symlinks -r -d /usr
DOREBOOT=true
else
echo "Notice: Skiped, already up-to-date"
fi
elif [[ "${DIST}" == *"fedora"* ]]; then
echo "Notice: Release upgrade disabled for Fedora"
else
echo "Warning: Release upgrade are supported for this distro"
#exit 100
fi
}
ParseOSRelease()
{
if [ ! -z "$OSRELEASE" ]; then
DISTRO=$(printf "$OSRELEASE" | awk -F= '$1=="ID" { print $2 ;}' |tr -d '"')
VERSION=$(printf "$OSRELEASE" | awk -F= '$1=="VERSION_ID" { print $2 ;}' |tr -d '"')
VERSIONNAME=$(printf "$OSRELEASE" | awk -F= '$1=="VERSION_CODENAME" { print $2 ;}' |tr -d '"')
#PRETTYNAME=$(printf "$OSRELEASE" | awk -F= '$1=="PRETTY_NAME" { print $2 ;}' |tr -d '"' | cut -d "(" -f2 | cut -d ")" -f1)
if [ ! -z "$VERSIONNAME" ]; then
VERSION="$VERSION ($VERSIONNAME)"
#elif [ ! -z "$PRETTYNAME" ]; then
# VERSION="$VERSION ($PRETTYNAME)"
fi
else
if [ -z ${DISTRO+x} ]; then local DISTRO=N/A;fi
if [ -z ${VERSION+x} ]; then local VERSION=N/A;fi
fi
echo "$TYPE,$ID,$NAME,$STATUS,$DISTRO,$VERSION" | tee -a $InventoryFile
}