Nimbin[12]?Administration / depslister

depslister Administration

List dependencies of a User or a binary
This is specially useful for packageuser LFS systems

dependencies: depscollector
Synopsis
depslister [OPTION] [ARG]
DESCRIPTION
-u USER List all binaries owned by USER
-b BIN_NAME List libraries required by binary BIN_NAME
-lu USER List all libraries used by binaries owned by USER
-ldu USER List owners of libraries used by USER's binaries (who USER depends on)
-ldr USER List owners of binaries depending on libraries owned by USER (who depends on USER)
-Rldr USER List owners of binaries depending on libraries owned by USER (who depends on USER) RECURSIVE
-a List all binaries in the database
-h Show this help message

wget https://git.christianimmanuel.de/scripts/raw/Administration/depslister && chmod 740 depslister
depslister 3.9 KB · 132 lines raw
#!/bin/bash


#################################################
### List dependencies of a User or a binary
### This is specially useful for packageuser LFS systems
###
### dependencies: depscollector
### Synopsis
###      depslister [OPTION] [ARG]
### DESCRIPTION
###      -u USER       List all binaries owned by USER
###      -b BIN_NAME   List libraries required by binary BIN_NAME
###      -lu USER      List all libraries used by binaries owned by USER
###      -ldu USER     List owners of libraries used by USER's binaries (who USER depends on)
###      -ldr USER     List owners of binaries depending on libraries owned by USER (who depends on USER)
###      -Rldr USER    List owners of binaries depending on libraries owned by USER (who depends on USER) RECURSIVE
###      -a            List all binaries in the database
###      -h            Show this help message



set -euo pipefail

db_path="/var/lib/depscollector/depscollector.db"


usage() {
    cat <<EOF
Usage: $0 [option] [argument]

Options:
  -u USER       List all binaries owned by USER
  -b BIN_NAME   List libraries required by binary BIN_NAME
  -lu USER      List all libraries used by binaries owned by USER
  -ldu USER     List owners of libraries used by USER's binaries (who USER depends on)
  -ldr USER     List owners of binaries depending on libraries owned by USER (who depends on USER)
  -Rldr USER    List owners of binaries depending on libraries owned by USER (who depends on USER) RECURSIVE
  -a            List all binaries in the database
  -h            Show this help message

Examples:
  $0 -u ncurses
  $0 -b bash
  $0 -lu ncurses
  $0 -ldu ncurses
  $0 -ldr ncurses
  $0 -Rldr ncurses
  $0 -a

EOF
    exit 1
}

list_binaries_by_user() {
    sqlite3 "$db_path" "SELECT name, path FROM binaries WHERE owner_user = '$1';"
}

list_libs_for_binary() {
    sqlite3 "$db_path" "
    SELECT b.owner_user, l.name, l.path FROM libraries l
    JOIN binary_dependencies bd ON bd.library_id = l.id
    JOIN binaries b ON b.id = bd.binary_id
    WHERE b.name = '$1';
    "
}

list_libs_for_user() {
    sqlite3 "$db_path" "
    SELECT DISTINCT l.name, l.path FROM libraries l
    JOIN binary_dependencies bd ON bd.library_id = l.id
    JOIN binaries b ON b.id = bd.binary_id
    WHERE b.owner_user = '$1';
    "
}

list_users_libs_used_by_user() {
    sqlite3 "$db_path" "
    SELECT DISTINCT l.owner_user FROM libraries l
    JOIN binary_dependencies bd ON bd.library_id = l.id
    JOIN binaries b ON b.id = bd.binary_id
    WHERE b.owner_user = '$1' AND l.owner_user IS NOT NULL;
    "
}

list_users_binaries_relying_on_user() {
    sqlite3 "$db_path" "
    SELECT DISTINCT b.owner_user FROM binaries b
    JOIN binary_dependencies bd ON bd.binary_id = b.id
    JOIN libraries l ON l.id = bd.library_id
    WHERE l.owner_user = '$1' AND b.owner_user IS NOT NULL;
    "
}

declare -A visited_users

recursive_list_users_binaries_relying_on_user() {
    local user="$1"
    local indent="${2:-0}"
    local index_space
    index_space="$(printf "%*s" "$indent" "")"

    [[ "${visited_users[$user]+_}" ]] && return
    visited_users["$user"]=1

    mapfile -t deps < <(list_users_binaries_relying_on_user "$user")
    for dep in "${deps[@]}"; do
        [[ "$dep" == "$user" ]] && continue
        echo "${index_space}${dep}"
        recursive_list_users_binaries_relying_on_user "$dep" $((indent + 1))
    done
}

list_all_binaries() {
    sqlite3 "$db_path" "SELECT name, path FROM binaries;"
}

if [[ $# -eq 0 ]]; then
    usage
fi

case "$1" in
    -u) list_binaries_by_user "$2" ;;
    -b) list_libs_for_binary "$2" ;;
    -lu) list_libs_for_user "$2" ;;  # libs used by user's binaries
    -ldu) list_users_libs_used_by_user "$2" ;; # users owning libs used by user
    -ldr) list_users_binaries_relying_on_user "$2" ;; # users relying on this user
    -Rldr) recursive_list_users_binaries_relying_on_user "$2" 0;; # users owning libs used by user recursive
    -a) list_all_binaries ;;
    *) usage ;;
esac