Changes: * Align columns with "column -t" * Add Arch Linux support in packages.sh
80 lines
4.8 KiB
Bash
Executable file
80 lines
4.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# SPDX-FileCopyrightText: 2024 Splunk, Inc.
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
# shellcheck disable=SC1091
|
|
. "$(dirname "$0")"/common.sh
|
|
|
|
assertHaveCommand column
|
|
|
|
HEADER='NAME VERSION RELEASE ARCH VENDOR GROUP'
|
|
HEADERIZE="BEGIN {print \"$HEADER\"}"
|
|
PRINTF='{printf "%-55.55s %-20.20s %-20.20s %-10.10s %-30.30s %-20s\n", name, version, release, arch, vendor, group}'
|
|
|
|
CMD='echo There is no flavor-independent command...'
|
|
if [ "$KERNEL" = "Linux" ] ; then
|
|
OSName=$(cat /etc/*release | grep '\bNAME=' | cut -d '=' -f2 | tr ' ' '_' | cut -d\" -f2)
|
|
if $DEBIAN; then
|
|
CMD1="eval dpkg-query -W -f='"
|
|
# shellcheck disable=SC2016
|
|
CMD2='${Package} ${Version} ${Architecture} ${Homepage}\n'
|
|
CMD3="'"
|
|
CMD=$CMD1$CMD2$CMD3
|
|
# shellcheck disable=SC2016
|
|
FORMAT='{name=$1;version=$2;sub("\\.?[^0-9\\.:\\-].*$", "", version); release=$2; sub("^[0-9\\.:\\-]*","",release); if(release=="") {release="?"}; arch=$3; if (NF>3) {sub("^.*:\\/\\/", "", $4); sub("^www\\.", "", $4); sub("\\/.*$", "", $4); vendor=$4} else {vendor="?"} group="?"}'
|
|
elif [ "$OSName" = "Arch_Linux" ] || [ "$OSName" = "Arch_Linux_ARM" ]; then
|
|
CMD="eval pacman -Q"
|
|
# shellcheck disable=SC2016
|
|
FORMAT="{name=\$1;version=\$2; release=\"?\"; arch=\"$(eval uname -m | sed -r "s/(armv7l|aarch64)/arm64/;s/x86_64/amd64/")\"; vendor=\"?\"; group=\"?\"}"
|
|
else
|
|
CMD='eval rpm --query --all --queryformat "%-56{name} %-21{version} %-21{release} %-11{arch} %-31{vendor} %-{group}\n"'
|
|
# shellcheck disable=SC2016
|
|
PRINTF='{print $0}'
|
|
fi
|
|
elif [ "$KERNEL" = "SunOS" ] ; then
|
|
CMD='pkginfo -l'
|
|
# shellcheck disable=SC2016
|
|
FORMAT='/PKGINST:/ {name=$2 ":"} /NAME:/ {for (i=2;i<=NF;i++) name = name " " $i} /CATEGORY:/ {group=$2} /ARCH:/ {arch=$2} /VERSION:/ {split($2,a,",REV="); version=a[1]; release=a[2]} /VENDOR:/ {vendor=$2; for(i=3;i<=NF;i++) vendor = vendor " " $i}'
|
|
SEPARATE_RECORDS='!/^$/ {next} {release = release ? release : "?"}'
|
|
elif [ "$KERNEL" = "AIX" ] ; then
|
|
CMD='eval lslpp -icq | sed "s,:, ," | sed "s,:.*,,"'
|
|
# shellcheck disable=SC2016
|
|
FORMAT='{name=$2 ; version=$3 ; vendor=release=arch=group="?"}'
|
|
elif [ "$KERNEL" = "Darwin" ] ; then
|
|
CMD='system_profiler SPApplicationsDataType'
|
|
FILTER='{ if (NR<3) next}'
|
|
# shellcheck disable=SC2016
|
|
FORMAT='{gsub("[^\40-\176]", "", $0)} /:$/ {sub("^[ ]*", "", $0); sub(":$", "", $0); name=$0} /Last Modified: / {vendor=""} /Version: / {version=$2} /Kind: / {arch=$2} /Get Info String: / {sub("^.*: ", "", $0); sub("[Aa]ll [Rr]ights.*$", "", $0); sub("^.*[Cc]opyright", "", $0); sub("^[^a-zA-Z_]*[0-9][0-9[0-9][0-9]", "", $0); sub("^[ ]*", "", $0); vendor=$0}'
|
|
SEPARATE_RECORDS='!/Location:/ {next} {release = "?"; vendor = vendor ? vendor : "?"; group = "?"}'
|
|
elif [ "$KERNEL" = "HP-UX" ] ; then
|
|
assertHaveCommand swlist
|
|
CMD='swlist -a revision -a architecture -a vendor_tag'
|
|
# shellcheck disable=SC2016
|
|
FILTER='/^#/ {next} $1=="" {next}'
|
|
# shellcheck disable=SC2016
|
|
FORMAT='{release="?"; group="?"; vendor="?"; name=$1; version=$2; arch=$3} NF==4 {vendor=$4}'
|
|
elif [ "$KERNEL" = "OpenBSD" ] ; then
|
|
CMD=pkg_info
|
|
HEADER='NAME VERSION ARCH '
|
|
HEADERIZE="BEGIN {print \"$HEADER\"; arch=\"$(arch -s)\"}"
|
|
#PRINTF='{ printf "%-50s %-50s %s\n",$1,$2,$3}'
|
|
PRINTF='{name=gensub(/-[0-9].*$/,"",1,$1); suffix=gensub(/^.*-([0-9][^-]*)/,"",1,$1); if (suffix!="") suffix="," suffix; version=gensub(/^.*-([0-9][^-]*)-?.*$/,"\\1",1,$1); printf "%-50s %-50s %s\n", name suffix, version, arch}'
|
|
elif [ "$KERNEL" = "FreeBSD" ] ; then
|
|
# the below syntax is valid when using zsh, bash, ksh
|
|
if [[ $KERNEL_RELEASE =~ 10.* ]] || [[ $KERNEL_RELEASE =~ 11.* ]] || [[ $KERNEL_RELEASE =~ 12.* ]] || [[ $KERNEL_RELEASE =~ 13.* ]]; then
|
|
CMD='eval pkg info --raw --all | grep "^name:\|^version:\|^arch:" | cut -d\" -f2'
|
|
HEADER='NAME VERSION ARCH '
|
|
HEADERIZE="BEGIN {print \"$HEADER\"}"
|
|
# shellcheck disable=SC2016
|
|
PRINTF='{ printf "%-50.50s" (NR%3==0 ? RS:FS),$1}'
|
|
else
|
|
CMD='pkg_info -da'
|
|
# shellcheck disable=SC2016
|
|
FORMAT='/^Information for / {vendor=""; sub(":$", "", $3); name=$3} /^WWW: / {sub("^.*//", "", $2); sub("/.*$", "", $2); sub("^www\134.", "", $2); vendor=$2} /^$/ {blanks+=1} !/^$/ {blanks=0}'
|
|
SEPARATE_RECORDS='(blanks<3) {next} {vendor = vendor ? vendor : "?"; version=release=arch=group="?"}'
|
|
fi
|
|
fi
|
|
|
|
assertHaveCommand "$CMD"
|
|
$CMD | tee "$TEE_DEST" | $AWK "$HEADERIZE $FILTER $FORMAT $SEPARATE_RECORDS $PRINTF" header="$HEADER" | column -t
|
|
echo "Cmd = [$CMD]; | $AWK '$HEADERIZE $FILTER $FORMAT $SEPARATE_RECORDS $PRINTF' header=\"$HEADER\"" >> "$TEE_DEST"
|