kernel-clean.sh 3.9 KB

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