2010年2月23日火曜日

twitter 発(?)の IPS mirror ツール

ブログではご無沙汰になってしまいましたが、みなさんいかがお過ごしでしょうか。私は相変わらず OpenSolaris 使い込んでいます。

OpenSolaris では IPS というパッケージ管理システムが導入されて、このシステム経由でパッケージやシステム全体のアップデートを行うのですが、この IPS サーバは実はpythonでwebアプリとして書かれています。普通に使っている分にはあまり気にならないのですが、バリバリ開発していると手元にこの IPS レポジトリのミラーが欲しくなります。

IPS レポジトリについては根こそぎミラーする術は公式には用意されていないのですが、IPSサーバは OpenSolaris に組み込まれているので、配布されているものをうまく準備できればミラーを作ることが可能です。ミラーを作る術についてはこれまでにもいくつかのスクリプトが作られており、中でも Andrzej Szezo さんの ips-mirror.py スクリプトが有名です。

このスクリプトを使うと一応ミラーを作ることは可能なのですが、IPS サーバ側の事情なのかたまにファイルの一部が欠落してしまったり、そもそもダウンロードするファイルの数が膨大(リリース1つx86/sparc両方ダウンロードで大体 350,000ファイル程度)だったりと、なかなか大変な仕事だったりします。

折しもさとうさんがtwitterでこの辺のことをボヤいていたこともあり、ips-mirror.py を改造してみたら、まるで「ぶっこぬきツール」なものができて関係筋に受けてしまったので、fork という形で ipsget.py ということで公開してみました。

ipsget.py についてはさとうさんイカす記事を書かれていたので、使い方の説明はそちらに任せて、ちょっとしたポイントを紹介したいと思います。

この IPS ではファイル名を自分自身の sha1sum 値にしてさらに gzip 圧縮しているのですが、ダウンロードしたファイルを検証するために sha1sum を調べる機構が必要になります。この機構、python 2.5 以降では hashlib モジュール、 python 2.4 までは sha モジュールでそれぞれ提供されています。さらに Solaris 10 では python 2.4 のみということなので、普通に考えれば hashlib バージョンと sha バージョンを用意しなければならないということになりますが、それではちょっと残念だったりします。

じゃあどうしようかということで、苦肉の策で書いてみたのがこんな感じです。
try:
from hashlib import sha1
except ImportError:
from sha import new as sha1

(途中略)

hash = sha1(gzip.GzipFile(fileobj=sf).read()).hexdigest()

なんか微妙な技を使ってしまった気がしますが、そんなこんなで OpenSolaris と Solaris 10 の両方でなんとか動くものができました。ということで、IPSをバリバリミラーしたいという方で気が向いた方がおられましたら ipsget.py おためしください。