blob: 24757f156cefe6abb6179c3b80e6e2b67be7a089 [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.wardbbbce1e2008-11-15 20:24:03 +000054 os_version_=`. /etc/lsb-release && \
55 echo "${DISTRIB_ID:-}-${DISTRIB_RELEASE:-}"`
56 fi
57 if [ "${os_version_}" = '-' ]; then
58 os_version_=''
59 if [ -r '/etc/redhat-release' ]; then
60 os_version_=`cat /etc/redhat-release`
61 fi
kate.ward2f3cad92008-10-21 23:29:23 +000062 fi
63 ;;
64 SunOS) os_version_=`echo ${os_release_} |sed 's/[0-9]*\.\([0-9]*\)/\1/'` ;;
65 esac
66 echo ${os_version_}
67 unset os_name_ os_release_ os_version_ major_ minor_ sub_
68}
69
70versions_shellVersion()
71{
72 shell_=$1
73
74 if [ ! -x "${shell_}" ]; then
75 echo 'not installed'
76 return
77 fi
78
kate.ward2764e4c2008-11-15 20:15:28 +000079 version_=''
kate.ward2f3cad92008-10-21 23:29:23 +000080 case ${shell_} in
kate.ward713fd9e2008-10-21 23:44:21 +000081 */sh)
82 # TODO(kward): fix this
83 ## this could be one of any number of shells. try until one fits.
84 #version_=`versions_shell_bash ${shell_}`
85 ## dash cannot be self determined yet
86 #[ -z "${version_}" ] && version_=`versions_shell_ksh ${shell_}`
87 ## pdksh is covered in versions_shell_ksh()
88 #[ -z "${version_}" ] && version_=`versions_shell_zsh ${shell_}`
kate.ward2f3cad92008-10-21 23:29:23 +000089 ;;
90 */bash) version_=`versions_shell_bash ${shell_}` ;;
91 */dash)
92 # simply assuming Ubuntu Linux until somebody comes up with a better
93 # test. the following test will return an empty string if dash is not
94 # installed.
95 version_=`versions_shell_dash`
96 ;;
97 */ksh) version_=`versions_shell_ksh ${shell_}` ;;
98 */pdksh) version_=`versions_shell_pdksh ${shell_}` ;;
99 */zsh) version_=`versions_shell_zsh ${shell_}` ;;
100 *) version_='invalid'
101 esac
kate.ward713fd9e2008-10-21 23:44:21 +0000102
kate.ward2764e4c2008-11-15 20:15:28 +0000103 echo ${version_:-unknown}
kate.ward2f3cad92008-10-21 23:29:23 +0000104 unset shell_ version_
105}
106
107versions_shell_bash()
108{
109 $1 --version 2>&1 |grep 'GNU bash' |sed 's/.*version \([^ ]*\).*/\1/'
110}
111
112versions_shell_dash()
113{
114 dpkg -l |grep ' dash ' |awk '{print $3}'
115}
116
117versions_shell_ksh()
118{
119 versions_shell_=$1
120
121 versions_version_=`strings ${versions_shell_} 2>&1 \
122 |grep Version \
123 |sed 's/^.*Version \(.*\)$/\1/;s/ s+ \$$//;s/ /-/g'`
124 [ -z "${versions_version_}" ] \
125 && versions_version_=`versions_shell_pdksh ${versions_shell_}`
126 echo ${versions_version_}
127
128 unset versions_shell_ versions_version_
129}
130
131versions_shell_pdksh()
132{
133 strings $1 2>&1 \
134 |grep 'PD KSH' \
135 |sed -e 's/.*PD KSH \(.*\)/\1/;s/ /-/g'
136}
137
138versions_shell_zsh()
139{
140 echo 'echo ${ZSH_VERSION}' |$1
141}
142
143#------------------------------------------------------------------------------
144# main
145#
146
147versions_main()
148{
149 # treat unset variables as an error
150 set -u
151
152 os_name=`versions_osName`
153 os_version=`versions_osVersion`
154 echo "os: ${os_name} version: ${os_version}"
155
kate.ward2f3cad92008-10-21 23:29:23 +0000156 for shell in ${VERSIONS_SHELLS}; do
157 shell_version=`versions_shellVersion ${shell}`
158 echo "shell: ${shell} version: ${shell_version}"
159 done
160}
161
162if [ "`basename $0`" = 'versions' ]; then
163 versions_main "$@"
164fi