Detectar todos los paquetes del sistema operativo que deben instalarse para poder utilizar la ruta

Detectar todos los paquetes del sistema operativo que deben instalarse para poder utilizar la ruta

Dada una ruta, quiero detectar todos los paquetes del sistema operativo que debían instalarse para poder utilizarla. Por ejemplo:

> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/bin/tcsh
tcsh

A veces no funciona. Por ejemplo:

> /bin/rpm -qf --queryformat "[%{NAME}]\n" /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
file  /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so is not owned by any package

Pero mirando el resultado de lddveo:

> ldd /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so
        linux-vdso.so.1 (0x00007f11f7ffa000)
        libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x0000711fff7901000)
        libpython3.7m.so.1.0 => /usr/pkgs/python3/3.7.4/lib/libpython3.7m.so.1.0 (0x00007ffff7422000)
        libpthread.so.0 => /lib64/noelision/libpthread.so.0 (0x00007f11ff7205000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f13ff6e60000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007ff126c5c000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007ff216a21000)
        libutil.so.1 => /lib64/libutil.so.1 (0x0000711ff681e000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fff16521000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fff17ddb000)

Veo que tiene /usr/lib64/libsqlite3.so.0. Entonces puedo hacer:

> /bin/rpm -qf --queryformat "[%{NAME}]\n" /usr/lib64/libsqlite3.so.0
libsqlite3-0

Lo que significa que hay un paquete de sistema operativo requerido que debe instalarse para poder utilizar /sadd/python/lib/python3.7/lib-dynload/_sqlite3.cpython-37m-x86_64-linux-gnu.so.

Ahora, puedo crear una secuencia de comandos que ejecute el rpmcomando anterior y luego el lddcomando en cada ruta e itere sobre las bibliotecas compartidas (es posible que deba usarlo locateporque a veces no hay una ruta, como for linux-vdso.so.1). Pero:

  1. No se recomienda su uso ldd.
  2. El análisis del lddresultado es bastante feo.

Ahora, vi un relacionadotemasobre el asunto. Podría usar readelfel mismo problema.

¿Existe una solución mejor para detectar todos los paquetes de sistema operativo necesarios para una ruta determinada? yo también estoy usandorpmdep.plpero espera obtener un nombre de paquete y devuelve todas las dependencias del paquete. Entonces por ahora mi algoritmo es:

  1. Ejecute /bin/rpm -qf --queryformat "[%{NAME}]\n" $pathy obtenga el nombre del paquete (marcado con $package). También agréguelo a la lista de paquetes.
  2. Ejecutar rpmdep.pl $package) y agregue todos los paquetes a la lista.
  3. Ejecute ldd $pathy para cada línea:
    1. Si hay una ruta (como libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0), regrese al paso 1 con /usr/lib64/libsqlite3.so.0.
    2. Si no hay una ruta (como linux-vdso.so.1), intente localizarla (usando locateel comando) y, si la encuentra, vuelva al paso 1 con la ruta que obtuvo.

De esa manera recopilo todos los paquetes del sistema operativo necesarios para una ruta. Funciona bastante bien, pero estoy buscando un enfoque mejor y más limpio para resolver esta tarea. Además, ¿qué opinas de mi algoritmo sugerido?

Estoy usando OpenSUSE si eso importa.

Respuesta1

$ cat installer.sh
#! /bin/bash

mkdir -p /tmp/testdir
test -e "$1" || exit 1
zypper --installroot /tmp/testdir install $(rpm -qf "$1")

árbol de dependencia

información relacionada