blob: 1acbf88659b66a061566195eea80e5010be76c7a [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
25 Cygwin) os_name_='Cygwin' ;;
26 Darwin) os_name_='Mac OS X' ;;
27 Linux) os_name_='Linux' ;;
28 SunOS) os_name_='Solaris' ;;
29 esac
30 echo ${os_name_}
31 unset os_name_ os_system_
32}
33
34versions_osVersion()
35{
36 os_version_='unrecognized'
37 os_system_=`uname -s`
38 os_release_=`uname -r`
39 case ${os_system_} in
40 Cygwin) os_version_='unknown' ;;
41 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
50 os_version_="${major_}.${minor_}.${sub_}"
51 ;;
52 Linux)
53 if [ -r '/etc/lsb-release' ]; then
kate.ward44d7cf82008-11-14 00:56:32 +000054 os_version_=`. /etc/lsb-release \
kate.ward2f3cad92008-10-21 23:29:23 +000055 && echo "${DISTRIB_ID}-${DISTRIB_RELEASE}"`
56 fi
57 ;;
58 SunOS) os_version_=`echo ${os_release_} |sed 's/[0-9]*\.\([0-9]*\)/\1/'` ;;
59 esac
60 echo ${os_version_}
61 unset os_name_ os_release_ os_version_ major_ minor_ sub_
62}
63
64versions_shellVersion()
65{
66 shell_=$1
67
68 if [ ! -x "${shell_}" ]; then
69 echo 'not installed'
70 return
71 fi
72
kate.ward2764e4c2008-11-15 20:15:28 +000073 version_=''
kate.ward2f3cad92008-10-21 23:29:23 +000074 case ${shell_} in
kate.ward713fd9e2008-10-21 23:44:21 +000075 */sh)
76 # TODO(kward): fix this
77 ## this could be one of any number of shells. try until one fits.
78 #version_=`versions_shell_bash ${shell_}`
79 ## dash cannot be self determined yet
80 #[ -z "${version_}" ] && version_=`versions_shell_ksh ${shell_}`
81 ## pdksh is covered in versions_shell_ksh()
82 #[ -z "${version_}" ] && version_=`versions_shell_zsh ${shell_}`
kate.ward2f3cad92008-10-21 23:29:23 +000083 ;;
84 */bash) version_=`versions_shell_bash ${shell_}` ;;
85 */dash)
86 # simply assuming Ubuntu Linux until somebody comes up with a better
87 # test. the following test will return an empty string if dash is not
88 # installed.
89 version_=`versions_shell_dash`
90 ;;
91 */ksh) version_=`versions_shell_ksh ${shell_}` ;;
92 */pdksh) version_=`versions_shell_pdksh ${shell_}` ;;
93 */zsh) version_=`versions_shell_zsh ${shell_}` ;;
94 *) version_='invalid'
95 esac
kate.ward713fd9e2008-10-21 23:44:21 +000096
kate.ward2764e4c2008-11-15 20:15:28 +000097 echo ${version_:-unknown}
kate.ward2f3cad92008-10-21 23:29:23 +000098 unset shell_ version_
99}
100
101versions_shell_bash()
102{
103 $1 --version 2>&1 |grep 'GNU bash' |sed 's/.*version \([^ ]*\).*/\1/'
104}
105
106versions_shell_dash()
107{
108 dpkg -l |grep ' dash ' |awk '{print $3}'
109}
110
111versions_shell_ksh()
112{
113 versions_shell_=$1
114
115 versions_version_=`strings ${versions_shell_} 2>&1 \
116 |grep Version \
117 |sed 's/^.*Version \(.*\)$/\1/;s/ s+ \$$//;s/ /-/g'`
118 [ -z "${versions_version_}" ] \
119 && versions_version_=`versions_shell_pdksh ${versions_shell_}`
120 echo ${versions_version_}
121
122 unset versions_shell_ versions_version_
123}
124
125versions_shell_pdksh()
126{
127 strings $1 2>&1 \
128 |grep 'PD KSH' \
129 |sed -e 's/.*PD KSH \(.*\)/\1/;s/ /-/g'
130}
131
132versions_shell_zsh()
133{
134 echo 'echo ${ZSH_VERSION}' |$1
135}
136
137#------------------------------------------------------------------------------
138# main
139#
140
141versions_main()
142{
143 # treat unset variables as an error
144 set -u
145
146 os_name=`versions_osName`
147 os_version=`versions_osVersion`
148 echo "os: ${os_name} version: ${os_version}"
149
kate.ward2f3cad92008-10-21 23:29:23 +0000150 for shell in ${VERSIONS_SHELLS}; do
151 shell_version=`versions_shellVersion ${shell}`
152 echo "shell: ${shell} version: ${shell_version}"
153 done
154}
155
156if [ "`basename $0`" = 'versions' ]; then
157 versions_main "$@"
158fi