blob: b81803425a58bd2c0488a21d29f6570300332860 [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.ward713fd9e2008-10-21 23:44:21 +000014VERSIONS_SHELLS='/bin/bash /bin/dash /bin/ksh /bin/pdksh /bin/sh /bin/zsh'
kate.ward2f3cad92008-10-21 23:29:23 +000015
16#------------------------------------------------------------------------------
17# functions
18#
19
20versions_osName()
21{
22 os_name_='unrecognized'
23 os_system_=`uname -s`
24 case ${os_system_} in
kate.ward93203d92010-03-28 23:11:33 +000025 Cygwin|FreeBSD|Linux) os_name_=${os_system_} ;;
kate.ward2f3cad92008-10-21 23:29:23 +000026 Darwin) os_name_='Mac OS X' ;;
kate.ward2f3cad92008-10-21 23:29:23 +000027 SunOS) os_name_='Solaris' ;;
28 esac
29 echo ${os_name_}
30 unset os_name_ os_system_
31}
32
kate.ward300c36b2009-04-25 12:19:31 +000033versions_osRelease()
kate.ward2f3cad92008-10-21 23:29:23 +000034{
kate.ward300c36b2009-04-25 12:19:31 +000035 os_str_='unrecognized'
kate.ward2f3cad92008-10-21 23:29:23 +000036 os_system_=`uname -s`
37 os_release_=`uname -r`
38 case ${os_system_} in
kate.ward300c36b2009-04-25 12:19:31 +000039 Cygwin) os_str_='unknown' ;;
kate.ward93203d92010-03-28 23:11:33 +000040
kate.ward2f3cad92008-10-21 23:29:23 +000041 Darwin)
42 major_='10'
43 sub_=`echo ${os_release_} |\
44 sed 's/^[0-9]*\.\([0-9]*\)\.[0-9]*$/\1/'`
45 case ${os_release_} in
46 8.*) minor_='4' ;;
47 9.*) minor_='5' ;;
48 *) minor_='X'; sub_='X' ;;
49 esac
kate.ward300c36b2009-04-25 12:19:31 +000050 os_str_="${major_}.${minor_}.${sub_}"
kate.ward2f3cad92008-10-21 23:29:23 +000051 ;;
kate.ward93203d92010-03-28 23:11:33 +000052
53 FreeBSD)
54 os_str_=`echo "${os_release_}" \
55 |sed 's/\([0-9]\.[0-9]\)-RELEASE-.*/\1/'`
56 ;;
57
kate.ward2f3cad92008-10-21 23:29:23 +000058 Linux)
59 if [ -r '/etc/lsb-release' ]; then
kate.ward300c36b2009-04-25 12:19:31 +000060 os_str_=`. /etc/lsb-release && \
kate.ward93203d92010-03-28 23:11:33 +000061 echo "${DISTRIB_ID:-}${DISTRIB_RELEASE:+-${DISTRIB_RELEASE}}"`
kate.wardbbbce1e2008-11-15 20:24:03 +000062 fi
kate.ward300c36b2009-04-25 12:19:31 +000063 if [ "${os_release_}" = '-' ]; then
64 os_str_=''
kate.wardbbbce1e2008-11-15 20:24:03 +000065 if [ -r '/etc/redhat-release' ]; then
kate.ward300c36b2009-04-25 12:19:31 +000066 os_str_=`cat /etc/redhat-release`
kate.wardbbbce1e2008-11-15 20:24:03 +000067 fi
kate.ward2f3cad92008-10-21 23:29:23 +000068 fi
69 ;;
kate.ward300c36b2009-04-25 12:19:31 +000070
kate.ward93203d92010-03-28 23:11:33 +000071 SunOS)
72 case ${os_release_} in
73 5.8) os_str_='8' ;;
74 5.9) os_str_='9' ;;
75 5.10) os_str_='10' ;;
76 esac
kate.ward300c36b2009-04-25 12:19:31 +000077 ;;
kate.ward2f3cad92008-10-21 23:29:23 +000078 esac
kate.ward93203d92010-03-28 23:11:33 +000079
kate.ward300c36b2009-04-25 12:19:31 +000080 echo ${os_str_}
81 unset os_name_ os_release_ os_str_ os_version_ major_ minor_ sub_
82}
83
84versions_osVersion()
85{
86 uname -v
kate.ward2f3cad92008-10-21 23:29:23 +000087}
88
89versions_shellVersion()
90{
91 shell_=$1
92
93 if [ ! -x "${shell_}" ]; then
94 echo 'not installed'
95 return
96 fi
97
kate.ward2764e4c2008-11-15 20:15:28 +000098 version_=''
kate.ward2f3cad92008-10-21 23:29:23 +000099 case ${shell_} in
kate.ward713fd9e2008-10-21 23:44:21 +0000100 */sh)
101 # TODO(kward): fix this
102 ## this could be one of any number of shells. try until one fits.
103 #version_=`versions_shell_bash ${shell_}`
104 ## dash cannot be self determined yet
105 #[ -z "${version_}" ] && version_=`versions_shell_ksh ${shell_}`
106 ## pdksh is covered in versions_shell_ksh()
107 #[ -z "${version_}" ] && version_=`versions_shell_zsh ${shell_}`
kate.ward2f3cad92008-10-21 23:29:23 +0000108 ;;
109 */bash) version_=`versions_shell_bash ${shell_}` ;;
110 */dash)
111 # simply assuming Ubuntu Linux until somebody comes up with a better
112 # test. the following test will return an empty string if dash is not
113 # installed.
114 version_=`versions_shell_dash`
115 ;;
116 */ksh) version_=`versions_shell_ksh ${shell_}` ;;
117 */pdksh) version_=`versions_shell_pdksh ${shell_}` ;;
118 */zsh) version_=`versions_shell_zsh ${shell_}` ;;
119 *) version_='invalid'
120 esac
kate.ward713fd9e2008-10-21 23:44:21 +0000121
kate.ward2764e4c2008-11-15 20:15:28 +0000122 echo ${version_:-unknown}
kate.ward2f3cad92008-10-21 23:29:23 +0000123 unset shell_ version_
124}
125
126versions_shell_bash()
127{
128 $1 --version 2>&1 |grep 'GNU bash' |sed 's/.*version \([^ ]*\).*/\1/'
129}
130
131versions_shell_dash()
132{
133 dpkg -l |grep ' dash ' |awk '{print $3}'
134}
135
136versions_shell_ksh()
137{
138 versions_shell_=$1
139
140 versions_version_=`strings ${versions_shell_} 2>&1 \
141 |grep Version \
142 |sed 's/^.*Version \(.*\)$/\1/;s/ s+ \$$//;s/ /-/g'`
143 [ -z "${versions_version_}" ] \
144 && versions_version_=`versions_shell_pdksh ${versions_shell_}`
145 echo ${versions_version_}
146
147 unset versions_shell_ versions_version_
148}
149
150versions_shell_pdksh()
151{
152 strings $1 2>&1 \
153 |grep 'PD KSH' \
154 |sed -e 's/.*PD KSH \(.*\)/\1/;s/ /-/g'
155}
156
157versions_shell_zsh()
158{
159 echo 'echo ${ZSH_VERSION}' |$1
160}
161
162#------------------------------------------------------------------------------
163# main
164#
165
166versions_main()
167{
168 # treat unset variables as an error
169 set -u
170
kate.ward93203d92010-03-28 23:11:33 +0000171 echo "os name: `versions_osName`"
172 echo "os release: `versions_osRelease`"
173 echo "os version: `versions_osVersion`"
kate.ward2f3cad92008-10-21 23:29:23 +0000174
kate.ward2f3cad92008-10-21 23:29:23 +0000175 for shell in ${VERSIONS_SHELLS}; do
176 shell_version=`versions_shellVersion ${shell}`
177 echo "shell: ${shell} version: ${shell_version}"
178 done
179}
180
kate.ward93203d92010-03-28 23:11:33 +0000181VERSIONS_OS_NAME=`versions_osName`
182VERSIONS_OS_RELEASE=`versions_osRelease`
183
kate.ward2f3cad92008-10-21 23:29:23 +0000184if [ "`basename $0`" = 'versions' ]; then
185 versions_main "$@"
186fi