sys_info.sh revision 1.8 1 1.1 agc #! /bin/sh
2 1.1 agc
3 1.8 kre # $NetBSD: sys_info.sh,v 1.8 2017/08/23 01:17:46 kre Exp $
4 1.1 agc
5 1.1 agc # Copyright (c) 2016 Alistair Crooks <agc (at] NetBSD.org>
6 1.1 agc # All rights reserved.
7 1.1 agc #
8 1.1 agc # Redistribution and use in source and binary forms, with or without
9 1.1 agc # modification, are permitted provided that the following conditions
10 1.1 agc # are met:
11 1.1 agc # 1. Redistributions of source code must retain the above copyright
12 1.1 agc # notice, this list of conditions and the following disclaimer.
13 1.1 agc # 2. Redistributions in binary form must reproduce the above copyright
14 1.1 agc # notice, this list of conditions and the following disclaimer in the
15 1.1 agc # documentation and/or other materials provided with the distribution.
16 1.1 agc #
17 1.1 agc # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 1.1 agc # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 1.1 agc # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 1.1 agc # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 1.1 agc # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 1.1 agc # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 1.1 agc # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 1.1 agc # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 1.1 agc # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 1.1 agc # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 1.1 agc #
28 1.1 agc
29 1.8 kre SYS_INFO_VERSION=$( D="\$Date: 2017/08/23 01:17:46 $"; set -f;
30 1.8 kre IFS=" /"; set -- $D; printf %s "$2$3$4" )
31 1.8 kre
32 1.8 kre PATH=$(sysctl -n user.cs_path)
33 1.8 kre export PATH
34 1.8 kre
35 1.8 kre LIBRARY_PATH=${LD_LIBRARY_PATH:-/usr/lib:/usr/X11R7/lib}
36 1.8 kre
37 1.8 kre # default libraries when no args are given (sorted...)
38 1.8 kre LIBS=
39 1.8 kre LIBS="${LIBS} libc"
40 1.8 kre LIBS="${LIBS} libcurses"
41 1.8 kre LIBS="${LIBS} libdrm"
42 1.8 kre LIBS="${LIBS} libm"
43 1.8 kre LIBS="${LIBS} libresolv"
44 1.8 kre LIBS="${LIBS} libsqlite"
45 1.8 kre LIBS="${LIBS} libssh"
46 1.8 kre LIBS="${LIBS} libstdc++"
47 1.8 kre LIBS="${LIBS} libterminfo"
48 1.8 kre LIBS="${LIBS} libutil"
49 1.8 kre LIBS="${LIBS} libX11"
50 1.8 kre LIBS="${LIBS} libXaw7"
51 1.8 kre LIBS="${LIBS} libXcb"
52 1.8 kre LIBS="${LIBS} libXfont"
53 1.8 kre LIBS="${LIBS} libXft"
54 1.8 kre LIBS="${LIBS} libXrandr"
55 1.8 kre LIBS="${LIBS} libXt"
56 1.1 agc
57 1.5 agc # short script to look for an executable $2, and if found, to place
58 1.5 agc # path in $1
59 1.5 agc # taken from pkgsrc bootstrap
60 1.5 agc which_prog()
61 1.5 agc {
62 1.8 kre local IFS _var _name _d -
63 1.8 kre set -f
64 1.8 kre
65 1.5 agc _var="$1"; _name="$2"
66 1.5 agc
67 1.8 kre eval _d=\"\$$_var\"
68 1.8 kre if [ -n "$_d" ]; then
69 1.5 agc # Variable is already set (by the user, for example)
70 1.5 agc return 0
71 1.5 agc fi
72 1.5 agc
73 1.8 kre IFS=:
74 1.8 kre for _d in $PATH ; do
75 1.5 agc if [ -f "$_d/$_name" ] && [ -x "$_d/$_name" ]; then
76 1.5 agc # Program found
77 1.5 agc eval $_var=\""$_d/$_name"\"
78 1.5 agc return 0
79 1.5 agc fi
80 1.5 agc done
81 1.5 agc
82 1.5 agc return 1
83 1.5 agc }
84 1.5 agc
85 1.8 kre savedIFS=unset
86 1.8 kre saveIFS() { savedIFS="${IFS-unset}"; IFS="$1"; }
87 1.8 kre restIFS() { test "${savedIFS}" = unset && unset IFS || IFS="${savedIFS}"; }
88 1.8 kre
89 1.8 kre run() {
90 1.8 kre # must send to stderr, as run is used in $() sometimes.
91 1.8 kre $verbose && printf >&2 '%s\n' "${PS4:-...: }${1}"
92 1.8 kre eval "$1"
93 1.8 kre }
94 1.8 kre
95 1.8 kre # print out the version for the given argument (or everything)
96 1.8 kre
97 1.8 kre # case patterns are sorted by output order so
98 1.8 kre # sys_info
99 1.8 kre # and
100 1.8 kre # sys_info | sort -f
101 1.8 kre # generate identical output
102 1.8 kre
103 1.1 agc getversion() {
104 1.1 agc case "$1" in
105 1.8 kre '')
106 1.8 kre # arriving here implies all==true, not possible otherwise
107 1.8 kre ;&
108 1.1 agc awk)
109 1.8 kre run "awk --version | awk '{ print \$1 \"-\" \$3 }'"
110 1.8 kre $all || return 0 ;&
111 1.8 kre [Bb][Ii][Nn][Dd]|named)
112 1.8 kre run "named -v | awk '{ gsub(\"-\", \"\", \$2); gsub(\"P\", \"pl\", \$2); print tolower(\$1) \"-\" \$2 }'"
113 1.8 kre $all || return 0 ;&
114 1.8 kre bozohttpd|httpd)
115 1.8 kre v=$(run "/usr/libexec/httpd -G" 2>/dev/null)
116 1.8 kre case "${v}" in
117 1.8 kre "")
118 1.8 kre run "strings -a /usr/libexec/httpd | awk -F/ '\$1 == \"bozohttpd\" && NF == 2 { print \$1 \"-\" \$2; exit }'"
119 1.8 kre ;;
120 1.8 kre *)
121 1.8 kre printf '%s\n' "bozohttpd-${v##*/}"
122 1.8 kre ;;
123 1.8 kre esac
124 1.8 kre $all || return 0 ;&
125 1.1 agc bzip2)
126 1.8 kre run "bzip2 --help 2>&1 | awk '{ sub(\",\", \"\", \$7); print \"bzip2-\" \$7; exit }'"
127 1.8 kre $all || return 0 ;&
128 1.1 agc calendar)
129 1.8 kre v=$(run "calendar -v" 2>/dev/null || true)
130 1.1 agc case "${v}" in
131 1.8 kre "") printf '%s\n' "calendar-20150701" ;;
132 1.8 kre *) printf '%s\n' "${v}" ;;
133 1.1 agc esac
134 1.8 kre $all || return 0 ;&
135 1.8 kre dhcpcd)
136 1.8 kre run "dhcpcd --version | sed -e 's/ /-/g' -e 1q"
137 1.8 kre $all || return 0 ;&
138 1.1 agc ftpd)
139 1.8 kre run "strings -a /usr/libexec/ftpd | awk '\$1 == \"NetBSD-ftpd\" { print \"ftpd-\" \$2 }'"
140 1.8 kre $all || return 0 ;&
141 1.1 agc g++|c++)
142 1.8 kre run "g++ --version | awk '{ print \$1 \"-\" \$4; exit }'"
143 1.8 kre $all || return 0 ;&
144 1.1 agc gcc|cc)
145 1.8 kre run "gcc --version | awk '{ print \$1 \"-\" \$4; exit }'"
146 1.8 kre $all || return 0 ;&
147 1.1 agc grep)
148 1.8 kre run "grep --version | awk '{ print \$1 \"-\" \$4 \$5; exit }'"
149 1.8 kre $all || return 0 ;&
150 1.1 agc gzip)
151 1.8 kre run "gzip --version 2>&1 | awk '{ print \$2 \"-\" \$3 }'"
152 1.8 kre $all || return 0 ;&
153 1.1 agc lib*)
154 1.8 kre for L in ${1:-$LIBS}; do
155 1.8 kre saveIFS :
156 1.8 kre for d in ${LIBRARY_PATH} nowhere; do
157 1.8 kre restIFS
158 1.8 kre if [ -e ${d}/$L.so ]; then
159 1.8 kre run "ls -al \"${d}/$L.so\" | sed -e 's/^.*-> //' -e 's;^.*/;;' -e 's/\\.so\\./-/'"
160 1.8 kre break
161 1.8 kre fi
162 1.8 kre done
163 1.8 kre restIFS
164 1.8 kre test "$d" = nowhere && test -n "$1" &&
165 1.8 kre printf 2>&1 '%s\n' "$0: library $1 not found"
166 1.1 agc done
167 1.8 kre $all || return 0 ;&
168 1.8 kre [Nn]et[Bb][Ss][Dd]|kernel)
169 1.8 kre run "uname -sr | awk '{ print \$1 \"-\" \$2 }'"
170 1.8 kre $all || return 0 ;&
171 1.1 agc netpgp)
172 1.8 kre run "netpgp -V | awk '{ sub(\"/.*\", \"\", \$3); print \"netpgp-\" \$3; exit }'"
173 1.8 kre $all || return 0 ;&
174 1.1 agc netpgpverify)
175 1.8 kre run "netpgpverify -v | awk '{ print \$1 \"-\" \$3 }'"
176 1.8 kre $all || return 0 ;&
177 1.1 agc ntp)
178 1.8 kre run "ntpq --version | awk '{ sub(\"-.\", \"\"); sub(\"p\", \"pl\", \$2); print \"ntp-\" \$2 }'"
179 1.8 kre $all || return 0 ;&
180 1.8 kre openssh|ssh)
181 1.8 kre run "ssh -V 2>&1 | awk '{ sub(\"_\", \"-\", \$1); print tolower(\$1) }'"
182 1.8 kre $all || return 0 ;&
183 1.8 kre opensshd|sshd)
184 1.8 kre run "sshd -V 2>&1 | awk '/OpenSSH/ { sub(\"_\", \"D-\", \$1); print tolower(\$1) }'"
185 1.8 kre $all || return 0 ;&
186 1.1 agc openssl)
187 1.8 kre run "openssl version 2>/dev/null | awk '{ print tolower(\$1) \"-\" \$2 }'"
188 1.8 kre $all || return 0 ;&
189 1.8 kre sh)
190 1.8 kre run "set -- \$NETBSD_SHELL; case \"\$1+\$2\" in *+BUILD*) ;; +) set -- ancient;; *) set -- \"\$1\";;esac; printf 'sh-%s\\n' \$1\${2:+-\${2#BUILD:}}"
191 1.8 kre $all || return 0 ;&
192 1.1 agc sqlite|sqlite3)
193 1.8 kre run "sqlite3 --version | awk '{ print \"sqlite3-\" \$1 }'"
194 1.8 kre $all || return 0 ;&
195 1.5 agc sys_info)
196 1.8 kre run "printf '%s\n' sys_info-${SYS_INFO_VERSION}"
197 1.8 kre $all || return 0 ;&
198 1.1 agc tcsh)
199 1.5 agc if which_prog tcshpath tcsh; then
200 1.8 kre run "${tcshpath} --version | awk '{ print \$1 \"-\" \$2 }'"
201 1.5 agc else
202 1.8 kre $all || printf >&2 '%s\n' "tcsh: not found"
203 1.5 agc fi
204 1.8 kre $all || return 0 ;&
205 1.7 agc tzdata)
206 1.7 agc if [ -f /usr/share/zoneinfo/TZDATA_VERSION ]; then
207 1.8 kre run "cat /usr/share/zoneinfo/TZDATA_VERSION"
208 1.8 kre else
209 1.8 kre run "printf '%s\n' tzdata-too-old-to-matter"
210 1.7 agc fi
211 1.8 kre $all || return 0 ;&
212 1.1 agc unbound)
213 1.5 agc if which_prog unboundpath unbound-control; then
214 1.8 kre run "${unboundpath} -h | awk '/^Version/ { print \"unbound-\" \$2 }'"
215 1.5 agc else
216 1.8 kre $all || printf >&2 '%s\n' "unbound: not found"
217 1.5 agc fi
218 1.8 kre $all || return 0 ;&
219 1.8 kre [uU]ser[lL]and|release)
220 1.8 kre run "sed </etc/release -e 's/ /-/g' -e 's/^/userland-/' -e 1q"
221 1.8 kre $all || return 0 ;&
222 1.1 agc xz)
223 1.8 kre run "xz --version | awk '{ print \$1 \"-\" \$4; exit }'"
224 1.8 kre $all || return 0 ;&
225 1.8 kre
226 1.8 kre '') # never matches
227 1.8 kre ;; # but terminates ;& sequence
228 1.8 kre
229 1.8 kre *) printf >&2 '%s\n' "Unrecognised subsystem: $1"
230 1.8 kre ERRS=1
231 1.1 agc ;;
232 1.1 agc esac
233 1.1 agc }
234 1.1 agc
235 1.8 kre verbose=false
236 1.5 agc # check if we have our only option
237 1.8 kre while getopts "L:P:v" a; do
238 1.8 kre case "$a" in
239 1.8 kre v) verbose=true;;
240 1.8 kre L) LIBRARY_PATH=${OPTARG};;
241 1.8 kre P) PATH=${OPTARG};;
242 1.8 kre \?) printf >&2 '%s\n' \
243 1.8 kre "Usage: $0 [-P path] [-L libdirs] [-v] [system...]"
244 1.8 kre exit 2
245 1.1 agc esac
246 1.1 agc done
247 1.8 kre shift $((OPTIND - 1))
248 1.1 agc
249 1.3 agc if [ $# -eq 0 ]; then
250 1.8 kre set -- ''
251 1.3 agc all=true
252 1.5 agc else
253 1.8 kre # note this deletes any attempt to use '' as an arg.
254 1.8 kre set -- $( printf '%s\n' "$@" | sort -u )
255 1.8 kre all=false
256 1.1 agc fi
257 1.1 agc
258 1.8 kre ERRS=0
259 1.1 agc while [ $# -gt 0 ]; do
260 1.8 kre getversion "$1"
261 1.1 agc shift
262 1.1 agc done
263 1.8 kre exit $ERRS
264