summaryrefslogtreecommitdiff
path: root/lddtree-parabola-packages
blob: 6682557e6c261fcf6b23e83d5734a155bf3903d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/bin/bash

# lddtree-parabola-packages - identify packages providing libraries which are in
# the linkage chain of a specified binary
#
# Copyright (C) 2022 bill-auger <bill-auger@programmer.net>
#
# 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 <https://www.gnu.org/licenses/>.


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 <elf_file>" >&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 "$@"