File solve_and_install of Package initrd
#!/bin/bash -e
# parameters job_name dest_dir [binary_directory]
# script will look for job_name.t and produce job_name.solv file
# based on packages in binary_directory
job="${1:?}"
dest="${2:?}"
pkgdir="${3:-/.build.binaries}"
tmpdir=$(mktemp -d -t solv.XXXXXX)
cleanup()
{
rm -rf "$tmpdir"
}
trap cleanup EXIT
mkdir "$tmpdir/nevra"
is_rpm=
if [ -e "$pkgdir/rpm.rpm" ]; then
is_rpm=1
for pkg in "$pkgdir"/*.rpm; do
ln -s "$pkg" "$tmpdir/nevra/$(rpm -qp --qf '%{nevra}.rpm\n' $pkg)"
done
rpms2solv "$pkgdir"/*.rpm > "$job".solv
else
for pkg in "$pkgdir"/*.deb; do
ln -s "$pkg" "$tmpdir/nevra/$(dpkg-deb -W --showformat '${Package}-${Version}.${Architecture}.deb\n' $pkg)"
done
deb2solv "$pkgdir"/*.deb > "$job".solv
fi
testsolv "$job.t" > "$tmpdir/result"
cat "$tmpdir/result"
if grep -q "Found.*problems" "$tmpdir/result"; then
exit 1
fi
mkdir "$dest"
cd "$dest"
if [ -n "$is_rpm" ]; then
extract() {
rpm2cpio "$1" | cpio -id
find -type d -print0 -not -perm '/0200' | xargs -0 --no-run-if-empty chmod u+w
mkdir -p usr/lib/sysimage/rpm-headers
dd if="$1" of="usr/lib/sysimage/rpm-headers/${1##*/}" bs=96 count=1
}
extract "$pkgdir"/filesystem.rpm
while read -r dash nevra; do
[ "$dash" = '-' ] || continue
extract "$tmpdir/nevra/$nevra.rpm"
done < "$tmpdir/result"
else
extract() {
dpkg-deb -x "$1" .
find -type d -print0 -not -perm '/0200' | xargs -0 --no-run-if-empty chmod u+w
}
extract "$pkgdir"/base-files.deb
while read -r dash nevra; do
[ "$dash" = '-' ] || continue
extract "$tmpdir/nevra/$nevra.deb"
done < "$tmpdir/result"
for d in bin sbin lib; do
find "$d" -not -type d -printf "/%P\n" | while read -r f; do
mkdir -p "usr/$d/${f%/*}"
mv "$d/$f" "usr/$d/$f"
done
rm -rvf "$d"
ln -s "usr/$d" "$d"
done
fi