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.
- package name to which /etc/hoge belongs
- comment starting charactor in /etc/hoge
- script which is excuted after rewriting
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-rewrite.pl
- 配布物全体 rpm-rewrite-0.5.tar.gz
'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.sh は p11.spec から4つの RPM を作ります。 test-rpm.sh でこのテストを行います。
TODO
- 英語ドキュメント
- PreReq: sed をチェック
- %triggerin/un のパッケージ名重複チェック
- .rpmnew の面倒も見ないといけない気がしてきた...
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 |