Home

rpm-rewrite

Japanese

While you are making RPM, have you ever wanted to rewrite a configuration file which belongs to other RPM at installing time? Then, you might have found it's very difficult to remove some messages from a file at uninstalling time, on the contrary it is very easy to add. Didn't you have to write a complex script?

rpm-rewrite-0.5.tar.gz solves this problem. It provides a easy way to rewrite configuration files in spec.


Syntax sugar

   Suppose that you want to append next one line to /etc/hoge at installing time.

use fugafuga

   And that you want to remove it at uninstalling time. What do you do?

   If spec had syntax like next, what do you do?

%rewrite /etc/hoge << EOF
use fugafuga
EOF

   rpm-rewrite.pl translates this expression using %triggerin/%triggerun.


Extention syntax in SPEC

   In fact, this expression is not enough.

   are also needed. Then I thought blow is better.

%rewritetrigger -- hogehoge        package name
%rewrite /etc/hoge #      filename to be rewrited and comment starting charcter
use fugafuga                                  contents to be appended
#             comment characotr again -- end mark of contents
%rewritein                    scripte after appending
echo "rewrited /etc/hoge .. add 'use fugafuga'"
%rewriteun                        script after deleting
echo "rewrited /etc/hoge .. remove 'use fugafuga'"

   In fact, /etc/hoge is appended next contents. First and last lines are marks for delete.

# Do not edit this line - begin fugafuga-1-1-1
# This part was added and will be removed by RPM automatically.
use fugafuga
# Do not edit this line - end fugafuga-1-1-1

   rpm-rewrite.pl generates a spec like next (main part only).

%triggerin -- hogehoge
if [ -e /etc/hoge ]; then
cat <<EOF>>/etc/hoge
# Do not edit this line - begin %{name}-%{version}-%{release}
# This part was added and will be removed by RPM automatically.
use fugafuga
# Do not edit this line - end %{name}-%{version}-%{release}
EOF
echo "rewrited /etc/hoge .. add 'use fugafuga'"
fi

%triggerun -- hogehoge
if [ -e /etc/hoge ]; then
cp -af /etc/hoge /etc/hoge.rpmtmp && \
    sed -e '/^# Do not edit this line - begin %{name}-%{version}-%{release}$/,/^# Do not edit this line - end %{name}-%{version}-%{release}$/d' \
    < /etc/hoge.rpmtmp > /etc/hoge
echo "rewrited /etc/hoge .. remove 'use fugafuga'"
fi

  %triggerin を使うのは、 /etc/hoge の属するパッケージがバージョンアップされた場合でも、 設定ファイルの書き換えを再度行うためです。

  削除時には、ファイルの所有者や属性を保存するために、 リダイレクトで元のファイルを上書きしています。

  しかし、この程度のことでは、うまく動きません。 'rpm -U' の動作や --force オプションがついた時の動作を考慮すると、どんどん複雑になります。


Real generated spec

  まず、rpm-rewrite で生成した SPEC は、 何度でも rpm-rewrite に通せることを目指しました。 つまり、SPEC 内に元の表記を保存することにします。


  'rpm -U' 時の動作は複雑で、 新パッケージのインストールの後に旧パッケージの削除が行われます。 update すると、せっかくの書き換えが消滅してしまうかもしれないのです。

  update 時には %triggerun 内で $1 が 1 になることを利用して、 その時にはなにもしないという方法も考えられます。 しかし、これはやりたくありません。 update 後のパッケージでは、ファイルの書き換えをやめているかもしれません。 そうすると、追記は永遠にそのままになってしまいます。

  追記した内容をそのパッケージの %triggerun で削除することを第一に考えると、 削除用のマークに、パッケージのバージョン番号を含めればよいことに気がつきます。 しかしこれでも十分ではありません。 トリガー対象のパッケージの update では、 同じバージョンで %triggerin と %triggerun が実行されます。 もちろん、トリガー対象のパッケージの update であることを、 スクリプト内で見分ける方法があります。$2 を使います。


  削除用のマークに $2 の値も書き込むことで、 ようやく満足に追記削除が行えるようになったと思えます。 思えるのですが、もう1つだけ問題を見つけました。

  --force オプションつきで 'rpm -U' を行うとすると、 同一バージョンのパッケージを何度でもインストールできてしまいます。 幸い、この場合は %treiggerun は実行されません。 %treiggerin で、まずは削除動作を行ってから追記すれば解決します。


  まだまだ問題はありそうな気もします。 とにかく気のついている問題は以上で、 これらについては解決しているはずです。


Perl script and distributed files

  このような SPEC を生成する perl スクリプトを作りました。

  'rpm -tb rpm-rewrite-0.5.tar.gz' で RPM を作ることができます。

  使い方は、以下の通りです。

usage1: rpm-rewrite.pl < old.spec > new.spec
usage2: rpm-rewrite.pl < new.spec > even_new.spec


Test

  2つのパッケージを考えます。p1 と p2 としましょう。 それぞれ /etc/p1 と /etc/p2 という設定ファイルを所有して、 互いに書き直すことにします。 p2 の設定ファイルには (noreplace) 属性をつけて、 バージョンアップでも書き換えないようにします。

  p1 p2 にそれぞれ2つずつのバージョンを用意して、

  での書き換えがうまくいくか確かめます。

  build-test-rpm.shp11.spec から4つの RPM を作ります。 test-rpm.sh でこのテストを行います。


TODO


Home
Feel free to link to us.
Nobuyuki Tsuchimura(tutimura(a)nn.iij4u.or.jp) Replace '(a)' with '@'
modified on 5/25 23:00, 2002