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