Home | History | Annotate | Line # | Download | only in sys_info
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