前回までのあらすじ
- RHEL/CentOS 以外の環境でもRPMファイルを扱いたいのでGoで再実装するよ!
- ファイル一覧とパッケージ情報を表示するコマンドを作ったよ!
- ファイル検証とか他にも実装したいね!
今回の成果
- オレオレverify機能を実装しました
- 個人的によく使う機能を実装しました
- rpm2cpio互換コマンド、Changelog表示、ファイルのタイプ別表示等
- RPMの闇は深い
ファイル検証機能(rpm -qV)
rpmコマンドにはパッケージの検証機能がある。詳しくはman rpmを参照していただきたいが、検証対象は、シグネチャ、ファイルのサイズ、MD5 チェックサム、許可属性、タイプ、 所有者、グループ、デバイス、readLinkしたパスである。
前回の記事でRPMパッケージのフォーマットについて記載したが、これらの情報はRPMヘッダー構造内に格納されている。
あれ? いらなくね?
実際はインストールしたパッケージを対象にしたオプションなので、当初の目的RPM系でない環境でパッケージを見る には不要。
でも、なんとなく欲しいのでどうにかならんかと考えたところ、CPIOアーカイブの情報と照らし合わせて検証するオレオレ仕様のverify機能を実装しました。
今回の嵌りどころ
ファイルチェックサム
man rpmにも書いてあるとおり各ファイルのチェックサムはMD5になっているはずだが、実際は32byteのsha256に変更となっている。
筆者が調査した限りではチェックサムについてのヘッダ情報等は提供されていないらしく、バイト長で判断するしか無い様子。
CPIOアーカイブの圧縮形式
RPMパッケージのPayload部は圧縮されたCPIOアーカイブである。
前回の記事で示した資料ではこのCPIOアーカイブの圧縮形式は gzip
とのことだったが、rpmのいずれかのバージョンで xz
形式に変更となっているようである。
どのバージョンで圧縮形式が変更となったかについては定かでない。圧縮形式については資料よりもRPMヘッダー構造の RPMTAG_PAYLOADCOMPRESSOR
を参照して対処するほうが良い。
なお、xz
形式の展開についてはxi2.org/x/xzパッケージを利用することができる。先人に感謝を。
CPIO
FreeBSDのマニュアルを参照したところ、CPIOにはどうやら4つのフォーマットが存在するようで、RPMの場合は新しいASCII形式のようである。
おそらく、rpmbuildした環境のCPIOアーカイバのバージョンに依っては異なる可能性がある。
その他の機能
既に上でも書いているが、個人的によく使う機能から実装してみた。
-
--changelog
オプション
オプション名どおり、パッケージのChangeLogを表示するオプション。gorpmのオプションとして追加。 -
-d
,-c
オプション
ファイルのタイプ別リスト表示機能。SPECファイル内にて、-d
は%doc
、-c
は%config
で示したファイルを表示 -
gorpm2cpio
コマンド
展開したCPIOアーカイブを標準出力するコマンド。rpm2cpio
互換。
$ gorpm2cpio <RPM Package> | cpio -id
今後
-
依存関係解決・パッケージダウンロード
yum
機能の実装。RHEL/CentOSでは、yum --downloadonly
等を使えばパッケージのダウンロードだけができる。
別環境でダウンロードしたパッケージを固めて配布したり、依存関係のチェック等もやりたいので、この機能はほしいところ -
RHEL/CentOSでも動作可能に
今のところ引数に指定したパッケージを対象にしたコマンドだが、将来的にはGo側から必要に応じて呼び出せるような仕様にし、GoのプログラムからRHEL/CentOSパッケージ管理ができるようになればと思う。
壁としてはrpmdb(Berkery DB)
優先度としては1の方かしらと考えてみたり。
RPMの闇
やはりドキュメント化されておらず、実装ファーストとなっている箇所がかなりある。