From e714badd9f62109d9c9fcd067deb806e0a51cb3a Mon Sep 17 00:00:00 2001 From: Holger Levsen Date: Tue, 16 Dec 2014 12:53:58 +0100 Subject: move setup.sh to bin/find_dpkg_trigger_cycles.sh --- bin/find_dpkg_trigger_cycles.sh | 243 ++++++++++++++++++++++++++++++++++++++++ setup.sh | 243 ---------------------------------------- 2 files changed, 243 insertions(+), 243 deletions(-) create mode 100755 bin/find_dpkg_trigger_cycles.sh delete mode 100755 setup.sh diff --git a/bin/find_dpkg_trigger_cycles.sh b/bin/find_dpkg_trigger_cycles.sh new file mode 100755 index 00000000..123488fc --- /dev/null +++ b/bin/find_dpkg_trigger_cycles.sh @@ -0,0 +1,243 @@ +#!/bin/sh +# +# Copyright 2014 Johannes Schauer +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# Running +# ======= +# +# Just start `./setup.sh`. It will do the following: +# +# 1. download apt sources and apt-file data for the amd64 Debian sid snapshot at +# `20141211T041251Z` and store them in a directory tree rooted at +# `./debian-sid-amd64` +# 2. go through all binary packages which have a file `DEBIAN/triggers` in their +# control archive (the list is retrieved from binarycontrol.debian.net) +# and for each package: +# 1. download and unpack its control archive +# 2. store all interest-await file triggers in the file `interested-file` +# 3. store all interest-await explicit triggers in the file `interested-explicit` +# 4. store all activate-await file triggers in the file `activated-file` +# 5. store all activate-await explicit triggers in the file `activated-explicit` +# 6. remove the downloaded binary package and unpacked control archive +# 3. go through `interested-file` and for each line: +# 1. calculate the dependency closure for the binary package and for +# each package in the closure: +# 1. use `apt-file` to get all files of the package +# 2. check if the current file trigger matches any file in the package +# 3. store any hits in the file `result-file` +# 4. go through `interested-file` and for each line: +# 1. calculate the dependency closure for the binary package and for +# each package in the closure: +# 1. check if the package activates the current file trigger +# 2. append any hits to the file `result-file` +# 5. go through `interested-explicit` and for each line: +# 1. calculate the dependency closure for the binary package and for +# each package in the closure: +# 1. check if the package activate the current explicit trigger +# 2. store any hits in the file `result-explicit` +# +# Files +# ===== +# +# interested-file +# --------------- +# +# Associates binary packages to file triggers they are interested in. The first +# column is the binary package, the second column is either `interest` or +# `interest-await` and the last column the path they are interested in. +# +# interested-explicit +# ------------------- +# +# Associates binary packages to explicit triggers they are interested in. The +# first column is the binary package, the second column is either `interest` or +# `interest-await` and the last column the name of the explicit trigger they are +# interested in. +# +# activated-file +# -------------- +# +# Associates binary packages to file triggers they activate. The first column is +# the binary package, the second column is either `activate` or `activate-await` +# and the last column the path they activate. +# +# activate-explicit +# ----------------- +# +# Associates binary packages to explicit triggers they activate. The first column +# is the binary package, the second column is either `activate` or +# `activate-await` and the last column the explicit trigger they activate. +# +# result-file +# ----------- +# +# Associates binary packages with other binary packages they can form a file +# trigger cycle with. The first column is the binary package containing the file +# trigger, the second column is the file trigger, the third column is a binary +# package providing a path that triggers the binary package in the first column, +# the fourth column is the triggering path of provided by the binary package in +# the third column. +# +# result-explicit +# --------------- +# +# Associates binary packages with other binary packages they can form an explicit +# trigger cycle with. The first column is the binary package interested in the +# explicit trigger, the second column is the name of the explicit trigger, the +# third column is the binary package activating the trigger. + +set -e + +ARCH="amd64" +DIST="sid" +MIRROR="http://http.debian.net/debian" +#MIRROR="http://snapshot.debian.org/archive/debian/20141211T041251Z/" +DIRECTORY="`pwd`/debian-$DIST-$ARCH" + +#FIXME: if the host has more than one arch enabled then those Packages files will be downloaded as well + +APT_OPTS="-y" +APT_OPTS=$APT_OPTS" -o Apt::Architecture=$ARCH" +APT_OPTS=$APT_OPTS" -o Dir::Etc::TrustedParts=$DIRECTORY/etc/apt/trusted.gpg.d" +APT_OPTS=$APT_OPTS" -o Dir::Etc::Trusted=$DIRECTORY/etc/apt/trusted.gpg" +APT_OPTS=$APT_OPTS" -o Dir=$DIRECTORY/" +APT_OPTS=$APT_OPTS" -o Dir::Etc=$DIRECTORY/etc/apt/" +APT_OPTS=$APT_OPTS" -o Dir::Etc::SourceList=$DIRECTORY/etc/apt/sources.list" +APT_OPTS=$APT_OPTS" -o Dir::State=$DIRECTORY/var/lib/apt/" +APT_OPTS=$APT_OPTS" -o Dir::State::Status=$DIRECTORY/var/lib/dpkg/status" +APT_OPTS=$APT_OPTS" -o Dir::Cache=$DIRECTORY/var/cache/apt/" +#APT_OPTS=$APT_OPTS" -o Acquire::Check-Valid-Until=false" # because we use snapshot + +mkdir -p $DIRECTORY +mkdir -p $DIRECTORY/etc/apt/ +mkdir -p $DIRECTORY/etc/apt/trusted.gpg.d/ +mkdir -p $DIRECTORY/etc/apt/sources.list.d/ +mkdir -p $DIRECTORY/etc/apt/preferences.d/ +mkdir -p $DIRECTORY/var/lib/apt/ +mkdir -p $DIRECTORY/var/lib/apt/lists/partial/ +mkdir -p $DIRECTORY/var/lib/dpkg/ +mkdir -p $DIRECTORY/var/cache/apt/ +mkdir -p $DIRECTORY/var/cache/apt/apt-file/ + +cp /etc/apt/trusted.gpg.d/* $DIRECTORY/etc/apt/trusted.gpg.d/ + +touch $DIRECTORY/var/lib/dpkg/status + +echo deb $MIRROR $DIST main > $DIRECTORY/etc/apt/sources.list + +apt-get $APT_OPTS update + +APT_FILE_OPTS="--architecture $ARCH" +APT_FILE_OPTS=$APT_FILE_OPTS" --cache $DIRECTORY/var/cache/apt/apt-file" +APT_FILE_OPTS=$APT_FILE_OPTS" --sources-list $DIRECTORY/etc/apt/sources.list" + +apt-file $APT_FILE_OPTS update + +printf "" > interested-file +printf "" > interested-explicit +printf "" > activated-file +printf "" > activated-explicit + +# find all binary packages with /triggers$ +curl "http://binarycontrol.debian.net/?q=&path=%2Ftriggers%24&format=pkglist" \ + | xargs apt-get $APT_OPTS --print-uris download \ + | sed -ne "s/^'\([^']\+\)'\s\+\([^_]\+\)_.*/\2 \1/p" \ + | sort \ + | while read pkg url; do + echo "working on $pkg..." >&2 + mkdir DEBIAN + curl --retry 2 --location --silent "$url" \ + | dpkg-deb --ctrl-tarfile /dev/stdin \ + | tar -C "DEBIAN" --exclude=./md5sums -x + if [ ! -f DEBIAN/triggers ]; then + rm -r DEBIAN + continue + fi + # find all triggers that are either interest or interest-await + # and which are file triggers (start with a slash) + egrep "^\s*interest(-await)?\s+/" DEBIAN/triggers | while read line; do + echo "$pkg $line" + done >> interested-file + egrep "^\s*interest(-await)?\s+[^/]" DEBIAN/triggers | while read line; do + echo "$pkg $line" + done >> interested-explicit + egrep "^\s*activate(-await)?\s+/" DEBIAN/triggers | while read line; do + echo "$pkg $line" + done >> activated-file + egrep "^\s*activate(-await)?\s+[^/]" DEBIAN/triggers | while read line; do + echo "$pkg $line" + done >> activated-explicit + rm -r DEBIAN +done + +printf "" > result-file + +# go through those that are interested in a path and check them against the +# files provided by its dependency closure +cat interested-file | while read pkg ttype ipath; do + echo "working on $pkg..." >&2 + echo "getting dependency closure..." >&2 + # go through all packages in the dependency closure and check if any + # of the files they ship match one of the interested paths + dose-ceve -c $pkg -T cudf -t deb \ + $DIRECTORY/var/lib/apt/lists/*_dists_${DIST}_main_binary-${ARCH}_Packages \ + | awk '/^package:/ { print $2 }' \ + | apt-file $APT_FILE_OPTS show -F --from-file - \ + | sed -ne "s ^\([^:]\+\):\s\+\(${ipath}/.*\) \1\t\2 p" \ + | while read dep cpath; do + [ "$pkg" != "$dep" ] || continue + echo "$pkg $ipath $dep $cpath" + done >> result-file +done + +# go through those that are interested in a path and check them against the +# packages in the dependency closure which activate such a path +cat interested-file | while read pkg ttype ipath; do + echo "working on $pkg..." >&2 + echo "getting dependency closure..." >&2 + # go through all packages in the dependency closure and check if any + # of them activate a matching path + dose-ceve -c $pkg -T cudf -t deb \ + $DIRECTORY/var/lib/apt/lists/*_dists_${DIST}_main_binary-${ARCH}_Packages \ + | awk '/^package:/ { print $2 }' \ + | while read dep; do + [ "$pkg" != "$dep" ] || continue + # using the space as sed delimeter because ipath has slashes + # a space should work because neither package names nor paths have them + sed -ne "s ^$dep\s\+activate\(-await\)\?\s\+\($ipath.*\) \2 p" activated-file | while read cpath; do + echo "$pkg $ipath $dep $cpath" + done + done >> result-file +done + +printf "" > result-explicit + +# go through those that are interested in an explicit trigger and check them +# against the packages in their dependency closure which activate it +cat interested-explicit | while read pkg ttype iname; do + echo "working on $pkg..." >&2 + echo "getting dependency closure..." >&2 + # go through all packages in the dependency closure and check if any of + # them activate the trigger in which this package is interested + dose-ceve -c $pkg -T cudf -t deb \ + $DIRECTORY/var/lib/apt/lists/*_dists_${DIST}_main_binary-${ARCH}_Packages \ + | awk '/^package:/ { print $2 }' \ + | while read dep; do + [ "$pkg" != "$dep" ] || continue + if egrep "^$dep\s+activate(-await)?\s+$iname\s*$" activated-explicit > /dev/null; then + echo "$pkg $iname $dep" + fi + done >> result-explicit +done + + diff --git a/setup.sh b/setup.sh deleted file mode 100755 index 123488fc..00000000 --- a/setup.sh +++ /dev/null @@ -1,243 +0,0 @@ -#!/bin/sh -# -# Copyright 2014 Johannes Schauer -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# Running -# ======= -# -# Just start `./setup.sh`. It will do the following: -# -# 1. download apt sources and apt-file data for the amd64 Debian sid snapshot at -# `20141211T041251Z` and store them in a directory tree rooted at -# `./debian-sid-amd64` -# 2. go through all binary packages which have a file `DEBIAN/triggers` in their -# control archive (the list is retrieved from binarycontrol.debian.net) -# and for each package: -# 1. download and unpack its control archive -# 2. store all interest-await file triggers in the file `interested-file` -# 3. store all interest-await explicit triggers in the file `interested-explicit` -# 4. store all activate-await file triggers in the file `activated-file` -# 5. store all activate-await explicit triggers in the file `activated-explicit` -# 6. remove the downloaded binary package and unpacked control archive -# 3. go through `interested-file` and for each line: -# 1. calculate the dependency closure for the binary package and for -# each package in the closure: -# 1. use `apt-file` to get all files of the package -# 2. check if the current file trigger matches any file in the package -# 3. store any hits in the file `result-file` -# 4. go through `interested-file` and for each line: -# 1. calculate the dependency closure for the binary package and for -# each package in the closure: -# 1. check if the package activates the current file trigger -# 2. append any hits to the file `result-file` -# 5. go through `interested-explicit` and for each line: -# 1. calculate the dependency closure for the binary package and for -# each package in the closure: -# 1. check if the package activate the current explicit trigger -# 2. store any hits in the file `result-explicit` -# -# Files -# ===== -# -# interested-file -# --------------- -# -# Associates binary packages to file triggers they are interested in. The first -# column is the binary package, the second column is either `interest` or -# `interest-await` and the last column the path they are interested in. -# -# interested-explicit -# ------------------- -# -# Associates binary packages to explicit triggers they are interested in. The -# first column is the binary package, the second column is either `interest` or -# `interest-await` and the last column the name of the explicit trigger they are -# interested in. -# -# activated-file -# -------------- -# -# Associates binary packages to file triggers they activate. The first column is -# the binary package, the second column is either `activate` or `activate-await` -# and the last column the path they activate. -# -# activate-explicit -# ----------------- -# -# Associates binary packages to explicit triggers they activate. The first column -# is the binary package, the second column is either `activate` or -# `activate-await` and the last column the explicit trigger they activate. -# -# result-file -# ----------- -# -# Associates binary packages with other binary packages they can form a file -# trigger cycle with. The first column is the binary package containing the file -# trigger, the second column is the file trigger, the third column is a binary -# package providing a path that triggers the binary package in the first column, -# the fourth column is the triggering path of provided by the binary package in -# the third column. -# -# result-explicit -# --------------- -# -# Associates binary packages with other binary packages they can form an explicit -# trigger cycle with. The first column is the binary package interested in the -# explicit trigger, the second column is the name of the explicit trigger, the -# third column is the binary package activating the trigger. - -set -e - -ARCH="amd64" -DIST="sid" -MIRROR="http://http.debian.net/debian" -#MIRROR="http://snapshot.debian.org/archive/debian/20141211T041251Z/" -DIRECTORY="`pwd`/debian-$DIST-$ARCH" - -#FIXME: if the host has more than one arch enabled then those Packages files will be downloaded as well - -APT_OPTS="-y" -APT_OPTS=$APT_OPTS" -o Apt::Architecture=$ARCH" -APT_OPTS=$APT_OPTS" -o Dir::Etc::TrustedParts=$DIRECTORY/etc/apt/trusted.gpg.d" -APT_OPTS=$APT_OPTS" -o Dir::Etc::Trusted=$DIRECTORY/etc/apt/trusted.gpg" -APT_OPTS=$APT_OPTS" -o Dir=$DIRECTORY/" -APT_OPTS=$APT_OPTS" -o Dir::Etc=$DIRECTORY/etc/apt/" -APT_OPTS=$APT_OPTS" -o Dir::Etc::SourceList=$DIRECTORY/etc/apt/sources.list" -APT_OPTS=$APT_OPTS" -o Dir::State=$DIRECTORY/var/lib/apt/" -APT_OPTS=$APT_OPTS" -o Dir::State::Status=$DIRECTORY/var/lib/dpkg/status" -APT_OPTS=$APT_OPTS" -o Dir::Cache=$DIRECTORY/var/cache/apt/" -#APT_OPTS=$APT_OPTS" -o Acquire::Check-Valid-Until=false" # because we use snapshot - -mkdir -p $DIRECTORY -mkdir -p $DIRECTORY/etc/apt/ -mkdir -p $DIRECTORY/etc/apt/trusted.gpg.d/ -mkdir -p $DIRECTORY/etc/apt/sources.list.d/ -mkdir -p $DIRECTORY/etc/apt/preferences.d/ -mkdir -p $DIRECTORY/var/lib/apt/ -mkdir -p $DIRECTORY/var/lib/apt/lists/partial/ -mkdir -p $DIRECTORY/var/lib/dpkg/ -mkdir -p $DIRECTORY/var/cache/apt/ -mkdir -p $DIRECTORY/var/cache/apt/apt-file/ - -cp /etc/apt/trusted.gpg.d/* $DIRECTORY/etc/apt/trusted.gpg.d/ - -touch $DIRECTORY/var/lib/dpkg/status - -echo deb $MIRROR $DIST main > $DIRECTORY/etc/apt/sources.list - -apt-get $APT_OPTS update - -APT_FILE_OPTS="--architecture $ARCH" -APT_FILE_OPTS=$APT_FILE_OPTS" --cache $DIRECTORY/var/cache/apt/apt-file" -APT_FILE_OPTS=$APT_FILE_OPTS" --sources-list $DIRECTORY/etc/apt/sources.list" - -apt-file $APT_FILE_OPTS update - -printf "" > interested-file -printf "" > interested-explicit -printf "" > activated-file -printf "" > activated-explicit - -# find all binary packages with /triggers$ -curl "http://binarycontrol.debian.net/?q=&path=%2Ftriggers%24&format=pkglist" \ - | xargs apt-get $APT_OPTS --print-uris download \ - | sed -ne "s/^'\([^']\+\)'\s\+\([^_]\+\)_.*/\2 \1/p" \ - | sort \ - | while read pkg url; do - echo "working on $pkg..." >&2 - mkdir DEBIAN - curl --retry 2 --location --silent "$url" \ - | dpkg-deb --ctrl-tarfile /dev/stdin \ - | tar -C "DEBIAN" --exclude=./md5sums -x - if [ ! -f DEBIAN/triggers ]; then - rm -r DEBIAN - continue - fi - # find all triggers that are either interest or interest-await - # and which are file triggers (start with a slash) - egrep "^\s*interest(-await)?\s+/" DEBIAN/triggers | while read line; do - echo "$pkg $line" - done >> interested-file - egrep "^\s*interest(-await)?\s+[^/]" DEBIAN/triggers | while read line; do - echo "$pkg $line" - done >> interested-explicit - egrep "^\s*activate(-await)?\s+/" DEBIAN/triggers | while read line; do - echo "$pkg $line" - done >> activated-file - egrep "^\s*activate(-await)?\s+[^/]" DEBIAN/triggers | while read line; do - echo "$pkg $line" - done >> activated-explicit - rm -r DEBIAN -done - -printf "" > result-file - -# go through those that are interested in a path and check them against the -# files provided by its dependency closure -cat interested-file | while read pkg ttype ipath; do - echo "working on $pkg..." >&2 - echo "getting dependency closure..." >&2 - # go through all packages in the dependency closure and check if any - # of the files they ship match one of the interested paths - dose-ceve -c $pkg -T cudf -t deb \ - $DIRECTORY/var/lib/apt/lists/*_dists_${DIST}_main_binary-${ARCH}_Packages \ - | awk '/^package:/ { print $2 }' \ - | apt-file $APT_FILE_OPTS show -F --from-file - \ - | sed -ne "s ^\([^:]\+\):\s\+\(${ipath}/.*\) \1\t\2 p" \ - | while read dep cpath; do - [ "$pkg" != "$dep" ] || continue - echo "$pkg $ipath $dep $cpath" - done >> result-file -done - -# go through those that are interested in a path and check them against the -# packages in the dependency closure which activate such a path -cat interested-file | while read pkg ttype ipath; do - echo "working on $pkg..." >&2 - echo "getting dependency closure..." >&2 - # go through all packages in the dependency closure and check if any - # of them activate a matching path - dose-ceve -c $pkg -T cudf -t deb \ - $DIRECTORY/var/lib/apt/lists/*_dists_${DIST}_main_binary-${ARCH}_Packages \ - | awk '/^package:/ { print $2 }' \ - | while read dep; do - [ "$pkg" != "$dep" ] || continue - # using the space as sed delimeter because ipath has slashes - # a space should work because neither package names nor paths have them - sed -ne "s ^$dep\s\+activate\(-await\)\?\s\+\($ipath.*\) \2 p" activated-file | while read cpath; do - echo "$pkg $ipath $dep $cpath" - done - done >> result-file -done - -printf "" > result-explicit - -# go through those that are interested in an explicit trigger and check them -# against the packages in their dependency closure which activate it -cat interested-explicit | while read pkg ttype iname; do - echo "working on $pkg..." >&2 - echo "getting dependency closure..." >&2 - # go through all packages in the dependency closure and check if any of - # them activate the trigger in which this package is interested - dose-ceve -c $pkg -T cudf -t deb \ - $DIRECTORY/var/lib/apt/lists/*_dists_${DIST}_main_binary-${ARCH}_Packages \ - | awk '/^package:/ { print $2 }' \ - | while read dep; do - [ "$pkg" != "$dep" ] || continue - if egrep "^$dep\s+activate(-await)?\s+$iname\s*$" activated-explicit > /dev/null; then - echo "$pkg $iname $dep" - fi - done >> result-explicit -done - - -- cgit v1.2.3-70-g09d2