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

第68回Plamo-5.3.1とget_pkginfoスクリプトその3]

前回は最初のバージョンのソースコードを使ってget_pkginfoのアイデアを紹介しました。最後に触れたように、このコードを公開後、メンテナの間でさまざまな機能追加や書き直しが施され、現在のget_pkginfoは最初のバージョンとは似ても似つかないほど高機能なスクリプトに成長しています。そこで今回は、このスクリプトの最新版を使って、実際にどのようなことができるのかを紹介してみましょう。

なお、get_pkginfoコマンドは現在も開発中のため、以下ではgithubのページからダウンロードした最新版のget_pkginfo.pyを/usr/bin/get_pkginfoにインストールして利用しています。古いバージョンでは動作しないオプション等があるのでご注意ください。

基本的な使い方

get_pkginfoの一番簡単な使い方は、そのまま起動することです。

$ get_pkginfo
local package: openssh-6.7p1-x86_64-P1
new   package: openssh-6.8p1-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/00_base/openssh-6.8p1-x86_64-P1.txz

local package: openssl-1.0.1k-x86_64-P1
new   package: openssl-1.0.1m-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/00_base/openssl-1.0.1m-x86_64-P1.txz

local package: libgcrypt-1.5.4-x86_64-P1
new   package: libgcrypt-1.5.4-x86_64-P2
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/01_minimum/gnupg_tls.txz/libgcrypt-1.5.4-x86_64-P2.txz
...

オプションを指定せずに起動すると、get_pkginfoはローカルにインストール済みのパッケージとFTPサーバにある最新パッケージを比較して、バージョンやビルド番号に違いがあるパッケージとその入手先を表示します。

FTPサーバの指定(-uオプション)

以前にも紹介したように、ローカルの情報は/var/log/packages/以下に記録されているインストール済みパッケージから調べるので常に最新なのに対し、サーバの情報はマスターのFTPサーバ(plamo.linet.gr.jp)で定期的に更新しているパッケージ情報のpickleファイルを、ミラーサイト(デフォルトではring.yamanashi.ac.jp)経由で入手するため、最新パッケージの情報が伝わるまで最大1日程度のタイムラグが生じることがあります。

通常、その程度の遅れが問題になることはないと思うものの、最新情報を確認したい場合など、-uオプションで接続先のサーバを変更することができます。

$ get_pkginfo -u ftp://plamo.linet.gr.jp/pub/Plamo-5.x/
local package: openssh-6.7p1-x86_64-P1
new   package: openssh-6.8p1-x86_64-P1
URL: ftp://plamo.linet.gr.jp/pub/Plamo-5.x/x86_64/plamo/00_base/openssh-6.8p1-x86_64-P1.txz
...

このオプションを指定する場合、パッケージ情報が置かれているディレクトリを指定する必要があるので、最後の/を忘れないようにしてください。

パッケージのダウンロード(-d/-sオプション)

get_pkginfoという名称が示すように、このスクリプトは、元々、パッケージの最新情報を入手することが目的でした。しかし、入手先までわかるならダウンロードできた方が便利だろう、ということで、パッケージのダウンロード機能を追加しました。更新されたパッケージをダウンロードするためには-dあるいは-sのオプションを指定します。-dを指定した場合、パッケージは1つのディレクトリにまとめてダウンロードされます。

$ get_pkginfo.py -d
local package: openssh-6.7p1-x86_64-P1
new   package: openssh-6.8p1-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/00_base/openssh-6.8p1-x86_64-P1.txz
downloading: openssh-6.8p1-x86_64-P1.txz
[     825072 /     825072 ]

local package: openssl-1.0.1k-x86_64-P1
new   package: openssl-1.0.1m-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/00_base/openssl-1.0.1m-x86_64-P1.txz
downloading: openssl-1.0.1m-x86_64-P1.txz
[    2763180 /    2763180 ]
...

$ ls
bind-9.9.6_P2-x86_64-P1.txz    libssh2-1.5.0-x86_64-P1.txz   rsync-3.1.1-x86_64-P2.txz
libgcrypt-1.5.4-x86_64-P2.txz  openssh-6.8p1-x86_64-P1.txz  ...

一方、-sを指定すると、各パッケージはFTPサーバ上のカテゴリやサブカテゴリを再現したディレクトリにダウンロードされます。

$ get_pkginfo.py -s
local package: openssh-6.7p1-x86_64-P1
new   package: openssh-6.8p1-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/00_base/openssh-6.8p1-x86_64-P1.txz
downloading: diskbase
[      20830 /      20830 ]
downloading: ediskbase
[      15875 /      15875 ]
downloading: openssh-6.8p1-x86_64-P1.txz
[     825072 /     825072 ]
...
$ ls -R
.:
00_base/  01_minimum/

./00_base:
diskbase  ediskbase  openssh-6.8p1-x86_64-P1.txz  openssl-1.0.1m-x86_64-P1.txz

./01_minimum:
diskminimum  ediskminimum  gnupg_tls.txz/  network.txz/

./01_minimum/gnupg_tls.txz:
diskgnupg_tls  ediskgnupg_tls  libgcrypt-1.5.4-x86_64-P2.txz
...

-sオプションでカテゴリごとにパッケージをダウンロードした場合は、パッケージの解説文書(diskbase等)も合わせてダウンロードされるので、パッケージを確認しつつ更新する際はこちらのオプションが便利でしょう。

ダウンロード先の指定(-oオプション)

通常、ダウンロードしたパッケージはカレントディレクトリ(get_pkginfoを起動したディレクトリ)に保存されます。一方、更新パッケージを特定のディレクトリに集めておきたい場合など、-oオプションでダウンロード先を指定することもできます。

$ get_pkginfo -s -o /var/packages
local package: openssh-6.7p1-x86_64-P1
new   package: openssh-6.8p1-x86_64-P1
...
$ ls /var/packages
00_base/  01_minimum/ ..

ダウンロード先には、実際に存在して書き込めるディレクトリを指定してください。

パッケージの自動更新(-a/-iオプション)

パッケージがダウンロードできるなら、アップデートもできれば便利じゃない?ということで、パッケージの自動更新機能も追加しました。

パッケージの更新にはupdatepkgコマンドを利用するのでroot権限が必要になります。そこで、まずsudoが可能かを確認した後、必要なパッケージをダウンロードし、sudo updatepkgでそのパッケージを更新します。

$ get_pkginfo.py -a
You need sudo to install package(s).  Are you sure? [y/N] y
local package: btrfs_progs-3.12-x86_64-P1
new   package: btrfs_progs-3.19_rc2-x86_64-P1
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/00_base/btrfs_progs-3.19_rc2-x86_64-P1.txz
downloading: diskbase
[      20830 /      20830 ]
downloading: ediskbase
[      15875 /      15875 ]
downloading: btrfs_progs-3.19_rc2-x86_64-P1.txz
[     528240 /     528240 ]
installing: btrfs_progs-3.19_rc2-x86_64-P1.txz
invoking: sudo /sbin/updatepkg -f btrfs_progs-3.19_rc2-x86_64-P1.txz
パスワード: ******

Removing package btrfs_progs...
Removing files:
  --> Deleting symlink sbin/btrfs
  --> Deleting symlink usr/lib/libbtrfs.so
  --> Deleting symlink usr/lib/libbtrfs.so.0
...
  --> Deleting empty directory usr/share/doc/btrfs-progs-v3.12
  --> Deleting empty directory usr/include/btrfs
btrfs_progs-3.19_rc2-x86_64-P1 のインストール中
PACKAGE DESCRIPTION:
btrfs_progs: Btrfs 操作ツール
btrfs_progs: 
btrfs_progs: Btrfsを操作するために必要なプログラム集です
btrfs_progs: 
btrfs_progs-3.19_rc2-x86_64-P1 のインストールスクリプトを実行中
...

自動更新オプションは-sオプションを含意し、パッケージ類はカテゴリごとのディレクトリにダウンロードされ、それぞれのディレクトリからupdatepkgコマンドを実行します。

-aオプションはパッケージの更新を一気に進める(autoモード)のに対し、-iオプションを指定するとダウンロードしたパッケージごとにアップデートするかどうかを問い合わせます(manualモード⁠⁠。アップデートするパッケージを細かくチェックしたい場合はこちらのオプションが便利でしょう。

$ get_pkginfo -i
You need sudo to install package(s).  Are you sure? [y/N] y
local package: libgcrypt-1.5.4-x86_64-P1
new   package: libgcrypt-1.5.4-x86_64-P2
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/01_minimum/gnupg_tls.txz/libgcrypt-1.5.4-x86_64-P2.txz
downloading: libgcrypt-1.5.4-x86_64-P2.txz
[     381736 /     381736 ]
Install libgcrypt? [y/N] y
installing: libgcrypt-1.5.4-x86_64-P2.txz
invoking: sudo /sbin/updatepkg -f libgcrypt-1.5.4-x86_64-P2.txz
パスワード:

Removing package libgcrypt...
Removing files:
  --> Deleting symlink usr/lib64/libgcrypt.so
...
local package: libxml2-2.9.2-x86_64-P1
new   package: libxml2-2.9.2-x86_64-P2
...
Install libxml2? [y/N] y
installing: libxml2-2.9.2-x86_64-P2.txz
invoking: sudo /sbin/updatepkg -f libxml2-2.9.2-x86_64-P2.txz
...

Plamo Linuxの場合、カーネル関連パッケージやブートローダなど、環境に合わせた調整が必要でupdatepkgだけでは更新できないパッケージもわずかながら存在します。それらのパッケージは自動更新の対象外に指定しており、-aや-iオプションを指定した場合、ダウンロードはするものの、パッケージの更新は行いません。

...
local package: grub-git_20150121-x86_64-P1
new   package: grub-git_20150121-x86_64-P2
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/00_base/grub-git_20150121-x86_64-P2.txz
downloading: grub-git_20150121-x86_64-P2.txz
[    4500408 /    4500408 ]
grub needs some tweaks to install.  Auto installation skipped.
...

これらのパッケージは必要に応じて手動で更新する必要があります。

より高度な使い方

get_pkginfoには、一般向けではないものの、開発者にとって便利な機能も用意されています。本節ではそれらの機能を簡単に紹介します。

ブロック解除(-bオプション)

Plamo Linuxに収録しているパッケージの中には、システムのディレクトリ構成を用意するパッケージや基本的な設定ファイルを提供するパッケージ、デバイス名のリストを提供するパッケージなど、更新には特別の手順を要するパッケージが存在します。

通常、それらは「ブロックされた」パッケージとしてget_pkginfoの対象外になっているものの、-bオプションを指定すると、この指定が解除され、それらのパッケージも表示やダウンロードの対象となります。現在、ブロック対象となっているパッケージはaaa_base, devs, etc, hdsetup, network_configs, shadow, sysvinitの7つです。

ローカルブロック(-lオプション)

ブロック解除とは逆に、指定したパッケージをget_pkginfoの対象外にする機能です。

get_pkginfoはバージョンやビルド番号の違いをチェックしているだけなので、公式に提供されているバージョンよりも新しいパッケージを自前でビルド、インストールしている場合でも、そのパッケージについてFTPサーバ上に新パッケージがある旨を報告してしまいます。

たとえば、Xfceの新版(4.12)をテスト中の環境でget_pkginfoを実行すると、FTPサーバ上のXfce-4.10との違いがチェックされてしまいます。

...
local package: libxfce4ui-4.12.0-x86_64-P1
new   package: libxfce4ui-4.10.0-x86_64-P4
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/06_xfce/libxfce4ui-4.10.0-x86_64-P4.txz

local package: libxfce4util-4.12.1-x86_64-P1
new   package: libxfce4util-4.10.0-x86_64-P2
URL: ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/x86_64/plamo/06_xfce/libxfce4util-4.10.0-x86_64-P2.txz
...

これら余計なチェックを回避するために、指定したパッケージをチェック対象外にする-lオプションを用意しました。

$ get_pkginfo -l 'libxfce4ui libxfce4util Thurnar'

複数のパッケージを指定したい場合はそれらをスペース区切りでクォートするか、後述する設定ファイルに記述してください。

カテゴリ指定(-cオプション)

たとえば、デスクトップ環境としてXfceのみをインストールしている場合、KDEやMate用パッケージの更新情報は必要ありません。そのためget_pkginfoは/var/log/packages/以下のパッケージリストからインストール済みのカテゴリを推測し、インストールしていないカテゴリの情報は表示しないようにしています。しかし、インストールしていないカテゴリのパッケージ事情を調べたい場合もありそうなので、-cオプションでチェック対象とするカテゴリを追加する機能を用意しました。

$ get_pkginfo -c '08_tex 10_lof'

...
 ** ptexlive-20100711-x86_64-P9 should be a new package in 08_tex category.
URL: ftp://plamo.linet.gr.jp/pub/Plamo-5.x/x86_64/plamo/08_tex/ptexlive-20100711-x86_64-P9.txz

** texlive_texmf1-20091107-x86_64-P3 should be a new package in 08_tex category.
URL: ftp://plamo.linet.gr.jp/pub/Plamo-5.x/x86_64/plamo/08_tex/texlive_texmf1-20091107-x86_64-P3.txz
...

インストールしていないカテゴリのパッケージはlocal packageが存在しないため、古くから存在していてもnew packageとして表示されるのでご注意ください。

リバースサーチ(-rオプション)

get_pkginfoは、通常はインストール済みのパッケージを元にFTPサーバ上のパッケージをチェックするのに対し、FTPサーバ上のパッケージを元に、未インストールのパッケージを調べる機能も用意しました。-rオプションを指定すると、FTPサーバには存在するもののインストールしていないパッケージが一覧表示されます。

$ get_pkginfo.py -r
un-selected package(s):
category: 11_mate
        zenity-3.14.0-x86_64-P1.txz
category: AVtool
        avidemux-2.6.8-x86_64-P3.txz
        avidemux5-2.5.6-x86_64-P2.txz
...
category: Devel
        nasm-2.11.06-x86_64-P1.txz
...

このオプションではcontribディレクトリに含まれているパッケージも表示対象となるので、今まで気づかなかったソフトウェアに出会えるかも知れません。しかしながら、contrib以下のパッケージはplamoディレクトリ以下のパッケージよりもメンテナンスが行きとどいていないことが多いのでご注意ください。

get_pkginfoの設定ファイル

今までに紹介してきた各種オプションは設定ファイルにも記述することができます。設定ファイルは /etc/pkginfo.conf と ~/.pkginfo で、各項目を1行に記述します。

設定できる項目は以下の通りです。

URLダウンロード先のURL(例: ftp://plamo.linet.gr.jp/pub/Plamo-5.x/)
DOWNDIRダウンロードしたパッケージの置き場所(例: /var/Newpkgs⁠
LOCAL_BLOCKブロックしたいパッケージ名(例: man man_db ffmpeg mplayer)
CHECK_CATEGORYインストール済みのカテゴリーに関わらずチェックしたいカテゴリー名(例: 08_tex 10_lof)
INSTALL自動更新機能をauto(-aと同等)にするかmanual(-iと同等)にするか
BLOCK_PKGブロックリスト機能の有無(-b と同等、True/False)
DOWNLOADダウンロードの有無(-d と同等、True/False)
DLSUBDIRパッケージをカテゴリごとにダウンロードするか(-sと同等、True/False)

これらを指定した設定ファイルの例を示します。1行は、項目とその内容を'='でつなぎ、内容が複数になる場合は空白区切りで並べます。

URL = ftp://plamo.linet.gr.jp/pub/Plamo-5.x/
DOWNDIR = /var/Newpkgs
LOCAL_BLOCK = man man_db ffmpeg
DLSUBDIR = True

この指定の場合、参照するFTPサーバをplamo.linet.gr.jpにし(URL⁠⁠、更新されたパッケージは/var/Newpkgs以下に(DOWNDIR)カテゴリごとのサブディレクトリに分類して(DLSUBDIR)ダウンロードされます。また、man, man_db, ffmpegの各パッケージは更新対象にしません(LOCAL_BLOCK⁠⁠。

これらの設定は/etc/pkginfo.conf、~/.pkginfo、コマンドラインオプション、の順に評価されるので、システム全体の指定は/etc/pkginfo.conf、ユーザごとの指定は ~/.pkginfo、一時的な変更はコマンドラインオプションで指定、のように使い分けることも可能です。ちなみに、これらを指定しなかった場合のデフォルト値は以下のようになっており、FTPサーバ上で更新されているパッケージとそのURLを表示するのみ、という動作になります。

URL ftp://ring.yamanashi.ac.jp/pub/linux/Plamo/Plamo-5.x/
DOWNDIR''(= cwd)
LOCAL_BLOCK''(無し)
CHECK_CATEGORY''(無し)
INSTALL''(自動インストールしない)
BLOCK_PKGTrue
DOWNLOADFalse
DLSUBDIRFalse

最近はだいぶ落ち着いてきたものの、get_pkginfoは現在も開発が進行中で、改称されたパッケージの追跡機能や廃止されたパッケージの削除機能など、いろいろな機能が提案されています。rpmやdebといった高機能なパッケージツールを使っている人から見ると「今ごろそんな議論をしてるのか」と笑われそうですが、必要なツールを必要に応じて作っていくのもOSSの面白さのひとつ、としておきましょう(苦笑⁠⁠。

おすすめ記事

記事・ニュース一覧