#!/bin/sh # 2007-2019 (c) Vitaly Lipatov <lav@etersoft.ru> # 2007-2019 (c) Etersoft # 2007-2019 Public domain # You can set ROOTDIR to root system dir #ROOTDIR= # TODO: check /etc/system-release # Check for DISTRO specific file in /etc distro() { #[ -n "$ROOTDIR" ] || return # fill global DISTROFILE DISTROFILE="$ROOTDIR/etc/$1" [ -f "$DISTROFILE" ] } # Has a distro file the specified word? has() { [ -n "$DISTROFILE" ] || exit 1 grep "$*" "$DISTROFILE" >/dev/null 2>&1 } # Has a system the specified command? hascommand() { which $1 2>/dev/null >/dev/null } firstupper() { echo "$*" | sed 's/.*/\u&/' } tolower() { # tr is broken in busybox (checked with OpenWrt) #echo "$*" | tr "[:upper:]" "[:lower:]" echo "$*" | awk '{print tolower($0)}' } # Translate DISTRIB_ID to vendor name (like %_vendor does) rpmvendor() { [ "$DISTRIB_ID" = "ALTLinux" ] && echo "alt" && return [ "$DISTRIB_ID" = "AstraLinux" ] && echo "astra" && return [ "$DISTRIB_ID" = "LinuxXP" ] && echo "lxp" && return [ "$DISTRIB_ID" = "TinyCoreLinux" ] && echo "tcl" && return [ "$DISTRIB_ID" = "VoidLinux" ] && echo "void" && return [ "$DISTRIB_ID" = "OpenSUSE" ] && echo "suse" && return tolower "$DISTRIB_ID" } # Translate DISTRIB_ID name to package manner (like in the package release name) pkgvendor() { [ "$DISTRIB_ID" = "Mandriva" ] && echo "mdv" && return rpmvendor } # Print pkgtype (need DISTRIB_ID var) pkgtype() { # TODO: try use generic names case $(pkgvendor) in freebsd) echo "tbz" ;; sunos) echo "pkg.gz" ;; slackware|mopslinux) echo "tgz" ;; archlinux|manjaro) echo "pkg.tar.xz" ;; gentoo) echo "tbz2" ;; windows) echo "exe" ;; android) echo "apk" ;; alpine) echo "apk" ;; tinycorelinux) echo "tcz" ;; voidlinux) echo "xbps" ;; openwrt) echo "ipk" ;; cygwin) echo "tar.xz" ;; debian|ubuntu|mint|runtu|mcst|astra) echo "deb" ;; alt|asplinux|suse|mandriva|rosa|mandrake|pclinux|sled|sles) echo "rpm" ;; fedora|redhat|scientific|centos|rhel|goslinux|amzn) echo "rpm" ;; *) echo "rpm" ;; esac } get_var() { # get first variable and print it out, drop quotes if exists grep -i "^$1 *=" | head -n 1 | sed -e "s/^[^=]*[ \t]*=[ \t]*//" | sed -e "s/^[\'\"]\(.*\)[\'\"]/\1/" } # 2010.1 -> 2010 get_major_version() { echo "$1" | sed -e "s/\..*//g" } # Default values DISTRIB_ID="Generic" DISTRIB_RELEASE="" DISTRIB_CODENAME="" # Default with LSB if distro lsb-release ; then DISTRIB_ID=$(cat $DISTROFILE | get_var DISTRIB_ID) DISTRIB_RELEASE=$(cat $DISTROFILE | get_var DISTRIB_RELEASE) DISTRIB_CODENAME=$(cat $DISTROFILE | get_var DISTRIB_CODENAME) fi # ALT Linux based if distro altlinux-release ; then # TODO: use os-release firsly DISTRIB_ID="ALTLinux" if has Sisyphus ; then DISTRIB_RELEASE="Sisyphus" elif has "ALT Linux 7." ; then DISTRIB_RELEASE="p7" elif has "ALT Linux t7." ; then DISTRIB_RELEASE="t7" elif has "ALT Linux 8." ; then DISTRIB_RELEASE="p8" elif has "ALT .*8.[0-9]" ; then DISTRIB_RELEASE="p8" elif has "ALT .*9.[0-9]" ; then DISTRIB_RELEASE="p9" elif has "ALT p9 " ; then DISTRIB_RELEASE="p9" elif has "Simply Linux 6." ; then DISTRIB_RELEASE="p6" elif has "Simply Linux 7." ; then DISTRIB_RELEASE="p7" elif has "Simply Linux 8." ; then DISTRIB_RELEASE="p8" elif has "Simply Linux 9." ; then DISTRIB_RELEASE="p9" elif has "ALT Linux 6." ; then DISTRIB_RELEASE="p6" elif has "ALT Linux p8" ; then DISTRIB_RELEASE="p8" elif has "ALT Linux p7" ; then DISTRIB_RELEASE="p7" elif has "ALT Linux p6" ; then DISTRIB_RELEASE="p6" elif has "ALT Linux p5" ; then DISTRIB_RELEASE="p5" elif has "ALT Linux 5.1" ; then DISTRIB_RELEASE="5.1" elif has "ALT Linux 5.0" ; then DISTRIB_RELEASE="5.0" elif has "ALT Linux 4.1" ; then DISTRIB_RELEASE="4.1" elif has "ALT Linux 4.0" ; then DISTRIB_RELEASE="4.0" elif has "starter kit" ; then DISTRIB_RELEASE="p8" elif has Citron ; then DISTRIB_RELEASE="2.4" fi elif distro gentoo-release ; then DISTRIB_ID="Gentoo" MAKEPROFILE=$(readlink $ROOTDIR/etc/portage/make.profile 2>/dev/null) || MAKEPROFILE=$(readlink $ROOTDIR/etc/make.profile) DISTRIB_RELEASE=$(basename $MAKEPROFILE) echo $DISTRIB_RELEASE | grep -q "[0-9]" || DISTRIB_RELEASE=$(basename "$(dirname $MAKEPROFILE)") #" elif distro slackware-version ; then DISTRIB_ID="Slackware" DISTRIB_RELEASE="$(grep -Eo '[0-9]+\.[0-9]+' $DISTROFILE)" elif distro os-release && hascommand apk ; then # shellcheck disable=SC1090 . $ROOTDIR/etc/os-release DISTRIB_ID="$(firstupper "$ID")" DISTRIB_RELEASE="$VERSION_ID" elif distro os-release && hascommand tce-ab ; then # shellcheck disable=SC1090 . $ROOTDIR/etc/os-release DISTRIB_ID="TinyCoreLinux" DISTRIB_RELEASE="$VERSION_ID" elif distro os-release && hascommand xbps-query ; then # shellcheck disable=SC1090 . $ROOTDIR/etc/os-release DISTRIB_ID="VoidLinux" DISTRIB_RELEASE="Live" elif distro arch-release ; then DISTRIB_ID="ArchLinux" DISTRIB_RELEASE="2010" if grep 2011 -q $ROOTDIR/etc/pacman.d/mirrorlist ; then DISTRIB_RELEASE="2011" fi # Elbrus elif distro mcst_version ; then DISTRIB_ID="MCST" DISTRIB_RELEASE=$(cat "$DISTROFILE" | grep "release" | sed -e "s|.*release \([0-9]*\).*|\1|g") # OpenWrt elif distro openwrt_release ; then . $DISTROFILE DISTRIB_RELEASE=$(cat $ROOTDIR/etc/openwrt_version) elif distro astra_version ; then #DISTRIB_ID=`cat $DISTROFILE | get_var DISTRIB_ID` DISTRIB_ID="AstraLinux" #DISTRIB_RELEASE=$(cat "$DISTROFILE" | head -n1 | sed -e "s|.* \([a-z]*\).*|\1|g") DISTRIB_RELEASE=$DISTRIB_CODENAME # for Ubuntu use standard LSB info elif [ "$DISTRIB_ID" = "Ubuntu" ] && [ -n "$DISTRIB_RELEASE" ]; then # use LSB version true # Debian based elif distro debian_version ; then DISTRIB_ID="Debian" DISTRIB_RELEASE=$(cat $DISTROFILE | sed -e "s/\..*//g") # Mandriva based elif distro pclinuxos-release ; then DISTRIB_ID="PCLinux" if has "2007" ; then DISTRIB_RELEASE="2007" elif has "2008" ; then DISTRIB_RELEASE="2008" elif has "2010" ; then DISTRIB_RELEASE="2010" fi elif distro mandriva-release || distro mandrake-release ; then DISTRIB_ID="Mandriva" if has 2005 ; then DISTRIB_RELEASE="2005" elif has 2006 ; then DISTRIB_RELEASE="2006" elif has 2007 ; then DISTRIB_RELEASE="2007" elif has 2008 ; then DISTRIB_RELEASE="2008" elif has 2009.0 ; then DISTRIB_RELEASE="2009.0" elif has 2009.1 ; then DISTRIB_RELEASE="2009.1" else # use /etc/lsb-release info by default if has ROSA ; then DISTRIB_ID="ROSA" fi fi # Fedora based elif distro MCBC-release ; then DISTRIB_ID="MCBC" if has 3.0 ; then DISTRIB_RELEASE="3.0" elif has 3.1 ; then DISTRIB_RELEASE="3.1" fi elif distro fedora-release ; then DISTRIB_ID="Fedora" DISTRIB_RELEASE=$(cat "$DISTROFILE" | grep "release" | sed -e "s|.*release \([0-9]*\).*|\1|g") #" elif distro redhat-release ; then # FIXME if need # actually in the original RHEL: Red Hat Enterprise Linux .. release N DISTRIB_ID="RHEL" if has CentOS ; then DISTRIB_ID="CentOS" elif has Scientific ; then DISTRIB_ID="Scientific" elif has GosLinux ; then DISTRIB_ID="GosLinux" fi if has Beryllium ; then DISTRIB_ID="Scientific" DISTRIB_RELEASE="4.1" elif has "release 4" ; then DISTRIB_RELEASE="4" elif has "release 5" ; then DISTRIB_RELEASE="5" elif has "release 6" ; then DISTRIB_RELEASE="6" elif has "release 7" ; then DISTRIB_RELEASE="7" elif has "release 8" ; then DISTRIB_RELEASE="8" fi # SUSE based elif distro SuSe-release || distro SuSE-release ; then DISTRIB_ID="SUSE" DISTRIB_RELEASE=$(cat "$DISTROFILE" | grep "VERSION" | sed -e "s|^VERSION = ||g") if has "SUSE Linux Enterprise Desktop" ; then DISTRIB_ID="SLED" elif has "SUSE Linux Enterprise Server" ; then DISTRIB_ID="SLES" fi # https://www.freedesktop.org/software/systemd/man/os-release.html elif distro os-release ; then # shellcheck disable=SC1090 . $ROOTDIR/etc/os-release DISTRIB_ID="$(firstupper "$ID")" DISTRIB_RELEASE="$VERSION_ID" [ -n "$DISTRIB_RELEASE" ] || DISTRIB_RELEASE="CUR" if [ "$ID" = "opensuse-leap" ] ; then DISTRIB_ID="SUSE" fi # fixme: can we detect by some file? elif [ "$(uname)" = "FreeBSD" ] ; then DISTRIB_ID="FreeBSD" UNAME=$(uname -r) DISTRIB_RELEASE=$(echo "$UNAME" | grep RELEASE | sed -e "s|\([0-9]\.[0-9]\)-RELEASE|\1|g") # fixme: can we detect by some file? elif [ "$(uname)" = "SunOS" ] ; then DISTRIB_ID="SunOS" DISTRIB_RELEASE=$(uname -r) # fixme: can we detect by some file? elif [ "$(uname -s 2>/dev/null)" = "Darwin" ] ; then DISTRIB_ID="MacOS" DISTRIB_RELEASE=$(uname -r) # fixme: move to up elif [ "$(uname)" = "Linux" ] && hascommand guix ; then DISTRIB_ID="GNU/Linux/Guix" DISTRIB_RELEASE=$(uname -r) # fixme: move to up elif [ "$(uname)" = "Linux" ] && [ -x $ROOTDIR/system/bin/getprop ] ; then DISTRIB_ID="Android" DISTRIB_RELEASE=$(getprop | awk -F": " '/build.version.release/ { print $2 }' | tr -d '[]') elif [ "$(uname -o 2>/dev/null)" = "Cygwin" ] ; then DISTRIB_ID="Cygwin" DISTRIB_RELEASE="all" # try use standart LSB info by default elif distro lsb-release && [ -n "$DISTRIB_RELEASE" ]; then # use LSB # fix distro name case "$DISTRIB_ID" in "openSUSE Tumbleweed") DISTRIB_ID="SUSE" DISTRIB_RELEASE="Tumbleweed" ;; esac fi get_uname() { tolower $(uname $1) | tr -d " \t\r\n" } get_base_os_name() { local DIST_OS # Resolve the os DIST_OS="$(get_uname -s)" case "$DIST_OS" in 'sunos') DIST_OS="solaris" ;; 'hp-ux' | 'hp-ux64') DIST_OS="hpux" ;; 'darwin' | 'oarwin') DIST_OS="macosx" ;; 'unix_sv') DIST_OS="unixware" ;; 'freebsd' | 'openbsd' | 'netbsd') DIST_OS="freebsd" ;; esac echo "$DIST_OS" } get_arch() { local DIST_ARCH # Resolve the architecture DIST_ARCH="$(get_uname -m)" case "$DIST_ARCH" in 'ia32' | 'i386' | 'i486' | 'i586' | 'i686') DIST_ARCH="x86" ;; 'amd64' | 'x86_64') DIST_ARCH="x86_64" ;; 'ia64' | 'ia-64') DIST_ARCH="ia64" ;; 'ip27' | 'mips') DIST_ARCH="mips" ;; 'powermacintosh' | 'power' | 'powerpc' | 'power_pc' | 'ppc64') DIST_ARCH="ppc" ;; 'pa_risc' | 'pa-risc') DIST_ARCH="parisc" ;; 'sun4u' | 'sparcv9') DIST_ARCH="sparc" ;; '9000/800') DIST_ARCH="parisc" ;; armv*) if [ -z "$(readelf -A /proc/self/exe | grep Tag_ABI_VFP_args)" ] ; then DIST_ARCH="armel" else DIST_ARCH="armhf" fi ;; esac echo "$DIST_ARCH" } get_bit_size() { local DIST_BIT # Check if we are running on 64bit platform, seems like a workaround for now... DIST_BIT="$(get_uname -m)" case "$DIST_BIT" in 'amd64' | 'ia64' | 'x86_64' | 'ppc64') DIST_BIT="64" ;; 'aarch64') DIST_BIT="64" ;; 'e2k') DIST_BIT="64" ;; # 'pa_risc' | 'pa-risc') # Are some of these 64bit? Least not all... # BIT="64" # ;; 'sun4u' | 'sparcv9') # Are all sparcs 64? DIST_BIT="64" ;; # '9000/800') # DIST_BIT="64" # ;; *) # In any other case default to 32 DIST_BIT="32" ;; esac echo "$DIST_BIT" } # TODO: check before calc get_memory_size() { local detected=0 local DIST_OS="$(get_base_os_name)" case "$DIST_OS" in macosx) detected=$((`sysctl hw.memsize | sed s/"hw.memsize: "//`/1024/1024)) ;; freebsd) detected=$((`sysctl hw.physmem | sed s/"hw.physmem: "//`/1024/1024)) ;; linux) [ -r /proc/meminfo ] && detected=$((`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`/1024)) ;; esac # Exit codes only support values between 0 and 255. So use stdout. echo $detected } print_name_version() { [ -n "$DISTRIB_RELEASE" ] && echo $DISTRIB_ID/$DISTRIB_RELEASE || echo $DISTRIB_ID } get_virt() { local VIRT local SDCMD SDCMD=$(which systemd-detect-virt 2>/dev/null) if [ -n "$SDCMD" ] ; then VIRT="$($SDCMD)" [ "$VIRT" = "none" ] && echo "(host system)" && return [ -z "$VIRT" ] && echo "(unknown)" && return echo "$VIRT" && return fi if [ -r /proc/user_beancounters ] ; then echo "openvz" && return fi echo "(unknown)" # TODO: check for openvz } # https://unix.stackexchange.com/questions/196166/how-to-find-out-if-a-system-uses-sysv-upstart-or-systemd-initsystem get_service_manager() { [ -d /run/systemd/system ] && echo "systemd" && return [ -d /usr/share/upstart ] && echo "upstart" && return [ -d /etc/init.d ] && echo "sysvinit" && return echo "(unknown)" } print_total_info() { cat <<EOF distro_info total information (run with -h to get help): Distro name and version (-e): $(print_name_version) Packaging system (-p): $(pkgtype) Running service manager (-y): $(get_service_manager) Virtualization (-i): $(get_virt) CPU Architecture (-a): $(get_arch) CPU norm register size (-b): $(get_bit_size) System memory size (MB) (-m): $(get_memory_size) Base OS name (-o): $(get_base_os_name) Build system distro name (-s): $(pkgvendor) Build system vendor name (-n): $(rpmvendor) EOF } case $1 in -h) echo "distro_info - distro name and version detection" echo "Usage: distro_info [options] [args]" echo "Options:" echo " -a - print hardware architecture" echo " -b - print size of arch bit (32/64)" echo " -d - print distro name" echo " -e - print full name of distro with version" echo " -i - print virtualization type" echo " -h - this help" echo " -m - print system memory size (in MB)" echo " -n [SystemName] - print vendor name (as _vendor macros in rpm)" echo " -o - print base OS name" echo " -p [SystemName] - print type of the packaging system" echo " -s [SystemName] - print name of distro for build system (like in the package release name)" ecgi " -y - print running service manager" echo " -v - print version of distro" echo " -V - print the utility version" echo "Run without args to print all information." exit 0 ;; -p) # override DISTRIB_ID test -n "$2" && DISTRIB_ID="$2" pkgtype exit 0 ;; -d) echo $DISTRIB_ID ;; -a) get_arch ;; -b) get_bit_size ;; -i) get_virt ;; -m) get_memory_size ;; -o) get_base_os_name ;; -v) echo $DISTRIB_RELEASE ;; -s) # override DISTRIB_ID test -n "$2" && DISTRIB_ID="$2" pkgvendor exit 0 ;; -n) # override DISTRIB_ID test -n "$2" && DISTRIB_ID="$2" rpmvendor exit 0 ;; -y) get_service_manager ;; -V) echo "20191121" exit 0 ;; -e) print_name_version ;; *) print_total_info ;; esac