@@ -19,11 +19,77 @@ UPDATE_RUST="${UPDATE_RUST:-"false"}"
19
19
20
20
set -e
21
21
22
- # Clean up
23
- if [ " $( ls -1 /var/lib/apt/lists/ | wc -l) " -gt -1 ]; then
24
- rm -rf /var/lib/apt/lists/*
22
+ # Detect the Linux distribution and package manager
23
+ PKG_MANAGER=" "
24
+
25
+ # Bring in ID, ID_LIKE, VERSION_ID, VERSION_CODENAME
26
+ . /etc/os-release
27
+ # Get an adjusted ID independent of distro variants
28
+ if [ " ${ID} " = " debian" ] || [ " ${ID_LIKE} " = " debian" ]; then
29
+ ADJUSTED_ID=" debian"
30
+ elif [ " ${ID} " = " alpine" ]; then
31
+ ADJUSTED_ID=" alpine"
32
+ elif [[ " ${ID} " = " rhel" || " ${ID} " = " fedora" || " ${ID} " = " mariner" || " ${ID_LIKE} " = * " rhel" * || " ${ID_LIKE} " = * " fedora" * || " ${ID_LIKE} " = * " mariner" * ]]; then
33
+ ADJUSTED_ID=" rhel"
34
+ VERSION_CODENAME=" ${ID}${VERSION_ID} "
35
+ else
36
+ echo " Linux distro ${ID} not supported."
37
+ exit 1
38
+ fi
39
+
40
+ if [ " ${ADJUSTED_ID} " = " rhel" ] && [ " ${VERSION_CODENAME-} " = " centos7" ]; then
41
+ # As of 1 July 2024, mirrorlist.centos.org no longer exists.
42
+ # Update the repo files to reference vault.centos.org.
43
+ sed -i s/mirror.centos.org/vault.centos.org/g /etc/yum.repos.d/* .repo
44
+ sed -i s/^# .*baseurl=http/baseurl=http/g /etc/yum.repos.d/*.repo
45
+ sed -i s/^mirrorlist=http/# mirrorlist=http/g /etc/yum.repos.d/*.repo
46
+ fi
47
+
48
+
49
+ # Detect package manager
50
+ if command -v apt-get > /dev/null 2>&1 ; then
51
+ PKG_MANAGER=" apt"
52
+ elif command -v dnf > /dev/null 2>&1 ; then
53
+ PKG_MANAGER=" dnf"
54
+ elif command -v yum > /dev/null 2>&1 ; then
55
+ PKG_MANAGER=" yum"
56
+ elif command -v microdnf > /dev/null 2>&1 ; then
57
+ PKG_MANAGER=" microdnf"
58
+ elif command -v tdnf > /dev/null 2>&1 ; then
59
+ PKG_MANAGER=" tdnf"
60
+ else
61
+ echo " No supported package manager found. Supported: apt, dnf, yum, microdnf, tdnf"
62
+ exit 1
25
63
fi
26
64
65
+ echo " Detected package manager: $PKG_MANAGER "
66
+
67
+ # Clean up based on package manager
68
+ clean_package_cache () {
69
+ case " $PKG_MANAGER " in
70
+ apt)
71
+ if [ " $( ls -1 /var/lib/apt/lists/ 2> /dev/null | wc -l) " -gt 0 ]; then
72
+ rm -rf /var/lib/apt/lists/*
73
+ fi
74
+ ;;
75
+ dnf|yum|microdnf)
76
+ if command -v dnf > /dev/null 2>&1 ; then
77
+ dnf clean all
78
+ elif command -v yum > /dev/null 2>&1 ; then
79
+ yum clean all
80
+ elif command -v microdnf > /dev/null 2>&1 ; then
81
+ microdnf clean all
82
+ fi
83
+ ;;
84
+ tdnf)
85
+ tdnf clean all
86
+ ;;
87
+ esac
88
+ }
89
+
90
+ # Initial cleanup
91
+ clean_package_cache
92
+
27
93
if [ " $( id -u) " -ne 0 ]; then
28
94
echo -e ' Script must be run as root. Use sudo, su, or add "USER root" to your Dockerfile before running this script.'
29
95
exit 1
@@ -106,48 +172,174 @@ check_nightly_version_formatting() {
106
172
107
173
updaterc () {
108
174
if [ " ${UPDATE_RC} " = " true" ]; then
109
- echo " Updating /etc/bash.bashrc and /etc/zsh/zshrc..."
110
- if [[ " $( cat /etc/bash.bashrc) " != * " $1 " * ]]; then
111
- echo -e " $1 " >> /etc/bash.bashrc
175
+ echo " Updating shell configuration files..."
176
+ local bashrc_file=" /etc/bash.bashrc"
177
+
178
+ # Different distributions use different bashrc locations
179
+ if [ ! -f " $bashrc_file " ]; then
180
+ if [ -f " /etc/bashrc" ]; then
181
+ bashrc_file=" /etc/bashrc"
182
+ elif [ -f " /etc/bash/bashrc" ]; then
183
+ bashrc_file=" /etc/bash/bashrc"
184
+ fi
185
+ fi
186
+
187
+ if [ -f " $bashrc_file " ] && [[ " $( cat " $bashrc_file " ) " != * " $1 " * ]]; then
188
+ echo -e " $1 " >> " $bashrc_file "
112
189
fi
190
+
113
191
if [ -f " /etc/zsh/zshrc" ] && [[ " $( cat /etc/zsh/zshrc) " != * " $1 " * ]]; then
114
192
echo -e " $1 " >> /etc/zsh/zshrc
115
193
fi
116
194
fi
117
195
}
118
196
119
- apt_get_update ()
120
- {
121
- if [ " $( find /var/lib/apt/lists/* | wc -l) " = " 0" ]; then
122
- echo " Running apt-get update..."
123
- apt-get update -y
124
- fi
197
+ # Package update functions
198
+ pkg_mgr_update () {
199
+ case " $PKG_MANAGER " in
200
+ apt)
201
+ if [ " $( find /var/lib/apt/lists/* 2> /dev/null | wc -l) " = " 0" ]; then
202
+ echo " Running apt-get update..."
203
+ apt-get update -y
204
+ fi
205
+ ;;
206
+ dnf)
207
+ dnf check-update || true
208
+ ;;
209
+ yum)
210
+ yum check-update || true
211
+ ;;
212
+ microdnf)
213
+ # microdnf doesn't have check-update
214
+ true
215
+ ;;
216
+ tdnf)
217
+ tdnf makecache || true
218
+ ;;
219
+ esac
220
+ }
221
+
222
+ # Check if package is installed
223
+ is_package_installed () {
224
+ local package=$1
225
+ case " $PKG_MANAGER " in
226
+ apt)
227
+ dpkg -s " $package " > /dev/null 2>&1
228
+ ;;
229
+ dnf|yum|microdnf|tdnf)
230
+ rpm -q " $package " > /dev/null 2>&1
231
+ ;;
232
+ esac
125
233
}
126
234
127
- # Checks if packages are installed and installs them if not
235
+ # Unified package checking and installation function
128
236
check_packages () {
129
- if ! dpkg -s " $@ " > /dev/null 2>&1 ; then
130
- apt_get_update
131
- apt-get -y install --no-install-recommends " $@ "
237
+ local packages=(" $@ " )
238
+ local missing_packages=()
239
+
240
+ # Check if curl-minimal is installed and swap it with curl
241
+ if is_package_installed " curl-minimal" ; then
242
+ echo " curl-minimal is installed. Swapping it with curl..."
243
+ case " $PKG_MANAGER " in
244
+ dnf|yum|microdnf)
245
+ ${PKG_MANAGER} swap curl-minimal curl -y
246
+ ;;
247
+ tdnf)
248
+ tdnf remove -y curl-minimal
249
+ tdnf install -y curl
250
+ ;;
251
+ * )
252
+ echo " Package manager does not support swapping curl-minimal with curl. Please handle this manually."
253
+ ;;
254
+ esac
255
+ fi
256
+
257
+ # Map package names based on distribution
258
+ for i in " ${! packages[@]} " ; do
259
+ case " $PKG_MANAGER " in
260
+ dnf|yum|microdnf|tdnf)
261
+ case " ${packages[$i]} " in
262
+ " libc6-dev" ) packages[$i ]=" glibc-devel" ;;
263
+ " python3-minimal" ) packages[$i ]=" python3" ;;
264
+ " libpython3.*" ) packages[$i ]=" python3-devel" ;;
265
+ " gnupg2" ) packages[$i ]=" gnupg" ;;
266
+ esac
267
+ ;;
268
+ esac
269
+ done
270
+
271
+ # Check which packages are missing
272
+ for package in " ${packages[@]} " ; do
273
+ if [ -n " $package " ] && ! is_package_installed " $package " ; then
274
+ missing_packages+=(" $package " )
275
+ fi
276
+ done
277
+
278
+ # Install missing packages
279
+ if [ ${# missing_packages[@]} -gt 0 ]; then
280
+ pkg_mgr_update
281
+ case " $PKG_MANAGER " in
282
+ apt)
283
+ apt-get -y install --no-install-recommends " ${missing_packages[@]} "
284
+ ;;
285
+ dnf)
286
+ dnf install -y " ${missing_packages[@]} "
287
+ ;;
288
+ yum)
289
+ yum install -y " ${missing_packages[@]} "
290
+ ;;
291
+ microdnf)
292
+ microdnf install -y " ${missing_packages[@]} "
293
+ ;;
294
+ tdnf)
295
+ tdnf install -y " ${missing_packages[@]} "
296
+ ;;
297
+ esac
132
298
fi
133
299
}
134
300
135
301
export DEBIAN_FRONTEND=noninteractive
136
302
137
303
# Install curl, lldb, python3-minimal,libpython and rust dependencies if missing
138
- if ! dpkg -s curl ca-certificates gnupg2 lldb python3-minimal gcc libc6-dev > /dev/null 2>&1 ; then
139
- apt_get_update
140
- apt-get -y install --no-install-recommends curl ca-certificates gcc libc6-dev
141
- apt-get -y install lldb python3-minimal libpython3.?
304
+ echo " Installing required dependencies..."
305
+ check_packages curl ca-certificates gcc libc6-dev gnupg2 git
306
+
307
+ # Install optional dependencies (continue if they fail)
308
+ case " $PKG_MANAGER " in
309
+ apt)
310
+ check_packages lldb python3-minimal libpython3.? || true
311
+ ;;
312
+ dnf|yum|microdnf)
313
+ check_packages lldb python3 python3-devel || true
314
+ ;;
315
+ tdnf)
316
+ check_packages python3 python3-devel || true
317
+ # LLDB might not be available in Photon/Mariner
318
+ ;;
319
+ esac
320
+
321
+ # Get architecture
322
+ if command -v dpkg > /dev/null 2>&1 ; then
323
+ architecture=" $( dpkg --print-architecture) "
324
+ else
325
+ architecture=" $( uname -m) "
326
+ # Convert common architectures to Debian equivalents
327
+ case ${architecture} in
328
+ x86_64)
329
+ architecture=" amd64"
330
+ ;;
331
+ aarch64)
332
+ architecture=" arm64"
333
+ ;;
334
+ esac
142
335
fi
143
336
144
- architecture=" $( dpkg --print-architecture) "
145
337
download_architecture=" ${architecture} "
146
338
case ${download_architecture} in
147
- amd64)
339
+ amd64|x86_64 )
148
340
download_architecture=" x86_64"
149
341
;;
150
- arm64)
342
+ arm64|aarch64 )
151
343
download_architecture=" aarch64"
152
344
;;
153
345
* ) echo " (!) Architecture ${architecture} not supported."
225
417
chmod -R g+r+w " ${RUSTUP_HOME} " " ${CARGO_HOME} "
226
418
227
419
# Clean up
228
- rm -rf /var/lib/apt/lists/ *
420
+ clean_package_cache
229
421
230
422
echo " Done!"
231
-
0 commit comments