1
0
This commit is contained in:
2025-06-10 00:29:29 +02:00
commit 0387b79f3e
7 changed files with 516 additions and 0 deletions

221
bin/netupgrade Executable file
View File

@@ -0,0 +1,221 @@
#!/bin/bash
showHelp() {
echo "netupgrade [-f] [-y] [configfilename]"
echo ""
echo " -f : Select all nodes"
echo " -y : No confirmation"
echo " -b : Breack on error"
echo " configfilename : a cfg filename"
}
pressAnyKey(){
read -n1 -r -p "Press any key to continue."
}
loadConfig(){
if [ -e "${CONFIGFILENAME}" ]; then
. "${CONFIGFILENAME}"
else
echo "Error : Config file not found :"
echo "${CONFIGFILENAME}"
exit 1
fi
}
selectNodes(){
local -a OPTIONS=()
local -i INDEX=1
for NODE in "${NODES[@]}"; do
# shellcheck disable=SC2206
local FIELDS=(${NODE//;/ })
OPTIONS+=("${INDEX}:${FIELDS[0]}" "${FIELDS[1]}" "${FULL}")
INDEX+=1
done
if ! SEL=$(whiptail --title "NetUpgrade" --checklist "" 0 0 0 \
"${OPTIONS[@]}" \
3>&1 1>&2 2>&3); then
exit 0
fi
if [ ${#SEL} == 0 ]; then
exit 0
fi
if [ -f "${LOGFILENAME}" ]; then
rm "${LOGFILENAME}"
fi
touch "${LOGFILENAME}"
local RESULT="\n"
for ITM in ${SEL}; do
INDEX=1
for NODE in "${NODES[@]}"; do
# shellcheck disable=SC2206
local FIELDS=(${NODE//;/ })
if [ "${ITM}" = "\"${INDEX}:${FIELDS[0]}\"" ]; then
for ((I = 2; I < ${#FIELDS[@]}; ++I)); do
if runCmd "${FIELDS[0]}" "${FIELDS[1]}" "${FIELDS[${I}]}"; then
RESULT+="Ok: ${FIELDS[1]} @ ${FIELDS[0]} : ${FIELDS[${I}]}\n"
else
RESULT+="Error: ${FIELDS[1]} @ ${FIELDS[0]} : ${FIELDS[${I}]}\n"
fi
done
fi
INDEX+=1
done
done
sed -i "1s/^/${RESULT//\//\\\/}\n\n\n\n/" "${LOGFILENAME}"
sed -i "1s/^/---------\n\n/" "${LOGFILENAME}"
sed -i "1s/^/Results :\n/" "${LOGFILENAME}"
nano "${LOGFILENAME}"
rm -i "${LOGFILENAME}"
echo ""
echo "Results :"
echo "---------"
echo -e "${RESULT}"
}
runCmd() { #$1=host $2=name #3=cmd
local -r HOST=${1}
local -r NAME=${2}
local -r CMD=${3//:*}
local -r CMDVAL=${3//*:}
local -i ERROR=0
echo "${NAME} @ ${HOST} : ${CMD}" | tee -a "${LOGFILENAME}"
local TITLELENGTH=$((${#NAME} + ${#HOST} + ${#CMD} + 6))
local SUBTITLE="-----------------------------------------------------------------------------"
echo ${SUBTITLE:0:${TITLELENGTH}} | tee -a "${LOGFILENAME}"
date +'%Y-%m-%d %H:%M:%S %A' | tee -a "${LOGFILENAME}"
echo "" | tee -a "${LOGFILENAME}"
set -o pipefail
local YESARG=""
case ${CMD} in
reboot)
ssh root@"${HOST}" reboot | tee -a "${LOGFILENAME}"
;;
apt)
if [ ${YES} == 1 ]; then
YESARG="-y"
fi
echo "apt-get ${YESARG} update" | tee -a "${LOGFILENAME}"
if ! ssh root@"${HOST}" apt-get ${YESARG} update | tee -a "${LOGFILENAME}"; then
ERROR=1
else
echo "" | tee -a "${LOGFILENAME}"
echo "apt-get ${YESARG} dist-upgrade" | tee -a "${LOGFILENAME}"
if ! ssh root@"${HOST}" apt-get ${YESARG} dist-upgrade | tee -a "${LOGFILENAME}"; then
ERROR=1
fi
echo "" | tee -a "${LOGFILENAME}"
echo "apt-get ${YESARG} autoremove" | tee -a "${LOGFILENAME}"
ssh root@"${HOST}" apt-get ${YESARG} autoremove | tee -a "${LOGFILENAME}"
echo "" | tee -a "${LOGFILENAME}"
echo "apt-get ${YESARG} autoclean" | tee -a "${LOGFILENAME}"
ssh root@"${HOST}" apt-get ${YESARG} autoclean | tee -a "${LOGFILENAME}"
echo "" | tee -a "${LOGFILENAME}"
echo "apt-get ${YESARG} clean" | tee -a "${LOGFILENAME}"
ssh root@"${HOST}" apt-get ${YESARG} clean | tee -a "${LOGFILENAME}"
echo "" | tee -a "${LOGFILENAME}"
echo "apt-get ${YESARG} purge" | tee -a "${LOGFILENAME}"
ssh root@"${HOST}" apt-get ${YESARG} purge | tee -a "${LOGFILENAME}"
echo "" | tee -a "${LOGFILENAME}"
fi
;;
yum)
if [ ${YES} == 1 ]; then
YESARG="-y"
fi
echo "yum ${YESARG} update" | tee -a "${LOGFILENAME}"
if ! ssh root@"${HOST}" yum ${YESARG} update | tee -a "${LOGFILENAME}"; then
ERROR=1
fi
;;
pkg)
if [ ${YES} == 1 ]; then
YESARG="-y"
fi
echo "pkg ${YESARG} update" | tee -a "${LOGFILENAME}"
if ! ssh root@"${HOST}" pkg ${YESARG} update | tee -a "${LOGFILENAME}"; then
ERROR=1
else
echo "" | tee -a "${LOGFILENAME}"
echo "pkg upgrade ${YESARG}" | tee -a "${LOGFILENAME}"
if ! ssh root@"${HOST}" pkg upgrade ${YESARG} | tee -a "${LOGFILENAME}"; then
ERROR=1
fi
echo "" | tee -a "${LOGFILENAME}"
echo "pkg autoremove ${YESARG}" | tee -a "${LOGFILENAME}"
ssh root@"${HOST}" pkg autoremove ${YESARG} | tee -a "${LOGFILENAME}"
echo "" | tee -a "${LOGFILENAME}"
echo "pkg clean ${YESARG}" | tee -a "${LOGFILENAME}"
ssh root@"${HOST}" pkg clean ${YESARG} | tee -a "${LOGFILENAME}"
echo "" | tee -a "${LOGFILENAME}"
fi
;;
pacman)
if [ ${YES} == 1 ]; then
YESARG="--noconfirm"
fi
echo "pacman -Syu ${YESARG}" | tee -a "${LOGFILENAME}"
if ! ssh root@"${HOST}" pacman -Syu ${YESARG} | tee -a "${LOGFILENAME}"; then
ERROR=1
fi
# shellcheck disable=SC2046
ssh root@"${HOST}" pacman -Rns $(pacman -Qqtd) ${YESARG} | tee -a "${LOGFILENAME}"
ssh root@"${HOST}" pacman -Sc ${YESARG} | tee -a "${LOGFILENAME}"
;;
apk)
if [ ${YES} == 1 ]; then
YESARG="-y"
fi
echo "apk update" | tee -a "${LOGFILENAME}"
if ! ssh root@"${HOST}" apk update | tee -a "${LOGFILENAME}"; then
ERROR=1
fi
echo "apk upgrade" | tee -a "${LOGFILENAME}"
if ! ssh root@"${HOST}" apk upgrade | tee -a "${LOGFILENAME}"; then
ERROR=1
fi
;;
docker-stacks)
echo "docker stacks update" | tee -a "${LOGFILENAME}"
echo "for each" | tee -a "${LOGFILENAME}"
echo " docker compose pull; docker compose up -d" | tee -a "${LOGFILENAME}"
#if ! ssh root@"${HOST}" 'for dir in '"${CMDVAL}"'/*; do (cd "${dir}"; docker compose pull; docker compose up -d); done; docker image prune -f' | tee -a "${LOGFILENAME}"; then
if ! ssh root@"${HOST}" 'for dir in '"${CMDVAL}"'/*; do (cd "${dir}"; docker compose pull; docker compose up -d); done; docker image prune -f' | tee -a "${LOGFILENAME}"; then
ERROR=1
fi
echo "docker image prune -a -f" | tee -a "${LOGFILENAME}"
if ! ssh root@"${HOST}" docker image prune -f | tee -a "${LOGFILENAME}"; then
ERROR=1
fi
;;
*) echo "Error: Command ${CMD} unknown" | tee -a "${LOGFILENAME}";;
esac
echo "" | tee -a "${LOGFILENAME}"
echo "" | tee -a "${LOGFILENAME}"
if [ ${ERROR} == 1 ]; then
return 1
fi
}
declare -i YES=0
declare -i FULL=0
declare CONFIGFILENAME="${HOME}/.config/netupgrade/index.cfg"
declare LOGFILENAME="${HOME}/netupgrade.log"
declare -a NODES=()
while [[ ${#} -gt 0 ]]; do
case ${1} in
--help) showHelp; exit 0;;
-y) YES=1; shift;;
-f) FULL=1; shift;;
*) CONFIGFILENAME=${1}; shift;;
esac
done
loadConfig
selectNodes