いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

rpmのファイル名からパッケージとかバージョンとかを抽出

概要

ちょっと興味が湧いたので、調べてみました。自分用のメモ書きです。

rpm のパッケージ名って apt のやつと違って、一見どこがパッケージ名でどこがバージョンなのかが分からないものが多いです個人的に。

たとえば、libvirt-daemon-driver-storage-scsi-4.5.0-35.module_el8.1.0+248+298dec18.x86_64 とか。

長過ぎる・・・ハイフン多い・・・ドットとプラスも一杯w

rpm -qi とかしたら、ちゃんと出力してくれますし、ネットで調べても以下のように表示されます。

rpmfind.net

中身のヘッダエリアみると情報があるみたいなのですが、ファイル名から判別したい。アンド、どうやるのか知りたい。

yumのソースコードにていい関数発見

yumのソースコード上に splitFilename っていい感じの関数を見つけました。この関数の中みると、どのようにparseすればいいのか分かりそう。

github.com

基本後ろからドンドン処理していって確定させていってますね。

ついでなので 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,
    }
}

ついでにプチツール作った

勉強がてらにプチツールつくって備忘録代わりにアップしました。

github.com

実行すると以下のような感じ。ファイル名しか見ていないので、実際にインストールされているかどうかとかは関係ありません。

$ 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

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com