#!/bin/bash # lddtree-parabola-packages - identify packages providing libraries which are in # the linkage chain of a specified binary # # Copyright (C) 2022 bill-auger # # SPDX-License-Identifier: AGPL-3.0-or-later # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . readonly REPOS_RX='^(libre|nonprism|nonsystem|pcr)' LogLibErr() { echo "ERROR: no lib ${lib}" >&2 ; } ; LogPkgErr() { echo "ERROR: no pkg ${pkg} for lib ${lib}" >&2 ; } ; Main() { local a_bin="$(which $1)" local libs=() local pkg local lib local file_meta local repo local name local parabola_pkgs=() local upstream_pkgs=() [[ -x "${a_bin}" ]] || ! echo "USAGE: $0 " >&2 || return 1 libs=( $(lddtree ${a_bin} | cut -d '>' -f 2 | sort -u | grep '\.so[^\)]*$') ) echo "digging the linkage chain for: '${a_bin}'" for pkg in $( for lib in "${libs[@]}" do file_meta="$(file --dereference "${lib}")" [[ "${file_meta}" =~ "${lib}: ELF " ]] && pkgfile ${lib} || LogLibErr done | sort -u ) do repo=${pkg/\/*/} name=${pkg/*\//} [[ "${repo}" =~ ${REPOS_RX} ]] && parabola_pkgs+=(${pkg}) || upstream_pkgs+=(${pkg}) done echo -e "\nupstream packages:" ; (( ${#upstream_pkgs[@]} )) && printf "\t%s\n" "${upstream_pkgs[@]}" echo -e "\nparabola packages:" ; (( ${#parabola_pkgs[@]} )) && printf "\t%s\n" "${parabola_pkgs[@]}" } Main "$@"