#!/bin/sh
# deps -- enumerate all installed software on this system
# outputs one line per dep: NAME<tab>VERSION<tab>SOURCE
# used by cve script for local matching
# pacman (system packages + AUR)
pacman -Q 2>/dev/null | while IFS=' ' read -r name ver; do
printf '%s\t%s\tpacman\n' "$name" "$ver"
done
# python (pip)
pip list --format=freeze 2>/dev/null | while IFS='=' read -r name _ ver; do
[ -n "$name" ] && printf '%s\t%s\tpip\n' "$name" "$ver"
done
# python (pipx)
pipx list --short 2>/dev/null | while read -r name ver _; do
[ -n "$name" ] && printf '%s\t%s\tpipx\n' "$name" "$ver"
done
# node (npm global)
npm list -g --depth=0 --parseable --long 2>/dev/null | tail -n +2 | while IFS= read -r line; do
pkg=$(basename "$line" | sed 's/@[^@]*$//')
ver=$(basename "$line" | grep -o '@[^@]*$' | tr -d '@')
[ -n "$pkg" ] && printf '%s\t%s\tnpm\n' "$pkg" "$ver"
done
# rust (cargo)
cargo install --list 2>/dev/null | grep -E '^[a-zA-Z]' | while read -r name ver _; do
ver=$(echo "$ver" | tr -d 'v:')
[ -n "$name" ] && printf '%s\t%s\tcargo\n' "$name" "$ver"
done
# flatpak
flatpak list --columns=application,version 2>/dev/null | tail -n +1 | while IFS=$'\t' read -r app ver; do
[ -n "$app" ] && printf '%s\t%s\tflatpak\n' "$app" "$ver"
done
# kernel
printf 'linux\t%s\tkernel\n' "$(uname -r)"
# running services (no version, but useful for matching product names)
systemctl list-units --type=service --state=running --no-legend 2>/dev/null | awk '{print $1}' | sed 's/\.service$//' | while read -r svc; do
printf '%s\t-\tservice\n' "$svc"
done
# docker containers
if command -v docker >/dev/null 2>&1; then
docker ps --format '{{.Image}}' 2>/dev/null | while read -r img; do
name=$(echo "$img" | sed 's/:.*//; s|.*/||')
ver=$(echo "$img" | grep -o ':.*' | tr -d ':')
[ -z "$ver" ] && ver="latest"
printf '%s\t%s\tdocker\n' "$name" "$ver"
done
fi