Home | History | Annotate | Line # | Download | only in sys_info
sys_info.sh revision 1.10
      1   1.1  agc #! /bin/sh
      2   1.1  agc 
      3  1.10  kre # $NetBSD: sys_info.sh,v 1.10 2017/08/23 19:18:38 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.10  kre SYS_INFO_VERSION=$( D="\$Date: 2017/08/23 19:18:38 $"; 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.9  agc 	pkg_info|pkg_install)
    190   1.9  agc 		if which_prog infopath pkg_info; then
    191  1.10  kre 			run "printf 'pkg_install-%s\n' \$(${infopath} -V)"
    192   1.9  agc 		fi
    193   1.9  agc 		$all || return 0 ;&
    194   1.8  kre 	sh)
    195   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:}}"
    196   1.8  kre 		$all || return 0 ;&
    197   1.1  agc 	sqlite|sqlite3)
    198   1.8  kre 		run "sqlite3 --version | awk '{ print \"sqlite3-\" \$1 }'"
    199   1.8  kre 		$all || return 0 ;&
    200   1.5  agc 	sys_info)
    201   1.8  kre 		run "printf '%s\n' sys_info-${SYS_INFO_VERSION}"
    202   1.8  kre 		$all || return 0 ;&
    203   1.1  agc 	tcsh)
    204   1.5  agc 		if which_prog tcshpath tcsh; then
    205   1.8  kre 			run "${tcshpath} --version | awk '{ print \$1 \"-\" \$2 }'"
    206   1.5  agc 		fi
    207   1.8  kre 		$all || return 0 ;&
    208   1.7  agc 	tzdata)
    209   1.7  agc 		if [ -f /usr/share/zoneinfo/TZDATA_VERSION ]; then
    210   1.8  kre 			run "cat /usr/share/zoneinfo/TZDATA_VERSION"
    211   1.8  kre 		else
    212   1.8  kre 			run "printf '%s\n' tzdata-too-old-to-matter"
    213   1.7  agc 		fi
    214   1.8  kre 		$all || return 0 ;&
    215   1.1  agc 	unbound)
    216   1.5  agc 		if which_prog unboundpath unbound-control; then
    217   1.8  kre 			run "${unboundpath} -h | awk '/^Version/ { print \"unbound-\" \$2 }'"
    218   1.5  agc 		else
    219   1.8  kre 			$all || printf >&2 '%s\n' "unbound: not found"
    220   1.5  agc 		fi
    221   1.8  kre 		$all || return 0 ;&
    222   1.8  kre 	[uU]ser[lL]and|release)
    223   1.8  kre 		run "sed </etc/release -e 's/ /-/g' -e 's/^/userland-/' -e 1q"
    224   1.8  kre 		$all || return 0 ;&
    225   1.1  agc 	xz)
    226   1.8  kre 		run "xz --version | awk '{ print \$1 \"-\" \$4; exit }'"
    227   1.8  kre 		$all || return 0 ;&
    228   1.8  kre 
    229   1.8  kre 	'')			# never matches
    230   1.8  kre 		;;		# but terminates ;& sequence
    231   1.8  kre 
    232   1.8  kre 	*)	printf >&2 '%s\n' "Unrecognised subsystem: $1"
    233   1.8  kre 		ERRS=1
    234   1.1  agc 		;;
    235   1.1  agc 	esac
    236   1.1  agc }
    237   1.1  agc 
    238   1.8  kre verbose=false
    239   1.5  agc # check if we have our only option
    240   1.8  kre while getopts "L:P:v" a; do
    241   1.8  kre 	case "$a" in
    242   1.8  kre 	v)	verbose=true;;
    243   1.8  kre 	L)	LIBRARY_PATH=${OPTARG};;
    244   1.8  kre 	P)	PATH=${OPTARG};;
    245   1.8  kre 	\?)	printf >&2 '%s\n' \
    246   1.8  kre 		    "Usage: $0 [-P path] [-L libdirs] [-v] [system...]"
    247   1.8  kre 		exit 2
    248   1.1  agc 	esac
    249   1.1  agc done
    250   1.8  kre shift $((OPTIND - 1))
    251   1.1  agc 
    252   1.3  agc if [ $# -eq 0 ]; then
    253   1.8  kre 	set -- ''
    254   1.3  agc 	all=true
    255   1.5  agc else
    256   1.8  kre 	# note this deletes any attempt to use '' as an arg.
    257   1.8  kre 	set -- $( printf '%s\n' "$@" | sort -u )
    258   1.8  kre 	all=false
    259   1.1  agc fi
    260   1.1  agc 
    261   1.8  kre ERRS=0
    262   1.1  agc while [ $# -gt 0 ]; do
    263   1.8  kre 	getversion "$1"
    264   1.1  agc 	shift
    265   1.1  agc done
    266   1.8  kre exit $ERRS
    267