Home | History | Annotate | Line # | Download | only in sys_info
sys_info.sh revision 1.18.8.1
      1       1.1       agc #! /bin/sh
      2       1.1       agc 
      3  1.18.8.1  perseant # $NetBSD: sys_info.sh,v 1.18.8.1 2025/08/02 05:58:43 perseant 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.18      reed SYS_INFO_VERSION=20200714
     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.18      reed 		v=$(run "${destdir}/usr/libexec/httpd -G")
    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.18      reed 		v=$(run "calendar -v" || 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.18.8.1  perseant 		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