4
0

command_dev_detect_glibc.sh 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!/bin/bash
  2. # LinuxGSM command_dev_detect_glibc.sh module
  3. # Author: Daniel Gibbs
  4. # Contributors: https://linuxgsm.com/contrib
  5. # Website: https://linuxgsm.com
  6. # Description: Automatically detects the version of GLIBC that is required.
  7. # Can check a file or directory recursively.
  8. commandname="DEV-DETECT-GLIBC"
  9. commandaction="Detect Glibc Requirements"
  10. moduleselfname="$(basename "$(readlink -f "${BASH_SOURCE[0]}")")"
  11. fn_firstcommand_set
  12. fn_print_header
  13. if [ ! "$(command -v objdump 2> /dev/null)" ]; then
  14. fn_print_failure_nl "objdump is missing"
  15. fn_script_log_fail "objdump is missing"
  16. core_exit.sh
  17. fi
  18. if [ -z "${serverfiles}" ]; then
  19. dir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
  20. fi
  21. if [ -d "${serverfiles}" ]; then
  22. echo -e "Checking directory: "
  23. echo -e "${serverfiles}"
  24. elif [ -f "${serverfiles}" ]; then
  25. echo -e "Checking file: "
  26. echo -e "${serverfiles}"
  27. fi
  28. echo -e ""
  29. glibc_check_dir_array=(steamcmddir serverfiles)
  30. for glibc_check_var in "${glibc_check_dir_array[@]}"; do
  31. if [ "${glibc_check_var}" == "serverfiles" ]; then
  32. glibc_check_dir="${serverfiles}"
  33. glibc_check_name="${gamename}"
  34. elif [ "${glibc_check_var}" == "steamcmddir" ]; then
  35. glibc_check_dir="${steamcmddir}"
  36. glibc_check_name="SteamCMD"
  37. fi
  38. if [ -d "${glibc_check_dir}" ]; then
  39. glibc_check_files=$(find "${glibc_check_dir}" | wc -l)
  40. find "${glibc_check_dir}" -type f -print0 \
  41. | while IFS= read -r -d $'\0' line; do
  42. glibcversion=$(objdump -T "${line}" 2> /dev/null | grep -oP "GLIBC[^ ]+" | grep -v GLIBCXX | sort | uniq | sort -r --version-sort | head -n 1 | sed 's/)$//')
  43. if [ "${glibcversion}" ]; then
  44. echo -e "${glibcversion}: ${line}" >> "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp"
  45. fi
  46. objdump -T "${line}" 2> /dev/null | grep -oP "GLIBC[^ ]+" | sed 's/)$//' >> "${tmpdir}/detect_glibc_${glibc_check_var}.tmp"
  47. echo -n "${i} / ${glibc_check_files}" $'\r'
  48. ((i++))
  49. done
  50. echo -e ""
  51. echo -e ""
  52. fn_print_nl "${bold}${lightyellow}${glibc_check_name} glibc Requirements"
  53. fn_messages_separator
  54. if [ -f "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp" ]; then
  55. echo -e "Required glibc"
  56. cat "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" | sort | uniq | sort -r --version-sort | head -1 | tee -a "${tmpdir}/detect_glibc_highest.tmp"
  57. echo -e ""
  58. echo -e "Files requiring GLIBC"
  59. echo -e "Highest version required: filename"
  60. cat "${tmpdir}/detect_glibc_files_${glibc_check_var}.tmp"
  61. echo -e ""
  62. echo -e "All required GLIBC versions"
  63. cat "${tmpdir}/detect_glibc_${glibc_check_var}.tmp" | sort | uniq | sort -r --version-sort
  64. rm -f "${tmpdir:?}/detect_glibc_${glibc_check_var}.tmp"
  65. rm -f "${tmpdir:?}/detect_glibc_files_${glibc_check_var}.tmp"
  66. else
  67. fn_print_information_nl "glibc is not required"
  68. fi
  69. else
  70. fn_print_information_nl "${glibc_check_name} is not installed"
  71. fi
  72. done
  73. echo -e ""
  74. fn_print_nl "${bold}${lightyellow}Final glibc Requirement"
  75. fn_messages_separator
  76. if [ -f "${tmpdir}/detect_glibc_highest.tmp" ]; then
  77. cat "${tmpdir}/detect_glibc_highest.tmp" | sort | uniq | sort -r --version-sort | head -1
  78. rm -f "${tmpdir:?}/detect_glibc_highest.tmp"
  79. else
  80. fn_print_information_nl "glibc is not required"
  81. fi
  82. core_exit.sh