#!/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 # 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 . # # 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" # - # 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