Archive
Archive for July, 2009
ldd2chroot – A script to extract packages
July 26, 2009
Leave a comment
At last I got some time to blog, and I did something with ‘chroot’. Here is a script which will extract ldd dependency library packages(.debs) to ‘chroot’ directory. Here is the steps it follows,
1. For the given command, get the shared libraries.
2. Then get the packages which will give the shared libraries.
3. and download those shared libraries and extract in the given ‘chroot’ directory.
I hope it will be useful to package maintainers.
#!/bin/bash
# ldd2chroot - A script to extract packages
# Author: mohan43u
USAGE="[usage]
ldd2chroot [-i chrootdir] [-p] [-h] cmd_or_pkg [...]"
HELP="${USAGE}
[description]
-i chrootdir Install pkgs in 'chrootdir'
-p 'chd_or_pkg' will be package name
-h Print this help
cmd_or_pkg Command name or package name(only for -p)"
executeldd()
{
ldd $(which "${1}")
}
getsharedlibs()
{
tr '\t' ' ' |
tr -s ' ' '\n' |
grep '^/'
}
getlibpkgs()
{
while read LIB; do dpkg -S "${LIB}"; done
}
getpkgs()
{
cut -d':' -f1 | sort | uniq
}
extractpkg()
{
for PKG
do
echo "[starting apt-get for ${PKG}]"
apt-get clean
apt-get --reinstall --download-only --yes install "${PKG}"
DEBFILE=$(find /var/cache/apt/archives -name '*.deb')
cp -p ${DEBFILE} $(pwd)
test ! -z "${CHROOTDIR}" && echo -e "[extracting ${DEBFILE} to ${CHROOTDIR}]" &&
dpkg -X "${DEBFILE}" "${CHROOTDIR}"
done
}
while getopts 'i:ph' OPTIONS
do
case "${OPTIONS}" in
i) CHROOTDIR="${OPTARG}";;
p) PKGARGS="1";;
h) echo -e "${HELP}" && exit 0;;
\?) echo -e "${USAGE}" && exit 1;;
esac
done
shift $((OPTIND - 1))
test -z "${@}" && echo -e "${USAGE}" && exit 1
for ARG
do
if test -z "${PKGARGS}"
then
LDDOUTPUT=$(executeldd "${ARG}")
echo -e "[ldd]\n${LDDOUTPUT}"
SHAREDLIBS=$(echo -e "${LDDOUTPUT}" | getsharedlibs)
SHAREDLIBS="$(which ${ARG})\n${SHAREDLIBS}"
echo -e "[sharedlibs]\n${SHAREDLIBS}"
LIBPKGS=$(echo -e "${SHAREDLIBS}" | getlibpkgs)
echo -e "[required shared library packages]\n${LIBPKGS}"
PKGS=$(echo -e "${LIBPKGS}" | getpkgs)
echo -e "[required pkgs for apt-get]\n${PKGS}"
else
PKGS="${ARG}"
fi
extractpkg ${PKGS}
done
Download: ldd2chroot
If someone improving this, let me know, so that I can also use the changes.