288 lines
7.9 KiB
Bash
288 lines
7.9 KiB
Bash
#! /bin/sh
|
|
|
|
# $NetBSD: sys_info.sh,v 1.18 2020/07/14 01:01:05 reed Exp $
|
|
|
|
# Copyright (c) 2016 Alistair Crooks <agc@NetBSD.org>
|
|
# All rights reserved.
|
|
#
|
|
# Redistribution and use in source and binary forms, with or without
|
|
# modification, are permitted provided that the following conditions
|
|
# are met:
|
|
# 1. Redistributions of source code must retain the above copyright
|
|
# notice, this list of conditions and the following disclaimer.
|
|
# 2. Redistributions in binary form must reproduce the above copyright
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
# documentation and/or other materials provided with the distribution.
|
|
#
|
|
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
#
|
|
|
|
SYS_INFO_VERSION=20200714
|
|
|
|
PATH=$(sysctl -n user.cs_path)
|
|
export PATH
|
|
|
|
LIBRARY_PATH=${LD_LIBRARY_PATH:-/usr/lib:/usr/X11R7/lib}
|
|
|
|
# default libraries when no args are given (sorted...)
|
|
LIBS=
|
|
LIBS="${LIBS} libc"
|
|
LIBS="${LIBS} libcurses"
|
|
LIBS="${LIBS} libdrm"
|
|
LIBS="${LIBS} libm"
|
|
LIBS="${LIBS} libresolv"
|
|
LIBS="${LIBS} libsqlite"
|
|
LIBS="${LIBS} libssh"
|
|
LIBS="${LIBS} libstdc++"
|
|
LIBS="${LIBS} libterminfo"
|
|
LIBS="${LIBS} libutil"
|
|
LIBS="${LIBS} libX11"
|
|
LIBS="${LIBS} libXaw7"
|
|
LIBS="${LIBS} libXcb"
|
|
LIBS="${LIBS} libXfont"
|
|
LIBS="${LIBS} libXft"
|
|
LIBS="${LIBS} libXrandr"
|
|
LIBS="${LIBS} libXt"
|
|
|
|
# short script to look for an executable $2, and if found, to place
|
|
# path in $1
|
|
# taken from pkgsrc bootstrap
|
|
which_prog()
|
|
{
|
|
local IFS _var _name _d -
|
|
set -f
|
|
|
|
_var="$1"; _name="$2"
|
|
|
|
eval _d=\"\$$_var\"
|
|
if [ -n "$_d" ]; then
|
|
# Variable is already set (by the user, for example)
|
|
return 0
|
|
fi
|
|
|
|
IFS=:
|
|
for _d in $PATH ; do
|
|
if [ -f "$_d/$_name" ] && [ -x "$_d/$_name" ]; then
|
|
# Program found
|
|
eval $_var=\""$_d/$_name"\"
|
|
return 0
|
|
fi
|
|
done
|
|
|
|
return 1
|
|
}
|
|
|
|
savedIFS=unset
|
|
saveIFS() { savedIFS="${IFS-unset}"; IFS="$1"; }
|
|
restIFS() { test "${savedIFS}" = unset && unset IFS || IFS="${savedIFS}"; }
|
|
|
|
run() {
|
|
# must send to stderr, as run is used in $() sometimes.
|
|
$verbose && printf >&2 '%s\n' "${PS4:-...: }${1}"
|
|
eval "$1"
|
|
}
|
|
|
|
# print out the version for the given argument (or everything)
|
|
|
|
# case patterns are sorted by output order so
|
|
# sys_info
|
|
# and
|
|
# sys_info | sort -f
|
|
# generate identical output
|
|
|
|
getversion() {
|
|
case "$1" in
|
|
'')
|
|
$all || return 0 ;&
|
|
awk)
|
|
run "awk --version | awk '{ print \$1 \"-\" \$3 }'"
|
|
$all || return 0 ;&
|
|
[Bb][Ii][Nn][Dd]|named)
|
|
run "named -v | awk '{ gsub(\"-\", \"\", \$2); gsub(\"P\", \"pl\", \$2); print tolower(\$1) \"-\" \$2 }'"
|
|
$all || return 0 ;&
|
|
bozohttpd|httpd)
|
|
v=$(run "${destdir}/usr/libexec/httpd -G")
|
|
case "${v}" in
|
|
"")
|
|
run "strings -a ${destdir}/usr/libexec/httpd | awk -F/ '\$1 == \"bozohttpd\" && NF == 2 { print \$1 \"-\" \$2; exit }'"
|
|
;;
|
|
*)
|
|
printf '%s\n' "bozohttpd-${v##*/}"
|
|
;;
|
|
esac
|
|
$all || return 0 ;&
|
|
bzip2)
|
|
run "bzip2 --help 2>&1 | awk '{ sub(\",\", \"\", \$7); print \"bzip2-\" \$7; exit }'"
|
|
$all || return 0 ;&
|
|
calendar)
|
|
v=$(run "calendar -v" || true)
|
|
case "${v}" in
|
|
"") printf '%s\n' "calendar-20150701" ;;
|
|
*) printf '%s\n' "${v}" ;;
|
|
esac
|
|
$all || return 0 ;&
|
|
dhcpcd)
|
|
run "dhcpcd --version | sed -e 's/ /-/g' -e 1q"
|
|
$all || return 0 ;&
|
|
dtc)
|
|
run "dtc --version | sed 's/Version: DTC /dtc-/'"
|
|
$all || return 0 ;&
|
|
ftpd)
|
|
run "strings -a /usr/libexec/ftpd | awk '\$1 == \"NetBSD-ftpd\" { print \"ftpd-\" \$2 }'"
|
|
$all || return 0 ;&
|
|
g++|c++)
|
|
run "g++ --version | awk '{ print \$1 \"-\" \$4; exit }'"
|
|
$all || return 0 ;&
|
|
gcc|cc)
|
|
run "gcc --version | awk '{ print \$1 \"-\" \$4; exit }'"
|
|
$all || return 0 ;&
|
|
grep)
|
|
run "grep --version | awk '{ print \$1 \"-\" \$4 \$5; exit }'"
|
|
$all || return 0 ;&
|
|
gzip)
|
|
run "gzip --version 2>&1 | awk '{ print \$2 \"-\" \$3 }'"
|
|
$all || return 0 ;&
|
|
lib*)
|
|
for L in ${1:-$LIBS}; do
|
|
saveIFS :
|
|
for d in ${LIBRARY_PATH} nowhere; do
|
|
restIFS
|
|
if [ -e ${d}/$L.so ]; then
|
|
run "ls -al \"${d}/$L.so\" | sed -e 's/^.*-> //' -e 's;^.*/;;' -e 's/\\.so\\./-/'"
|
|
break
|
|
fi
|
|
done
|
|
restIFS
|
|
test "$d" = nowhere && test -n "$1" &&
|
|
printf 2>&1 '%s\n' "$0: library $1 not found"
|
|
done
|
|
$all || return 0 ;&
|
|
[Nn]et[Bb][Ss][Dd]|kernel)
|
|
run "uname -sr | awk '{ print \$1 \"-\" \$2 }'"
|
|
$all || return 0 ;&
|
|
netpgp)
|
|
run "netpgp -V | awk '{ sub(\"/.*\", \"\", \$3); print \"netpgp-\" \$3; exit }'"
|
|
$all || return 0 ;&
|
|
netpgpverify)
|
|
run "netpgpverify -v | awk '{ print \$1 \"-\" \$3 }'"
|
|
$all || return 0 ;&
|
|
ntp)
|
|
run "ntpq --version | awk '{ sub(\"-.\", \"\"); sub(\"p\", \"pl\", \$2); print \"ntp-\" \$2 }'"
|
|
$all || return 0 ;&
|
|
openssh|ssh)
|
|
run "ssh -V 2>&1 | awk '{ sub(\"_\", \"-\", \$1); print tolower(\$1) }'"
|
|
$all || return 0 ;&
|
|
opensshd|sshd)
|
|
run "sshd -V 2>&1 | awk '/OpenSSH/ { sub(\"_\", \"D-\", \$1); print tolower(\$1) }'"
|
|
$all || return 0 ;&
|
|
openssl)
|
|
run "openssl version 2>/dev/null | awk '{ print tolower(\$1) \"-\" \$2 }'"
|
|
$all || return 0 ;&
|
|
pcap)
|
|
if which_prog tcpdumppath tcpdump; then
|
|
run "${tcpdumppath} -h 2>&1 | awk '\$1 == \"libpcap\" { sub(\" version \", \"-\"); print }'"
|
|
fi
|
|
$all || return 0 ;&
|
|
pkg_info|pkg_install)
|
|
if which_prog infopath pkg_info; then
|
|
run "printf 'pkg_install-%s\n' \$(${infopath} -V)"
|
|
fi
|
|
$all || return 0 ;&
|
|
sh)
|
|
run "set -- \$NETBSD_SHELL; case \"\$1+\$2\" in *+BUILD*) ;; +) set -- ancient;; *) set -- \"\$1\";;esac; printf 'sh-%s\\n' \$1\${2:+-\${2#BUILD:}}"
|
|
$all || return 0 ;&
|
|
sqlite|sqlite3)
|
|
run "sqlite3 --version | awk '{ print \"sqlite3-\" \$1 }'"
|
|
$all || return 0 ;&
|
|
sys_info)
|
|
run "printf '%s\n' sys_info-${SYS_INFO_VERSION}"
|
|
$all || return 0 ;&
|
|
tcpdump)
|
|
if which_prog tcpdumppath tcpdump; then
|
|
run "${tcpdumppath} -h 2>&1 | awk '\$1 == \"tcpdump\" { sub(\" version \", \"-\"); print }'"
|
|
fi
|
|
$all || return 0 ;&
|
|
tcsh)
|
|
if which_prog tcshpath tcsh; then
|
|
run "${tcshpath} --version | awk '{ print \$1 \"-\" \$2 }'"
|
|
fi
|
|
$all || return 0 ;&
|
|
tzdata)
|
|
if [ -f ${destdir}/usr/share/zoneinfo/TZDATA_VERSION ]; then
|
|
run "cat ${destdir}/usr/share/zoneinfo/TZDATA_VERSION"
|
|
else
|
|
run "printf '%s\n' tzdata-too-old-to-matter"
|
|
fi
|
|
$all || return 0 ;&
|
|
unbound)
|
|
if which_prog unboundpath unbound-control; then
|
|
run "${unboundpath} -h | awk '/^Version/ { print \"unbound-\" \$2 }'"
|
|
else
|
|
$all || printf >&2 '%s\n' "unbound: not found"
|
|
fi
|
|
$all || return 0 ;&
|
|
[uU]ser[lL]and|release)
|
|
run "sed <${destdir}/etc/release -e 's/ /-/g' -e 's/^/userland-/' -e 1q"
|
|
$all || return 0 ;&
|
|
wpa_supplicant)
|
|
if which_prog wpapath wpa_supplicant; then
|
|
run "${wpapath} -v | awk 'NF == 2 { sub(\" v\", \"-\"); print }'"
|
|
fi
|
|
$all || return 0 ;&
|
|
xz)
|
|
run "xz --version | awk '{ print \$1 \"-\" \$4; exit }'"
|
|
$all || return 0 ;&
|
|
yacc)
|
|
run "yacc -V | sed -e 's| ||g'"
|
|
$all || return 0 ;&
|
|
|
|
'') # never matches
|
|
;; # but terminates ;& sequence
|
|
|
|
*) printf >&2 '%s\n' "Unrecognised subsystem: $1"
|
|
ERRS=1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
verbose=false
|
|
destdir=""
|
|
# check if we have our only option
|
|
while getopts "L:P:d:v" a; do
|
|
case "$a" in
|
|
L) LIBRARY_PATH=${OPTARG};;
|
|
P) PATH=${OPTARG};;
|
|
d) PATH=${OPTARG}/bin:${OPTARG}/sbin:${OPTARG}/usr/bin:${OPTARG}/usr/sbin
|
|
LIBRARY_PATH=${OPTARG}/usr/lib:${OPTARG}/usr.X11R7/lib
|
|
destdir=${OPTARG};;
|
|
v) verbose=true;;
|
|
\?) printf >&2 '%s\n' \
|
|
"Usage: $0 [-v] [-d destdir] [-L libdirs] [-P path] [system...]"
|
|
exit 2
|
|
esac
|
|
done
|
|
shift $((OPTIND - 1))
|
|
|
|
if [ $# -eq 0 ]; then
|
|
set -- ''
|
|
all=true
|
|
else
|
|
all=false
|
|
fi
|
|
|
|
ERRS=0
|
|
while [ $# -gt 0 ]; do
|
|
getversion "$1"
|
|
shift
|
|
done
|
|
exit $ERRS
|