玩式草子─ソフトウェアとたわむれる日々

第66回 Plamo-5.3.1とget_pkginfoスクリプト

この記事を読むのに必要な時間:およそ 5 分

更新パッケージチェック用スクリプト

この連載でも何度か触れたように,ディストリビューションというのは生き物で,更新が滞れば衰えてゆきます。その意味で,新バージョンのリリース直後でも,このように活発にパッケージが更新されるというのはありがたい話ではあるものの,Plamo Linuxの場合,ユーザがこれらパッケージ更新を簡単に知る方法が無いことが以前から気になっていました。

もちろん,セキュリティ関連などの重要な更新はメーリングリストやホームページ等でアナウンスするものの,それほど緊急性の高くない更新は広報していないので,それらをチェックするには更新履歴を記録したChange.Logを確認するしかありません。

DVDイメージ等から手元にPlamo Linuxのパッケージツリーを用意して,cronとwget等のミラーリング機能を使って更新されたパッケージを定期的にダウンロードする,というのも,ちょっと敷居が高いでしょう。

以前から,何かいい方法はないかなぁ,とあれこれ考えてはいて,たとえば「パッケージの更新時刻」を元に,新しいパッケージを紹介するような機能を検討したこともあります。すなわち,サーバ側に全パッケージの更新時刻を記録しておいて,クライアント側から「ある時刻以降に更新されたパッケージ」を調べるようなリクエストを送れば該当するパッケージの一覧を返すような機能です。

この機能を使えば「サーバ上で更新されたパッケージ」はわかるものの,果してそのパッケージがクライアント側に必要なのかまではわかりません。Plamo Linuxの場合,KDEやMate,Xfceといったデスクトップ環境はユーザが選択可能なので,デスクトップ環境としてXfceを選んだユーザに,KDEやMate用パッケージの更新情報が届いてもあまり意味は無いでしょう。

また,繰り返し問い合わせがあった場合,以前に問い合わせた時刻から後に更新したパッケージのみを調べるにはクライアント側で問い合わせ時刻を管理する必要がありますし,以前は更新を見送ったパッケージを再度チェックしたい場合には問い合わせ時刻を巻き戻すような処理も必要で,仕組みとしてはずいぶん複雑になりそうです。

更新時刻での管理が難しいとすると,パッケージのバージョンやビルド番号で管理することになるものの,サーバ側に収めているパッケージの情報と,ユーザ側でインストールしているパッケージの情報を簡単に照合する方法をなかなか思いつきませんでした。

Plamo Linuxは小規模なディストリビューションなものの,32ビット版,64ビット版,それぞれに1300強のパッケージがあります。サーバ側に用意しておいた全パッケージのリストをダウンロードして,ユーザ側でインストール済みのパッケージのリストと照合する,という作業は,シェルスクリプトでやるにはちょっと大変だし,時間もずいぶんかかりそうです。照合作業を高速化するためにSQLite3あたりを使ってパッケージ情報をデータベース化する方法も考えたものの,毎回データベースファイルをやりとりするというのもちょっと牛刀な気がします。

そのあたりをあれこれ考えているうちに,ふと思い出したのがPythonの持っているpickleという機能です。

pickleとは,一般には「ピクルス」いわゆる「酢漬け」という意味なものの,Pythonの世界では,Pythonが扱うあらゆる形式のデータをシリアライズする機能を意味します。すなわち,あるマシンで作ったPythonのリスト型や辞書型のデータをpickleしてファイルにしておけば,そのファイルを受けとった別のマシンのPythonで元のデータを簡単に復元できる,ということです。

Plamo Linuxのパッケージは,"ベース名"-"バージョン"-"アーキテクチャ"-"ビルド番号"."拡張子"という形式になっています。たとえば,bash-4.2.53-x86_64-P1.txz というパッケージの場合,ベース名は"bash",バージョンは"4.2.53",アーキテクチャは"x86_64",ビルド番号は"P1",拡張子は"txz"です。これらのうち,ベース名(bash)システム上で一意になっているので,ベース名をキーにした辞書型のデータを使えばパッケージ情報は効率よく管理できそうです。

サーバ側で最新のパッケージ情報を辞書型に整理して,そのデータをpickleでファイルにしておけば,ユーザ側ではそのファイルをダウンロードしてPythonで復元するだけで,サーバ上の最新パッケージ情報を容易に再現できます。一方,ユーザ側でインストールしているパッケージの情報も同様の辞書型のデータにしておけば,パッケージの有無やバージョン,ビルド番号の違いなどは,辞書型データのキーの有無対応する要素の比較で簡単にチェックできるでしょう

そう考えて,最新のパッケージ情報を拾ってpickleするサーバ側のPythonスクリプトと,ローカルにインストール済みのパッケージの情報をまとめてサーバのpickleデータと比較するようなスクリプトを書いてみることにしました。


さて,だいぶ長くなってしまったのでスクリプトの詳細は次回に譲ることにしましょう。紹介予定のスクリプトの最新版は,githubで公開しているPlamo Linuxのページに登録されているので,次回まで待てない人は,こちらから直接ダウンロードして試してみてください。

このスクリプトを実行すると,ローカルにあるパッケージとサーバ上のパッケージを比較して,違いがあるパッケージを報告します。

$ python get_pkginfo.py 
local package: binutils-2.24-x86_64-P1
new   package: binutils-2.25-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/01_minimum/devel.txz/binutils-2.25-x86_64-P1.txz

local package: curl-7.39.0-x86_64-P1
new   package: curl-7.40.0-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/01_minimum/network.txz/curl-7.40.0-x86_64-P1.txz

local package: firefox-34.0-x86_64-P1
new   package: firefox-35.0-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/04_xapps/firefox-35.0-x86_64-P1.txz
 ...

-dオプションを指定すると,更新されているパッケージをダウンロードしてきます。

$ python get_pkginfo.py -d
local package: binutils-2.24-x86_64-P1
new   package: binutils-2.25-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/01_minimum/devel.txz/binutils-2.25-x86_64-P1.txz
downloading: binutils-2.25-x86_64-P1.txz
[    1922656 /    1922656 ]

local package: curl-7.39.0-x86_64-P1
new   package: curl-7.40.0-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/01_minimum/network.txz/curl-7.40.0-x86_64-P1.txz
downloading: curl-7.40.0-x86_64-P1.txz
[     797712 /     797712 ]
...

このスクリプトは現在も開発中なものの,Plamo-5.3.1にはパッケージとして組み込む予定で,Plamo Linuxのユーザにとって便利なツールになることを期待しています。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html