X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/98c934f2723d63d00908803ad47ab1359081ec2d..0e071dfe205ad21d8b929b4bb8164b008dc7c474:/test/integration/test-failing-maintainer-scripts diff --git a/test/integration/test-failing-maintainer-scripts b/test/integration/test-failing-maintainer-scripts index 3dd7d643e..8cf2380ee 100755 --- a/test/integration/test-failing-maintainer-scripts +++ b/test/integration/test-failing-maintainer-scripts @@ -1,18 +1,19 @@ #!/bin/sh set -e -TESTDIR=$(readlink -f $(dirname $0)) -. $TESTDIR/framework +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" setupenvironment configarchitecture 'native' +configdpkgnoopchroot # create a bunch of failures createfailure() { setupsimplenativepackage "failure-$1" 'native' '1.0' 'unstable' 'Depends: dependee' BUILDDIR="incoming/failure-$1-1.0" echo '#!/bin/sh -exit 29' > ${BUILDDIR}/debian/$1 +exit 29' > "${BUILDDIR}/debian/$1" buildpackage "$BUILDDIR" 'unstable' 'main' 'native' rm -rf "$BUILDDIR" } @@ -25,90 +26,45 @@ createfailure 'postrm' setupaptarchive -# create a library to noop chroot() and rewrite maintainer script executions -# via execvp() as used by dpkg as we don't want our rootdir to be a fullblown -# chroot directory dpkg could chroot into to execute the maintainer scripts -cat << EOF > noopchroot.c -#define _GNU_SOURCE -#include -#include -#include -#include - -static char * chrootdir = NULL; - -int chroot(const char *path) { - printf("WARNING: CHROOTing to %s was ignored!\n", path); - free(chrootdir); - chrootdir = strdup(path); - return 0; -} -int execvp(const char *file, char *const argv[]) { - static int (*func_execvp) (const char *, char * const []) = NULL; - if (func_execvp == NULL) - func_execvp = (int (*) (const char *, char * const [])) dlsym(RTLD_NEXT, "execvp"); - if (chrootdir == NULL || strncmp(file, "/var/lib/dpkg/", strlen("/var/lib/dpkg/")) != 0) - return func_execvp(file, argv); - printf("REWRITE execvp call %s into %s\n", file, chrootdir); - char newfile[strlen(chrootdir) + strlen(file)]; - strcpy(newfile, chrootdir); - strcat(newfile, file); - return func_execvp(newfile, argv); -} -EOF -testsuccess gcc -fPIC -shared -o noopchroot.so noopchroot.c -ldl - -mkdir -p "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/" -DPKG="${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" -echo "#!/bin/sh -if [ -n \"\$LD_PRELOAD\" ]; then - export LD_PRELOAD=\"${TMPWORKINGDIRECTORY}/noopchroot.so \${LD_PRELOAD}\" -else - export LD_PRELOAD=\"${TMPWORKINGDIRECTORY}/noopchroot.so\" -fi -dpkg \"\$@\"" > $DPKG -chmod +x $DPKG -sed -ie "s|^DPKG::options:: \"dpkg\";\$|DPKG::options:: \"$DPKG\";|" aptconfig.conf - # setup some pre- and post- invokes to check the output isn't garbled later APTHOOK="${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apthook" echo '#!/bin/sh echo "$1: START" echo "$1: MaiN" -echo "$1: ENd"' > $APTHOOK -chmod +x $APTHOOK +echo "$1: ENd"' > "$APTHOOK" +chmod +x "$APTHOOK" echo "DPKG::Pre-Invoke:: \"${APTHOOK} PRE\"; DPKG::Post-Invoke:: \"${APTHOOK} POST\";" > rootdir/etc/apt/apt.conf.d/99apthooks testmyfailure() { local PROGRESS='rootdir/tmp/progress.log' - exec 3> $PROGRESS + exec 3> "$PROGRESS" testfailure "$@" -o APT::Status-Fd=3 msgtest 'Test for failure message of maintainerscript in' 'console log' local TEST='rootdir/tmp/testfailure.output' if grep -q 'exit status 29' "$TEST"; then msgpass else - cat $TEST + cat "$TEST" msgfail fi msgtest 'Test for proper execution of invoke scripts in' 'console log' - if grep -q '^PRE: START$' $TEST && - grep -q '^PRE: MaiN$' $TEST && - grep -q '^PRE: ENd$' $TEST && - grep -q '^POST: START$' $TEST && - grep -q '^POST: MaiN$' $TEST && - grep -q '^POST: ENd$' $TEST; then + if grep -q '^PRE: START$' "$TEST" && + grep -q '^PRE: MaiN$' "$TEST" && + grep -q '^PRE: ENd$' "$TEST" && + grep -q '^POST: START$' "$TEST" && + grep -q '^POST: MaiN$' "$TEST" && + grep -q '^POST: ENd$' "$TEST"; then msgpass else - cat $TEST + cat "$TEST" msgfail fi msgtest 'Test for failure message of maintainerscript in' 'progress log' if grep -q '^pmerror:.\+exit status 29$' "$PROGRESS"; then msgpass else - cat $PROGRESS + cat "$PROGRESS" msgfail fi testmarkedauto 'dependee' @@ -128,5 +84,8 @@ testdpkginstalled failure-postrm testmyfailure aptget purge failure-postrm -y # FIXME: test with output going to a PTY as it usually does -#cp -a rootdir/var/lib/dpkg/status.backup rootdir/var/lib/dpkg/status -#aptget install failure-preinst -y +if false; then + cp -a rootdir/var/lib/dpkg/status.backup rootdir/var/lib/dpkg/status + apt install dependee -y || true + apt install failure-postinst -y || true +fi