13f81b607Sagc#! /bin/sh 23f81b607Sagc 3*10564be9Sreed# $NetBSD: sys_info.sh,v 1.18 2020/07/14 01:01:05 reed Exp $ 43f81b607Sagc 53f81b607Sagc# Copyright (c) 2016 Alistair Crooks <agc@NetBSD.org> 63f81b607Sagc# All rights reserved. 73f81b607Sagc# 83f81b607Sagc# Redistribution and use in source and binary forms, with or without 93f81b607Sagc# modification, are permitted provided that the following conditions 103f81b607Sagc# are met: 113f81b607Sagc# 1. Redistributions of source code must retain the above copyright 123f81b607Sagc# notice, this list of conditions and the following disclaimer. 133f81b607Sagc# 2. Redistributions in binary form must reproduce the above copyright 143f81b607Sagc# notice, this list of conditions and the following disclaimer in the 153f81b607Sagc# documentation and/or other materials provided with the distribution. 163f81b607Sagc# 173f81b607Sagc# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 183f81b607Sagc# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 193f81b607Sagc# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 203f81b607Sagc# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 213f81b607Sagc# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 223f81b607Sagc# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 233f81b607Sagc# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 243f81b607Sagc# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 253f81b607Sagc# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 263f81b607Sagc# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 273f81b607Sagc# 283f81b607Sagc 29*10564be9SreedSYS_INFO_VERSION=20200714 30e5c13d3eSkre 31e5c13d3eSkrePATH=$(sysctl -n user.cs_path) 32e5c13d3eSkreexport PATH 33e5c13d3eSkre 34e5c13d3eSkreLIBRARY_PATH=${LD_LIBRARY_PATH:-/usr/lib:/usr/X11R7/lib} 35e5c13d3eSkre 36e5c13d3eSkre# default libraries when no args are given (sorted...) 37e5c13d3eSkreLIBS= 38e5c13d3eSkreLIBS="${LIBS} libc" 39e5c13d3eSkreLIBS="${LIBS} libcurses" 40e5c13d3eSkreLIBS="${LIBS} libdrm" 41e5c13d3eSkreLIBS="${LIBS} libm" 42e5c13d3eSkreLIBS="${LIBS} libresolv" 43e5c13d3eSkreLIBS="${LIBS} libsqlite" 44e5c13d3eSkreLIBS="${LIBS} libssh" 45e5c13d3eSkreLIBS="${LIBS} libstdc++" 46e5c13d3eSkreLIBS="${LIBS} libterminfo" 47e5c13d3eSkreLIBS="${LIBS} libutil" 48e5c13d3eSkreLIBS="${LIBS} libX11" 49e5c13d3eSkreLIBS="${LIBS} libXaw7" 50e5c13d3eSkreLIBS="${LIBS} libXcb" 51e5c13d3eSkreLIBS="${LIBS} libXfont" 52e5c13d3eSkreLIBS="${LIBS} libXft" 53e5c13d3eSkreLIBS="${LIBS} libXrandr" 54e5c13d3eSkreLIBS="${LIBS} libXt" 553f81b607Sagc 568df5d761Sagc# short script to look for an executable $2, and if found, to place 578df5d761Sagc# path in $1 588df5d761Sagc# taken from pkgsrc bootstrap 598df5d761Sagcwhich_prog() 608df5d761Sagc{ 61e5c13d3eSkre local IFS _var _name _d - 62e5c13d3eSkre set -f 63e5c13d3eSkre 648df5d761Sagc _var="$1"; _name="$2" 658df5d761Sagc 66e5c13d3eSkre eval _d=\"\$$_var\" 67e5c13d3eSkre if [ -n "$_d" ]; then 688df5d761Sagc # Variable is already set (by the user, for example) 698df5d761Sagc return 0 708df5d761Sagc fi 718df5d761Sagc 72e5c13d3eSkre IFS=: 73e5c13d3eSkre for _d in $PATH ; do 748df5d761Sagc if [ -f "$_d/$_name" ] && [ -x "$_d/$_name" ]; then 758df5d761Sagc # Program found 768df5d761Sagc eval $_var=\""$_d/$_name"\" 778df5d761Sagc return 0 788df5d761Sagc fi 798df5d761Sagc done 808df5d761Sagc 818df5d761Sagc return 1 828df5d761Sagc} 838df5d761Sagc 84e5c13d3eSkresavedIFS=unset 85e5c13d3eSkresaveIFS() { savedIFS="${IFS-unset}"; IFS="$1"; } 86e5c13d3eSkrerestIFS() { test "${savedIFS}" = unset && unset IFS || IFS="${savedIFS}"; } 87e5c13d3eSkre 88e5c13d3eSkrerun() { 89e5c13d3eSkre # must send to stderr, as run is used in $() sometimes. 90e5c13d3eSkre $verbose && printf >&2 '%s\n' "${PS4:-...: }${1}" 91e5c13d3eSkre eval "$1" 92e5c13d3eSkre} 93e5c13d3eSkre 94e5c13d3eSkre# print out the version for the given argument (or everything) 95e5c13d3eSkre 96e5c13d3eSkre# case patterns are sorted by output order so 97e5c13d3eSkre# sys_info 98e5c13d3eSkre# and 99e5c13d3eSkre# sys_info | sort -f 100e5c13d3eSkre# generate identical output 101e5c13d3eSkre 1023f81b607Sagcgetversion() { 1033f81b607Sagc case "$1" in 104e5c13d3eSkre '') 1059f2931ceSkre $all || return 0 ;& 1063f81b607Sagc awk) 107e5c13d3eSkre run "awk --version | awk '{ print \$1 \"-\" \$3 }'" 108e5c13d3eSkre $all || return 0 ;& 109e5c13d3eSkre [Bb][Ii][Nn][Dd]|named) 110e5c13d3eSkre run "named -v | awk '{ gsub(\"-\", \"\", \$2); gsub(\"P\", \"pl\", \$2); print tolower(\$1) \"-\" \$2 }'" 111e5c13d3eSkre $all || return 0 ;& 112e5c13d3eSkre bozohttpd|httpd) 113*10564be9Sreed v=$(run "${destdir}/usr/libexec/httpd -G") 1143f81b607Sagc case "${v}" in 1153f81b607Sagc "") 116c77bafdeSagc run "strings -a ${destdir}/usr/libexec/httpd | awk -F/ '\$1 == \"bozohttpd\" && NF == 2 { print \$1 \"-\" \$2; exit }'" 1173f81b607Sagc ;; 1183f81b607Sagc *) 119e5c13d3eSkre printf '%s\n' "bozohttpd-${v##*/}" 1203f81b607Sagc ;; 1213f81b607Sagc esac 122e5c13d3eSkre $all || return 0 ;& 123e5c13d3eSkre bzip2) 124e5c13d3eSkre run "bzip2 --help 2>&1 | awk '{ sub(\",\", \"\", \$7); print \"bzip2-\" \$7; exit }'" 125e5c13d3eSkre $all || return 0 ;& 126e5c13d3eSkre calendar) 127*10564be9Sreed v=$(run "calendar -v" || true) 128e5c13d3eSkre case "${v}" in 129e5c13d3eSkre "") printf '%s\n' "calendar-20150701" ;; 130e5c13d3eSkre *) printf '%s\n' "${v}" ;; 131e5c13d3eSkre esac 132e5c13d3eSkre $all || return 0 ;& 133e5c13d3eSkre dhcpcd) 134e5c13d3eSkre run "dhcpcd --version | sed -e 's/ /-/g' -e 1q" 135e5c13d3eSkre $all || return 0 ;& 13604892807Sjmcneill dtc) 13704892807Sjmcneill run "dtc --version | sed 's/Version: DTC /dtc-/'" 13804892807Sjmcneill $all || return 0 ;& 139e5c13d3eSkre ftpd) 140e5c13d3eSkre run "strings -a /usr/libexec/ftpd | awk '\$1 == \"NetBSD-ftpd\" { print \"ftpd-\" \$2 }'" 141e5c13d3eSkre $all || return 0 ;& 142e5c13d3eSkre g++|c++) 143e5c13d3eSkre run "g++ --version | awk '{ print \$1 \"-\" \$4; exit }'" 144e5c13d3eSkre $all || return 0 ;& 145e5c13d3eSkre gcc|cc) 146e5c13d3eSkre run "gcc --version | awk '{ print \$1 \"-\" \$4; exit }'" 147e5c13d3eSkre $all || return 0 ;& 148e5c13d3eSkre grep) 149e5c13d3eSkre run "grep --version | awk '{ print \$1 \"-\" \$4 \$5; exit }'" 150e5c13d3eSkre $all || return 0 ;& 151e5c13d3eSkre gzip) 152e5c13d3eSkre run "gzip --version 2>&1 | awk '{ print \$2 \"-\" \$3 }'" 153e5c13d3eSkre $all || return 0 ;& 1543f81b607Sagc lib*) 155e5c13d3eSkre for L in ${1:-$LIBS}; do 156e5c13d3eSkre saveIFS : 157e5c13d3eSkre for d in ${LIBRARY_PATH} nowhere; do 158e5c13d3eSkre restIFS 159e5c13d3eSkre if [ -e ${d}/$L.so ]; then 160e5c13d3eSkre run "ls -al \"${d}/$L.so\" | sed -e 's/^.*-> //' -e 's;^.*/;;' -e 's/\\.so\\./-/'" 1613f81b607Sagc break 1623f81b607Sagc fi 1633f81b607Sagc done 164e5c13d3eSkre restIFS 165e5c13d3eSkre test "$d" = nowhere && test -n "$1" && 166e5c13d3eSkre printf 2>&1 '%s\n' "$0: library $1 not found" 167e5c13d3eSkre done 168e5c13d3eSkre $all || return 0 ;& 169e5c13d3eSkre [Nn]et[Bb][Ss][Dd]|kernel) 170e5c13d3eSkre run "uname -sr | awk '{ print \$1 \"-\" \$2 }'" 171e5c13d3eSkre $all || return 0 ;& 1723f81b607Sagc netpgp) 173e5c13d3eSkre run "netpgp -V | awk '{ sub(\"/.*\", \"\", \$3); print \"netpgp-\" \$3; exit }'" 174e5c13d3eSkre $all || return 0 ;& 1753f81b607Sagc netpgpverify) 176e5c13d3eSkre run "netpgpverify -v | awk '{ print \$1 \"-\" \$3 }'" 177e5c13d3eSkre $all || return 0 ;& 1783f81b607Sagc ntp) 179e5c13d3eSkre run "ntpq --version | awk '{ sub(\"-.\", \"\"); sub(\"p\", \"pl\", \$2); print \"ntp-\" \$2 }'" 180e5c13d3eSkre $all || return 0 ;& 181e5c13d3eSkre openssh|ssh) 182e5c13d3eSkre run "ssh -V 2>&1 | awk '{ sub(\"_\", \"-\", \$1); print tolower(\$1) }'" 183e5c13d3eSkre $all || return 0 ;& 184e5c13d3eSkre opensshd|sshd) 185e5c13d3eSkre run "sshd -V 2>&1 | awk '/OpenSSH/ { sub(\"_\", \"D-\", \$1); print tolower(\$1) }'" 186e5c13d3eSkre $all || return 0 ;& 1873f81b607Sagc openssl) 188e5c13d3eSkre run "openssl version 2>/dev/null | awk '{ print tolower(\$1) \"-\" \$2 }'" 189e5c13d3eSkre $all || return 0 ;& 19089894cf8Sagc pcap) 19189894cf8Sagc if which_prog tcpdumppath tcpdump; then 19289894cf8Sagc run "${tcpdumppath} -h 2>&1 | awk '\$1 == \"libpcap\" { sub(\" version \", \"-\"); print }'" 19389894cf8Sagc fi 19489894cf8Sagc $all || return 0 ;& 195dc6cab86Sagc pkg_info|pkg_install) 196dc6cab86Sagc if which_prog infopath pkg_info; then 197fa98c4d0Skre run "printf 'pkg_install-%s\n' \$(${infopath} -V)" 198dc6cab86Sagc fi 199dc6cab86Sagc $all || return 0 ;& 200e5c13d3eSkre sh) 201e5c13d3eSkre run "set -- \$NETBSD_SHELL; case \"\$1+\$2\" in *+BUILD*) ;; +) set -- ancient;; *) set -- \"\$1\";;esac; printf 'sh-%s\\n' \$1\${2:+-\${2#BUILD:}}" 202e5c13d3eSkre $all || return 0 ;& 2033f81b607Sagc sqlite|sqlite3) 204e5c13d3eSkre run "sqlite3 --version | awk '{ print \"sqlite3-\" \$1 }'" 205e5c13d3eSkre $all || return 0 ;& 2068df5d761Sagc sys_info) 207e5c13d3eSkre run "printf '%s\n' sys_info-${SYS_INFO_VERSION}" 208e5c13d3eSkre $all || return 0 ;& 20989894cf8Sagc tcpdump) 21089894cf8Sagc if which_prog tcpdumppath tcpdump; then 21189894cf8Sagc run "${tcpdumppath} -h 2>&1 | awk '\$1 == \"tcpdump\" { sub(\" version \", \"-\"); print }'" 21289894cf8Sagc fi 21389894cf8Sagc $all || return 0 ;& 2143f81b607Sagc tcsh) 2158df5d761Sagc if which_prog tcshpath tcsh; then 216e5c13d3eSkre run "${tcshpath} --version | awk '{ print \$1 \"-\" \$2 }'" 2178df5d761Sagc fi 218e5c13d3eSkre $all || return 0 ;& 2193e739125Sagc tzdata) 220c77bafdeSagc if [ -f ${destdir}/usr/share/zoneinfo/TZDATA_VERSION ]; then 221c77bafdeSagc run "cat ${destdir}/usr/share/zoneinfo/TZDATA_VERSION" 222e5c13d3eSkre else 223e5c13d3eSkre run "printf '%s\n' tzdata-too-old-to-matter" 2243e739125Sagc fi 225e5c13d3eSkre $all || return 0 ;& 2263f81b607Sagc unbound) 2278df5d761Sagc if which_prog unboundpath unbound-control; then 228e5c13d3eSkre run "${unboundpath} -h | awk '/^Version/ { print \"unbound-\" \$2 }'" 2298df5d761Sagc else 230e5c13d3eSkre $all || printf >&2 '%s\n' "unbound: not found" 2318df5d761Sagc fi 232e5c13d3eSkre $all || return 0 ;& 233e5c13d3eSkre [uU]ser[lL]and|release) 234c77bafdeSagc run "sed <${destdir}/etc/release -e 's/ /-/g' -e 's/^/userland-/' -e 1q" 235e5c13d3eSkre $all || return 0 ;& 23689894cf8Sagc wpa_supplicant) 23789894cf8Sagc if which_prog wpapath wpa_supplicant; then 23889894cf8Sagc run "${wpapath} -v | awk 'NF == 2 { sub(\" v\", \"-\"); print }'" 23989894cf8Sagc fi 24089894cf8Sagc $all || return 0 ;& 2413f81b607Sagc xz) 242e5c13d3eSkre run "xz --version | awk '{ print \$1 \"-\" \$4; exit }'" 243e5c13d3eSkre $all || return 0 ;& 244da4a8c85Sagc yacc) 245da4a8c85Sagc run "yacc -V | sed -e 's| ||g'" 246da4a8c85Sagc $all || return 0 ;& 247e5c13d3eSkre 248e5c13d3eSkre '') # never matches 249e5c13d3eSkre ;; # but terminates ;& sequence 250e5c13d3eSkre 251e5c13d3eSkre *) printf >&2 '%s\n' "Unrecognised subsystem: $1" 252e5c13d3eSkre ERRS=1 2533f81b607Sagc ;; 2543f81b607Sagc esac 2553f81b607Sagc} 2563f81b607Sagc 257e5c13d3eSkreverbose=false 258c77bafdeSagcdestdir="" 2598df5d761Sagc# check if we have our only option 260c77bafdeSagcwhile getopts "L:P:d:v" a; do 261e5c13d3eSkre case "$a" in 262e5c13d3eSkre L) LIBRARY_PATH=${OPTARG};; 263e5c13d3eSkre P) PATH=${OPTARG};; 264c77bafdeSagc d) PATH=${OPTARG}/bin:${OPTARG}/sbin:${OPTARG}/usr/bin:${OPTARG}/usr/sbin 265c77bafdeSagc LIBRARY_PATH=${OPTARG}/usr/lib:${OPTARG}/usr.X11R7/lib 266c77bafdeSagc destdir=${OPTARG};; 267c77bafdeSagc v) verbose=true;; 268e5c13d3eSkre \?) printf >&2 '%s\n' \ 269598b83d4Swiz "Usage: $0 [-v] [-d destdir] [-L libdirs] [-P path] [system...]" 270e5c13d3eSkre exit 2 2713f81b607Sagc esac 2723f81b607Sagcdone 273e5c13d3eSkreshift $((OPTIND - 1)) 2743f81b607Sagc 27565b09bb6Sagcif [ $# -eq 0 ]; then 276e5c13d3eSkre set -- '' 27765b09bb6Sagc all=true 2788df5d761Sagcelse 279e5c13d3eSkre all=false 2803f81b607Sagcfi 2813f81b607Sagc 282e5c13d3eSkreERRS=0 2833f81b607Sagcwhile [ $# -gt 0 ]; do 284e5c13d3eSkre getversion "$1" 2853f81b607Sagc shift 2863f81b607Sagcdone 287e5c13d3eSkreexit $ERRS 288