On Tue, Jun 01, 2004 at 11:28:41PM +0100, Matthew Vernon wrote: > Branden Robinson writes: > > Please run the attached shell script and mail the output to: > > Done. Um, it appears to be buggy... Sorry. I've now attached a version that should work. -- G. Branden Robinson | No executive devotes much effort to Debian GNU/Linux | proving himself wrong. branden@debian.org | -- Laurence J. Peter http://people.debian.org/~branden/ |
#!/bin/sh PROGNAME=${0##*/} # Use special abnormal exit codes so that problems with this script are more # easily tracked down. INTERNAL_ERROR=86 THROWN_ERROR=74 USAGE_ERROR=99 trap "message;\ message \"Received signal. Aborting.\";\ message;\ exit 1" HUP INT QUIT TERM # Query the terminal to establish a default number of columns to use for # displaying messages to the user. This is used only as a fallback in the # event the COLUMNS variable is not set. ($COLUMNS can react to SIGWINCH while # the script is running, and this cannot, only being calculated once.) DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then DEFCOLUMNS=80 fi message () { # pretty-print messages of arbitrary length echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2 } observe () { # syntax: observe message ... # # issue observational message suitable for logging someday when support for # it exists in dpkg if [ -n "$DEBUG_XFREE86_PACKAGE" ]; then message "$PROGNAME note: $*" fi } warn () { # syntax: warn message ... # # issue warning message suitable for logging someday when support for # it exists in dpkg; also send to standard error message "$PROGNAME warning: $*" } die () { # syntax: die message ... # # exit script with error message message "$PROGNAME error: $*" exit $THROWN_ERROR } internal_error () { # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message message "internal error: $*" exit $INTERNAL_ERROR } usage_error () { message "usage error: $*" exit $USAGE_ERROR } maplink () { # returns what symlink should point to; i.e., what the "sane" answer is # Keep this in sync with the debian/*.links files. # This is only needed for symlinks to directories. case "$1" in /etc/X11/xkb/compiled) echo /var/lib/xkb ;; /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;; /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;; /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;; /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;; /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;; /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;; /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;; /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;; /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;; /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;; /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;; /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;; /usr/bin/X11) echo ../X11R6/bin ;; /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;; /usr/include/X11) echo ../X11R6/include/X11 ;; /usr/lib/X11) echo ../X11R6/lib/X11 ;; *) internal_error "maplink() called with unknown path \"$1\"" ;; esac } analyze_path () { # given a supplied set of pathnames, break each one up by directory and do an # ls -dl on each component, cumulatively; i.e. # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin # Thanks to Randolph Chung for this clever hack. local f g while [ -n "$1" ]; do g= message "Analyzing $1:" for f in $(echo "$1" | tr / \ ); do if [ -e /$g$f ]; then ls -dl /$g$f /$g$f.dpkg-* 2> /dev/null || true g=$g$f/ else message "/$g$f: nonexistent; directory contents of /$g:" ls -l /$g break fi done shift done } find_culprits () { local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \ msg message "Searching for overlapping packages..." dpkg_info_dir=/var/lib/dpkg/info if [ -d $dpkg_info_dir ]; then if [ "$(echo $dpkg_info_dir/*.list)" != "$dpkg_info_dir/*.list" ]; then possible_culprits=$(ls -1 $dpkg_info_dir/*.list | egrep -v \ "(xbase-clients|xfree86-common|xfs|xlibs)") if [ -n "$possible_culprits" ]; then smoking_guns=$(grep -l "$1" $possible_culprits) if [ -n "$smoking_guns" ]; then bad_packages=$(printf "\\n") for f in $smoking_guns; do # too bad you can't nest parameter expansion voodoo p=${f%*.list} # strip off the trailing ".list" package=${p##*/} # strip off the directories bad_packages=$(printf "%s\n%s" "$bad_packages" "$package") done msg=$(cat <<EOF The following packages appear to have file overlaps with the XFree86 packages; these packages are either very old, or in violation of Debian Policy. Try upgrading each of these packages to the latest available version if possible: for example, with the command "apt-get install". If no newer version of a package is available, you will have to remove it; for example, with the command "apt-get remove". If even the latest available version of the package has this file overlap, please file a bug against that package with the Debian Bug Tracking System. You may want to refer the package maintainer to section 12.8 of the Debian Policy manual. EOF ) message "$msg" message "The overlapping packages are: $bad_packages" else message "no overlaps found." fi fi else message "cannot search; no matches for $dpkg_info_dir/*.list." fi else message "cannot search; $dpkg_info_dir does not exist." fi } # we require a readlink command or shell function if ! which readlink > /dev/null 2>&1; then message "The readlink command was not found. Please install version" \ "1.13.1 or later of the debianutils package." readlink () { # returns what symlink in $1 actually points to perl -e '$l = shift; exit 1 unless -l $l; $r = readlink $l; exit 1 unless $r; print "$r\n"' "$1" } fi check_symlinks_and_warn () { # syntax: check_symlinks_and_warn symlink ... # # For each argument, check for symlink sanity, and warn if it isn't sane. # # Call this function from a preinst script in the event $1 is "upgrade" or # "install". local errmsg symlink # validate arguments if [ $# -lt 1 ]; then usage_error "check_symlinks_and_warn() called with wrong number of" \ "arguments; expected at least 1, got $#" exit $USAGE_ERROR fi while [ -n "$1" ]; do symlink="$1" if [ -L "$symlink" ]; then if [ "$(maplink "$symlink")" != "$(readlink "$symlink")" ]; then observe "$symlink symbolic link points to wrong location" \ "$(readlink "$symlink"); removing" rm "$symlink" fi elif [ -e "$symlink" ]; then errmsg="$symlink exists and is not a symbolic link; this package cannot" errmsg="$errmsg be installed until this" if [ -f "$symlink" ]; then errmsg="$errmsg file" elif [ -d "$symlink" ]; then errmsg="$errmsg directory" else errmsg="$errmsg thing" fi errmsg="$errmsg is removed" die "$errmsg" fi shift done } check_symlinks_and_bomb () { # syntax: check_symlinks_and_bomb symlink ... # # For each argument, check for symlink sanity, and bomb if it isn't sane. # # Call this function from a postinst script. local problem symlink # validate arguments if [ $# -lt 1 ]; then usage_error "check_symlinks_and_bomb() called with wrong number of" "arguments; expected at least 1, got $#" exit $USAGE_ERROR fi while [ -n "$1" ]; do problem= symlink="$1" if [ -L "$symlink" ]; then if [ "$(maplink "$symlink")" != "$(readlink "$symlink")" ]; then problem=yes warn "$symlink symbolic link points to wrong location" \ "$(readlink "$symlink")" fi elif [ -e "$symlink" ]; then problem=yes warn "$symlink is not a symbolic link" else problem=yes warn "$symlink symbolic link does not exist" fi if [ -n "$problem" ]; then analyze_path "$symlink" "$(readlink "$symlink")" find_culprits "$symlink" die "bad symbolic links on system" fi shift done } check_symlinks_and_bomb \ /etc/X11/xkb/compiled \ /etc/X11/xkb/xkbcomp \ /usr/X11R6/lib/X11/app-defaults \ /usr/X11R6/lib/X11/fs \ /usr/X11R6/lib/X11/lbxproxy \ /usr/X11R6/lib/X11/proxymngr \ /usr/X11R6/lib/X11/rstart \ /usr/X11R6/lib/X11/twm \ /usr/X11R6/lib/X11/xdm \ /usr/X11R6/lib/X11/xinit \ /usr/X11R6/lib/X11/xkb \ /usr/X11R6/lib/X11/xserver \ /usr/X11R6/lib/X11/xsm \ /usr/bin/X11 \ /usr/bin/rstartd \ /usr/include/X11 \ /usr/lib/X11 # vim:set ai et sts=2 sw=2 tw=0:
Attachment:
signature.asc
Description: Digital signature