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