sys_info.sh revision 1.17 1 1.1 agc #! /bin/sh
2 1.1 agc
3 1.17 agc # $NetBSD: sys_info.sh,v 1.17 2017/09/28 18:08:04 agc 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.17 agc SYS_INFO_VERSION=20170928
30 1.8 kre
31 1.8 kre PATH=$(sysctl -n user.cs_path)
32 1.8 kre export PATH
33 1.8 kre
34 1.8 kre LIBRARY_PATH=${LD_LIBRARY_PATH:-/usr/lib:/usr/X11R7/lib}
35 1.8 kre
36 1.8 kre # default libraries when no args are given (sorted...)
37 1.8 kre LIBS=
38 1.8 kre LIBS="${LIBS} libc"
39 1.8 kre LIBS="${LIBS} libcurses"
40 1.8 kre LIBS="${LIBS} libdrm"
41 1.8 kre LIBS="${LIBS} libm"
42 1.8 kre LIBS="${LIBS} libresolv"
43 1.8 kre LIBS="${LIBS} libsqlite"
44 1.8 kre LIBS="${LIBS} libssh"
45 1.8 kre LIBS="${LIBS} libstdc++"
46 1.8 kre LIBS="${LIBS} libterminfo"
47 1.8 kre LIBS="${LIBS} libutil"
48 1.8 kre LIBS="${LIBS} libX11"
49 1.8 kre LIBS="${LIBS} libXaw7"
50 1.8 kre LIBS="${LIBS} libXcb"
51 1.8 kre LIBS="${LIBS} libXfont"
52 1.8 kre LIBS="${LIBS} libXft"
53 1.8 kre LIBS="${LIBS} libXrandr"
54 1.8 kre LIBS="${LIBS} libXt"
55 1.1 agc
56 1.5 agc # short script to look for an executable $2, and if found, to place
57 1.5 agc # path in $1
58 1.5 agc # taken from pkgsrc bootstrap
59 1.5 agc which_prog()
60 1.5 agc {
61 1.8 kre local IFS _var _name _d -
62 1.8 kre set -f
63 1.8 kre
64 1.5 agc _var="$1"; _name="$2"
65 1.5 agc
66 1.8 kre eval _d=\"\$$_var\"
67 1.8 kre if [ -n "$_d" ]; then
68 1.5 agc # Variable is already set (by the user, for example)
69 1.5 agc return 0
70 1.5 agc fi
71 1.5 agc
72 1.8 kre IFS=:
73 1.8 kre for _d in $PATH ; do
74 1.5 agc if [ -f "$_d/$_name" ] && [ -x "$_d/$_name" ]; then
75 1.5 agc # Program found
76 1.5 agc eval $_var=\""$_d/$_name"\"
77 1.5 agc return 0
78 1.5 agc fi
79 1.5 agc done
80 1.5 agc
81 1.5 agc return 1
82 1.5 agc }
83 1.5 agc
84 1.8 kre savedIFS=unset
85 1.8 kre saveIFS() { savedIFS="${IFS-unset}"; IFS="$1"; }
86 1.8 kre restIFS() { test "${savedIFS}" = unset && unset IFS || IFS="${savedIFS}"; }
87 1.8 kre
88 1.8 kre run() {
89 1.8 kre # must send to stderr, as run is used in $() sometimes.
90 1.8 kre $verbose && printf >&2 '%s\n' "${PS4:-...: }${1}"
91 1.8 kre eval "$1"
92 1.8 kre }
93 1.8 kre
94 1.8 kre # print out the version for the given argument (or everything)
95 1.8 kre
96 1.8 kre # case patterns are sorted by output order so
97 1.8 kre # sys_info
98 1.8 kre # and
99 1.8 kre # sys_info | sort -f
100 1.8 kre # generate identical output
101 1.8 kre
102 1.1 agc getversion() {
103 1.1 agc case "$1" in
104 1.8 kre '')
105 1.12 kre $all || return 0 ;&
106 1.1 agc awk)
107 1.8 kre run "awk --version | awk '{ print \$1 \"-\" \$3 }'"
108 1.8 kre $all || return 0 ;&
109 1.8 kre [Bb][Ii][Nn][Dd]|named)
110 1.8 kre run "named -v | awk '{ gsub(\"-\", \"\", \$2); gsub(\"P\", \"pl\", \$2); print tolower(\$1) \"-\" \$2 }'"
111 1.8 kre $all || return 0 ;&
112 1.8 kre bozohttpd|httpd)
113 1.15 agc v=$(run "${destdir}/usr/libexec/httpd -G" 2>/dev/null)
114 1.8 kre case "${v}" in
115 1.8 kre "")
116 1.15 agc run "strings -a ${destdir}/usr/libexec/httpd | awk -F/ '\$1 == \"bozohttpd\" && NF == 2 { print \$1 \"-\" \$2; exit }'"
117 1.8 kre ;;
118 1.8 kre *)
119 1.8 kre printf '%s\n' "bozohttpd-${v##*/}"
120 1.8 kre ;;
121 1.8 kre esac
122 1.8 kre $all || return 0 ;&
123 1.1 agc bzip2)
124 1.8 kre run "bzip2 --help 2>&1 | awk '{ sub(\",\", \"\", \$7); print \"bzip2-\" \$7; exit }'"
125 1.8 kre $all || return 0 ;&
126 1.1 agc calendar)
127 1.8 kre v=$(run "calendar -v" 2>/dev/null || true)
128 1.1 agc case "${v}" in
129 1.8 kre "") printf '%s\n' "calendar-20150701" ;;
130 1.8 kre *) printf '%s\n' "${v}" ;;
131 1.1 agc esac
132 1.8 kre $all || return 0 ;&
133 1.8 kre dhcpcd)
134 1.8 kre run "dhcpcd --version | sed -e 's/ /-/g' -e 1q"
135 1.8 kre $all || return 0 ;&
136 1.14 jmcneill dtc)
137 1.14 jmcneill run "dtc --version | sed 's/Version: DTC /dtc-/'"
138 1.14 jmcneill $all || return 0 ;&
139 1.1 agc ftpd)
140 1.8 kre run "strings -a /usr/libexec/ftpd | awk '\$1 == \"NetBSD-ftpd\" { print \"ftpd-\" \$2 }'"
141 1.8 kre $all || return 0 ;&
142 1.1 agc g++|c++)
143 1.8 kre run "g++ --version | awk '{ print \$1 \"-\" \$4; exit }'"
144 1.8 kre $all || return 0 ;&
145 1.1 agc gcc|cc)
146 1.8 kre run "gcc --version | awk '{ print \$1 \"-\" \$4; exit }'"
147 1.8 kre $all || return 0 ;&
148 1.1 agc grep)
149 1.8 kre run "grep --version | awk '{ print \$1 \"-\" \$4 \$5; exit }'"
150 1.8 kre $all || return 0 ;&
151 1.1 agc gzip)
152 1.8 kre run "gzip --version 2>&1 | awk '{ print \$2 \"-\" \$3 }'"
153 1.8 kre $all || return 0 ;&
154 1.1 agc lib*)
155 1.8 kre for L in ${1:-$LIBS}; do
156 1.8 kre saveIFS :
157 1.8 kre for d in ${LIBRARY_PATH} nowhere; do
158 1.8 kre restIFS
159 1.8 kre if [ -e ${d}/$L.so ]; then
160 1.8 kre run "ls -al \"${d}/$L.so\" | sed -e 's/^.*-> //' -e 's;^.*/;;' -e 's/\\.so\\./-/'"
161 1.8 kre break
162 1.8 kre fi
163 1.8 kre done
164 1.8 kre restIFS
165 1.8 kre test "$d" = nowhere && test -n "$1" &&
166 1.8 kre printf 2>&1 '%s\n' "$0: library $1 not found"
167 1.1 agc done
168 1.8 kre $all || return 0 ;&
169 1.8 kre [Nn]et[Bb][Ss][Dd]|kernel)
170 1.8 kre run "uname -sr | awk '{ print \$1 \"-\" \$2 }'"
171 1.8 kre $all || return 0 ;&
172 1.1 agc netpgp)
173 1.8 kre run "netpgp -V | awk '{ sub(\"/.*\", \"\", \$3); print \"netpgp-\" \$3; exit }'"
174 1.8 kre $all || return 0 ;&
175 1.1 agc netpgpverify)
176 1.8 kre run "netpgpverify -v | awk '{ print \$1 \"-\" \$3 }'"
177 1.8 kre $all || return 0 ;&
178 1.1 agc ntp)
179 1.8 kre run "ntpq --version | awk '{ sub(\"-.\", \"\"); sub(\"p\", \"pl\", \$2); print \"ntp-\" \$2 }'"
180 1.8 kre $all || return 0 ;&
181 1.8 kre openssh|ssh)
182 1.8 kre run "ssh -V 2>&1 | awk '{ sub(\"_\", \"-\", \$1); print tolower(\$1) }'"
183 1.8 kre $all || return 0 ;&
184 1.8 kre opensshd|sshd)
185 1.8 kre run "sshd -V 2>&1 | awk '/OpenSSH/ { sub(\"_\", \"D-\", \$1); print tolower(\$1) }'"
186 1.8 kre $all || return 0 ;&
187 1.1 agc openssl)
188 1.8 kre run "openssl version 2>/dev/null | awk '{ print tolower(\$1) \"-\" \$2 }'"
189 1.8 kre $all || return 0 ;&
190 1.17 agc pcap)
191 1.17 agc if which_prog tcpdumppath tcpdump; then
192 1.17 agc run "${tcpdumppath} -h 2>&1 | awk '\$1 == \"libpcap\" { sub(\" version \", \"-\"); print }'"
193 1.17 agc fi
194 1.17 agc $all || return 0 ;&
195 1.9 agc pkg_info|pkg_install)
196 1.9 agc if which_prog infopath pkg_info; then
197 1.10 kre run "printf 'pkg_install-%s\n' \$(${infopath} -V)"
198 1.9 agc fi
199 1.9 agc $all || return 0 ;&
200 1.8 kre sh)
201 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:}}"
202 1.8 kre $all || return 0 ;&
203 1.1 agc sqlite|sqlite3)
204 1.8 kre run "sqlite3 --version | awk '{ print \"sqlite3-\" \$1 }'"
205 1.8 kre $all || return 0 ;&
206 1.5 agc sys_info)
207 1.8 kre run "printf '%s\n' sys_info-${SYS_INFO_VERSION}"
208 1.8 kre $all || return 0 ;&
209 1.17 agc tcpdump)
210 1.17 agc if which_prog tcpdumppath tcpdump; then
211 1.17 agc run "${tcpdumppath} -h 2>&1 | awk '\$1 == \"tcpdump\" { sub(\" version \", \"-\"); print }'"
212 1.17 agc fi
213 1.17 agc $all || return 0 ;&
214 1.1 agc tcsh)
215 1.5 agc if which_prog tcshpath tcsh; then
216 1.8 kre run "${tcshpath} --version | awk '{ print \$1 \"-\" \$2 }'"
217 1.5 agc fi
218 1.8 kre $all || return 0 ;&
219 1.7 agc tzdata)
220 1.15 agc if [ -f ${destdir}/usr/share/zoneinfo/TZDATA_VERSION ]; then
221 1.15 agc run "cat ${destdir}/usr/share/zoneinfo/TZDATA_VERSION"
222 1.8 kre else
223 1.8 kre run "printf '%s\n' tzdata-too-old-to-matter"
224 1.7 agc fi
225 1.8 kre $all || return 0 ;&
226 1.1 agc unbound)
227 1.5 agc if which_prog unboundpath unbound-control; then
228 1.8 kre run "${unboundpath} -h | awk '/^Version/ { print \"unbound-\" \$2 }'"
229 1.5 agc else
230 1.8 kre $all || printf >&2 '%s\n' "unbound: not found"
231 1.5 agc fi
232 1.8 kre $all || return 0 ;&
233 1.8 kre [uU]ser[lL]and|release)
234 1.15 agc run "sed <${destdir}/etc/release -e 's/ /-/g' -e 's/^/userland-/' -e 1q"
235 1.8 kre $all || return 0 ;&
236 1.17 agc wpa_supplicant)
237 1.17 agc if which_prog wpapath wpa_supplicant; then
238 1.17 agc run "${wpapath} -v | awk 'NF == 2 { sub(\" v\", \"-\"); print }'"
239 1.17 agc fi
240 1.17 agc $all || return 0 ;&
241 1.1 agc xz)
242 1.8 kre run "xz --version | awk '{ print \$1 \"-\" \$4; exit }'"
243 1.8 kre $all || return 0 ;&
244 1.11 agc yacc)
245 1.11 agc run "yacc -V | sed -e 's| ||g'"
246 1.11 agc $all || return 0 ;&
247 1.8 kre
248 1.8 kre '') # never matches
249 1.8 kre ;; # but terminates ;& sequence
250 1.8 kre
251 1.8 kre *) printf >&2 '%s\n' "Unrecognised subsystem: $1"
252 1.8 kre ERRS=1
253 1.1 agc ;;
254 1.1 agc esac
255 1.1 agc }
256 1.1 agc
257 1.8 kre verbose=false
258 1.15 agc destdir=""
259 1.5 agc # check if we have our only option
260 1.15 agc while getopts "L:P:d:v" a; do
261 1.8 kre case "$a" in
262 1.8 kre L) LIBRARY_PATH=${OPTARG};;
263 1.8 kre P) PATH=${OPTARG};;
264 1.15 agc d) PATH=${OPTARG}/bin:${OPTARG}/sbin:${OPTARG}/usr/bin:${OPTARG}/usr/sbin
265 1.15 agc LIBRARY_PATH=${OPTARG}/usr/lib:${OPTARG}/usr.X11R7/lib
266 1.15 agc destdir=${OPTARG};;
267 1.15 agc v) verbose=true;;
268 1.8 kre \?) printf >&2 '%s\n' \
269 1.16 wiz "Usage: $0 [-v] [-d destdir] [-L libdirs] [-P path] [system...]"
270 1.8 kre exit 2
271 1.1 agc esac
272 1.1 agc done
273 1.8 kre shift $((OPTIND - 1))
274 1.1 agc
275 1.3 agc if [ $# -eq 0 ]; then
276 1.8 kre set -- ''
277 1.3 agc all=true
278 1.5 agc else
279 1.8 kre all=false
280 1.1 agc fi
281 1.1 agc
282 1.8 kre ERRS=0
283 1.1 agc while [ $# -gt 0 ]; do
284 1.8 kre getversion "$1"
285 1.1 agc shift
286 1.1 agc done
287 1.8 kre exit $ERRS
288