kernel-clean.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/usr/bin/env bash
  2. # Copyright (c) 2021-2023 tteck
  3. # Author: tteck (tteckster)
  4. # License: MIT
  5. # https://github.com/tteck/Proxmox/raw/main/LICENSE
  6. function header_info {
  7. cat <<"EOF"
  8. __ __ __ ________
  9. / //_/__ _________ ___ / / / ____/ /__ ____ _____
  10. / ,< / _ \/ ___/ __ \/ _ \/ / / / / / _ \/ __ `/ __ \
  11. / /| / __/ / / / / / __/ / / /___/ / __/ /_/ / / / /
  12. /_/ |_\___/_/ /_/ /_/\___/_/ \____/_/\___/\__,_/_/ /_/
  13. EOF
  14. }
  15. set -euo pipefail
  16. shopt -s inherit_errexit nullglob
  17. YW=$(echo "\033[33m")
  18. BL=$(echo "\033[36m")
  19. RD=$(echo "\033[01;31m")
  20. BGN=$(echo "\033[4;92m")
  21. GN=$(echo "\033[1;92m")
  22. DGN=$(echo "\033[32m")
  23. CL=$(echo "\033[m")
  24. BFR="\\r\\033[K"
  25. HOLD="-"
  26. CM="${GN}✓${CL}"
  27. CROSS="${RD}✗${CL}"
  28. PARTY="🎉"
  29. current_kernel=$(uname -r)
  30. clear
  31. header_info
  32. while true; do
  33. read -p "This will Clean Unused Kernel Images, USE AT YOUR OWN RISK. Proceed(y/n)?" yn
  34. case $yn in
  35. [Yy]*) break ;;
  36. [Nn]*) exit ;;
  37. *) echo -e "${RD}Please answer y/n${CL}" ;;
  38. esac
  39. done
  40. clear
  41. function msg_info() {
  42. local msg="$1"
  43. echo -ne " ${HOLD} ${YW}${msg}..."
  44. }
  45. function msg_ok() {
  46. local msg="$1"
  47. echo -e "${BFR} ${CM} ${GN}${msg}${CL}"
  48. }
  49. function check_root() {
  50. if [[ $EUID -ne 0 ]]; then
  51. echo -e "${CROSS}${RD}Error: This script must be ran as the root user.\n${CL}"
  52. exit 1
  53. else
  54. header_info
  55. other_kernel
  56. kernel_info
  57. kernel_clean
  58. fi
  59. }
  60. function other_kernel() {
  61. if [[ "$current_kernel" == *"edge"* ]]; then
  62. echo -e "\n${CROSS} ${RD}ERROR:${CL} Proxmox ${BL}${current_kernel}${CL} Kernel Active"
  63. echo -e "\nAn Active PVE Kernel is required to use Kernel Clean\n"
  64. exit 1
  65. fi
  66. if [[ "$current_kernel" == *"6.1"* ]]; then
  67. echo -e "\n${CROSS} ${RD}ERROR:${CL} Proxmox ${BL}${current_kernel}${CL} Kernel Active"
  68. echo -e "\nAs 5.15 is the current default kernel in PVE 7.3 the package management directly depends on it, it's not possible to use this script while running 6.1 kernels. (the script tries to remove ALL old kernels) \n"
  69. exit 1
  70. fi
  71. }
  72. function kernel_info() {
  73. if [[ "$MODE" != "PBS" ]]; then
  74. echo -e "${YW}PVE Version: ${BL}$(pveversion)\n${CL}"
  75. fi
  76. if [[ "$current_kernel" == *"pve"* ]]; then
  77. echo -e "${YW}Current Kernel: ${BL}$current_kernel\n${CL}"
  78. else
  79. echo -e "\n${CROSS} ${RD}ERROR: No PVE Kernel Found\n${CL}"
  80. exit 1
  81. fi
  82. }
  83. function kernel_clean() {
  84. kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print $2}' | sort -V)
  85. remove_kernels=""
  86. for kernel in $kernels; do
  87. if [ "$(echo $kernel | grep $current_kernel)" ]; then
  88. break
  89. else
  90. echo -e "${BL}'$kernel' ${CL}${YW}has been added to the remove Kernel list\n${CL}"
  91. remove_kernels+=" $kernel"
  92. fi
  93. done
  94. msg_ok "Kernel Search Completed\n"
  95. if [[ "$remove_kernels" != *"pve"* ]]; then
  96. echo -e "${PARTY} ${GN}It appears there are no old Kernels on your system. \n${CL}"
  97. msg_info "Exiting"
  98. sleep 2
  99. msg_ok "Done"
  100. else
  101. read -p "Would you like to remove the $(echo $remove_kernels | awk '{print NF}') selected Kernels listed above? [y/n]: " -n 1 -r
  102. echo
  103. if [[ $REPLY =~ ^[Yy]$ ]]; then
  104. msg_info "Removing ${CL}${RD}$(echo $remove_kernels | awk '{print NF}') ${CL}${YW}old Kernels${CL}"
  105. /usr/bin/apt purge -y $remove_kernels >/dev/null 2>&1
  106. msg_ok "Successfully Removed Kernels"
  107. msg_info "Updating GRUB"
  108. /usr/sbin/update-grub >/dev/null 2>&1
  109. msg_ok "Successfully Updated GRUB"
  110. msg_info "Exiting"
  111. sleep 2
  112. msg_ok "Done"
  113. else
  114. msg_info "Exiting"
  115. sleep 2
  116. msg_ok "Done"
  117. fi
  118. fi
  119. }
  120. if ! command -v pveversion >/dev/null 2>&1; then
  121. echo -e " Switching to PBS mode"
  122. MODE="PBS"
  123. sleep 2
  124. else
  125. MODE="PVE"
  126. fi
  127. check_root