command_dev_detect_glibc.sh 3.1 KB

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