| ... | ... |
@@ -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 |
|
| ... | ... |
@@ -292,112 +292,71 @@ function warn {
|
| 292 | 292 |
# ================ |
| 293 | 293 |
|
| 294 | 294 |
# Determine OS Vendor, Release and Update |
| 295 |
-# Tested with OS/X, Ubuntu, RedHat, CentOS, Fedora |
|
| 296 |
-# Returns results in global variables: |
|
| 295 |
+ |
|
| 296 |
+# |
|
| 297 |
+# NOTE : For portability, you almost certainly do not want to use |
|
| 298 |
+# these variables directly! The "is_*" functions defined below this |
|
| 299 |
+# bundle up compatible platforms under larger umbrellas that we have |
|
| 300 |
+# determinted are compatible enough (e.g. is_ubuntu covers Ubuntu & |
|
| 301 |
+# Debian, is_fedora covers RPM-based distros). Higher-level functions |
|
| 302 |
+# such as "install_package" further abstract things in better ways. |
|
| 303 |
+# |
|
| 297 | 304 |
# ``os_VENDOR`` - vendor name: ``Ubuntu``, ``Fedora``, etc |
| 298 | 305 |
# ``os_RELEASE`` - major release: ``14.04`` (Ubuntu), ``20`` (Fedora) |
| 299 |
-# ``os_UPDATE`` - update: ex. the ``5`` in ``RHEL6.5`` |
|
| 300 | 306 |
# ``os_PACKAGE`` - package type: ``deb`` or ``rpm`` |
| 301 |
-# ``os_CODENAME`` - vendor's codename for release: ``snow leopard``, ``trusty`` |
|
| 302 |
-os_VENDOR="" |
|
| 303 |
-os_RELEASE="" |
|
| 304 |
-os_UPDATE="" |
|
| 305 |
-os_PACKAGE="" |
|
| 306 |
-os_CODENAME="" |
|
| 307 |
+# ``os_CODENAME`` - vendor's codename for release: ``trusty`` |
|
| 308 |
+ |
|
| 309 |
+declare os_VENDOR os_RELEASE os_PACKAGE os_CODENAME |
|
| 310 |
+ |
|
| 311 |
+# Make a *best effort* attempt to install lsb_release packages for the |
|
| 312 |
+# user if not available. Note can't use generic install_package* |
|
| 313 |
+# because they depend on this! |
|
| 314 |
+function _ensure_lsb_release {
|
|
| 315 |
+ if [[ -x $(which lsb_release 2>/dev/null) ]]; then |
|
| 316 |
+ return |
|
| 317 |
+ fi |
|
| 318 |
+ |
|
| 319 |
+ if [[ -x $(which apt-get 2>/dev/null) ]]; then |
|
| 320 |
+ sudo apt-get install -y lsb-release |
|
| 321 |
+ elif [[ -x $(which zypper 2>/dev/null) ]]; then |
|
| 322 |
+ # XXX: old code paths seem to have assumed SUSE platforms also |
|
| 323 |
+ # had "yum". Keep this ordered above yum so we don't try to |
|
| 324 |
+ # install the rh package. suse calls it just "lsb" |
|
| 325 |
+ sudo zypper -y install lsb |
|
| 326 |
+ elif [[ -x $(which dnf 2>/dev/null) ]]; then |
|
| 327 |
+ sudo dnf install -y redhat-lsb-core |
|
| 328 |
+ elif [[ -x $(which yum 2>/dev/null) ]]; then |
|
| 329 |
+ # all rh patforms (fedora, centos, rhel) have this pkg |
|
| 330 |
+ sudo yum install -y redhat-lsb-core |
|
| 331 |
+ else |
|
| 332 |
+ die $LINENO "Unable to find or auto-install lsb_release" |
|
| 333 |
+ fi |
|
| 334 |
+} |
|
| 307 | 335 |
|
| 308 | 336 |
# GetOSVersion |
| 337 |
+# Set the following variables: |
|
| 338 |
+# - os_RELEASE |
|
| 339 |
+# - os_CODENAME |
|
| 340 |
+# - os_VENDOR |
|
| 341 |
+# - os_PACKAGE |
|
| 309 | 342 |
function GetOSVersion {
|
| 343 |
+ # We only support distros that provide a sane lsb_release |
|
| 344 |
+ _ensure_lsb_release |
|
| 310 | 345 |
|
| 311 |
- # Figure out which vendor we are |
|
| 312 |
- if [[ -x "`which sw_vers 2>/dev/null`" ]]; then |
|
| 313 |
- # OS/X |
|
| 314 |
- os_VENDOR=`sw_vers -productName` |
|
| 315 |
- os_RELEASE=`sw_vers -productVersion` |
|
| 316 |
- os_UPDATE=${os_RELEASE##*.}
|
|
| 317 |
- os_RELEASE=${os_RELEASE%.*}
|
|
| 318 |
- os_PACKAGE="" |
|
| 319 |
- if [[ "$os_RELEASE" =~ "10.7" ]]; then |
|
| 320 |
- os_CODENAME="lion" |
|
| 321 |
- elif [[ "$os_RELEASE" =~ "10.6" ]]; then |
|
| 322 |
- os_CODENAME="snow leopard" |
|
| 323 |
- elif [[ "$os_RELEASE" =~ "10.5" ]]; then |
|
| 324 |
- os_CODENAME="leopard" |
|
| 325 |
- elif [[ "$os_RELEASE" =~ "10.4" ]]; then |
|
| 326 |
- os_CODENAME="tiger" |
|
| 327 |
- elif [[ "$os_RELEASE" =~ "10.3" ]]; then |
|
| 328 |
- os_CODENAME="panther" |
|
| 329 |
- else |
|
| 330 |
- os_CODENAME="" |
|
| 331 |
- fi |
|
| 332 |
- elif [[ -x $(which lsb_release 2>/dev/null) ]]; then |
|
| 333 |
- os_VENDOR=$(lsb_release -i -s) |
|
| 334 |
- os_RELEASE=$(lsb_release -r -s) |
|
| 335 |
- os_UPDATE="" |
|
| 336 |
- os_PACKAGE="rpm" |
|
| 337 |
- if [[ "Debian,Ubuntu,LinuxMint" =~ $os_VENDOR ]]; then |
|
| 338 |
- os_PACKAGE="deb" |
|
| 339 |
- elif [[ "SUSE LINUX" =~ $os_VENDOR ]]; then |
|
| 340 |
- lsb_release -d -s | grep -q openSUSE |
|
| 341 |
- if [[ $? -eq 0 ]]; then |
|
| 342 |
- os_VENDOR="openSUSE" |
|
| 343 |
- fi |
|
| 344 |
- elif [[ $os_VENDOR == "openSUSE project" ]]; then |
|
| 345 |
- os_VENDOR="openSUSE" |
|
| 346 |
- elif [[ $os_VENDOR =~ Red.*Hat ]]; then |
|
| 347 |
- os_VENDOR="Red Hat" |
|
| 348 |
- fi |
|
| 349 |
- os_CODENAME=$(lsb_release -c -s) |
|
| 350 |
- elif [[ -r /etc/redhat-release ]]; then |
|
| 351 |
- # Red Hat Enterprise Linux Server release 5.5 (Tikanga) |
|
| 352 |
- # Red Hat Enterprise Linux Server release 7.0 Beta (Maipo) |
|
| 353 |
- # CentOS release 5.5 (Final) |
|
| 354 |
- # CentOS Linux release 6.0 (Final) |
|
| 355 |
- # Fedora release 16 (Verne) |
|
| 356 |
- # XenServer release 6.2.0-70446c (xenenterprise) |
|
| 357 |
- # Oracle Linux release 7 |
|
| 358 |
- # CloudLinux release 7.1 |
|
| 359 |
- os_CODENAME="" |
|
| 360 |
- for r in "Red Hat" CentOS Fedora XenServer CloudLinux; do |
|
| 361 |
- os_VENDOR=$r |
|
| 362 |
- if [[ -n "`grep \"$r\" /etc/redhat-release`" ]]; then |
|
| 363 |
- ver=`sed -e 's/^.* \([0-9].*\) (\(.*\)).*$/\1\|\2/' /etc/redhat-release` |
|
| 364 |
- os_CODENAME=${ver#*|}
|
|
| 365 |
- os_RELEASE=${ver%|*}
|
|
| 366 |
- os_UPDATE=${os_RELEASE##*.}
|
|
| 367 |
- os_RELEASE=${os_RELEASE%.*}
|
|
| 368 |
- break |
|
| 369 |
- fi |
|
| 370 |
- os_VENDOR="" |
|
| 371 |
- done |
|
| 372 |
- if [ "$os_VENDOR" = "Red Hat" ] && [[ -r /etc/oracle-release ]]; then |
|
| 373 |
- os_VENDOR=OracleLinux |
|
| 374 |
- fi |
|
| 375 |
- os_PACKAGE="rpm" |
|
| 376 |
- elif [[ -r /etc/SuSE-release ]]; then |
|
| 377 |
- for r in openSUSE "SUSE Linux"; do |
|
| 378 |
- if [[ "$r" = "SUSE Linux" ]]; then |
|
| 379 |
- os_VENDOR="SUSE LINUX" |
|
| 380 |
- else |
|
| 381 |
- os_VENDOR=$r |
|
| 382 |
- fi |
|
| 346 |
+ os_RELEASE=$(lsb_release -r -s) |
|
| 347 |
+ os_CODENAME=$(lsb_release -c -s) |
|
| 348 |
+ os_VENDOR=$(lsb_release -i -s) |
|
| 383 | 349 |
|
| 384 |
- if [[ -n "`grep \"$r\" /etc/SuSE-release`" ]]; then |
|
| 385 |
- os_CODENAME=`grep "CODENAME = " /etc/SuSE-release | sed 's:.* = ::g'` |
|
| 386 |
- os_RELEASE=`grep "VERSION = " /etc/SuSE-release | sed 's:.* = ::g'` |
|
| 387 |
- os_UPDATE=`grep "PATCHLEVEL = " /etc/SuSE-release | sed 's:.* = ::g'` |
|
| 388 |
- break |
|
| 389 |
- fi |
|
| 390 |
- os_VENDOR="" |
|
| 391 |
- done |
|
| 392 |
- os_PACKAGE="rpm" |
|
| 393 |
- # If lsb_release is not installed, we should be able to detect Debian OS |
|
| 394 |
- elif [[ -f /etc/debian_version ]] && [[ $(cat /proc/version) =~ "Debian" ]]; then |
|
| 395 |
- os_VENDOR="Debian" |
|
| 350 |
+ if [[ $os_VENDOR =~ (Debian|Ubuntu|LinuxMint) ]]; then |
|
| 396 | 351 |
os_PACKAGE="deb" |
| 397 |
- os_CODENAME=$(awk '/VERSION=/' /etc/os-release | sed 's/VERSION=//' | sed -r 's/\"|\(|\)//g' | awk '{print $2}')
|
|
| 398 |
- os_RELEASE=$(awk '/VERSION_ID=/' /etc/os-release | sed 's/VERSION_ID=//' | sed 's/\"//g') |
|
| 352 |
+ else |
|
| 353 |
+ os_PACKAGE="rpm" |
|
| 399 | 354 |
fi |
| 400 |
- export os_VENDOR os_RELEASE os_UPDATE os_PACKAGE os_CODENAME |
|
| 355 |
+ |
|
| 356 |
+ typeset -xr os_VENDOR |
|
| 357 |
+ typeset -xr os_RELEASE |
|
| 358 |
+ typeset -xr os_PACKAGE |
|
| 359 |
+ typeset -xr os_CODENAME |
|
| 401 | 360 |
} |
| 402 | 361 |
|
| 403 | 362 |
# Translate the OS version values into common nomenclature |
| ... | ... |
@@ -407,7 +366,8 @@ declare DISTRO |
| 407 | 407 |
function GetDistro {
|
| 408 | 408 |
GetOSVersion |
| 409 | 409 |
if [[ "$os_VENDOR" =~ (Ubuntu) || "$os_VENDOR" =~ (Debian) ]]; then |
| 410 |
- # 'Everyone' refers to Ubuntu / Debian releases by the code name adjective |
|
| 410 |
+ # 'Everyone' refers to Ubuntu / Debian releases by |
|
| 411 |
+ # the code name adjective |
|
| 411 | 412 |
DISTRO=$os_CODENAME |
| 412 | 413 |
elif [[ "$os_VENDOR" =~ (Fedora) ]]; then |
| 413 | 414 |
# For Fedora, just use 'f' and the release |
| ... | ... |
@@ -415,26 +375,22 @@ function GetDistro {
|
| 415 | 415 |
elif [[ "$os_VENDOR" =~ (openSUSE) ]]; then |
| 416 | 416 |
DISTRO="opensuse-$os_RELEASE" |
| 417 | 417 |
elif [[ "$os_VENDOR" =~ (SUSE LINUX) ]]; then |
| 418 |
- # For SLE, also use the service pack |
|
| 419 |
- if [[ -z "$os_UPDATE" ]]; then |
|
| 420 |
- DISTRO="sle${os_RELEASE}"
|
|
| 421 |
- else |
|
| 422 |
- DISTRO="sle${os_RELEASE}sp${os_UPDATE}"
|
|
| 423 |
- fi |
|
| 424 |
- elif [[ "$os_VENDOR" =~ (Red Hat) || \ |
|
| 418 |
+ # just use major release |
|
| 419 |
+ DISTRO="sle${os_RELEASE%.*}"
|
|
| 420 |
+ elif [[ "$os_VENDOR" =~ (Red.*Hat) || \ |
|
| 425 | 421 |
"$os_VENDOR" =~ (CentOS) || \ |
| 426 | 422 |
"$os_VENDOR" =~ (OracleLinux) ]]; then |
| 427 | 423 |
# Drop the . release as we assume it's compatible |
| 424 |
+ # XXX re-evaluate when we get RHEL10 |
|
| 428 | 425 |
DISTRO="rhel${os_RELEASE::1}"
|
| 429 | 426 |
elif [[ "$os_VENDOR" =~ (XenServer) ]]; then |
| 430 |
- DISTRO="xs$os_RELEASE" |
|
| 427 |
+ DISTRO="xs${os_RELEASE%.*}"
|
|
| 431 | 428 |
elif [[ "$os_VENDOR" =~ (kvmibm) ]]; then |
| 432 | 429 |
DISTRO="${os_VENDOR}${os_RELEASE::1}"
|
| 433 | 430 |
else |
| 434 |
- # Catch-all for now is Vendor + Release + Update |
|
| 435 |
- DISTRO="$os_VENDOR-$os_RELEASE.$os_UPDATE" |
|
| 431 |
+ die $LINENO "Unable to determine DISTRO" |
|
| 436 | 432 |
fi |
| 437 |
- export DISTRO |
|
| 433 |
+ typeset -xr DISTRO |
|
| 438 | 434 |
} |
| 439 | 435 |
|
| 440 | 436 |
# Utility function for checking machine architecture |
| ... | ... |
@@ -138,7 +138,7 @@ source $TOP_DIR/inc/meta-config |
| 138 | 138 |
source $TOP_DIR/lib/stack |
| 139 | 139 |
|
| 140 | 140 |
# Determine what system we are running on. This provides ``os_VENDOR``, |
| 141 |
-# ``os_RELEASE``, ``os_UPDATE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 141 |
+# ``os_RELEASE``, ``os_PACKAGE``, ``os_CODENAME`` |
|
| 142 | 142 |
# and ``DISTRO`` |
| 143 | 143 |
GetDistro |
| 144 | 144 |
|
| ... | ... |
@@ -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 |
set -o xtrace |