| Index: src/scripts/dpkg_no_scripts.sh
|
| diff --git a/src/scripts/dpkg_no_scripts.sh b/src/scripts/dpkg_no_scripts.sh
|
| index 90dc377adc7d21bfd865cc9562b9486a80fea63f..c2cc7c345ee01008a225feed7eb581a9389e1342 100755
|
| --- a/src/scripts/dpkg_no_scripts.sh
|
| +++ b/src/scripts/dpkg_no_scripts.sh
|
| @@ -22,6 +22,8 @@
|
| # Flags
|
| DEFINE_string root "" \
|
| "The target rootfs directory in which to install packages."
|
| +DEFINE_boolean dpkg_fallback $FLAGS_TRUE \
|
| + "Run normal dpkg if maintainer scripts are not whitelisted."
|
| DEFINE_string status_fd "" \
|
| "The file descriptor to report status on; ignored."
|
| DEFINE_boolean unpack $FLAGS_FALSE "Is the action 'unpack'?"
|
| @@ -43,52 +45,144 @@ eval set -- "${FLAGS_ARGV}"
|
| # Die on any errors.
|
| set -e
|
|
|
| -if [ $FLAGS_configure -eq $FLAGS_TRUE ]; then
|
| - # We ignore configure requests.
|
| - exit 0
|
| -fi
|
| -if [ $FLAGS_remove -eq $FLAGS_TRUE ]; then
|
| - # We log but ignore remove requests.
|
| - echo "dpkg_no_scripts, remove: $@"
|
| - exit 0
|
| -fi
|
| -if [ $FLAGS_unpack -ne $FLAGS_TRUE ]; then
|
| - # Ignore unknown command line.
|
| - echo "Unexpected command line: $@"
|
| - exit 0
|
| -fi
|
| -if [ -z "$FLAGS_root" ]; then
|
| - echo "Missing root directory."
|
| - exit 0
|
| -fi
|
| +# Returns true if the input file is whitelisted.
|
| +#
|
| +# $1 - The file to check
|
| +is_whitelisted() {
|
| + local whitelist="${SRC_ROOT}/package_scripts/package.whitelist"
|
| + test -f "$whitelist" || return
|
|
|
| -DPKG_STATUS=""
|
| -if [ -d "$FLAGS_root/var/lib/dpkg" ]; then
|
| - DPKG_STATUS="$FLAGS_root/var/lib/dpkg/status"
|
| - DPKG_INFO="$FLAGS_root/var/lib/dpkg/info/"
|
| -fi
|
| + local checksum=$(md5sum "$1" | awk '{ print $1 }')
|
| + local count=$(grep -c "$checksum" "${whitelist}" || /bin/true)
|
| + test $count -ne 0
|
| +}
|
|
|
| -for p in "$@"; do
|
| - echo "Extracting $p"
|
| - dpkg-deb --extract "$p" "$FLAGS_root"
|
| +# Returns true if either of the two given files exist and are not whitelisted.
|
| +#
|
| +# $1 - The package name.
|
| +# $2 - The path to the preinst file if it were to exist.
|
| +# $3 - The path to the postinst file if it were to exist.
|
| +has_missing_whitelist() {
|
| + local package=$1
|
| + local preinst=$2
|
| + local postinst=$3
|
| + local missing_whitelist=0
|
| +
|
| + if [ -f "$preinst" ]; then
|
| + if ! is_whitelisted "$preinst"; then
|
| + missing_whitelist=1
|
| + echo "Warning: Missing whitelist entry for ${package}.preinst"
|
| + fi
|
| + fi
|
| + if [ -f "$postinst" ]; then
|
| + if ! is_whitelisted "$postinst"; then
|
| + missing_whitelist=1
|
| + echo "Warning: Missing whitelist entry for ${package}.postinst"
|
| + fi
|
| + fi
|
| + test $missing_whitelist -ne 0
|
| +}
|
|
|
| - if [ -n "$DPKG_STATUS" ]; then
|
| - TMPDIR=$(mktemp -d)
|
| - dpkg-deb --control "$p" "$TMPDIR"
|
| +do_configure() {
|
| + local dpkg_info="$FLAGS_root/var/lib/dpkg/info/"
|
| + local fallback_packages=""
|
| +
|
| + for p in "$@"; do
|
| + echo "Configuring: $p"
|
| +
|
| + # Make sure that any .preinst or .postinst files are whitelisted.
|
| + local preinst="${dpkg_info}/${p}.preinst"
|
| + local postinst="${dpkg_info}/${p}.postinst"
|
| + if has_missing_whitelist "$p" "$preinst" "$postinst"; then
|
| + if [ $FLAGS_dpkg_fallback -eq $FLAGS_TRUE ]; then
|
| + echo "** Warning: Will run full maintainer scripts for ${p}."
|
| + fallback_packages="$fallback_packages $p"
|
| + continue
|
| + else
|
| + # TODO: Eventually should be upgraded to a full error.
|
| + echo "** Warning: Ignoring missing whitelist for ${p}."
|
| + fi
|
| + fi
|
| +
|
| + # Run our maintainer script for this package if we have one.
|
| + local chromium_postinst="${SRC_ROOT}/package_scripts/${p}.postinst"
|
| + if [ -f "$chromium_postinst" ]; then
|
| + echo "Running: $chromium_postinst"
|
| + ROOT="$FLAGS_root" SRC_ROOT="$SRC_ROOT" sh -x $chromium_postinst
|
| + fi
|
| + done
|
| +
|
| + if [ -n "$fallback_packages" ]; then
|
| + dpkg --root="$FLAGS_root" --configure $fallback_packages
|
| + fi
|
| +}
|
| +
|
| +do_unpack() {
|
| + local dpkg_status="$FLAGS_root/var/lib/dpkg/status"
|
| + local dpkg_info="$FLAGS_root/var/lib/dpkg/info/"
|
| +
|
| + for p in "$@"; do
|
| + local package=$(dpkg-deb --field "$p" Package)
|
| + local tmpdir=$(mktemp -d)
|
| +
|
| + dpkg-deb --control "$p" "$tmpdir"
|
| +
|
| + local preinst="${tmpdir}/preinst"
|
| + local postinst="${tmpdir}/postinst"
|
| + if has_missing_whitelist "$package" "$preinst" "$postinst"; then
|
| + if [ $FLAGS_dpkg_fallback -eq $FLAGS_TRUE ]; then
|
| + echo "** Warning: Running full maintainer scripts for ${package}."
|
| + dpkg --root="$FLAGS_root" --unpack --auto-deconfigure "$p"
|
| + rm -rf "$tmpdir"
|
| + continue
|
| + else
|
| + # TODO: Eventually should be upgraded to a full error.
|
| + echo "** Warning: Ignoring missing whitelist for ${p}."
|
| + fi
|
| + fi
|
|
|
| # Copy the info files
|
| - PACKAGE=$(dpkg-deb --field "$p" Package)
|
| - FILES=$(ls "$TMPDIR" | grep -v control)
|
| - for f in $FILES; do
|
| - cp "${TMPDIR}/$f" "${DPKG_INFO}/$PACKAGE.$f"
|
| + local files=$(ls "$tmpdir" | grep -v control)
|
| + for f in $files; do
|
| + cp "${tmpdir}/${f}" "${dpkg_info}/${package}.${f}"
|
| done
|
| - touch "${DPKG_INFO}/$PACKAGE.list"
|
| + touch "${dpkg_info}/${package}.list" # TODO: Proper .list files.
|
|
|
| # Mark the package as installed successfully.
|
| - echo "Status: install ok installed" >> "$DPKG_STATUS"
|
| - cat "${TMPDIR}/control" >> "$DPKG_STATUS"
|
| - echo "" >> "$DPKG_STATUS"
|
| + echo "Status: install ok installed" >> "$dpkg_status"
|
| + cat "${tmpdir}/control" >> "$dpkg_status"
|
| + echo "" >> "$dpkg_status"
|
|
|
| - rm -rf "$TMPDIR"
|
| - fi
|
| -done
|
| + rm -rf "$tmpdir"
|
| +
|
| + # Run our maintainer script for this package if we have one.
|
| + local chromium_postinst="${SRC_ROOT}/package_scripts/${package}.preinst"
|
| + if [ -f "$chromium_preinst" ]; then
|
| + echo "Running: ${chromium_preinst}"
|
| + ROOT="$FLAGS_root" SRC_ROOT="$SRC_ROOT" $chromium_preinst
|
| + fi
|
| +
|
| + echo "Unpacking: $p"
|
| + dpkg-deb --extract "$p" "$FLAGS_root"
|
| + done
|
| +}
|
| +
|
| +# This script requires at least "--root="
|
| +if [ -z "$FLAGS_root" ]; then
|
| + echo "dpkg_no_scripts: Missing root directory."
|
| + exit 1
|
| +fi
|
| +
|
| +if [ $FLAGS_configure -eq $FLAGS_TRUE ]; then
|
| + do_configure $@
|
| +elif [ $FLAGS_unpack -eq $FLAGS_TRUE ]; then
|
| + do_unpack $@
|
| +elif [ $FLAGS_remove -eq $FLAGS_TRUE ]; then
|
| + # We log but ignore remove requests.
|
| + echo "Ignoring remove: $@"
|
| +else
|
| + echo "dpkg_no_scripts.sh: Unknown or missing command."
|
| + exit 1
|
| +fi
|
| +
|
| +exit 0
|
|
|