kernel-clean.sh 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. edge_kernel
  52. kernel_info
  53. kernel_clean
  54. fi
  55. }
  56. function edge_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. }
  63. function kernel_info() {
  64. if [[ "$MODE" != "PBS" ]]; then
  65. echo -e "${YW}PVE Version: ${BL}$(pveversion)\n${CL}"
  66. fi
  67. if [[ "$current_kernel" == *"pve"* ]]; then
  68. echo -e "${YW}Current Kernel: ${BL}$current_kernel\n${CL}"
  69. else
  70. echo -e "\n${CROSS} ${RD}ERROR: No PVE Kernel Found\n${CL}"
  71. exit 1
  72. fi
  73. }
  74. function kernel_clean() {
  75. kernels=$(dpkg --list | grep 'kernel-.*-pve' | awk '{print $2}' | sort -V)
  76. remove_kernels=""
  77. for kernel in $kernels; do
  78. if [ "$(echo $kernel | grep $current_kernel)" ]; then
  79. break
  80. else
  81. echo -e "${BL}'$kernel' ${CL}${YW}has been added to the remove Kernel list\n${CL}"
  82. remove_kernels+=" $kernel"
  83. fi
  84. done
  85. msg_ok "Kernel Search Completed\n"
  86. if [[ "$remove_kernels" != *"pve"* ]]; then
  87. echo -e "${PARTY} ${GN}It appears there are no old Kernels on your system. \n${CL}"
  88. msg_info "Exiting"
  89. sleep 2
  90. msg_ok "Done"
  91. else
  92. read -p "Would you like to remove the $(echo $remove_kernels | awk '{print NF}') selected Kernels listed above? [y/n]: " -n 1 -r
  93. echo
  94. if [[ $REPLY =~ ^[Yy]$ ]]; then
  95. msg_info "Removing ${CL}${RD}$(echo $remove_kernels | awk '{print NF}') ${CL}${YW}old Kernels${CL}"
  96. /usr/bin/apt purge -y $remove_kernels >/dev/null 2>&1
  97. msg_ok "Successfully Removed Kernels"
  98. msg_info "Updating GRUB"
  99. /usr/sbin/update-grub >/dev/null 2>&1
  100. msg_ok "Successfully Updated GRUB"
  101. msg_info "Exiting"
  102. sleep 2
  103. msg_ok "Done"
  104. else
  105. msg_info "Exiting"
  106. sleep 2
  107. msg_ok "Done"
  108. fi
  109. fi
  110. }
  111. if ! command -v pveversion >/dev/null 2>&1; then
  112. echo -e " Switching to PBS mode"
  113. MODE="PBS"
  114. sleep 2
  115. else
  116. MODE="PVE"
  117. fi
  118. check_root