旧 Indiana の update 〜 その2
予期せぬ例外浮揚で全然駄目だった image-update だが、登録したバグ報告に付いたコメントによると:
path 属性が複数ある(= 想定外)パッケージがあるんじゃなかろうか?
我々の提供するパッケージには無い筈だけど。
とのことなので、もしや ext2 からの吸い上げのために導入したパッケージなんじゃなかろうか?という予感が。
とりあえず原因パッケージを特定すべく、pkgplan.py ファイルの 143 行目あたりを以下のように改造した上で "pkg image-update" を実施。
try: self.actions = self.__destination_mfst.difference(self.__origin_mfst, old_excludes, new_excludes) finally: print ('planning: %s, %s ....' % (self.origin_fmri, self.destination_fmri)) print "done"
厳密なことを言うなら、print すべきなのは finally 節ではなく try 前なのだけど、ドサクサで出力がロストしないようにとりあえずこの位置で。
で、例外が浮揚した際の最終出力が:
planning: pkg:/SUNWsfman@0.5.11,5.11-0.111:20090508T163519Z, pkg:/SUNWsfman@0.5.11,5.11-0.130:20091219T033829Z ....
は? SUNWsfman?全然関係なかったね > FSWpart/FSWfsmisc for ext2fs
SUNWsfman に対する pkg contents や pkg info -l で同じようなエラーが発生することから、現行版(111b)の manifest がアレしていることが確定 .... orz
release リポジトリ上で 111 版 SUNWsfman の manifest を見ても、path が二重化しているようなエントリは見当たらない。
問題箇所を絞り込むために、更に情報採取コードを追加(file.py の 60 行目)
self.replace_required = False
if "path" in self.attrs:
if isinstance(self.attrs["path"], list):
print "unexpected PATH: %s" % (self.attrs["path"])
self.attrs["path"] = self.attrs["path"].lstrip(
os.path.sep)
"pkg contents SUNWsfman" で検出されたエラーは以下の様なもの。
unexpected PATH: ['usr/095347', 'usr/share/man/man1/zipinfo.1']
は?なんじゃそりゃ? > 'usr/095347'
"pkg contents SUNWsfman" に truss を掛けて manifest の場所を特定し、実際にファイルを見てみると .... あれ?確かにあるわ > path=usr/095347
っていうか、正規版の manifest と比較してみたら、smb.conf.4 の man ファイルエントリの途中から、zipinfo.1 の man ファイルエントリの途中までがごっそり欠落してる感じ。あれ?manifest 全体で差分取ったら、単なる欠落なんてもんじゃないわ。完全にグチャグチャになってるぞ? > manifest@SUNsfman
正規の manifest ベースで確認した限りでは、インストール自体の漏れは無いみたいなので、保存の際にファイルシステムがアレしたのか?っつーか、file 部分だけ抜き出した manifest.file ファイルは正規版の manifest と一致してるし ....
とりあえず、file 情報部分を manifest.file の内容で復旧したところ、"pkg contents" や "pkg info -l" でも異常終了しなくなったので、その勢いで "pkg image-update" を実行 .... 成功した!
いやぁ、紆余曲折した割に、あんまり応用の利かない原因+解決方法だったなぁ .... orz