sys_info.sh revision 1.11 1 1.1 agc #! /bin/sh
2 1.1 agc
3 1.11 agc # $NetBSD: sys_info.sh,v 1.11 2017/08/23 21:18:57 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.11 agc SYS_INFO_VERSION=20170823
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.8 kre # arriving here implies all==true, not possible otherwise
106 1.8 kre ;&
107 1.1 agc awk)
108 1.8 kre run "awk --version | awk '{ print \$1 \"-\" \$3 }'"
109 1.8 kre $all || return 0 ;&
110 1.8 kre [Bb][Ii][Nn][Dd]|named)
111 1.8 kre run "named -v | awk '{ gsub(\"-\", \"\", \$2); gsub(\"P\", \"pl\", \$2); print tolower(\$1) \"-\" \$2 }'"
112 1.8 kre $all || return 0 ;&
113 1.8 kre bozohttpd|httpd)
114 1.8 kre v=$(run "/usr/libexec/httpd -G" 2>/dev/null)
115 1.8 kre case "${v}" in
116 1.8 kre "")
117 1.8 kre run "strings -a /usr/libexec/httpd | awk -F/ '\$1 == \"bozohttpd\" && NF == 2 { print \$1 \"-\" \$2; exit }'"
118 1.8 kre ;;
119 1.8 kre *)
120 1.8 kre printf '%s\n' "bozohttpd-${v##*/}"
121 1.8 kre ;;
122 1.8 kre esac
123 1.8 kre $all || return 0 ;&
124 1.1 agc bzip2)
125 1.8 kre run "bzip2 --help 2>&1 | awk '{ sub(\",\", \"\", \$7); print \"bzip2-\" \$7; exit }'"
126 1.8 kre $all || return 0 ;&
127 1.1 agc calendar)
128 1.8 kre v=$(run "calendar -v" 2>/dev/null || true)
129 1.1 agc case "${v}" in
130 1.8 kre "") printf '%s\n' "calendar-20150701" ;;
131 1.8 kre *) printf '%s\n' "${v}" ;;
132 1.1 agc esac
133 1.8 kre $all || return 0 ;&
134 1.8 kre dhcpcd)
135 1.8 kre run "dhcpcd --version | sed -e 's/ /-/g' -e 1q"
136 1.8 kre $all || return 0 ;&
137 1.1 agc ftpd)
138 1.8 kre run "strings -a /usr/libexec/ftpd | awk '\$1 == \"NetBSD-ftpd\" { print \"ftpd-\" \$2 }'"
139 1.8 kre $all || return 0 ;&
140 1.1 agc g++|c++)
141 1.8 kre run "g++ --version | awk '{ print \$1 \"-\" \$4; exit }'"
142 1.8 kre $all || return 0 ;&
143 1.1 agc gcc|cc)
144 1.8 kre run "gcc --version | awk '{ print \$1 \"-\" \$4; exit }'"
145 1.8 kre $all || return 0 ;&
146 1.1 agc grep)
147 1.8 kre run "grep --version | awk '{ print \$1 \"-\" \$4 \$5; exit }'"
148 1.8 kre $all || return 0 ;&
149 1.1 agc gzip)
150 1.8 kre run "gzip --version 2>&1 | awk '{ print \$2 \"-\" \$3 }'"
151 1.8 kre $all || return 0 ;&
152 1.1 agc lib*)
153 1.8 kre for L in ${1:-$LIBS}; do
154 1.8 kre saveIFS :
155 1.8 kre for d in ${LIBRARY_PATH} nowhere; do
156 1.8 kre restIFS
157 1.8 kre if [ -e ${d}/$L.so ]; then
158 1.8 kre run "ls -al \"${d}/$L.so\" | sed -e 's/^.*-> //' -e 's;^.*/;;' -e 's/\\.so\\./-/'"
159 1.8 kre break
160 1.8 kre fi
161 1.8 kre done
162 1.8 kre restIFS
163 1.8 kre test "$d" = nowhere && test -n "$1" &&
164 1.8 kre printf 2>&1 '%s\n' "$0: library $1 not found"
165 1.1 agc done
166 1.8 kre $all || return 0 ;&
167 1.8 kre [Nn]et[Bb][Ss][Dd]|kernel)
168 1.8 kre run "uname -sr | awk '{ print \$1 \"-\" \$2 }'"
169 1.8 kre $all || return 0 ;&
170 1.1 agc netpgp)
171 1.8 kre run "netpgp -V | awk '{ sub(\"/.*\", \"\", \$3); print \"netpgp-\" \$3; exit }'"
172 1.8 kre $all || return 0 ;&
173 1.1 agc netpgpverify)
174 1.8 kre run "netpgpverify -v | awk '{ print \$1 \"-\" \$3 }'"
175 1.8 kre $all || return 0 ;&
176 1.1 agc ntp)
177 1.8 kre run "ntpq --version | awk '{ sub(\"-.\", \"\"); sub(\"p\", \"pl\", \$2); print \"ntp-\" \$2 }'"
178 1.8 kre $all || return 0 ;&
179 1.8 kre openssh|ssh)
180 1.8 kre run "ssh -V 2>&1 | awk '{ sub(\"_\", \"-\", \$1); print tolower(\$1) }'"
181 1.8 kre $all || return 0 ;&
182 1.8 kre opensshd|sshd)
183 1.8 kre run "sshd -V 2>&1 | awk '/OpenSSH/ { sub(\"_\", \"D-\", \$1); print tolower(\$1) }'"
184 1.8 kre $all || return 0 ;&
185 1.1 agc openssl)
186 1.8 kre run "openssl version 2>/dev/null | awk '{ print tolower(\$1) \"-\" \$2 }'"
187 1.8 kre $all || return 0 ;&
188 1.9 agc pkg_info|pkg_install)
189 1.9 agc if which_prog infopath pkg_info; then
190 1.10 kre run "printf 'pkg_install-%s\n' \$(${infopath} -V)"
191 1.9 agc fi
192 1.9 agc $all || return 0 ;&
193 1.8 kre sh)
194 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:}}"
195 1.8 kre $all || return 0 ;&
196 1.1 agc sqlite|sqlite3)
197 1.8 kre run "sqlite3 --version | awk '{ print \"sqlite3-\" \$1 }'"
198 1.8 kre $all || return 0 ;&
199 1.5 agc sys_info)
200 1.8 kre run "printf '%s\n' sys_info-${SYS_INFO_VERSION}"
201 1.8 kre $all || return 0 ;&
202 1.1 agc tcsh)
203 1.5 agc if which_prog tcshpath tcsh; then
204 1.8 kre run "${tcshpath} --version | awk '{ print \$1 \"-\" \$2 }'"
205 1.5 agc fi
206 1.8 kre $all || return 0 ;&
207 1.7 agc tzdata)
208 1.7 agc if [ -f /usr/share/zoneinfo/TZDATA_VERSION ]; then
209 1.8 kre run "cat /usr/share/zoneinfo/TZDATA_VERSION"
210 1.8 kre else
211 1.8 kre run "printf '%s\n' tzdata-too-old-to-matter"
212 1.7 agc fi
213 1.8 kre $all || return 0 ;&
214 1.1 agc unbound)
215 1.5 agc if which_prog unboundpath unbound-control; then
216 1.8 kre run "${unboundpath} -h | awk '/^Version/ { print \"unbound-\" \$2 }'"
217 1.5 agc else
218 1.8 kre $all || printf >&2 '%s\n' "unbound: not found"
219 1.5 agc fi
220 1.8 kre $all || return 0 ;&
221 1.8 kre [uU]ser[lL]and|release)
222 1.8 kre run "sed </etc/release -e 's/ /-/g' -e 's/^/userland-/' -e 1q"
223 1.8 kre $all || return 0 ;&
224 1.1 agc xz)
225 1.8 kre run "xz --version | awk '{ print \$1 \"-\" \$4; exit }'"
226 1.8 kre $all || return 0 ;&
227 1.11 agc yacc)
228 1.11 agc run "yacc -V | sed -e 's| ||g'"
229 1.11 agc $all || return 0 ;&
230 1.8 kre
231 1.8 kre '') # never matches
232 1.8 kre ;; # but terminates ;& sequence
233 1.8 kre
234 1.8 kre *) printf >&2 '%s\n' "Unrecognised subsystem: $1"
235 1.8 kre ERRS=1
236 1.1 agc ;;
237 1.1 agc esac
238 1.1 agc }
239 1.1 agc
240 1.8 kre verbose=false
241 1.5 agc # check if we have our only option
242 1.8 kre while getopts "L:P:v" a; do
243 1.8 kre case "$a" in
244 1.8 kre v) verbose=true;;
245 1.8 kre L) LIBRARY_PATH=${OPTARG};;
246 1.8 kre P) PATH=${OPTARG};;
247 1.8 kre \?) printf >&2 '%s\n' \
248 1.8 kre "Usage: $0 [-P path] [-L libdirs] [-v] [system...]"
249 1.8 kre exit 2
250 1.1 agc esac
251 1.1 agc done
252 1.8 kre shift $((OPTIND - 1))
253 1.1 agc
254 1.3 agc if [ $# -eq 0 ]; then
255 1.8 kre set -- ''
256 1.3 agc all=true
257 1.5 agc else
258 1.8 kre # note this deletes any attempt to use '' as an arg.
259 1.8 kre set -- $( printf '%s\n' "$@" | sort -u )
260 1.8 kre all=false
261 1.1 agc fi
262 1.1 agc
263 1.8 kre ERRS=0
264 1.1 agc while [ $# -gt 0 ]; do
265 1.8 kre getversion "$1"
266 1.1 agc shift
267 1.1 agc done
268 1.8 kre exit $ERRS
269