Entry

パッケージの自動取得

2004年03月08日

FreeBSD も 5.2.1 が Release になったということで,いいかげん 5.1 から移行することにしました。ソースからビルドするのもいいんですけど,パッケージまわりが相当ごちゃごちゃしてるので,思い切ってクリーンインストールです。

ところで,クリーンインストールで面倒なのが,今まで入れてたパッケージを入れ直すことです。そんなわけで,pgl なる道具を Ruby で作ってみました。やることは,必要なパッケージを列挙したリストから lftp 用のスクリプトを生成することです。

ただ,ここで紹介してるのは,ベータ版にもなりきれてないやっつけもんです。こういう道具って,大抵やっつけもんのまま野ざらしなっちゃうんですけど,意外とまとまってしまったので紹介します。似たようなツールありそうなもんですけどね(portupgrade とかに入ってないのかな)。

概要

pgl は,パッケージを列挙したリスト(パッケージリスト)から,lftp 用のダウンロードスクリプトを生成するプログラムです。バージョン番号がなくても必要なファイルのスクリプトを作るので,パッケージツリーのバージョンを(比較的)選びません。もちろん,バージョン番号を付けたパッケージリストから,スクリプトを作ることもできます(汎用性が無くなるだけ)。どんなことをやるのか,もう少し詳しく説明しておきます。

  • リストは pkg_info の出力等々から自前で作る
  • 依存関係にあるパッケージも取ってくる
  • パッケージの有無や依存関係を調べるために,packages/INDEX ファイルを参照する
  • lftp 用のスクリプトを生成するだけなので,ダウンロードは lftp でやる

ダウンロード

物好きな方のために,置いておきます。

使い方

書式

一般的な書式は,次のとおり。

pgl [pkglist [index]]

pkglist というのは,必要なパッケージを書いて並べたリストです。このファイルは,自前で作る必要があります(作り方は後述)。省略した場合は,`./pkglist' を開こうとします。

index というのは,パッケージの INDEX ファイルです。「何ぞや?」と思う方もいるかもしれませんけど,これは,パッケージツリーをまとめるデータベースファイルで,/stand/sysintall が参照するパッケージツリーに必ず置いてあります。このファイルは,FTP サイトの packages ディレクトリにあるので,必要なバージョンのものを取ってきます。ここでは,5.2.1 のパッケージツリーから取ってくるので,

を取ってきてローカルに置いておきます。この引数を省略すると,`./INDEX' を開こうとします。

パッケージファイルの書き方

パッケージファイルというのは,(しつこいですが)必要なパッケージを書いて並べたリストです。pgl はこれを食べて,lftp 用のスクリプトを出力します。書き方を説明するより,実物を見た方が早いと思います。

########################################
#   qune package list
########################################

# Emacs
emacs

# X WIndow System
blackbox

# Web Blowser
mozilla
mozilla-firebird

# Lang
ruby

ルールは次の3つです。

  • 行頭の `#' はコメント
  • 1行に1つの ${PKGNAME} を書く
  • ${PORTVERSION} は書いても書かなくてもいい(書くとバージョンを指定する)

${PKGNAME} は,${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION} という書式で表すことになってるんですけど,原則として,${PORTVERSION} を除いた部分だけを指定します。これを付けた場合は,バージョン番号を明示したものとみなして,一致しないバージョンは出力に反映させません(大したマッチングはしてないんですけど)。

一応,うちで作ったリストをサンプルとしてあげておきます。

一から自前で全部作るのが面倒な場合は,

% pkg_info | awk '{print $1}' - > pkglist

みたいなことをすれば,今インストールしているパッケージのリストが得られます。これを雛形にして加工するのもいいかもしれません。

使用例

パッケージファイルを作ったら,後は pgl に食べさせるだけです。パッケージリスト(pkglist)と INDEX ファイル(INDEX)をカレントディレクトリに置いて,

% pgl > lftpscript
OK: emacs [emacs-19.34b_1]
**: emacs [emacs-20.7.3]
**: emacs [emacs-21.3.2]
……
(以下省略)

とすると,lftp 用のダウンロードスクリプト(lfpscript)が標準出力に出力されます。初めに,パッケージリストのチェックをするけれど,これは標準エラー出力に出力されます。

エラー出力に出るメッセージは,

STATUS: pkglistのエントリ [INDEXに見つかったエントリ]

というフォーマットで表示されます。STATUS の `OK' は,指定したパッケージが INDEX に見つかったという意味で,`**' というのは,1つのエントリで2つ以上マッチしちゃった(バージョン違い)という意味です。マッチしないときは,<NG> と表示されます。

あとは,

% lftp -f lftpscript

とすれば,ダウンロードが始まります。

問題いろいろ

やっつけで書いたとはいえ,問題がありすぎるので,いくつか書いておきます。

  • pkglist のエントリは,そのまま正規表現として使われるので,メタ文字が入ってると正しく認識してくれません(ja-less+iso が読めなかった)。単純な話ですけど,エスケープすれば回避できます(ja-less\+iso)。
  • lftp のスクリプトしか吐けません。これは簡単に直せるけれど,`wget -i urllist' とかすると,エントリを読み出すたびにログイン・ログアウトを繰り返して FTP サーバに負担がかかる(らしい)から,そのままにしています(融通が利かない)。
  • INDEX には 9000 近くのエントリがあるけれど,これを linear search するのはちょっときついかも(芸がない)。
  • 例えば,'mozilla' とだけ書いておくと,バージョン違いのパッケージ(mozilla-1.5 と mozilla-1.6)を全部もってきちゃうけど,これはどうにかした方がよさそう(ポリシーが無い)。
  • マッチングのルーチンを関数にしようと思ったまま手つかずで,空関数が残ってます(論外)。←あまりにあんまりなので直しました。

もう少し体裁を整えてから紹介した方がよかったですかね。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN