xref: /netbsd-src/usr.bin/sys_info/sys_info.sh (revision 10564be9b772f0a03aee85673d4876774d8f2d56)
13f81b607Sagc#! /bin/sh
23f81b607Sagc
3*10564be9Sreed# $NetBSD: sys_info.sh,v 1.18 2020/07/14 01:01:05 reed Exp $
43f81b607Sagc
53f81b607Sagc# Copyright (c) 2016 Alistair Crooks <agc@NetBSD.org>
63f81b607Sagc# All rights reserved.
73f81b607Sagc#
83f81b607Sagc# Redistribution and use in source and binary forms, with or without
93f81b607Sagc# modification, are permitted provided that the following conditions
103f81b607Sagc# are met:
113f81b607Sagc# 1. Redistributions of source code must retain the above copyright
123f81b607Sagc#    notice, this list of conditions and the following disclaimer.
133f81b607Sagc# 2. Redistributions in binary form must reproduce the above copyright
143f81b607Sagc#    notice, this list of conditions and the following disclaimer in the
153f81b607Sagc#    documentation and/or other materials provided with the distribution.
163f81b607Sagc#
173f81b607Sagc# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
183f81b607Sagc# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
193f81b607Sagc# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
203f81b607Sagc# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
213f81b607Sagc# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
223f81b607Sagc# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233f81b607Sagc# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243f81b607Sagc# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253f81b607Sagc# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
263f81b607Sagc# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273f81b607Sagc#
283f81b607Sagc
29*10564be9SreedSYS_INFO_VERSION=20200714
30e5c13d3eSkre
31e5c13d3eSkrePATH=$(sysctl -n user.cs_path)
32e5c13d3eSkreexport PATH
33e5c13d3eSkre
34e5c13d3eSkreLIBRARY_PATH=${LD_LIBRARY_PATH:-/usr/lib:/usr/X11R7/lib}
35e5c13d3eSkre
36e5c13d3eSkre# default libraries when no args are given (sorted...)
37e5c13d3eSkreLIBS=
38e5c13d3eSkreLIBS="${LIBS} libc"
39e5c13d3eSkreLIBS="${LIBS} libcurses"
40e5c13d3eSkreLIBS="${LIBS} libdrm"
41e5c13d3eSkreLIBS="${LIBS} libm"
42e5c13d3eSkreLIBS="${LIBS} libresolv"
43e5c13d3eSkreLIBS="${LIBS} libsqlite"
44e5c13d3eSkreLIBS="${LIBS} libssh"
45e5c13d3eSkreLIBS="${LIBS} libstdc++"
46e5c13d3eSkreLIBS="${LIBS} libterminfo"
47e5c13d3eSkreLIBS="${LIBS} libutil"
48e5c13d3eSkreLIBS="${LIBS} libX11"
49e5c13d3eSkreLIBS="${LIBS} libXaw7"
50e5c13d3eSkreLIBS="${LIBS} libXcb"
51e5c13d3eSkreLIBS="${LIBS} libXfont"
52e5c13d3eSkreLIBS="${LIBS} libXft"
53e5c13d3eSkreLIBS="${LIBS} libXrandr"
54e5c13d3eSkreLIBS="${LIBS} libXt"
553f81b607Sagc
568df5d761Sagc# short script to look for an executable $2, and if found, to place
578df5d761Sagc# path in $1
588df5d761Sagc# taken from pkgsrc bootstrap
598df5d761Sagcwhich_prog()
608df5d761Sagc{
61e5c13d3eSkre	local IFS _var _name _d -
62e5c13d3eSkre	set -f
63e5c13d3eSkre
648df5d761Sagc	_var="$1"; _name="$2"
658df5d761Sagc
66e5c13d3eSkre	eval _d=\"\$$_var\"
67e5c13d3eSkre	if [ -n "$_d" ]; then
688df5d761Sagc		# Variable is already set (by the user, for example)
698df5d761Sagc		return 0
708df5d761Sagc	fi
718df5d761Sagc
72e5c13d3eSkre	IFS=:
73e5c13d3eSkre	for _d in $PATH ; do
748df5d761Sagc		if [ -f "$_d/$_name" ] && [ -x "$_d/$_name" ]; then
758df5d761Sagc			# Program found
768df5d761Sagc			eval $_var=\""$_d/$_name"\"
778df5d761Sagc			return 0
788df5d761Sagc		fi
798df5d761Sagc	done
808df5d761Sagc
818df5d761Sagc	return 1
828df5d761Sagc}
838df5d761Sagc
84e5c13d3eSkresavedIFS=unset
85e5c13d3eSkresaveIFS() { savedIFS="${IFS-unset}"; IFS="$1"; }
86e5c13d3eSkrerestIFS() { test "${savedIFS}" = unset && unset IFS || IFS="${savedIFS}"; }
87e5c13d3eSkre
88e5c13d3eSkrerun() {
89e5c13d3eSkre	 # must send to stderr, as run is used in $() sometimes.
90e5c13d3eSkre	 $verbose && printf >&2 '%s\n' "${PS4:-...: }${1}"
91e5c13d3eSkre	 eval "$1"
92e5c13d3eSkre}
93e5c13d3eSkre
94e5c13d3eSkre# print out the version for the given argument (or everything)
95e5c13d3eSkre
96e5c13d3eSkre# case patterns are sorted by output order so
97e5c13d3eSkre#	sys_info
98e5c13d3eSkre# and
99e5c13d3eSkre#	sys_info | sort -f
100e5c13d3eSkre# generate identical output
101e5c13d3eSkre
1023f81b607Sagcgetversion() {
1033f81b607Sagc	case "$1" in
104e5c13d3eSkre	'')
1059f2931ceSkre		$all || return 0 ;&
1063f81b607Sagc	awk)
107e5c13d3eSkre		run "awk --version | awk '{ print \$1 \"-\" \$3 }'"
108e5c13d3eSkre		$all || return 0 ;&
109e5c13d3eSkre	[Bb][Ii][Nn][Dd]|named)
110e5c13d3eSkre		run "named -v | awk '{ gsub(\"-\", \"\", \$2); gsub(\"P\", \"pl\", \$2); print tolower(\$1) \"-\" \$2 }'"
111e5c13d3eSkre		$all || return 0 ;&
112e5c13d3eSkre	bozohttpd|httpd)
113*10564be9Sreed		v=$(run "${destdir}/usr/libexec/httpd -G")
1143f81b607Sagc		case "${v}" in
1153f81b607Sagc		"")
116c77bafdeSagc			run  "strings -a ${destdir}/usr/libexec/httpd | awk -F/ '\$1 == \"bozohttpd\" && NF == 2 { print \$1 \"-\" \$2; exit }'"
1173f81b607Sagc			;;
1183f81b607Sagc		*)
119e5c13d3eSkre			printf '%s\n' "bozohttpd-${v##*/}"
1203f81b607Sagc			;;
1213f81b607Sagc		esac
122e5c13d3eSkre		$all || return 0 ;&
123e5c13d3eSkre	bzip2)
124e5c13d3eSkre		run  "bzip2 --help 2>&1 | awk '{ sub(\",\", \"\", \$7); print \"bzip2-\" \$7; exit }'"
125e5c13d3eSkre		$all || return 0 ;&
126e5c13d3eSkre	calendar)
127*10564be9Sreed		v=$(run "calendar -v" || true)
128e5c13d3eSkre		case "${v}" in
129e5c13d3eSkre		"")	printf '%s\n' "calendar-20150701" ;;
130e5c13d3eSkre		*)	printf '%s\n' "${v}" ;;
131e5c13d3eSkre		esac
132e5c13d3eSkre		$all || return 0 ;&
133e5c13d3eSkre	dhcpcd)
134e5c13d3eSkre		run  "dhcpcd --version | sed -e 's/ /-/g' -e 1q"
135e5c13d3eSkre		$all || return 0 ;&
13604892807Sjmcneill	dtc)
13704892807Sjmcneill		run "dtc --version | sed 's/Version: DTC /dtc-/'"
13804892807Sjmcneill		$all || return 0 ;&
139e5c13d3eSkre	ftpd)
140e5c13d3eSkre		run "strings -a /usr/libexec/ftpd | awk '\$1 == \"NetBSD-ftpd\" { print \"ftpd-\" \$2 }'"
141e5c13d3eSkre		$all || return 0 ;&
142e5c13d3eSkre	g++|c++)
143e5c13d3eSkre		run "g++ --version | awk '{ print \$1 \"-\" \$4; exit }'"
144e5c13d3eSkre		$all || return 0 ;&
145e5c13d3eSkre	gcc|cc)
146e5c13d3eSkre		run "gcc --version | awk '{ print \$1 \"-\" \$4; exit }'"
147e5c13d3eSkre		$all || return 0 ;&
148e5c13d3eSkre	grep)
149e5c13d3eSkre		run "grep --version | awk '{ print \$1 \"-\" \$4 \$5; exit }'"
150e5c13d3eSkre		$all || return 0 ;&
151e5c13d3eSkre	gzip)
152e5c13d3eSkre		run "gzip --version 2>&1 | awk '{ print \$2 \"-\" \$3 }'"
153e5c13d3eSkre		$all || return 0 ;&
1543f81b607Sagc	lib*)
155e5c13d3eSkre		for L in ${1:-$LIBS}; do
156e5c13d3eSkre			saveIFS :
157e5c13d3eSkre			for d in ${LIBRARY_PATH} nowhere; do
158e5c13d3eSkre				restIFS
159e5c13d3eSkre				if [ -e ${d}/$L.so ]; then
160e5c13d3eSkre					run "ls -al \"${d}/$L.so\" | sed -e 's/^.*-> //' -e 's;^.*/;;' -e 's/\\.so\\./-/'"
1613f81b607Sagc					break
1623f81b607Sagc				fi
1633f81b607Sagc			done
164e5c13d3eSkre			restIFS
165e5c13d3eSkre			test "$d" = nowhere && test -n "$1" &&
166e5c13d3eSkre				printf 2>&1 '%s\n' "$0: library $1 not found"
167e5c13d3eSkre		done
168e5c13d3eSkre		$all || return 0 ;&
169e5c13d3eSkre	[Nn]et[Bb][Ss][Dd]|kernel)
170e5c13d3eSkre		run "uname -sr | awk '{ print \$1 \"-\" \$2 }'"
171e5c13d3eSkre		$all || return 0 ;&
1723f81b607Sagc	netpgp)
173e5c13d3eSkre		run "netpgp -V | awk '{ sub(\"/.*\", \"\", \$3); print \"netpgp-\" \$3; exit }'"
174e5c13d3eSkre		$all || return 0 ;&
1753f81b607Sagc	netpgpverify)
176e5c13d3eSkre		run "netpgpverify -v | awk '{ print \$1 \"-\" \$3 }'"
177e5c13d3eSkre		$all || return 0 ;&
1783f81b607Sagc	ntp)
179e5c13d3eSkre		run "ntpq --version | awk '{ sub(\"-.\", \"\"); sub(\"p\", \"pl\", \$2); print \"ntp-\" \$2 }'"
180e5c13d3eSkre		$all || return 0 ;&
181e5c13d3eSkre	openssh|ssh)
182e5c13d3eSkre		run "ssh -V 2>&1 | awk '{ sub(\"_\", \"-\", \$1); print tolower(\$1) }'"
183e5c13d3eSkre		$all || return 0 ;&
184e5c13d3eSkre	opensshd|sshd)
185e5c13d3eSkre		run "sshd -V 2>&1 | awk '/OpenSSH/ { sub(\"_\", \"D-\", \$1); print tolower(\$1) }'"
186e5c13d3eSkre		$all || return 0 ;&
1873f81b607Sagc	openssl)
188e5c13d3eSkre		run "openssl version 2>/dev/null | awk '{ print tolower(\$1) \"-\" \$2 }'"
189e5c13d3eSkre		$all || return 0 ;&
19089894cf8Sagc	pcap)
19189894cf8Sagc		if which_prog tcpdumppath tcpdump; then
19289894cf8Sagc			run "${tcpdumppath} -h 2>&1 | awk '\$1 == \"libpcap\" { sub(\" version \", \"-\"); print }'"
19389894cf8Sagc		fi
19489894cf8Sagc		$all || return 0 ;&
195dc6cab86Sagc	pkg_info|pkg_install)
196dc6cab86Sagc		if which_prog infopath pkg_info; then
197fa98c4d0Skre			run "printf 'pkg_install-%s\n' \$(${infopath} -V)"
198dc6cab86Sagc		fi
199dc6cab86Sagc		$all || return 0 ;&
200e5c13d3eSkre	sh)
201e5c13d3eSkre		run "set -- \$NETBSD_SHELL; case \"\$1+\$2\" in *+BUILD*) ;; +) set -- ancient;; *) set -- \"\$1\";;esac; printf 'sh-%s\\n' \$1\${2:+-\${2#BUILD:}}"
202e5c13d3eSkre		$all || return 0 ;&
2033f81b607Sagc	sqlite|sqlite3)
204e5c13d3eSkre		run "sqlite3 --version | awk '{ print \"sqlite3-\" \$1 }'"
205e5c13d3eSkre		$all || return 0 ;&
2068df5d761Sagc	sys_info)
207e5c13d3eSkre		run "printf '%s\n' sys_info-${SYS_INFO_VERSION}"
208e5c13d3eSkre		$all || return 0 ;&
20989894cf8Sagc	tcpdump)
21089894cf8Sagc		if which_prog tcpdumppath tcpdump; then
21189894cf8Sagc			run "${tcpdumppath} -h 2>&1 | awk '\$1 == \"tcpdump\" { sub(\" version \", \"-\"); print }'"
21289894cf8Sagc		fi
21389894cf8Sagc		$all || return 0 ;&
2143f81b607Sagc	tcsh)
2158df5d761Sagc		if which_prog tcshpath tcsh; then
216e5c13d3eSkre			run "${tcshpath} --version | awk '{ print \$1 \"-\" \$2 }'"
2178df5d761Sagc		fi
218e5c13d3eSkre		$all || return 0 ;&
2193e739125Sagc	tzdata)
220c77bafdeSagc		if [ -f ${destdir}/usr/share/zoneinfo/TZDATA_VERSION ]; then
221c77bafdeSagc			run "cat ${destdir}/usr/share/zoneinfo/TZDATA_VERSION"
222e5c13d3eSkre		else
223e5c13d3eSkre			run "printf '%s\n' tzdata-too-old-to-matter"
2243e739125Sagc		fi
225e5c13d3eSkre		$all || return 0 ;&
2263f81b607Sagc	unbound)
2278df5d761Sagc		if which_prog unboundpath unbound-control; then
228e5c13d3eSkre			run "${unboundpath} -h | awk '/^Version/ { print \"unbound-\" \$2 }'"
2298df5d761Sagc		else
230e5c13d3eSkre			$all || printf >&2 '%s\n' "unbound: not found"
2318df5d761Sagc		fi
232e5c13d3eSkre		$all || return 0 ;&
233e5c13d3eSkre	[uU]ser[lL]and|release)
234c77bafdeSagc		run "sed <${destdir}/etc/release -e 's/ /-/g' -e 's/^/userland-/' -e 1q"
235e5c13d3eSkre		$all || return 0 ;&
23689894cf8Sagc	wpa_supplicant)
23789894cf8Sagc		if which_prog wpapath wpa_supplicant; then
23889894cf8Sagc			run "${wpapath} -v | awk 'NF == 2 { sub(\" v\", \"-\"); print }'"
23989894cf8Sagc		fi
24089894cf8Sagc		$all || return 0 ;&
2413f81b607Sagc	xz)
242e5c13d3eSkre		run "xz --version | awk '{ print \$1 \"-\" \$4; exit }'"
243e5c13d3eSkre		$all || return 0 ;&
244da4a8c85Sagc	yacc)
245da4a8c85Sagc		run "yacc -V | sed -e 's| ||g'"
246da4a8c85Sagc		$all || return 0 ;&
247e5c13d3eSkre
248e5c13d3eSkre	'')			# never matches
249e5c13d3eSkre		;;		# but terminates ;& sequence
250e5c13d3eSkre
251e5c13d3eSkre	*)	printf >&2 '%s\n' "Unrecognised subsystem: $1"
252e5c13d3eSkre		ERRS=1
2533f81b607Sagc		;;
2543f81b607Sagc	esac
2553f81b607Sagc}
2563f81b607Sagc
257e5c13d3eSkreverbose=false
258c77bafdeSagcdestdir=""
2598df5d761Sagc# check if we have our only option
260c77bafdeSagcwhile getopts "L:P:d:v" a; do
261e5c13d3eSkre	case "$a" in
262e5c13d3eSkre	L)	LIBRARY_PATH=${OPTARG};;
263e5c13d3eSkre	P)	PATH=${OPTARG};;
264c77bafdeSagc	d)	PATH=${OPTARG}/bin:${OPTARG}/sbin:${OPTARG}/usr/bin:${OPTARG}/usr/sbin
265c77bafdeSagc		LIBRARY_PATH=${OPTARG}/usr/lib:${OPTARG}/usr.X11R7/lib
266c77bafdeSagc		destdir=${OPTARG};;
267c77bafdeSagc	v)	verbose=true;;
268e5c13d3eSkre	\?)	printf >&2 '%s\n' \
269598b83d4Swiz		    "Usage: $0 [-v] [-d destdir] [-L libdirs] [-P path] [system...]"
270e5c13d3eSkre		exit 2
2713f81b607Sagc	esac
2723f81b607Sagcdone
273e5c13d3eSkreshift $((OPTIND - 1))
2743f81b607Sagc
27565b09bb6Sagcif [ $# -eq 0 ]; then
276e5c13d3eSkre	set -- ''
27765b09bb6Sagc	all=true
2788df5d761Sagcelse
279e5c13d3eSkre	all=false
2803f81b607Sagcfi
2813f81b607Sagc
282e5c13d3eSkreERRS=0
2833f81b607Sagcwhile [ $# -gt 0 ]; do
284e5c13d3eSkre	getversion "$1"
2853f81b607Sagc	shift
2863f81b607Sagcdone
287e5c13d3eSkreexit $ERRS
288