centos.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #!/usr/bin/env bash
  2. # Package tree used for installing netdata on distribution:
  3. # << CentOS: [7] [8] [9] >>
  4. set -e
  5. declare -a package_tree=(
  6. bison
  7. cmake
  8. curl
  9. elfutils-libelf-devel
  10. findutils
  11. flex
  12. gcc
  13. gcc-c++
  14. git
  15. gzip
  16. json-c-devel
  17. libatomic
  18. libmnl-devel
  19. libuuid-devel
  20. libuv-devel
  21. libyaml-devel
  22. lz4-devel
  23. make
  24. openssl-devel
  25. pkgconfig
  26. python3
  27. systemd-devel
  28. tar
  29. zlib-devel
  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. 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. elif [[ $(os_version) =~ ^7(\..*)?$ ]]; then
  126. package_manager=yum
  127. echo >&2 " > Checking for EPEL ..."
  128. if ! rpm -qa | grep epel-release > /dev/null; then
  129. if prompt "EPEL not found, shall I install it?"; then
  130. yum ${opts} install epel-release
  131. fi
  132. fi
  133. yum makecache
  134. fi
  135. }
  136. enable_powertools_repo() {
  137. if ! dnf repolist | grep -q powertools; then
  138. cat > /etc/yum.repos.d/powertools.repo <<-EOF
  139. [powertools]
  140. name=CentOS Linux \$releasever - PowerTools
  141. mirrorlist=http://mirrorlist.centos.org/?release=\$releasever&arch=\$basearch&repo=PowerTools&infra=\$infra
  142. #baseurl=http://mirror.centos.org/\$contentdir/\$releasever/PowerTools/\$basearch/os/
  143. gpgcheck=1
  144. enabled=1
  145. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
  146. EOF
  147. else
  148. echo "Something went wrong!"
  149. exit 1
  150. fi
  151. }
  152. # shellcheck disable=SC2068
  153. check_flags ${@}
  154. validate_tree_centos
  155. packages_to_install=
  156. for package in "${package_tree[@]}"; do
  157. if rpm -q "$package" &> /dev/null; then
  158. echo "Package '${package}' is installed"
  159. else
  160. echo "Package '$package' is NOT installed"
  161. packages_to_install="$packages_to_install $package"
  162. fi
  163. done
  164. if [[ -z $packages_to_install ]]; then
  165. echo "All required packages are already installed. Skipping .."
  166. else
  167. echo "packages_to_install:" "${packages_to_install[@]}"
  168. opts=
  169. if [[ "${NON_INTERACTIVE}" == "1" ]]; then
  170. echo >&2 "Running in non-interactive mode"
  171. opts="-y"
  172. fi
  173. # shellcheck disable=SC2068
  174. ${package_manager} install ${opts} ${packages_to_install[@]}
  175. fi