427 lines
13 KiB
Bash
Executable File
427 lines
13 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# lsb_release - collect LSB conformance status about a system
|
|
#
|
|
# Copyright (C) 2000, 2002, 2004 Free Standards Group, Inc.
|
|
# Originally by Dominique MASSONIE <mdomi@users.sourceforge.net>
|
|
# Modified for SUSE Linux products by Thorsten Kukuk
|
|
#
|
|
# Copyright (C) 2023 Nedko Arnaudov
|
|
# Modified for LADIOS (LADI project)
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful, but
|
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
# General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
# Description:
|
|
# Collect information from sourceable /etc/lsb-release file (present on
|
|
# LSB-compliant systems) : LSB_VERSION, DISTRIB_ID, DISTRIB_RELEASE,
|
|
# DISTRIB_CODENAME, DISTRIB_DESCRIPTION (all optional)
|
|
# Then (if needed) find and add names from /etc/lsb-release.d
|
|
|
|
|
|
###############################################################################
|
|
# DECLARATIONS
|
|
###############################################################################
|
|
|
|
# This script version
|
|
SCRIPTVERSION="3.1-LADI"
|
|
|
|
# Defines the data files
|
|
INFO_LSB_FILE="/etc/lsb-release" # where to get LSB version
|
|
INFO_LSB_DIR="/etc/lsb-release.d" # where to get LSB addon modules
|
|
INFO_DISTRIB_FILE="/etc/os-release" # <distrib>-<suffix>
|
|
|
|
# Defines our exit codes
|
|
EXIT_STATUS="0" # default = Ok :)
|
|
ERROR_UNKNOWN="10" # unknown error
|
|
ERROR_USER="1" # program misuse
|
|
ERROR_PROGRAM="2" # internal error
|
|
ERROR_NOANSWER="3" # all required info not available
|
|
# typically non LSB compliant distro!
|
|
|
|
# Defines our messages
|
|
MSG_LSBVER="LSB Version:\t"
|
|
MSG_DISTID="Distributor ID:\t"
|
|
MSG_DISTDESC="Description:\t"
|
|
MSG_DISTREL="Release:\t"
|
|
MSG_DISTCODE="Codename:\t"
|
|
MSG_HOMEPAGE_URL="WWW Homepage:\t"
|
|
MSG_SUPPORT_URL="Support:\t"
|
|
MSG_BUGREPORT_URL="Bug reports:\t"
|
|
MSG_LOWERCASE_DISTID="Lowercase Name:\t"
|
|
MSG_NA="n/a"
|
|
MSG_NONE="(none)"
|
|
MSG_RESULT="" # contains the result in case short output selected
|
|
MSG_DISTRIBUTOR=""
|
|
|
|
###############################################################################
|
|
# FUNCTIONS
|
|
###############################################################################
|
|
|
|
# Display Program Version for internal use (needed by help2man)
|
|
DisplayProgramVersion() {
|
|
echo "$(basename "$0") v$SCRIPTVERSION"
|
|
echo
|
|
echo "Copyright (C) 2000, 2002, 2004 Free Standards Group, Inc."
|
|
echo "Copyright (C) 2017 SUSE Linux GmbH"
|
|
echo "Copyright (C) 2022 SUSE Software Solutions Germany GmbH"
|
|
echo "Copyright (C) 2023 Nedko Arnaudov"
|
|
echo
|
|
echo "This is free software; see the source for copying conditions. There is NO"
|
|
echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
|
echo
|
|
echo "Originally written by Dominique MASSONIE."
|
|
|
|
exit $EXIT_STATUS
|
|
}
|
|
|
|
# defines the Usage for lsb_release
|
|
Usage() {
|
|
echo "$(basename "$0") v$SCRIPTVERSION prints certain LSB (Linux Standard Base) and"
|
|
echo "Distribution information."
|
|
echo
|
|
echo "Usage: $(basename "$0") [OPTION]..."
|
|
echo "With no OPTION specified defaults to -v."
|
|
echo
|
|
echo "Options:"
|
|
echo " -v, --version"
|
|
echo " Display the version of the LSB specification against which the distribution is compliant."
|
|
echo " -i, --id"
|
|
echo " Display the string id of the distributor."
|
|
echo " -d, --description"
|
|
echo " Display the single line text description of the distribution."
|
|
echo " -r, --release"
|
|
echo " Display the release number of the distribution."
|
|
echo " -c, --codename"
|
|
echo " Display the codename according to the distribution release."
|
|
echo " -w, --homepage"
|
|
echo " Display the distribution WWW homepage URL."
|
|
echo " -u, --support"
|
|
echo " Display the distribution sUpport URL."
|
|
echo " -b, --bugreport"
|
|
echo " Display the distribution Bugreport URL."
|
|
echo " -n,--lowercase_name"
|
|
# '(echo $(lsb_release -is)-$(lsb_release -rs) | tr "[:upper:]" "[:lower:]")'
|
|
echo " Display the distro lowercase name (with revision)."
|
|
echo " -a, --all"
|
|
echo " Display all of the above information."
|
|
echo " -s, --short"
|
|
echo " Use short output format for information requested by other options (or version if none)."
|
|
echo " -h, --help"
|
|
echo " Display this message."
|
|
|
|
exit $EXIT_STATUS
|
|
}
|
|
|
|
# Handles the enhanced args (i.e. --something)
|
|
EnhancedGetopt() {
|
|
getopt -T >/dev/null 2>&1 # is getopt the enhanced one ?
|
|
if [ $? = 4 ]
|
|
then # Yes, advanced args ALLOWED
|
|
OPT=$(getopt -o acdhirsvpwubn \
|
|
--long all,codename,description,help,id,release,short,version,program_version,\
|
|
homepage,support,bugreport,lowercase_name \
|
|
-n 'lsb_release' \
|
|
-- "$@")
|
|
else # No, advanced args NOT allowed
|
|
# convert (if needed) the enhanced options into basic ones
|
|
MYARGS=$(echo "$@" | sed -e "/--/s/-\(-[[:alnum:]]\)[[:alnum:]]*/\1/g")
|
|
OPT=$(getopt -o acdhirsvpwubb \
|
|
-n 'lsb_release' \
|
|
-- "$MYARGS")
|
|
fi
|
|
if [ $? != 0 ]
|
|
then
|
|
exit $ERROR_PROGRAM
|
|
fi
|
|
|
|
NB_ARG="" # enabled if many args set in one parameter (i.e. -dris)
|
|
eval set -- "$OPT"
|
|
while true ; do
|
|
case "$1" in
|
|
-a|--all) ARG_A="y"; NB_ARG="y"; shift;;
|
|
-c|--codename) ARG_C="y"; NB_ARG="y"; shift;;
|
|
-d|--description) ARG_D="y"; NB_ARG="y"; shift;;
|
|
-i|--id) ARG_I="y"; NB_ARG="y"; shift;;
|
|
-r|--release) ARG_R="y"; NB_ARG="y"; shift;;
|
|
-w|--homepage) ARG_W="y"; shift;;
|
|
-u|--support) ARG_U="y"; shift;;
|
|
-b|--bugreport) ARG_B="y"; shift;;
|
|
-n|--lowecase_name) ARG_N="y"; shift;;
|
|
-s|--short) ARG_S="y"; shift;;
|
|
-v|--version) ARG_V="y"; NB_ARG="y"; shift;;
|
|
-p|--program_version) DisplayProgramVersion;;
|
|
-h|--help) Usage;;
|
|
--) shift; break;;
|
|
*) EXIT_STATUS=$ERROR_USER
|
|
Usage;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
# Get/Init LSB infos (maybe Distrib infos too)
|
|
GetLSBInfo() {
|
|
LSB_VERSION=""
|
|
if [ -f "$INFO_LSB_FILE" ]
|
|
then
|
|
# should init at least LSB_VERSION
|
|
. "$INFO_LSB_FILE"
|
|
fi
|
|
# Always look in the directories
|
|
if [ -d "$INFO_ROOT/$INFO_LSB_DIR" ]
|
|
then
|
|
for tag in "$INFO_ROOT/$INFO_LSB_DIR/"*
|
|
do
|
|
if [ -z "$LSB_VERSION" ]
|
|
then
|
|
LSB_VERSION=$(basename "$tag")
|
|
else
|
|
LSB_VERSION=$LSB_VERSION:$(basename "$tag")
|
|
fi
|
|
done
|
|
fi
|
|
if [ -z "$LSB_VERSION" ]
|
|
then
|
|
LSB_VERSION=$MSG_NA
|
|
fi
|
|
}
|
|
|
|
# Get the whole distrib information string (from /etc/os-release)
|
|
InitDistribInfo() {
|
|
|
|
. $INFO_DISTRIB_FILE
|
|
NO="" # is Description string syntax correct ?
|
|
|
|
if [ -z "$DISTRIB_DESCRIPTION" ]; then
|
|
if [ -n "$PRETTY_NAME" ]; then
|
|
DISTRIB_DESCRIPTION=$PRETTY_NAME
|
|
else
|
|
DISTRIB_DESCRIPTION=$MSG_NONE
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$DISTRIB_ID" ]; then
|
|
if [ -n "$MSG_DISTRIBUTOR" ]; then
|
|
DISTRIB_ID=$MSG_DISTRIBUTOR
|
|
else
|
|
case "$PRETTY_NAME" in
|
|
Fedora*)
|
|
DISTRIB_ID="Fedora"
|
|
;;
|
|
CentOS*)
|
|
DISTRIB_ID="CentOS"
|
|
;;
|
|
"Red Hat Enterprise Linux"*)
|
|
DISTRIB_ID="RedHatEnterprise"
|
|
;;
|
|
AlmaLinux*)
|
|
DISTRIB_ID="AlmaLinux"
|
|
;;
|
|
Oracle*)
|
|
DISTRIB_ID="OracleLinux"
|
|
;;
|
|
openSUSE*)
|
|
DISTRIB_ID="openSUSE"
|
|
;;
|
|
SUSE*)
|
|
DISTRIB_ID="SUSE"
|
|
;;
|
|
*)
|
|
DISTRIB_ID=$MSG_NA
|
|
;;
|
|
esac
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$DISTRIB_RELEASE" ]; then
|
|
if [ -n "$VERSION_ID" ]; then
|
|
DISTRIB_RELEASE=$VERSION_ID
|
|
else
|
|
DISTRIB_RELEASE=$MSG_NA
|
|
fi
|
|
fi
|
|
|
|
if [ -z "$DISTRIB_CODENAME" ]; then
|
|
if [ -n "$VERSION_CODENAME" ]; then
|
|
DISTRIB_CODENAME=$VERSION_CODENAME
|
|
else
|
|
DISTRIB_CODENAME=$MSG_NA
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# Check missing and requested infos, then find the file and get infos
|
|
GetDistribInfo() {
|
|
NO="" # /etc/lsb-release data are enough to reply what is requested?
|
|
[ -n "$ARG_D" ] && [ -z "$DISTRIB_DESCRIPTION" ] && NO="y"
|
|
[ -z "$NO" ] && [ -n "$ARG_I" ] && [ -z "$DISTRIB_ID" ] && NO="y"
|
|
[ -z "$NO" ] && [ -n "$ARG_R" ] && [ -z "$DISTRIB_RELEASE" ] && NO="y"
|
|
[ -z "$NO" ] && [ -n "$ARG_N" ] && [ -z "$DISTRIB_RELEASE" ] && NO="y"
|
|
[ -z "$NO" ] && [ -n "$ARG_W" ] && [ -z "$HOME_URL" ] && NO="y"
|
|
[ -z "$NO" ] && [ -n "$ARG_U" ] && [ -z "$SUPPORT_URL" ] && NO="y"
|
|
[ -z "$NO" ] && [ -n "$ARG_B" ] && [ -z "$BUG_REPORT_URL" ] && NO="y"
|
|
[ -z "$NO" ] && [ -n "$ARG_C" ] && [ -z "$DISTRIB_CODENAME" ] && NO="y"
|
|
|
|
if [ -n "$NO" ]
|
|
then
|
|
InitDistribInfo
|
|
fi
|
|
}
|
|
|
|
# Display version of LSB against which distribution is compliant
|
|
DisplayVersion() {
|
|
if [ -z "$ARG_S" ]
|
|
then
|
|
echo -e "$MSG_LSBVER$LSB_VERSION" # at least "n/a"
|
|
else
|
|
MSG_RESULT="$MSG_RESULT${MSG_RESULT:+ }$LSB_VERSION"
|
|
fi
|
|
}
|
|
|
|
# Display string id of distributor ( i.e. a single word! )
|
|
DisplayID() {
|
|
if [ -z "$ARG_S" ]
|
|
then
|
|
echo -e "$MSG_DISTID$DISTRIB_ID"
|
|
else
|
|
MSG_RESULT="$MSG_RESULT${MSG_RESULT:+ }$DISTRIB_ID"
|
|
fi
|
|
}
|
|
|
|
# Diplay single line text description of distribution
|
|
DisplayDescription() {
|
|
if [ -z "$DISTRIB_DESCRIPTION" ]
|
|
then
|
|
# should not be empty since GetDistribInfo called on Initialization !
|
|
EXIT_STATUS=$ERROR_PROGRAM
|
|
fi
|
|
if [ -z "$ARG_S" ]
|
|
then
|
|
echo -e "$MSG_DISTDESC$DISTRIB_DESCRIPTION"
|
|
else
|
|
MSG_RESULT="$MSG_RESULT${MSG_RESULT:+ }\"$DISTRIB_DESCRIPTION\""
|
|
fi
|
|
}
|
|
|
|
# Display release number of distribution.
|
|
DisplayRelease() {
|
|
if [ -z "$ARG_S" ]
|
|
then
|
|
echo -e "$MSG_DISTREL$DISTRIB_RELEASE"
|
|
else
|
|
MSG_RESULT="$MSG_RESULT${MSG_RESULT:+ }$DISTRIB_RELEASE"
|
|
fi
|
|
}
|
|
|
|
# Display codename according to distribution version.
|
|
DisplayCodename() {
|
|
if [ -z "$ARG_S" ]
|
|
then
|
|
echo -e "$MSG_DISTCODE$(echo "$DISTRIB_CODENAME" | \
|
|
tr -d "[:blank:]")" # Remove blanks
|
|
else
|
|
MSG_RESULT="$MSG_RESULT${MSG_RESULT:+ }$(echo "$DISTRIB_CODENAME" | \
|
|
tr -d "[:blank:]")"
|
|
fi
|
|
}
|
|
|
|
# Display the distribution WWW homepage URL
|
|
DisplayHomepageURL() {
|
|
if [ -z "$ARG_S" ]
|
|
then
|
|
echo -e "$MSG_HOMEPAGE_URL${HOME_URL}"
|
|
else
|
|
MSG_RESULT="$MSG_RESULT${MSG_RESULT:+ }${HOME_URL}"
|
|
fi
|
|
}
|
|
|
|
# Display the distribution sUpport URL
|
|
DisplaySupportURL() {
|
|
if [ -z "$ARG_S" ]
|
|
then
|
|
echo -e "$MSG_SUPPORT_URL${SUPPORT_URL}"
|
|
else
|
|
MSG_RESULT="$MSG_RESULT${MSG_RESULT:+ }${SUPPORT_URL}"
|
|
fi
|
|
}
|
|
|
|
# Display the distribution Bugreport URL
|
|
DisplayBugreportURL() {
|
|
if [ -z "$ARG_S" ]
|
|
then
|
|
echo -e "$MSG_BUGREPORT_URL${BUG_REPORT_URL}"
|
|
else
|
|
MSG_RESULT="$MSG_RESULT${MSG_RESULT:+ }${BUG_REPORT_URL}"
|
|
fi
|
|
}
|
|
|
|
DisplayLowercaseID() {
|
|
# '(echo $(lsb_release -is)-$(lsb_release -rs) | tr "[:upper:]" "[:lower:]")'
|
|
LOWERCASE_DISTRIB_ID=$(echo $DISTRIB_ID | tr "[:upper:]" "[:lower:]")-$DISTRIB_RELEASE
|
|
if [ -z "$ARG_S" ]
|
|
then
|
|
echo -e "$MSG_LOWERCASE_DISTID$LOWERCASE_DISTRIB_ID"
|
|
else
|
|
MSG_RESULT="$MSG_RESULT${MSG_RESULT:+ }$LOWERCASE_DISTRIB_ID"
|
|
fi
|
|
}
|
|
|
|
###############################################################################
|
|
# MAIN
|
|
###############################################################################
|
|
|
|
# Check if any prog argument
|
|
if [ -z "$1" ]
|
|
then
|
|
ARG_V="y" # default set to Display LSB Version (not Usage)
|
|
else
|
|
EnhancedGetopt "$@" # Parse program args
|
|
if [ -n "$ARG_S" ] && [ -z "$NB_ARG" ]
|
|
then
|
|
ARG_V="y" # set also default for --short when single arg
|
|
fi
|
|
fi
|
|
|
|
# Update args to All if requested
|
|
if [ -n "$ARG_A" ]
|
|
then
|
|
[ -z "$ARG_C" ] && ARG_C="y"
|
|
[ -z "$ARG_D" ] && ARG_D="y"
|
|
[ -z "$ARG_I" ] && ARG_I="y"
|
|
[ -z "$ARG_R" ] && ARG_R="y"
|
|
[ -z "$ARG_V" ] && ARG_V="y"
|
|
[ -z "$ARG_W" ] && ARG_W="y"
|
|
[ -z "$ARG_U" ] && ARG_U="y"
|
|
[ -z "$ARG_B" ] && ARG_B="y"
|
|
[ -z "$ARG_N" ] && ARG_N="y"
|
|
fi
|
|
|
|
# Initialization
|
|
GetLSBInfo
|
|
GetDistribInfo
|
|
|
|
# Display requested infos (order as follow)
|
|
[ -n "$ARG_V" ] && DisplayVersion
|
|
[ -n "$ARG_I" ] && DisplayID
|
|
[ -n "$ARG_D" ] && DisplayDescription
|
|
[ -n "$ARG_R" ] && DisplayRelease
|
|
[ -n "$ARG_C" ] && DisplayCodename
|
|
[ -n "$ARG_W" ] && DisplayHomepageURL
|
|
[ -n "$ARG_U" ] && DisplaySupportURL
|
|
[ -n "$ARG_B" ] && DisplayBugreportURL
|
|
[ -n "$ARG_N" ] && DisplayLowercaseID
|
|
|
|
[ -n "$ARG_S" ] && echo "$MSG_RESULT"
|
|
|
|
exit $EXIT_STATUS
|