#!/bin/bash # ############################################################################### # # portage-config: Show any configuration instructions at the end of installed # ebuilds (contained within the pkg_postinst function). # # Stuart Shelton, 20040207. # # Revision History # ---------------- # 20040207 SRCS Initial Version # 20040421 SRCS Make use of functions.sh, use qpkg, general improvements. # 20040718 SRCS Convert to equery # ############################################################################### # # set -o xtrace NAME="$( basename ${0} )" # QPKG="/usr/bin/equery" # QPKGOPTS="-q -C list -i \*" QPKG="$( type -p epm )" QPKGOPTS="-qGa" [ -d /dev/shm -a -w /dev/shm ] && TMP="/dev/shm" # VERBOSE=1 function die() { exit ${1:-1} } function error() { warn "$@" die 1 } function warn() { echo -e "$@" >&2 } function verbose() { if [ -n "$VERBOSE" ]; then warn "$@" fi } function showHelp() { echo "Usage: $NAME [package]" echo " Where package is in the form \"category/ebuild\"" die 1 } # Portage functions - which should be overridden... function einfo() { echo "$@" } function ewarn() { echo "$@" } [ -r /etc/init.d/functions.sh ] && source /etc/init.d/functions.sh [ -x "$( type -p equery )" ] || error "Please install \"app-portage/gentoolkit\"" [ -x "$( type -p portageq )" ] || error "Please install \"sys-apps/portage\"" if (( $# > 1 )); then showHelp fi if [ "$1" = "--help" -o "$1" = "-h" ]; then showHelp fi FIFO=${TMP:-/tmp}/$NAME.list [ -e $FIFO ] && rm -f $FIFO touch $FIFO [ -f $FIFO ] || error "Cannot create or read from file \"$FIFO\"" TEMPFILE=${TMP:-/tmp}/$NAME.tmp [ -e $TEMPFILE ] && rm -f $TEMPFILE touch $TEMPFILE [ -f $TEMPFILE ] || error "Cannot create or read from file \"$TEMPFILE\"" if (( 0 == $# )); then warn -n "Building package list... " $QPKG $QPKGOPTS | sed 's/^\[.*\] \[.*\] //' | grep -v "^$" | cut -d" " -f1 &>$FIFO warn -e "Done\n" else warn -n "Building package list for \"$1\"... " $QPKG $QPKGOPTS | grep -i "\/$1-" | sed 's/^\[.*\] \[.*\] //' | grep -v "^$" | cut -d" " -f1 &>$FIFO # Grr... qpkg/equery doesn't return false if no packages exist if (( 0 == $( cat $FIFO | wc -l ) )); then error "Cannot find ebuild \"$1\"" else warn -e "Found \"$( cat $FIFO )\"\n" fi fi PORTDIR="$( /usr/bin/portageq portdir 2>/dev/null )" PORTDIR="${PORTDIR:-/usr/portage}" while read LINE; do verbose "$NAME: Checking $LINE" DIR="$( echo $LINE | cut -d "/" -f 1 )" EBUILD="$( echo $LINE | cut -d " " -f 1 | cut -d "/" -f 2 )" PACKAGE="$( echo $EBUILD | sed 's/-[0-9].*$//' )" FILE="$PORTDIR/$DIR/$PACKAGE/$EBUILD.ebuild" if [ -r "$FILE" ]; then RESULT="$( grep pkg_config $FILE )" if [ -n "$RESULT" ]; then verbose "Running \"ebuild config\" for $FILE" echo "Configuration available: run \"ebuild $FILE config\"" >&2 fi RESULT="$( grep pkg_postinst $FILE )" if [ -n "$RESULT" ]; then verbose "$FILE has post-install section" cat $FILE | awk ' \ /^[[:space:]]*}[[:space:]]*$/ { OUTPUT=0 } ; \ OUTPUT==1 { print $0 } ; \ /^[[:space:]]*pkg_postinst[[:space:]]*(.*)[[:space:]]*{[[:space:]]*$/ { OUTPUT=1 } ' > $TEMPFILE if [ -n "$( grep -E "ewarn|einfo" $TEMPFILE )" ]; then echo "$DIR/$EBUILD:" # This next step is potentially dangerous... eval "$( grep -E "^[[:space:]]*ewarn[[:space:]]+|^[[:space:]]*einfo[[:space:]]+" $TEMPFILE )" fi else if (( 0 != $# )); then echo "$FILE has no post-install section" fi fi else warn "Cannot find ebuild for $DIR/$EBUILD" fi done < $FIFO rm $FIFO $TEMPFILE unset FIFO TEMPFILE