rpm でインストール/アンインストール時に実行されるスクリプトを確認する

※ このエントリは、はてなグループ終了に伴う、サブブログからの引越エントリ(2011/12)です。
※ 情報が古い可能性もありますので、ご留意ください。



既にインストールしているパッケージをアンインストールする際に、preuninstall とか postuninstall の script で何が行われるか確認したい時は、、、

# rpm -q --scripts (パッケージ名)

こんな感じで確認する。

# rpm -qp (rpmファイル)

rpmファイルに対して、確認したときは↑な感じ。
例えば、インストール前に、preinstallとかpostinstallのscriptを見たい時ですね。

サンプル

# rpm -qi igb
Name        : igb                          Relocations: (not relocatable)
Version     : 3.2.9                             Vendor: Intel Corporation
Release     : 1                             Build Date: 2011年12月13日 22時34分37秒
Install Date: 2011年12月13日 22時35分20秒      Build Host: localhost.localdomain
Group       : System Environment/Kernel     Source RPM: igb-3.2.9-1.src.rpm
Size        : 3190427                          License: GPL
Signature   : (none)
URL         : http://support.intel.com
Summary     : Intel(R) Gigabit Ethernet Connection
Description :
This package contains the Linux driver for the Intel(R) Gigabit Family of Server Adapters.

が、インストール済の場合は、、、

# rpm -q --scripts igb
postinstall scriptlet (using /bin/sh):
FL="/usr/share/doc/igb-3.2.9/file.list
    /usr/share/doc/igb/file.list"
FL=$(for d in $FL ; do if [ -e $d ]; then echo $d; break; fi;  done)

if [ -d /usr/local/lib/igb ]; then
        rm -rf /usr/local/lib/igb
fi
if [ -d /usr/local/share/igb ]; then
        rm -rf /usr/local/share/igb
fi

# Save old drivers (aka .o and .o.gz)
echo "original pci.ids saved in /usr/local/share/igb";
if [ "/dev/null" != "/dev/null" ]; then
        echo "original pcitable saved in /usr/local/share/igb";
fi
for k in $(sed 's/\/lib\/modules\/\([0-9a-zA-Z_\.\-]*\).*/\1/' $FL) ;
do
        d_drivers=/lib/modules/$k
        d_usr=/usr/local/share/igb/$k
        mkdir -p $d_usr
        cd $d_drivers; find . -name igb.*o -exec cp --parents {} $d_usr \; -exec rm -f {} \;
        cd $d_drivers; find . -name igb_*.*o -exec cp --parents {} $d_usr \; -exec rm -f {} \;
        cd $d_drivers; find . -name igb.*o.gz -exec cp --parents {} $d_usr \; -exec rm -f {} \;
        cd $d_drivers; find . -name igb_*.*o.gz -exec cp --parents {} $d_usr \; -exec rm -f {} \;
        cp --parents /usr/share/hwdata/pci.ids /usr/local/share/igb/
        if [ "/dev/null" != "/dev/null" ]; then
                cp --parents /dev/null /usr/local/share/igb/
        fi
done

# Add driver link
for f in $(sed 's/\.new$//' $FL) ; do
        ln -f $f.new $f
done

# Check if kernel version rpm was built on IS the same as running kernel
BK_LIST=$(sed 's/\/lib\/modules\/\([0-9a-zA-Z_\.\-]*\).*/\1/' $FL)
MATCH=no
for i in $BK_LIST
do
        if [ $(uname -r) == $i ] ; then
                MATCH=yes
                break
        fi
done
if [ $MATCH == no ] ; then
        echo -n "WARNING: Running kernel is $(uname -r).  "
        echo -n "RPM supports kernels (  "
        for i in $BK_LIST
        do
                echo -n "$i  "
        done
        echo ")"
fi

LD="/usr/share/doc/igb";
if [ -d /usr/share/doc/igb-3.2.9 ]; then
        LD="/usr/share/doc/igb-3.2.9";
fi

#Yes, this really needs bash
bash -s /usr/share/hwdata/pci.ids \
        /dev/null \
        $LD/pci.updates \
        $LD/pci.ids.new \
        $LD/pcitable.new \
        igb \
<<"END"
#! /bin/bash
# $1 = system pci.ids file to update
# $2 = system pcitable file to update
# $3 = file with new entries in pci.ids file format
# $4 = pci.ids output file
# $5 = pcitable output file
# $6 = driver name for use in pcitable file

exec 3<$1
exec 4<$2
exec 5<$3
exec 6>$4
exec 7>$5
driver=$6
IFS=

# pattern matching strings
ID="[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]"
VEN="${ID}*"
DEV="   ${ID}*"
SUB="           ${ID}*"
TABLE_DEV="0x${ID}      0x${ID} \"*"
TABLE_SUB="0x${ID}      0x${ID} 0x${ID} 0x${ID} \"*"

line=
table_line=
ids_in=
table_in=
vendor=
device=
ids_device=
table_device=
subven=
ids_subven=
table_subven=
subdev=
ids_subdev=
table_subdev=
ven_str=
dev_str=
sub_str=

# force a sub-shell to fork with a new stdin
# this is needed if the shell is reading these instructions from stdin
while true
do
        # get the first line of each data file to jump start things
        exec 0<&3
        read -r ids_in
        if [ "$2" != "/dev/null" ];then
        exec 0<&4
        read -r table_in
        fi

        # outer loop reads lines from the updates file
        exec 0<&5
        while read -r line
        do
                # vendor entry
                if [[ $line == $VEN ]]
                then
                        vendor=0x${line:0:4}
                        ven_str=${line#${line:0:6}}
                        # add entry to pci.ids
                        exec 0<&3
                        exec 1>&6
                        while [[ $ids_in != $VEN ||
                                 0x${ids_in:0:4} < $vendor ]]
                        do
                                echo "$ids_in"
                                read -r ids_in
                        done
                        echo "$line"
                        if [[ 0x${ids_in:0:4} == $vendor ]]
                        then
                                read -r ids_in
                        fi

                # device entry
                elif [[ $line == $DEV ]]
                then
                        device=`echo ${line:1:4} | tr "[:upper:]" "[:lower:]"`
                        table_device=0x${line:1:4}
                        dev_str=${line#${line:0:7}}
                        ids_device=`echo ${ids_in:1:4} | tr "[:upper:]" "[:lower:]"`
                        table_line="$vendor     $table_device   \"$driver\"     \"$ven_str|$dev_str\""
                        # add entry to pci.ids
                        exec 0<&3
                        exec 1>&6
                        while [[ $ids_in != $DEV ||
                                 $ids_device < $device ]]
                        do
                                if [[ $ids_in == $VEN ]]
                                then
                                        break
                                fi
                                if [[ $ids_device != ${ids_in:1:4} ]]
                                then
                                        echo "${ids_in:0:1}$ids_device${ids_in#${ids_in:0:5}}"
                                else
                                        echo "$ids_in"
                                fi
                                read -r ids_in
                                ids_device=`echo ${ids_in:1:4} | tr "[:upper:]" "[:lower:]"`
                        done
                        if [[ $device != ${line:1:4} ]]
                        then
                                echo "${line:0:1}$device${line#${line:0:5}}"
                        else
                                echo "$line"
                        fi
                        if [[ $ids_device == $device ]]
                        then
                                read -r ids_in
                        fi
                        # add entry to pcitable
                        if [ "$2" != "/dev/null" ];then
                        exec 0<&4
                        exec 1>&7
                        while [[ $table_in != $TABLE_DEV ||
                                 ${table_in:0:6} < $vendor ||
                                 ( ${table_in:0:6} == $vendor &&
                                   ${table_in:7:6} < $table_device ) ]]
                        do
                                echo "$table_in"
                                read -r table_in
                        done
                        echo "$table_line"
                        if [[ ${table_in:0:6} == $vendor &&
                              ${table_in:7:6} == $table_device ]]
                        then
                                read -r table_in
                        fi
                        fi
                # subsystem entry
                elif [[ $line == $SUB ]]
                then
                        subven=`echo ${line:2:4} | tr "[:upper:]" "[:lower:]"`
                        subdev=`echo ${line:7:4} | tr "[:upper:]" "[:lower:]"`
                        table_subven=0x${line:2:4}
                        table_subdev=0x${line:7:4}
                        sub_str=${line#${line:0:13}}
                        ids_subven=`echo ${ids_in:2:4} | tr "[:upper:]" "[:lower:]"`
                        ids_subdev=`echo ${ids_in:7:4} | tr "[:upper:]" "[:lower:]"`
                        table_line="$vendor     $table_device   $table_subven   $table_subdev   \"$driver\"     \"$ven_str|$sub_str\""
                        # add entry to pci.ids
                        exec 0<&3
                        exec 1>&6
                        while [[ $ids_in != $SUB ||
                                 $ids_subven < $subven ||
                                 ( $ids_subven == $subven &&
                                   $ids_subdev < $subdev ) ]]
                        do
                                if [[ $ids_in == $VEN ||
                                      $ids_in == $DEV ]]
                                then
                                        break
                                fi
                                if [[ ! (${ids_in:2:4} == "1014" &&
                                         ${ids_in:7:4} == "052C") ]]
                                then
                                        if [[ $ids_subven != ${ids_in:2:4} || $ids_subdev != ${ids_in:7:4} ]]
                                        then
                                                echo "${ids_in:0:2}$ids_subven $ids_subdev${ids_in#${ids_in:0:11}}"
                                        else
                                                echo "$ids_in"
                                        fi
                                fi
                                read -r ids_in
                                ids_subven=`echo ${ids_in:2:4} | tr "[:upper:]" "[:lower:]"`
                                ids_subdev=`echo ${ids_in:7:4} | tr "[:upper:]" "[:lower:]"`
                        done
                        if [[ $subven != ${line:2:4} || $subdev != ${line:7:4} ]]
                        then
                                echo "${line:0:2}$subven $subdev${line#${line:0:11}}"
                        else
                                echo "$line"
                        fi
                        if [[ $ids_subven == $subven  &&
                              $ids_subdev == $subdev ]]
                        then
                                read -r ids_in
                        fi
                        # add entry to pcitable
                        if [ "$2" != "/dev/null" ];then
                        exec 0<&4
                        exec 1>&7
                        while [[ $table_in != $TABLE_SUB ||
                                 ${table_in:14:6} < $table_subven ||
                                 ( ${table_in:14:6} == $table_subven &&
                                   ${table_in:21:6} < $table_subdev ) ]]
                        do
                                if [[ $table_in == $TABLE_DEV ]]
                                then
                                        break
                                fi
                                if [[ ! (${table_in:14:6} == "0x1014" &&
                                         ${table_in:21:6} == "0x052C") ]]
                                then
                                        echo "$table_in"
                                fi
                                read -r table_in
                        done
                        echo "$table_line"
                        if [[ ${table_in:14:6} == $table_subven &&
                              ${table_in:21:6} == $table_subdev ]]
                        then
                                read -r table_in
                        fi
                        fi
                fi

                exec 0<&5
        done

        # print the remainder of the original files
        exec 0<&3
        exec 1>&6
        echo "$ids_in"
        while read -r ids_in
        do
                echo "$ids_in"
        done

        if [ "$2" != "/dev/null" ];then
        exec 0>&4
        exec 1>&7
        echo "$table_in"
        while read -r table_in
        do
                echo "$table_in"
        done
        fi

        break
done <&5

exec 3<&-
exec 4<&-
exec 5<&-
exec 6>&-
exec 7>&-

END

mv -f $LD/pci.ids.new  /usr/share/hwdata/pci.ids
if [ "/dev/null" != "/dev/null" ]; then
mv -f $LD/pcitable.new /dev/null
fi

uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true
preuninstall scriptlet (using /bin/sh):
# If doing RPM un-install
if [ $1 -eq 0 ] ; then
        FL="/usr/share/doc/igb-3.2.9/file.list
                /usr/share/doc/igb/file.list"
        FL=$(for d in $FL ; do if [ -e $d ]; then echo $d; break; fi;  done)

        # Remove driver link
        for f in $(sed 's/\.new$//' $FL) ; do
                rm -f $f
        done

        # Restore old drivers
        if [ -d /usr/local/share/igb ]; then
                cd /usr/local/share/igb; find . -name 'igb.*o*' -exec cp --parents {} /lib/modules/ \;
                cd /usr/local/share/igb; find . -name 'igb_*.*o*' -exec cp --parents {} /lib/modules/ \;
                rm -rf /usr/local/share/igb
        fi
fi
postuninstall scriptlet (using /bin/sh):
uname -r | grep BOOT || /sbin/depmod -a > /dev/null 2>&1 || true

こんな感じ。(サンプル的に長かった...)