概要
ちょっと興味が湧いたので、調べてみました。自分用のメモ書きです。
rpm のパッケージ名って apt のやつと違って、一見どこがパッケージ名でどこがバージョンなのかが分からないものが多いです個人的に。
たとえば、libvirt-daemon-driver-storage-scsi-4.5.0-35.module_el8.1.0+248+298dec18.x86_64
とか。
長過ぎる・・・ハイフン多い・・・ドットとプラスも一杯w
rpm -qi
とかしたら、ちゃんと出力してくれますし、ネットで調べても以下のように表示されます。
中身のヘッダエリアみると情報があるみたいなのですが、ファイル名から判別したい。アンド、どうやるのか知りたい。
yumのソースコードにていい関数発見
yumのソースコード上に splitFilename っていい感じの関数を見つけました。この関数の中みると、どのようにparseすればいいのか分かりそう。
基本後ろからドンドン処理していって確定させていってますね。
ついでなので Go で移植
Goでやるとこんな感じですね。
func Parse(filename string) *Rpm { if filename[len(filename)-4:] == ".rpm" { filename = filename[:len(filename)-4] } var arch string archIndex := strings.LastIndex(filename, ".") arch = filename[archIndex+1:] var rel string relIndex := strings.LastIndex(filename[:archIndex], "-") rel = filename[relIndex+1 : archIndex] var version string verIndex := strings.LastIndex(filename[:relIndex], "-") version = filename[verIndex+1 : relIndex] var epoch string epochIndex := strings.Index(filename, ":") if epochIndex != -1 { epoch = filename[:epochIndex] } var name string name = filename[epochIndex+1 : verIndex] return &Rpm{ name: name, version: version, rel: rel, epoch: epoch, arch: arch, outPattern: RpmOutputTab, } }
ついでにプチツール作った
勉強がてらにプチツールつくって備忘録代わりにアップしました。
実行すると以下のような感じ。ファイル名しか見ていないので、実際にインストールされているかどうかとかは関係ありません。
$ rpminfo libvirt-daemon-driver-storage-scsi-4.5.0-35.module_el8.1.0+248+298dec18.x86_64 [name] libvirt-daemon-driver-storage-scsi [version] 4.5.0 [rel] 35.module_el8.1.0+248+298dec18 [arch] x86_64 $ rpminfo -newline libvirt-daemon-driver-storage-scsi-4.5.0-35.module_el8.1.0+248+298dec18.x86_64 name : libvirt-daemon-driver-storage-scsi version: 4.5.0 rel : 35.module_el8.1.0+248+298dec18 arch : x86_64 $ rpminfo -field name libvirt-daemon-driver-storage-scsi-4.5.0-35.module_el8.1.0+248+298dec18.x86_64 libvirt-daemon-driver-storage-scsi $ rpminfo -field version libvirt-daemon-driver-storage-scsi-4.5.0-35.module_el8.1.0+248+298dec18.x86_64 4.5.0
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場