LoginSignup
2

More than 5 years have passed since last update.

Go言語でRPMファイルを読む その1.5

Posted at

前回までのあらすじ

  1. RHEL/CentOS 以外の環境でもRPMファイルを扱いたいのでGoで再実装するよ!
  2. ファイル一覧とパッケージ情報を表示するコマンドを作ったよ!
  3. ファイル検証とか他にも実装したいね!

今回の成果

  1. オレオレverify機能を実装しました
  2. 個人的によく使う機能を実装しました

    • rpm2cpio互換コマンド、Changelog表示、ファイルのタイプ別表示等
  3. 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

今後

  1. 依存関係解決・パッケージダウンロード
    yum機能の実装。RHEL/CentOSでは、yum --downloadonly 等を使えばパッケージのダウンロードだけができる。
    別環境でダウンロードしたパッケージを固めて配布したり、依存関係のチェック等もやりたいので、この機能はほしいところ

  2. RHEL/CentOSでも動作可能に
    今のところ引数に指定したパッケージを対象にしたコマンドだが、将来的にはGo側から必要に応じて呼び出せるような仕様にし、GoのプログラムからRHEL/CentOSパッケージ管理ができるようになればと思う。
    壁としてはrpmdb(Berkery DB)

優先度としては1の方かしらと考えてみたり。

RPMの闇

やはりドキュメント化されておらず、実装ファーストとなっている箇所がかなりある。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2