Movable Type Open Source (MTOS) の標準プラグイン MultiBlog を活用して複数のブログサイトのエントリーをまとめようとしていて、「自ブログに一切更新はないが、他ブログの更新内容を取り込んで再構築したい」と言う壁にぶつかった。少々てこずったものの、何とかクリアできたので記録に残しておく。この方法がベストではないかもしれないが、もうこれでやってしまったので悪しからず(苦笑)。

今回の要件はダイナミック・パブリッシングではなく「定期的に再構築」なので、まず頭に浮かんだのは、何かのスクリプトを cron で回して終了、と言うプラン。その際も毎回問答無用で再構築していては負荷がバカにならないため、スクリプトが再構築の必要性を判断してくれればベストだ。

いろいろ調べてみると、MT3 時代は mt-rebuild と言う便利なツールが使えたようだが、MT/MTOS4 には対応していない模様。MTOS に付属するオマケツール "<MT_DIR>/tools/run-periodic-tasks" (<MT_DIR> は MTOS インストールディレクトリ)は公開キューを使ったバックグラウンド処理なので、今回はちょっと違う。前述の「自ブログ」は、いちいちサインインして再構築のキューを登録していては意味がない。

しばらく悩んでから改めて "<MT_DIR>/tools" ディレクトリを眺めていると、"rebuild-pages" と言うスクリプトの存在に気が付いた。名前を見る限りでは、何かやってくれそうな気配が漂っている。「"rebuild-pages" だから、再構築できるのは『ウェブページ』だけなんだよね~(英語版 MTOS で「ウェブページ」の名称は "Page")」と言うオチを半ば覚悟しながらこのファイルについて調べてみると、ありがたいことに今回の目的にピッタリであることが判明した。

しかしこの "tools" 以下のスクリプトはあくまでも「オマケ」で、いきなり使えるものもあれば、そのままではマトモに動かないものもある。"rebuild-pages" はこのままでは使えないので、動かすために必要な改変を以下にまとめる。

まずいきなり実行してみるとわかるが、"Can't locate LWP/UserAgent/Local.pm" と文句を言われる。スクリプトを見ると、確かに Perl モジュール "LWP::UserAgent::Local" を使っている。「聞いたことない名前だな」と思って CentOS のリポジトリや CPAN で検索しても見つからないので、調べてみるとこちらでズバリ解説されていた。Six Apart 社のサイトからいただいて来ればいいようだ。

$ cd <MT_DIR>/
$ mkdir -p extlib/LWP/UserAgent ← 格納先ディレクトリを作成
$ cd extlib/LWP/UserAgent/
$ wget http://code.sixapart.com/svn/movabletype/trunk/t/lib/LWP/UserAgent/Local.pm ← ファイルをダウンロード

参考サイトで解説されているように、この "<MT_DIR>/extlib/LWP/UserAgent/Local.pm" は "mt.cgi" を相対パスで指定していることで具合が悪い箇所があるので、次のようにフルパスに修正する。(行頭の数字は行番号)

78: ./$script_name → <FULLPATH>/$script_name
83: ./$script_name → <FULLPATH>/$script_name

次に "<MT_DIR>/tools/rebuild-pages" を修正する。上記の参考サイトの通りにやれば動くようになるが、カレントディレクトリの位置を問わず cron で実行できるように、フルパスで指定した。

"use LWP::UserAgent::Local;" 行の前に挿入。各ディレクトリをフルパスで指定。

use lib qw(
    <MT_DIR>/lib
    <MT_DIR>/extlib
);

実際の URL に合わせて修正。(行頭の数字はデフォルトの行番号。上記行を挿入すると、その分ずれるので注意)

11: {ScriptAlias => '/mt/'} → {ScriptAlias => '/path/to/mtos4/'}
24: http://localhost/mt/mt.cgi → http://www.example.com/path/to/mtos4/mt.cgi

以上で修正は完了。使い方は次のように、再構築をさせたい MTOS 上のユーザーとパスワードを引数に渡せば OK。スクリプトに実行属性が付与してあれば、とりあえず動くはず。

$ <MT_DIR>/tools/rebuild-pages <USERNAME> <PASSWORD>

あとは "rebuild-pages" 中の変数 $build_type で列挙されている不要な項目を省いてもいいし、今回は「複数のブログサイトの更新情報を拾う」と言っても同じ MTOS の中の話なので、再構築するブログを特定するための変数 $blog_id を "rebuild-pages" コマンドの引数として渡したり、先の $build_type を同じく引数から指定できるようにすると、より汎用的なコマンドとして使えると思う。

本当はスクリプト冒頭の "use lib qw()" 部分で変数を使いたかったが、use の時点では変数が展開されず単純文字列として認識されてしまう問題が解決できなかったので、やむを得ずフルパスのベタ打ちとしたのが悔しい。これと同じ問題だと思うんだが・・・。

Comments are closed.