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