versions revision 4b66ecdc0d3f6b89d3132b75f5aca1773a29a1a3
1#! /bin/sh 2# $Id$ 3# vim:et:ft=sh:sts=2:sw=2 4# 5# Copyright 2008 Kate Ward. All Rights Reserved. 6# Released under the LGPL (GNU Lesser General Public License) 7# 8# Author: kate.ward@forestent.com (Kate Ward) 9# 10# This library provides reusable functions that determine actual names and 11# versions of installed shells and the OS. The library can also be run as a 12# script if set execuatable. 13 14ARGV0=`basename "$0"` 15LSB_RELEASE='/etc/lsb-release' 16VERSIONS_SHELLS="/bin/bash /bin/dash /bin/ksh /bin/pdksh /bin/sh /bin/zsh" 17 18TRUE=0 19FALSE=1 20ERROR=2 21 22UNAME_R=`uname -r` 23UNAME_S=`uname -s` 24 25__versions_haveStrings=${ERROR} 26 27#------------------------------------------------------------------------------ 28# functions 29# 30 31versions_osName() 32{ 33 os_name_='unrecognized' 34 os_system_=${UNAME_S} 35 case ${os_system_} in 36 CYGWIN_NT-*) os_name_='Cygwin' ;; 37 Darwin) os_name_='Mac OS X' ;; 38 FreeBSD) os_name_='FreeBSD' ;; 39 Linux) os_name_='Linux' ;; 40 SunOS) 41 if grep 'OpenSolaris' /etc/release >/dev/null; then 42 os_name_='OpenSolaris' 43 else 44 os_name_='Solaris' 45 fi 46 ;; 47 esac 48 49 echo ${os_name_} 50 unset os_name_ os_system_ 51} 52 53versions_osVersion() 54{ 55 os_version_='unrecognized' 56 os_system_=${UNAME_S} 57 os_release_=${UNAME_R} 58 case ${os_system_} in 59 CYGWIN_NT-*) 60 os_version_=`expr "${os_release_}" : '\([0-9]*\.[0-9]\.[0-9]*\).*'` 61 ;; 62 Darwin) 63 major_='10' 64 sub_=`echo ${os_release_} |sed 's/^[0-9]*\.\([0-9]*\)\.[0-9]*$/\1/'` 65 case ${os_release_} in 66 8.*) minor_='4' ;; 67 9.*) minor_='5' ;; 68 10.*) minor_='6' ;; 69 11.*) minor_='7' ;; 70 12.*) minor_='8' ;; 71 *) minor_='X'; sub_='X' ;; 72 esac 73 os_version_="${major_}.${minor_}.${sub_}" 74 ;; 75 FreeBSD) 76 os_version_=`expr "${os_release_}" : '\([0-9]*\.[0-9]*\)-.*'` 77 ;; 78 Linux) 79 if [ -r "${LSB_RELEASE}" ]; then 80 if grep -q 'DISTRIB_ID=Ubuntu' "${LSB_RELEASE}"; then 81 os_version_=`cat "${LSB_RELEASE}" \ 82 |awk -F= '$1~/DISTRIB_DESCRIPTION/{print $2}' \ 83 |sed 's/"//g;s/ /-/g'` 84 fi 85 elif [ -r '/etc/redhat-release' ]; then 86 os_version_=`cat /etc/redhat-release` 87 fi 88 ;; 89 SunOS) 90 if grep 'OpenSolaris' /etc/release >/dev/null; then 91 os_version_=`grep 'OpenSolaris' /etc/release |awk '{print $2"("$3")"}'` 92 else 93 major_=`echo ${os_release_} |sed 's/[0-9]*\.\([0-9]*\)/\1/'` 94 minor_=`grep Solaris /etc/release |sed 's/[^u]*\(u[0-9]*\).*/\1/'` 95 os_version_="${major_}${minor_}" 96 fi 97 ;; 98 esac 99 100 echo ${os_version_} 101 unset os_name_ os_release_ os_version_ major_ minor_ sub_ 102} 103 104versions_shellVersion() 105{ 106 shell_=$1 107 108 if [ ! -x "${shell_}" ]; then 109 echo 'not installed' 110 return 111 fi 112 113 version_='' 114 case ${shell_} in 115 */sh) 116 # TODO(kward): fix this 117 ## this could be one of any number of shells. try until one fits. 118 #version_=`versions_shell_bash ${shell_}` 119 ## dash cannot be self determined yet 120 #[ -z "${version_}" ] && version_=`versions_shell_ksh ${shell_}` 121 ## pdksh is covered in versions_shell_ksh() 122 #[ -z "${version_}" ] && version_=`versions_shell_zsh ${shell_}` 123 ;; 124 */bash) version_=`versions_shell_bash ${shell_}` ;; 125 */dash) 126 # simply assuming Ubuntu Linux until somebody comes up with a better 127 # test. the following test will return an empty string if dash is not 128 # installed. 129 version_=`versions_shell_dash` 130 ;; 131 */ksh) version_=`versions_shell_ksh ${shell_}` ;; 132 */pdksh) version_=`versions_shell_pdksh ${shell_}` ;; 133 */zsh) version_=`versions_shell_zsh ${shell_}` ;; 134 *) version_='invalid' 135 esac 136 137 echo ${version_:-unknown} 138 unset shell_ version_ 139} 140 141versions_shell_bash() 142{ 143 $1 --version 2>&1 |grep 'GNU bash' |sed 's/.*version \([^ ]*\).*/\1/' 144} 145 146versions_shell_dash() 147{ 148 eval dpkg >/dev/null 2>&1 149 [ $? -eq 127 ] && return # return if dpkg not found 150 151 dpkg -l |grep ' dash ' |awk '{print $3}' 152} 153 154versions_shell_ksh() 155{ 156 versions_shell_=$1 157 158 # try a few different ways to figure out the version 159 versions_version_=`${versions_shell_} --version : 2>&1` 160 if [ $? -eq 0 ]; then 161 versions_version_=`echo "${versions_version_}" \ 162 |sed 's/.*\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\).*/\1/'` 163 else 164 versions_version_='' 165 fi 166 167 if [ -z "${versions_version_}" ]; then 168 _versions_have_strings 169 versions_version_=`strings ${versions_shell_} 2>&1 \ 170 |grep Version \ 171 |sed 's/^.*Version \(.*\)$/\1/;s/ s+ \$$//;s/ /-/g'` 172 fi 173 174 if [ -z "${versions_version_}" ]; then 175 versions_version_=`versions_shell_pdksh ${versions_shell_}` 176 fi 177 178 echo ${versions_version_} 179 unset versions_shell_ versions_version_ 180} 181 182versions_shell_pdksh() 183{ 184 _versions_have_strings 185 strings $1 2>&1 \ 186 |grep 'PD KSH' \ 187 |sed -e 's/.*PD KSH \(.*\)/\1/;s/ /-/g' 188} 189 190versions_shell_zsh() 191{ 192 versions_shell_=$1 193 194 # try a few different ways to figure out the version 195 versions_version_=`echo 'echo ${ZSH_VERSION}' |${versions_shell_}` 196 197 if [ -z "${versions_version_}" ]; then 198 versions_version_=`${versions_shell_} --version 2>&1 |awk '{print $2}'` 199 fi 200 201 echo ${versions_version_} 202 unset versions_shell_ versions_version_ 203} 204 205# Determine if the 'strings' binary installed. 206_versions_have_strings() 207{ 208 [ ${__versions_haveStrings} -ne ${ERROR} ] && return 209 eval strings /dev/null >/dev/null 2>&1 210 if [ $? -eq 0 ]; then 211 __versions_haveStrings=${TRUE} 212 else 213 echo 'WARN: strings not installed. try installing binutils?' >&2 214 __versions_haveStrings=${FALSE} 215 fi 216} 217 218#------------------------------------------------------------------------------ 219# main 220# 221 222versions_main() 223{ 224 # treat unset variables as an error 225 set -u 226 227 os_name=`versions_osName` 228 os_version=`versions_osVersion` 229 echo "os: ${os_name} version: ${os_version}" 230 231 for shell in ${VERSIONS_SHELLS}; do 232 shell_version=`versions_shellVersion ${shell}` 233 echo "shell: ${shell} version: ${shell_version}" 234 done 235} 236 237if [ "${ARGV0}" = 'versions' ]; then 238 versions_main "$@" 239fi 240