centos.sh 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #!/usr/bin/env bash
  2. # Package tree used for installing netdata on distribution:
  3. # << CentOS: [7] [8] >>
  4. set -e
  5. declare -a package_tree=(
  6. gcc
  7. gcc-c++
  8. make
  9. autoconf
  10. autoconf-archive
  11. automake
  12. libatomic
  13. libtool
  14. pkgconfig
  15. cmake
  16. nmap-ncat
  17. zlib-devel
  18. libuuid-devel
  19. libmnl-devel
  20. json-c-devel
  21. libuv-devel
  22. lz4-devel
  23. openssl-devel
  24. python3
  25. elfutils-libelf-devel
  26. git
  27. tar
  28. curl
  29. gzip
  30. )
  31. os_version() {
  32. if [[ -f /etc/os-release ]]; then
  33. # shellcheck disable=SC2002
  34. cat /etc/os-release | grep VERSION_ID | cut -d'=' -f2 | cut -d'"' -f2
  35. else
  36. echo "Error: Cannot determine OS version!"
  37. exit 1
  38. fi
  39. }
  40. prompt() {
  41. if [[ "${NON_INTERACTIVE}" == "1" ]]; then
  42. echo >&2 "Running in non-interactive mode, assuming yes (y)"
  43. echo >&2 " > Would have prompted for ${1} ..."
  44. return 0
  45. fi
  46. while true; do
  47. read -r -p "${1} [y/n] " yn
  48. case $yn in
  49. [Yy]*) return 0 ;;
  50. [Nn]*) return 1 ;;
  51. *) echo >&2 "Please answer with yes (y) or no (n)." ;;
  52. esac
  53. done
  54. }
  55. usage() {
  56. cat << EOF
  57. OPTIONS:
  58. [--dont-wait] [--non-interactive] [ ]
  59. EOF
  60. }
  61. check_flags() {
  62. while [ -n "${1}" ]; do
  63. case "${1}" in
  64. dont-wait | --dont-wait | -n)
  65. DONT_WAIT=1
  66. ;;
  67. non-interactive | --non-interactive | -y)
  68. NON_INTERACTIVE=1
  69. ;;
  70. help | -h | --help)
  71. usage
  72. exit 1
  73. ;;
  74. *)
  75. echo >&2 "ERROR: Cannot understand option '${1}'"
  76. echo >&2
  77. usage
  78. exit 1
  79. ;;
  80. esac
  81. shift
  82. done
  83. if [[ "${DONT_WAIT}" == "0" ]] && [[ "${NON_INTERACTIVE}" == "0" ]]; then
  84. read -r -p "Press ENTER to run it > " || exit 1
  85. fi
  86. }
  87. validate_tree_centos() {
  88. local opts=
  89. export local package_manager=
  90. if [[ "${NON_INTERACTIVE}" == "1" ]]; then
  91. echo >&2 "Running in non-interactive mode"
  92. opts="-y"
  93. fi
  94. echo >&2 " > CentOS Version: $(os_version) ..."
  95. if [[ $(os_version) =~ ^9(\..*)?$ ]]; then
  96. package_manager=dnf
  97. echo >&2 " > Checking for config-manager ..."
  98. if ! dnf config-manager --help &> /dev/null; then
  99. if prompt "config-manager not found, shall I install it?"; then
  100. dnf ${opts} install 'dnf-command(config-manager)'
  101. fi
  102. fi
  103. echo >&2 " > Checking for CRB ..."
  104. if ! dnf repolist | grep CRB; then
  105. if prompt "CRB not found, shall I install it?"; then
  106. dnf ${opts} config-manager --set-enabled crb
  107. fi
  108. fi
  109. elif [[ $(os_version) =~ ^8(\..*)?$ ]]; then
  110. package_manager=dnf
  111. echo >&2 " > Checking for config-manager ..."
  112. if ! dnf config-manager --help &> /dev/null; then
  113. if prompt "config-manager not found, shall I install it?"; then
  114. dnf ${opts} install 'dnf-command(config-manager)'
  115. fi
  116. fi
  117. echo >&2 " > Checking for PowerTools ..."
  118. if ! dnf repolist | grep PowerTools; then
  119. if prompt "PowerTools not found, shall I install it?"; then
  120. dnf ${opts} config-manager --set-enabled powertools || enable_powertools_repo
  121. fi
  122. fi
  123. echo >&2 " > Updating libarchive ..."
  124. dnf ${opts} install libarchive
  125. echo >&2 " > Installing Judy-devel directly ..."
  126. dnf ${opts} install http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/Judy-devel-1.0.5-18.module_el8.3.0+757+d382997d.x86_64.rpm
  127. dnf makecache --refresh
  128. elif [[ $(os_version) =~ ^7(\..*)?$ ]]; then
  129. package_manager=yum
  130. echo >&2 " > Checking for EPEL ..."
  131. if ! rpm -qa | grep epel-release > /dev/null; then
  132. if prompt "EPEL not found, shall I install it?"; then
  133. yum ${opts} install epel-release
  134. fi
  135. fi
  136. yum makecache
  137. fi
  138. }
  139. enable_powertools_repo() {
  140. if ! dnf repolist | grep -q powertools; then
  141. cat > /etc/yum.repos.d/powertools.repo <<-EOF
  142. [powertools]
  143. name=CentOS Linux \$releasever - PowerTools
  144. mirrorlist=http://mirrorlist.centos.org/?release=\$releasever&arch=\$basearch&repo=PowerTools&infra=\$infra
  145. #baseurl=http://mirror.centos.org/\$contentdir/\$releasever/PowerTools/\$basearch/os/
  146. gpgcheck=1
  147. enabled=1
  148. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
  149. EOF
  150. else
  151. echo "Something went wrong!"
  152. exit 1
  153. fi
  154. }
  155. # shellcheck disable=SC2068
  156. check_flags ${@}
  157. validate_tree_centos
  158. packages_to_install=
  159. for package in "${package_tree[@]}"; do
  160. if rpm -q "$package" &> /dev/null; then
  161. echo "Package '${package}' is installed"
  162. else
  163. echo "Package '$package' is NOT installed"
  164. packages_to_install="$packages_to_install $package"
  165. fi
  166. done
  167. if [[ -z $packages_to_install ]]; then
  168. echo "All required packages are already installed. Skipping .."
  169. else
  170. echo "packages_to_install:" "${packages_to_install[@]}"
  171. opts=
  172. if [[ "${NON_INTERACTIVE}" == "1" ]]; then
  173. echo >&2 "Running in non-interactive mode"
  174. opts="-y"
  175. fi
  176. # shellcheck disable=SC2068
  177. ${package_manager} install ${opts} ${packages_to_install[@]}
  178. fi