The existing GetOSVersion has a lot of unused code which is wrong in
several ways
- the only path tested in upstream CI is with lsb_release, because
it's pre-installed on all nodes
- the /etc/redhat-release checking probably still works, but is
unnecessary
- If using lsb_release, os_UPDATE has never actually been set.
- the /etc/SuSE-release branch checking is broken if the lsb package
is actually installed. lsb checking does not set os_UPDATE but yet
the SuSE DISTRO setting relies on this to set a patch level (and so
does some of the rpm tags). SuSE 11 is up to update 3, but the rpm
matching is stuck hard-coded to update 2. I'm guessing
installation is actually broken there.
- the debian checking branch is broken. The VERSION tags have been
removed and were not supposed to be relied on anyway (see notes in
[1])
This simplifies things:
- remove OSX checking (moved here after discussions in
I31d0fdd30928ecc8d959a95838b1d3affd28ac6f)
- only use the output of lsb_release.
- A small best-effort check to pre-install lsb packages if not
detected (that avoids chicken-egg-problem of package-install
wrappers relying on os_* flags).
- The unset os_UPDATE is removed. It's only previous use was for
setting separate suse versions in the DISTRO element for matching
during package installs (since removed)
- DISTRO setting is modified to use the parts of os_RELEASE it wants.
Per-above, this is the correct place to parse out specifics.
- Call out the is_* functions, which are a better way to detect
platforms
- Export the variables as read-only, since they shouldn't be reset
[1] http://sources.debian.net/src/base-files/7.5/debian/changelog/
Change-Id: I46a2c36d95327087085df07cb797eb91249a893c
| ... | ... |
@@ -26,7 +26,7 @@ if [[ -r $TOP_DIR/.stackenv ]]; then |
| 26 | 26 |
fi |
| 27 | 27 |
|
| 28 | 28 |
# Determine what system we are running on. This provides ``os_VENDOR``, |
| 29 |
-# ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 29 |
+# ``os_RELEASE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 30 | 30 |
# and ``DISTRO`` |
| 31 | 31 |
GetDistro |
| 32 | 32 |
|
| ... | ... |
@@ -274,112 +274,71 @@ function warn {
|
| 274 | 274 |
# ================ |
| 275 | 275 |
|
| 276 | 276 |
# Determine OS Vendor, Release and Update |
| 277 |
-# Tested with OS/X, Ubuntu, RedHat, CentOS, Fedora |
|
| 278 |
-# Returns results in global variables: |
|
| 277 |
+ |
|
| 278 |
+# |
|
| 279 |
+# NOTE : For portability, you almost certainly do not want to use |
|
| 280 |
+# these variables directly! The "is_*" functions defined below this |
|
| 281 |
+# bundle up compatible platforms under larger umbrellas that we have |
|
| 282 |
+# determinted are compatible enough (e.g. is_ubuntu covers Ubuntu & |
|
| 283 |
+# Debian, is_fedora covers RPM-based distros). Higher-level functions |
|
| 284 |
+# such as "install_package" further abstract things in better ways. |
|
| 285 |
+# |
|
| 279 | 286 |
# ``os_VENDOR`` - vendor name: ``Ubuntu``, ``Fedora``, etc |
| 280 | 287 |
# ``os_RELEASE`` - major release: ``14.04`` (Ubuntu), ``20`` (Fedora) |
| 281 |
-# ``os_UPDATE`` - update: ex. the ``5`` in ``RHEL6.5`` |
|
| 282 | 288 |
# ``os_PACKAGE`` - package type: ``deb`` or ``rpm`` |
| 283 |
-# ``os_CODENAME`` - vendor's codename for release: ``snow leopard``, ``trusty`` |
|
| 284 |
-os_VENDOR="" |
|
| 285 |
-os_RELEASE="" |
|
| 286 |
-os_UPDATE="" |
|
| 287 |
-os_PACKAGE="" |
|
| 288 |
-os_CODENAME="" |
|
| 289 |
+# ``os_CODENAME`` - vendor's codename for release: ``trusty`` |
|
| 290 |
+ |
|
| 291 |
+declare os_VENDOR os_RELEASE os_PACKAGE os_CODENAME |
|
| 292 |
+ |
|
| 293 |
+# Make a *best effort* attempt to install lsb_release packages for the |
|
| 294 |
+# user if not available. Note can't use generic install_package* |
|
| 295 |
+# because they depend on this! |
|
| 296 |
+function _ensure_lsb_release {
|
|
| 297 |
+ if [[ -x $(which lsb_release 2>/dev/null) ]]; then |
|
| 298 |
+ return |
|
| 299 |
+ fi |
|
| 300 |
+ |
|
| 301 |
+ if [[ -x $(which apt-get 2>/dev/null) ]]; then |
|
| 302 |
+ sudo apt-get install -y lsb-release |
|
| 303 |
+ elif [[ -x $(which zypper 2>/dev/null) ]]; then |
|
| 304 |
+ # XXX: old code paths seem to have assumed SUSE platforms also |
|
| 305 |
+ # had "yum". Keep this ordered above yum so we don't try to |
|
| 306 |
+ # install the rh package. suse calls it just "lsb" |
|
| 307 |
+ sudo zypper -y install lsb |
|
| 308 |
+ elif [[ -x $(which dnf 2>/dev/null) ]]; then |
|
| 309 |
+ sudo dnf install -y redhat-lsb-core |
|
| 310 |
+ elif [[ -x $(which yum 2>/dev/null) ]]; then |
|
| 311 |
+ # all rh patforms (fedora, centos, rhel) have this pkg |
|
| 312 |
+ sudo yum install -y redhat-lsb-core |
|
| 313 |
+ else |
|
| 314 |
+ die $LINENO "Unable to find or auto-install lsb_release" |
|
| 315 |
+ fi |
|
| 316 |
+} |
|
| 289 | 317 |
|
| 290 | 318 |
# GetOSVersion |
| 319 |
+# Set the following variables: |
|
| 320 |
+# - os_RELEASE |
|
| 321 |
+# - os_CODENAME |
|
| 322 |
+# - os_VENDOR |
|
| 323 |
+# - os_PACKAGE |
|
| 291 | 324 |
function GetOSVersion {
|
| 325 |
+ # We only support distros that provide a sane lsb_release |
|
| 326 |
+ _ensure_lsb_release |
|
| 292 | 327 |
|
| 293 |
- # Figure out which vendor we are |
|
| 294 |
- if [[ -x "`which sw_vers 2>/dev/null`" ]]; then |
|
| 295 |
- # OS/X |
|
| 296 |
- os_VENDOR=`sw_vers -productName` |
|
| 297 |
- os_RELEASE=`sw_vers -productVersion` |
|
| 298 |
- os_UPDATE=${os_RELEASE##*.}
|
|
| 299 |
- os_RELEASE=${os_RELEASE%.*}
|
|
| 300 |
- os_PACKAGE="" |
|
| 301 |
- if [[ "$os_RELEASE" =~ "10.7" ]]; then |
|
| 302 |
- os_CODENAME="lion" |
|
| 303 |
- elif [[ "$os_RELEASE" =~ "10.6" ]]; then |
|
| 304 |
- os_CODENAME="snow leopard" |
|
| 305 |
- elif [[ "$os_RELEASE" =~ "10.5" ]]; then |
|
| 306 |
- os_CODENAME="leopard" |
|
| 307 |
- elif [[ "$os_RELEASE" =~ "10.4" ]]; then |
|
| 308 |
- os_CODENAME="tiger" |
|
| 309 |
- elif [[ "$os_RELEASE" =~ "10.3" ]]; then |
|
| 310 |
- os_CODENAME="panther" |
|
| 311 |
- else |
|
| 312 |
- os_CODENAME="" |
|
| 313 |
- fi |
|
| 314 |
- elif [[ -x $(which lsb_release 2>/dev/null) ]]; then |
|
| 315 |
- os_VENDOR=$(lsb_release -i -s) |
|
| 316 |
- os_RELEASE=$(lsb_release -r -s) |
|
| 317 |
- os_UPDATE="" |
|
| 318 |
- os_PACKAGE="rpm" |
|
| 319 |
- if [[ "Debian,Ubuntu,LinuxMint" =~ $os_VENDOR ]]; then |
|
| 320 |
- os_PACKAGE="deb" |
|
| 321 |
- elif [[ "SUSE LINUX" =~ $os_VENDOR ]]; then |
|
| 322 |
- lsb_release -d -s | grep -q openSUSE |
|
| 323 |
- if [[ $? -eq 0 ]]; then |
|
| 324 |
- os_VENDOR="openSUSE" |
|
| 325 |
- fi |
|
| 326 |
- elif [[ $os_VENDOR == "openSUSE project" ]]; then |
|
| 327 |
- os_VENDOR="openSUSE" |
|
| 328 |
- elif [[ $os_VENDOR =~ Red.*Hat ]]; then |
|
| 329 |
- os_VENDOR="Red Hat" |
|
| 330 |
- fi |
|
| 331 |
- os_CODENAME=$(lsb_release -c -s) |
|
| 332 |
- elif [[ -r /etc/redhat-release ]]; then |
|
| 333 |
- # Red Hat Enterprise Linux Server release 5.5 (Tikanga) |
|
| 334 |
- # Red Hat Enterprise Linux Server release 7.0 Beta (Maipo) |
|
| 335 |
- # CentOS release 5.5 (Final) |
|
| 336 |
- # CentOS Linux release 6.0 (Final) |
|
| 337 |
- # Fedora release 16 (Verne) |
|
| 338 |
- # XenServer release 6.2.0-70446c (xenenterprise) |
|
| 339 |
- # Oracle Linux release 7 |
|
| 340 |
- # CloudLinux release 7.1 |
|
| 341 |
- os_CODENAME="" |
|
| 342 |
- for r in "Red Hat" CentOS Fedora XenServer CloudLinux; do |
|
| 343 |
- os_VENDOR=$r |
|
| 344 |
- if [[ -n "`grep \"$r\" /etc/redhat-release`" ]]; then |
|
| 345 |
- ver=`sed -e 's/^.* \([0-9].*\) (\(.*\)).*$/\1\|\2/' /etc/redhat-release` |
|
| 346 |
- os_CODENAME=${ver#*|}
|
|
| 347 |
- os_RELEASE=${ver%|*}
|
|
| 348 |
- os_UPDATE=${os_RELEASE##*.}
|
|
| 349 |
- os_RELEASE=${os_RELEASE%.*}
|
|
| 350 |
- break |
|
| 351 |
- fi |
|
| 352 |
- os_VENDOR="" |
|
| 353 |
- done |
|
| 354 |
- if [ "$os_VENDOR" = "Red Hat" ] && [[ -r /etc/oracle-release ]]; then |
|
| 355 |
- os_VENDOR=OracleLinux |
|
| 356 |
- fi |
|
| 357 |
- os_PACKAGE="rpm" |
|
| 358 |
- elif [[ -r /etc/SuSE-release ]]; then |
|
| 359 |
- for r in openSUSE "SUSE Linux"; do |
|
| 360 |
- if [[ "$r" = "SUSE Linux" ]]; then |
|
| 361 |
- os_VENDOR="SUSE LINUX" |
|
| 362 |
- else |
|
| 363 |
- os_VENDOR=$r |
|
| 364 |
- fi |
|
| 328 |
+ os_RELEASE=$(lsb_release -r -s) |
|
| 329 |
+ os_CODENAME=$(lsb_release -c -s) |
|
| 330 |
+ os_VENDOR=$(lsb_release -i -s) |
|
| 365 | 331 |
|
| 366 |
- if [[ -n "`grep \"$r\" /etc/SuSE-release`" ]]; then |
|
| 367 |
- os_CODENAME=`grep "CODENAME = " /etc/SuSE-release | sed 's:.* = ::g'` |
|
| 368 |
- os_RELEASE=`grep "VERSION = " /etc/SuSE-release | sed 's:.* = ::g'` |
|
| 369 |
- os_UPDATE=`grep "PATCHLEVEL = " /etc/SuSE-release | sed 's:.* = ::g'` |
|
| 370 |
- break |
|
| 371 |
- fi |
|
| 372 |
- os_VENDOR="" |
|
| 373 |
- done |
|
| 374 |
- os_PACKAGE="rpm" |
|
| 375 |
- # If lsb_release is not installed, we should be able to detect Debian OS |
|
| 376 |
- elif [[ -f /etc/debian_version ]] && [[ $(cat /proc/version) =~ "Debian" ]]; then |
|
| 377 |
- os_VENDOR="Debian" |
|
| 332 |
+ if [[ $os_VENDOR =~ (Debian|Ubuntu|LinuxMint) ]]; then |
|
| 378 | 333 |
os_PACKAGE="deb" |
| 379 |
- os_CODENAME=$(awk '/VERSION=/' /etc/os-release | sed 's/VERSION=//' | sed -r 's/\"|\(|\)//g' | awk '{print $2}')
|
|
| 380 |
- os_RELEASE=$(awk '/VERSION_ID=/' /etc/os-release | sed 's/VERSION_ID=//' | sed 's/\"//g') |
|
| 334 |
+ else |
|
| 335 |
+ os_PACKAGE="rpm" |
|
| 381 | 336 |
fi |
| 382 |
- export os_VENDOR os_RELEASE os_UPDATE os_PACKAGE os_CODENAME |
|
| 337 |
+ |
|
| 338 |
+ typeset -xr os_VENDOR |
|
| 339 |
+ typeset -xr os_RELEASE |
|
| 340 |
+ typeset -xr os_PACKAGE |
|
| 341 |
+ typeset -xr os_CODENAME |
|
| 383 | 342 |
} |
| 384 | 343 |
|
| 385 | 344 |
# Translate the OS version values into common nomenclature |
| ... | ... |
@@ -389,7 +348,8 @@ declare DISTRO |
| 389 | 389 |
function GetDistro {
|
| 390 | 390 |
GetOSVersion |
| 391 | 391 |
if [[ "$os_VENDOR" =~ (Ubuntu) || "$os_VENDOR" =~ (Debian) ]]; then |
| 392 |
- # 'Everyone' refers to Ubuntu / Debian releases by the code name adjective |
|
| 392 |
+ # 'Everyone' refers to Ubuntu / Debian releases by |
|
| 393 |
+ # the code name adjective |
|
| 393 | 394 |
DISTRO=$os_CODENAME |
| 394 | 395 |
elif [[ "$os_VENDOR" =~ (Fedora) ]]; then |
| 395 | 396 |
# For Fedora, just use 'f' and the release |
| ... | ... |
@@ -397,26 +357,22 @@ function GetDistro {
|
| 397 | 397 |
elif [[ "$os_VENDOR" =~ (openSUSE) ]]; then |
| 398 | 398 |
DISTRO="opensuse-$os_RELEASE" |
| 399 | 399 |
elif [[ "$os_VENDOR" =~ (SUSE LINUX) ]]; then |
| 400 |
- # For SLE, also use the service pack |
|
| 401 |
- if [[ -z "$os_UPDATE" ]]; then |
|
| 402 |
- DISTRO="sle${os_RELEASE}"
|
|
| 403 |
- else |
|
| 404 |
- DISTRO="sle${os_RELEASE}sp${os_UPDATE}"
|
|
| 405 |
- fi |
|
| 406 |
- elif [[ "$os_VENDOR" =~ (Red Hat) || \ |
|
| 400 |
+ # just use major release |
|
| 401 |
+ DISTRO="sle${os_RELEASE%.*}"
|
|
| 402 |
+ elif [[ "$os_VENDOR" =~ (Red.*Hat) || \ |
|
| 407 | 403 |
"$os_VENDOR" =~ (CentOS) || \ |
| 408 | 404 |
"$os_VENDOR" =~ (OracleLinux) ]]; then |
| 409 | 405 |
# Drop the . release as we assume it's compatible |
| 406 |
+ # XXX re-evaluate when we get RHEL10 |
|
| 410 | 407 |
DISTRO="rhel${os_RELEASE::1}"
|
| 411 | 408 |
elif [[ "$os_VENDOR" =~ (XenServer) ]]; then |
| 412 |
- DISTRO="xs$os_RELEASE" |
|
| 409 |
+ DISTRO="xs${os_RELEASE%.*}"
|
|
| 413 | 410 |
elif [[ "$os_VENDOR" =~ (kvmibm) ]]; then |
| 414 | 411 |
DISTRO="${os_VENDOR}${os_RELEASE::1}"
|
| 415 | 412 |
else |
| 416 |
- # Catch-all for now is Vendor + Release + Update |
|
| 417 |
- DISTRO="$os_VENDOR-$os_RELEASE.$os_UPDATE" |
|
| 413 |
+ die $LINENO "Unable to determine DISTRO" |
|
| 418 | 414 |
fi |
| 419 |
- export DISTRO |
|
| 415 |
+ typeset -xr DISTRO |
|
| 420 | 416 |
} |
| 421 | 417 |
|
| 422 | 418 |
# Utility function for checking machine architecture |
| ... | ... |
@@ -136,7 +136,7 @@ source $TOP_DIR/inc/meta-config |
| 136 | 136 |
source $TOP_DIR/lib/stack |
| 137 | 137 |
|
| 138 | 138 |
# Determine what system we are running on. This provides ``os_VENDOR``, |
| 139 |
-# ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 139 |
+# ``os_RELEASE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 140 | 140 |
# and ``DISTRO`` |
| 141 | 141 |
GetDistro |
| 142 | 142 |
|
| ... | ... |
@@ -24,7 +24,7 @@ TOP_DIR=$(cd $(dirname "$0")/.. && pwd) |
| 24 | 24 |
source $TOP_DIR/functions |
| 25 | 25 |
|
| 26 | 26 |
# Determine what system we are running on. This provides ``os_VENDOR``, |
| 27 |
-# ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 27 |
+# ``os_RELEASE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 28 | 28 |
# and ``DISTRO`` |
| 29 | 29 |
GetDistro |
| 30 | 30 |
|
| ... | ... |
@@ -28,7 +28,7 @@ if [[ -z "$TOP_DIR" ]]; then |
| 28 | 28 |
source $TOP_DIR/functions |
| 29 | 29 |
|
| 30 | 30 |
# Determine what system we are running on. This provides ``os_VENDOR``, |
| 31 |
- # ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 31 |
+ # ``os_RELEASE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 32 | 32 |
# and ``DISTRO`` |
| 33 | 33 |
GetDistro |
| 34 | 34 |
|
| ... | ... |
@@ -84,7 +84,7 @@ fi |
| 84 | 84 |
load_plugin_settings |
| 85 | 85 |
|
| 86 | 86 |
# Determine what system we are running on. This provides ``os_VENDOR``, |
| 87 |
-# ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 87 |
+# ``os_RELEASE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 88 | 88 |
GetOSVersion |
| 89 | 89 |
|
| 90 | 90 |
# Run extras |