LoginSignup
8
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-03-28

はじめに

日常業務(書類作ったり、メール見たり)する端末はWindows環境で、開発や保守作業をする環境はLinuxというのはよくある話ではないかと思う。

そして誰しも、どこかのサイトからダウンロードしたり、CentOSかRedHatのインストールメディアから取り出したり、あるいは自作したRPMファイルが自分の端末にあり、パッケージの内容を確認したい、と思ったことが一度はあるかと思う。

そんなときどうするかというと、

  • 仮想環境にインストールしたRHEL上で確認する
  • 開発環境なんかにscpして確認する

のどちらかでやっている人が多いだろう。

めんどくさい。
そもそも開発者側なら上記の手段をとれるだろうが、手元にTera Termなんかしか無い保守側の人間には、そういう上等な環境なんかない場合が多い。

趣旨(だからなんなのか)

昨今はランタイムのいらない(というと語弊があるかもしれないが)Go言語があるのだから、それを使ってrpmコマンドの代わりを作ろう

RHEL以外で動くrpmコマンドライクなツール

最低限、パッケージの詳細情報とファイルリスト、パッケージの検証ぐらいはやりたい

  • rpm -qip <package>
    パッケージ情報の表示

  • rpm -qlp <package>
    パッケージ内部のファイルリストの表示

  • rpm -qVp <package>
    パッケージの検証

できあがったもの

  • package rpmlib
    RPMファイルを読んでデータを取得するためのライブラリ。
    今のところパッケージからの読み込みのみで、一部の機能のみ対応。

  • gorpm コマンド
    パッケージ情報とファイルリストを表示するコマンド。

インストール/利用方法

インストールは以下のような感じ

$ mkidr gorpm
$ cd gorpm
$ export GOROOT=<Your Go language tools path>
$ export GOPATH=${PWD}
$ go get github.com/necomeshi/gorpm
$ go install github.com/necomeshi/gorpm

使うとこんな感じ

$ gorpm -i rpm-4.8.0-55.el6.x86_64.rpm
Name:       rpm
Version:    4.8.0
Release:    55.el6
Group:      System Environment/Base
Size:       2034245
Licence:    GPLv2+
BuildDate:  2016-05-11 08:49:46 +0900 JST
Source RPM: rpm-4.8.0-55.el6.src.rpm
Summary:    The RPM package management system
Description:
 The RPM Package Manager (RPM) is a powerful command line driven
 package management system capable of installing, uninstalling,
 verifying, querying, and updating software packages. Each software
 package consists of an archive of files along with information about
 the package like its version, a description, etc.

現状はファイル情報を取得するための-iオプションと、ファイルリストを表示するための-lオプションのみ対応。いずれ色々増やしていきたい。

詰まりどころ

RPMファイルのファイルフォーマットについての資料が完成してないので、必要な情報を取ろうにも現状の実装を確認する必要があった。

たとえば、下の参考の資料が示すように、RPMファイルは以下のようなフォーマットになっている。

  RPMファイル
+----------------+
| Lead           |    各セクション内部の構造
+----------------+ -> +----------------------+
| Signature      |    | Header Recode        |
+----------------+    +----------------------+
| Header         |    | Array of Index Recode|
+----------------+    +----------------------+
| Payload        |    | Store of Index Value |
~                ~    +----------------------+

Signature には文字通りシグネチャとか検証用のチェックサムが入っており、Header にはパッケージの情報が格納されている。

Signature セクションと Header セクションは上図のように3つのセクションで構成され、 Array of Index Recode でデータのタイプ(タグ名:パッケージ名、ファイル名...etc)と型(int, string, ...etc)、 Store of Index Value 内のデータ格納位置のオフセットを示している。

で、このデータタイプ(タグ名)が資料には全部リストアップされてない。
ひどいときは意味すら書いてない箇所がある。どうも実装ファーストでやっているようだ。

今後

パッケージの検証はまだ実装できてないし、色々足りない部分があるので、機会を見て実装したい。コードの構成もイマイチなのでどこかの段階できれいにしたい

追記 2017-04-04

rpm2cpio互換コマンド、Changelog表示、ファイルのタイプ別表示機能を追加しました。

詳細についてはGo言語でRPMファイルを読む その1.5を御覧ください。

参考

8
4
0

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
8
4