blob: 94326c9b1a93a94cfa63de73c53bf522509cd57c [file] [log] [blame]
kate.ward2f3cad92008-10-21 23:29:23 +00001#! /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
kate.warde7ed70c2011-06-10 11:45:17 +000014ARGV0=`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
kate.ward65d38c32013-01-05 12:37:57 +000022UNAME_R=`uname -r`
23UNAME_S=`uname -s`
24
kate.warde7ed70c2011-06-10 11:45:17 +000025__versions_haveStrings=${ERROR}
kate.ward2f3cad92008-10-21 23:29:23 +000026
27#------------------------------------------------------------------------------
28# functions
29#
30
31versions_osName()
32{
33 os_name_='unrecognized'
kate.ward65d38c32013-01-05 12:37:57 +000034 os_system_=${UNAME_S}
kate.ward2f3cad92008-10-21 23:29:23 +000035 case ${os_system_} in
kate.warde7ed70c2011-06-10 11:45:17 +000036 CYGWIN_NT-*) os_name_='Cygwin' ;;
kate.ward2f3cad92008-10-21 23:29:23 +000037 Darwin) os_name_='Mac OS X' ;;
kate.warde7ed70c2011-06-10 11:45:17 +000038 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 ;;
kate.ward2f3cad92008-10-21 23:29:23 +000047 esac
kate.warde10dd532013-01-04 21:52:23 +000048
kate.ward2f3cad92008-10-21 23:29:23 +000049 echo ${os_name_}
50 unset os_name_ os_system_
51}
52
kate.warde7ed70c2011-06-10 11:45:17 +000053versions_osVersion()
kate.ward2f3cad92008-10-21 23:29:23 +000054{
kate.warde7ed70c2011-06-10 11:45:17 +000055 os_version_='unrecognized'
kate.ward65d38c32013-01-05 12:37:57 +000056 os_system_=${UNAME_S}
57 os_release_=${UNAME_R}
kate.ward2f3cad92008-10-21 23:29:23 +000058 case ${os_system_} in
kate.warde7ed70c2011-06-10 11:45:17 +000059 CYGWIN_NT-*)
60 os_version_=`expr "${os_release_}" : '\([0-9]*\.[0-9]\.[0-9]*\).*'`
61 ;;
kate.ward2f3cad92008-10-21 23:29:23 +000062 Darwin)
63 major_='10'
kate.warde7ed70c2011-06-10 11:45:17 +000064 sub_=`echo ${os_release_} |sed 's/^[0-9]*\.\([0-9]*\)\.[0-9]*$/\1/'`
kate.ward2f3cad92008-10-21 23:29:23 +000065 case ${os_release_} in
66 8.*) minor_='4' ;;
67 9.*) minor_='5' ;;
kate.warde7ed70c2011-06-10 11:45:17 +000068 10.*) minor_='6' ;;
kate.ward65d38c32013-01-05 12:37:57 +000069 11.*) minor_='7' ;;
70 12.*) minor_='8' ;;
kate.ward2f3cad92008-10-21 23:29:23 +000071 *) minor_='X'; sub_='X' ;;
72 esac
kate.warde7ed70c2011-06-10 11:45:17 +000073 os_version_="${major_}.${minor_}.${sub_}"
kate.ward2f3cad92008-10-21 23:29:23 +000074 ;;
kate.ward93203d92010-03-28 23:11:33 +000075 FreeBSD)
kate.warde7ed70c2011-06-10 11:45:17 +000076 os_version_=`expr "${os_release_}" : '\([0-9]*\.[0-9]*\)-.*'`
kate.ward93203d92010-03-28 23:11:33 +000077 ;;
kate.ward2f3cad92008-10-21 23:29:23 +000078 Linux)
kate.warde7ed70c2011-06-10 11:45:17 +000079 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'`
kate.wardbbbce1e2008-11-15 20:24:03 +000084 fi
kate.warde7ed70c2011-06-10 11:45:17 +000085 elif [ -r '/etc/redhat-release' ]; then
86 os_version_=`cat /etc/redhat-release`
kate.ward2f3cad92008-10-21 23:29:23 +000087 fi
88 ;;
kate.ward93203d92010-03-28 23:11:33 +000089 SunOS)
kate.warde7ed70c2011-06-10 11:45:17 +000090 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
kate.ward300c36b2009-04-25 12:19:31 +000097 ;;
kate.ward2f3cad92008-10-21 23:29:23 +000098 esac
kate.warde10dd532013-01-04 21:52:23 +000099
kate.warde7ed70c2011-06-10 11:45:17 +0000100 echo ${os_version_}
101 unset os_name_ os_release_ os_version_ major_ minor_ sub_
kate.ward2f3cad92008-10-21 23:29:23 +0000102}
103
104versions_shellVersion()
105{
106 shell_=$1
107
108 if [ ! -x "${shell_}" ]; then
109 echo 'not installed'
110 return
111 fi
112
kate.ward2764e4c2008-11-15 20:15:28 +0000113 version_=''
kate.ward2f3cad92008-10-21 23:29:23 +0000114 case ${shell_} in
kate.ward713fd9e2008-10-21 23:44:21 +0000115 */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_}`
kate.ward2f3cad92008-10-21 23:29:23 +0000123 ;;
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
kate.ward713fd9e2008-10-21 23:44:21 +0000136
kate.ward2764e4c2008-11-15 20:15:28 +0000137 echo ${version_:-unknown}
kate.ward2f3cad92008-10-21 23:29:23 +0000138 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{
kate.warde7ed70c2011-06-10 11:45:17 +0000148 eval dpkg >/dev/null 2>&1
149 [ $? -eq 127 ] && return # return if dpkg not found
150
kate.ward2f3cad92008-10-21 23:29:23 +0000151 dpkg -l |grep ' dash ' |awk '{print $3}'
152}
153
154versions_shell_ksh()
155{
156 versions_shell_=$1
157
kate.warde10dd532013-01-04 21:52:23 +0000158 # try a few different ways to figure out the version
159 versions_version_=`${versions_shell_} --version : 2>&1 \
kate.warde7ed70c2011-06-10 11:45:17 +0000160 |sed 's/.*\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\).*/\1/'`
161
kate.warde10dd532013-01-04 21:52:23 +0000162 if [ -z "${versions_version_}" ]; then
kate.warde7ed70c2011-06-10 11:45:17 +0000163 _versions_have_strings
164 versions_version_=`strings ${versions_shell_} 2>&1 \
kate.ward2f3cad92008-10-21 23:29:23 +0000165 |grep Version \
166 |sed 's/^.*Version \(.*\)$/\1/;s/ s+ \$$//;s/ /-/g'`
kate.warde10dd532013-01-04 21:52:23 +0000167 fi
168
169 if [ -z "${versions_version_}" ]; then
170 versions_version_=`versions_shell_pdksh ${versions_shell_}`
kate.warde7ed70c2011-06-10 11:45:17 +0000171 fi
172
kate.ward2f3cad92008-10-21 23:29:23 +0000173 echo ${versions_version_}
kate.ward2f3cad92008-10-21 23:29:23 +0000174 unset versions_shell_ versions_version_
175}
176
177versions_shell_pdksh()
178{
kate.warde7ed70c2011-06-10 11:45:17 +0000179 _versions_have_strings
kate.ward2f3cad92008-10-21 23:29:23 +0000180 strings $1 2>&1 \
181 |grep 'PD KSH' \
182 |sed -e 's/.*PD KSH \(.*\)/\1/;s/ /-/g'
183}
184
185versions_shell_zsh()
186{
kate.warde7ed70c2011-06-10 11:45:17 +0000187 versions_shell_=$1
188
kate.warde10dd532013-01-04 21:52:23 +0000189 # try a few different ways to figure out the version
190 versions_version_=`echo 'echo ${ZSH_VERSION}' |${versions_shell_}`
kate.warde7ed70c2011-06-10 11:45:17 +0000191
kate.warde10dd532013-01-04 21:52:23 +0000192 if [ -z "${versions_version_}" ]; then
193 versions_version_=`${versions_shell_} --version 2>&1 |awk '{print $2}'`
kate.warde7ed70c2011-06-10 11:45:17 +0000194 fi
195
196 echo ${versions_version_}
kate.warde7ed70c2011-06-10 11:45:17 +0000197 unset versions_shell_ versions_version_
198}
199
200# Determine if the 'strings' binary installed.
201_versions_have_strings()
202{
203 [ ${__versions_haveStrings} -ne ${ERROR} ] && return
204 eval strings /dev/null >/dev/null 2>&1
205 if [ $? -eq 0 ]; then
206 __versions_haveStrings=${TRUE}
207 else
208 echo 'WARN: strings not installed. try installing binutils?' >&2
209 __versions_haveStrings=${FALSE}
210 fi
kate.ward2f3cad92008-10-21 23:29:23 +0000211}
212
213#------------------------------------------------------------------------------
214# main
215#
216
217versions_main()
218{
219 # treat unset variables as an error
220 set -u
221
kate.warde7ed70c2011-06-10 11:45:17 +0000222 os_name=`versions_osName`
223 os_version=`versions_osVersion`
224 echo "os: ${os_name} version: ${os_version}"
kate.ward2f3cad92008-10-21 23:29:23 +0000225
kate.ward2f3cad92008-10-21 23:29:23 +0000226 for shell in ${VERSIONS_SHELLS}; do
227 shell_version=`versions_shellVersion ${shell}`
228 echo "shell: ${shell} version: ${shell_version}"
229 done
230}
231
kate.warde7ed70c2011-06-10 11:45:17 +0000232if [ "${ARGV0}" = 'versions' ]; then
kate.ward2f3cad92008-10-21 23:29:23 +0000233 versions_main "$@"
234fi