blob: a29ad3b2e2a92f6251f29bbb30f63edb6d928ccb [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
kate.ward300c36b2009-04-25 12:19:31 +000034versions_osRelease()
kate.ward2f3cad92008-10-21 23:29:23 +000035{
kate.ward300c36b2009-04-25 12:19:31 +000036 os_str_='unrecognized'
kate.ward2f3cad92008-10-21 23:29:23 +000037 os_system_=`uname -s`
38 os_release_=`uname -r`
39 case ${os_system_} in
kate.ward300c36b2009-04-25 12:19:31 +000040 Cygwin) os_str_='unknown' ;;
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 ;;
52 Linux)
53 if [ -r '/etc/lsb-release' ]; then
kate.ward300c36b2009-04-25 12:19:31 +000054 os_str_=`. /etc/lsb-release && \
kate.wardbbbce1e2008-11-15 20:24:03 +000055 echo "${DISTRIB_ID:-}-${DISTRIB_RELEASE:-}"`
56 fi
kate.ward300c36b2009-04-25 12:19:31 +000057 if [ "${os_release_}" = '-' ]; then
58 os_str_=''
kate.wardbbbce1e2008-11-15 20:24:03 +000059 if [ -r '/etc/redhat-release' ]; then
kate.ward300c36b2009-04-25 12:19:31 +000060 os_str_=`cat /etc/redhat-release`
kate.wardbbbce1e2008-11-15 20:24:03 +000061 fi
kate.ward2f3cad92008-10-21 23:29:23 +000062 fi
63 ;;
kate.ward300c36b2009-04-25 12:19:31 +000064 SunOS)
65 os_version_=`versions_osVersion`
66
67 os_str_=`echo ${os_release_} |sed 's/[0-9]*\.\([0-9]*\)/\1/'`
68 os_str_="${os_release_}-${os_version_}"
69 ;;
kate.ward2f3cad92008-10-21 23:29:23 +000070 esac
kate.ward300c36b2009-04-25 12:19:31 +000071 echo ${os_str_}
72 unset os_name_ os_release_ os_str_ os_version_ major_ minor_ sub_
73}
74
75versions_osVersion()
76{
77 uname -v
kate.ward2f3cad92008-10-21 23:29:23 +000078}
79
80versions_shellVersion()
81{
82 shell_=$1
83
84 if [ ! -x "${shell_}" ]; then
85 echo 'not installed'
86 return
87 fi
88
kate.ward2764e4c2008-11-15 20:15:28 +000089 version_=''
kate.ward2f3cad92008-10-21 23:29:23 +000090 case ${shell_} in
kate.ward713fd9e2008-10-21 23:44:21 +000091 */sh)
92 # TODO(kward): fix this
93 ## this could be one of any number of shells. try until one fits.
94 #version_=`versions_shell_bash ${shell_}`
95 ## dash cannot be self determined yet
96 #[ -z "${version_}" ] && version_=`versions_shell_ksh ${shell_}`
97 ## pdksh is covered in versions_shell_ksh()
98 #[ -z "${version_}" ] && version_=`versions_shell_zsh ${shell_}`
kate.ward2f3cad92008-10-21 23:29:23 +000099 ;;
100 */bash) version_=`versions_shell_bash ${shell_}` ;;
101 */dash)
102 # simply assuming Ubuntu Linux until somebody comes up with a better
103 # test. the following test will return an empty string if dash is not
104 # installed.
105 version_=`versions_shell_dash`
106 ;;
107 */ksh) version_=`versions_shell_ksh ${shell_}` ;;
108 */pdksh) version_=`versions_shell_pdksh ${shell_}` ;;
109 */zsh) version_=`versions_shell_zsh ${shell_}` ;;
110 *) version_='invalid'
111 esac
kate.ward713fd9e2008-10-21 23:44:21 +0000112
kate.ward2764e4c2008-11-15 20:15:28 +0000113 echo ${version_:-unknown}
kate.ward2f3cad92008-10-21 23:29:23 +0000114 unset shell_ version_
115}
116
117versions_shell_bash()
118{
119 $1 --version 2>&1 |grep 'GNU bash' |sed 's/.*version \([^ ]*\).*/\1/'
120}
121
122versions_shell_dash()
123{
124 dpkg -l |grep ' dash ' |awk '{print $3}'
125}
126
127versions_shell_ksh()
128{
129 versions_shell_=$1
130
131 versions_version_=`strings ${versions_shell_} 2>&1 \
132 |grep Version \
133 |sed 's/^.*Version \(.*\)$/\1/;s/ s+ \$$//;s/ /-/g'`
134 [ -z "${versions_version_}" ] \
135 && versions_version_=`versions_shell_pdksh ${versions_shell_}`
136 echo ${versions_version_}
137
138 unset versions_shell_ versions_version_
139}
140
141versions_shell_pdksh()
142{
143 strings $1 2>&1 \
144 |grep 'PD KSH' \
145 |sed -e 's/.*PD KSH \(.*\)/\1/;s/ /-/g'
146}
147
148versions_shell_zsh()
149{
150 echo 'echo ${ZSH_VERSION}' |$1
151}
152
153#------------------------------------------------------------------------------
154# main
155#
156
157versions_main()
158{
159 # treat unset variables as an error
160 set -u
161
162 os_name=`versions_osName`
163 os_version=`versions_osVersion`
164 echo "os: ${os_name} version: ${os_version}"
165
kate.ward2f3cad92008-10-21 23:29:23 +0000166 for shell in ${VERSIONS_SHELLS}; do
167 shell_version=`versions_shellVersion ${shell}`
168 echo "shell: ${shell} version: ${shell_version}"
169 done
170}
171
172if [ "`basename $0`" = 'versions' ]; then
173 versions_main "$@"
174fi