テロ後の復旧の話。
丁寧にまとめている時間はないのですが、今後のためにも記録しておく。
手順としてはこんな感じ。
1. 既存のカテゴリーアーカイブファイルからすべての個別のエントリのパーマネントリンクを抽出
2. 各エントリのスクレイピングおよび MT 用インポートファイル作成
3. 新規ブログ作成とデータインポート
さて詳細。
1. 既存のカテゴリーアーカイブファイルからすべての個別のエントリのパーマネントリンクを抽出
ディスク上に存在する HTML ファイルから調べようと思ったのですが、削除されたエントリが残っている可能性があったためファイルの存在だけでは生きているエントリか判断が付かないためそうしました。
また元々個々のページにカテゴリを出力していなかったため、カテゴリアーカイブ毎に抽出されるエントリの URL へカテゴリ情報を追加することもできたので一石二鳥。
結果として「URL」と「カテゴリ名」を一行とした TSV ファイルができました。
http://5net.com/k/archives/000005.html leisure http://5net.com/k/archives/000018.html moblog http://5net.com/k/archives/000022.html moblog http://5net.com/k/archives/000025.html moblog http://5net.com/k/archives/000026.html moblog
2. 各エントリのスクレイピングおよび MT 用インポートファイル作成
各エントリのスクレイピング方法はいろいろ考えたあげく、使ってみたかった Template-Toolkit の記述法を利用した Template::Extract を利用して実装しました。ついでに MT 用のインポートファイルへ出力するため Template-Toolkit を利用して、ある意味また一石二鳥(謎)。(Template::Extract は NDO::Weblog Naoya さんのエントリーを参考。というかパクらさせてもらいました。)
Template::Extract の [% ... %] の match 具合がいまいち把握しきれず、1つのテンプレートだけで実装するのをあきらめて 2つ作成。コメントがあるページ用(extract-ks-entry-with-comments.tt)とコメントがないページ用(extract-ks-entry.tt)の 2つ。
[extract-ks-entry-with-comments.tt]
<h3 class="title"><img src="[% ... %].jpg" alt="[% author %]">[% title %]</h3> [% body %] <a name="more"></a> [% more %] <span class="posted">Posted by [% name %] at [% year %]年[% month %]月[% date %]日 [% hour %]:[% minute %] | [% ... %] [% FOREACH comments %]<div class="comments-body"> [% body %] <span class="comments-post">Posted by: <a href="[% email %]">[% author %]</a> at [% year %]年[% month %]月[% date %]日 [% hour %]:[% minute %]</span> </div> [% END %]
[extract-ks-entry.tt]
<h3 class="title"><img src="[% ... %].jpg" alt="[% author %]">[% title %]</h3> [% body %] <a name="more"></a> [% more %] <span class="posted">Posted by [% name %] at [% year %]年[% month %]月[% date %]日 [% hour %]:[% minute %] |
そして実行スクリプト。ちと汚いけど、まぁいいや。
#!/usr/local/bin/perl
use strict;
use LWP::Simple;
use Template::Extract;
use FileHandle;
use URI;
use Template;
if (@ARGV != 4) {
print STDERR "usage: $0 <extract template1> <extract template2> <preview template> <url list file>\n";
exit(1);
}
my $fh1 = FileHandle->new( shift ) or die "cannot open template: $!";
my $template1 = join('', $fh1->getlines);
$fh1->close;
my $fh2 = FileHandle->new( shift ) or die "cannot open template: $!";
my $template2 = join('', $fh2->getlines);
$fh2->close;
my $tt = Template->new();
my $obj = Template::Extract->new;
my $output = shift;
my $urls = FileHandle->new( shift ) or die "cannot open template: $!";
while (my $line = $urls->getline) {
chomp( $line );
my ($url, $category) = split(/\t/, $line);
eval {
my $uri = URI->new( $url );
my $document = LWP::Simple::get( $uri );
my $ext = $obj->extract( $template1, $document );
$ext = $obj->extract( $template2, $document ) if !defined( $ext );
$ext->{category} = $category;
$tt->process( $output, { entry => $ext } ) or die "cannot open template: $!";
}; if (my $err = $@) {
die $err;
}
}
$urls->close;
そういえば出力用のテンプレート。
AUTHOR: [% entry.author %]
TITLE: [% entry.title %]
STATUS: Publish
ALLOW COMMENTS: 1
CONVERT BREAKS: __default__
ALLOW PINGS: 1
PRIMARY CATEGORY: [% entry.category %]
CATEGORY: [% entry.category %]
DATE: [% entry.date %]/[% entry.month %]/[% entry.year %] [% entry.hour % 12 %]:[% entry.minute | remove('\n') %]:00 [% IF entry.hour <= 12 %]AM[% ELSE %]PM[% END %]
-----
BODY:
[% entry.body | remove('<p>') | remove('</p>') | remove('<br />') %]
-----
EXTENDED BODY:
[% entry.more | remove('<p>') | remove('</p>') | remove('<br />') %]
-----
EXCERPT:
-----
KEYWORDS:
-----
[% FOREACH entry.comments %]COMMENT:
AUTHOR: [% author %]
EMAIL:
IP:
URL:
DATE: [% date %]/[% month %]/[% year %] [% hour % 12 %]:[% minute %]:00 [% IF hour <= 12 %]AM[% ELSE %]PM[% END %]
[% body | remove('<p>') | remove('</p>') | remove('<br />') %]
-----
[% END %]
--------
3. 新規ブログ作成とデータインポート
さてデータの準備はできたので、MT 側の準備へ。
管理画面で新規ブログを作成する。その後各ユーザー(Author)の権限を付与する。このとき「ウェブログの設定」権限は絶対につけないこと。また「ウェブログの削除」されます。とほほ。
既存のディレクトリの HTML や画像をバックアップ。そして HTML のみ削除する。
find . -name \*.html -exec rm {} \;
2 で作成したインポート用のファイルを <MTをインストールしたディレクトリ>/import/ へ配置する。(ファイル名は何でも良い)
MT 管理画面の Import/Export で「パスワード」を入力後、「エントリーの読み込み」ボタンをクリック!
しばし待つと読み込みが正常に完了します。その後、「サイトの Rebuild」で完成!!!終了ーー。
と思ったらテンプレートそのものの移行が最後に残ってました。_| ̄|○
手作業で対応。
そして無事復旧しました。

コメントする