pukiwiki plus! のdumpプラグインでリストアが動作しない!

なぜか、pukiwiki plus! のdumpプラグインでリストアが機能しない現象にあたりました。
そもそもpukiwikiに詳しくないため、dumpプラグインのソースを解析することになったのでその顛末を書きとめておきます。

そもそもリストアのプラグインが呼ばれないじゃないか!

dumpプラグインではリストアするファイルをPOSTしたフォームにMenuというパラメータが無ければリストアのアクションが起動しないようでした。

// メニューを表示する必要があるか?
if (! isset($vars['menu'])) {
	// 入力フォームを表示
	$body = plugin_dump_disp_form();
	return array('msg' => $msg, 'body' => $body);
}

このように$vars[‘menu’]が要求され、なければ74行目のreturnでプラグインが終了してしまいます。
にもかかわらず、これをPOSTするフォームはというと…

  <input type="hidden" name="cmd"  value="dump" />
  <input type="hidden" name="page" value="$defaultpage" />
  <input type="hidden" name="act"  value="$act_up" />

となっており、menuの値など一切渡されません。

そこで、フォームを変更してmenuに’1’をセットして渡すようにしました。

  <input type="hidden" name="cmd"  value="dump" />
  <input type="hidden" name="page" value="$defaultpage" />
  <input type="hidden" name="act"  value="$act_up" />
  <input type="hidden" name="menu" value="1" />

これでひとまず、リストア処理が呼び出されるところまで行きましたが…
なぜか「解凍するファイルが無い!」というエラーが発生します。

よくよく調べていくと、アップロードするtar.gzからファイルを取り出す処理でなにやらフィルターが…

if ($name == TARLIB_DATA_LONGLINK) {
  // LongLink
  $buff     = fread($this->fp, $pdsz);
  $longname = substr($buff, 0, $size);
} else if (preg_match("/$pattern/", $name) ) {
  $buff = fread($this->fp, $pdsz);
  // 既に同じファイルがある場合は上書きされる
  $fpw = @fopen($name, 'wb');
  if ($fpw !== FALSE) {
    flock($fpw, LOCK_EX);
    fwrite($fpw, $buff, $size);
    @chmod($name, 0666);
    @touch($name, $mtime);
    flock($fpw, LOCK_UN);

この752行目のpreg_matchのパターンが怪しい…

どうやらこのパターン、復元先を保証するために設定されているようで、
ダンプファイルを取得したディレクトリ構造と同じ位置に復元する
という仕様のようでした。

私が今回試していたのは、実は別のWikiサービスからとってきたDumpを自分のサーバに上げようとしていたため、取得したダンプファイルのディレクトリ構造とリストア先のサーバのディレクトリ構造が異なっていたため、このフィルタに引っ掛かって上手くリストアされていなかったようです。

うーん、Dumpプラグインを改造しなくちゃです。

3件のコメント

  1. 私も同じ問題を抱えていましたが、何とか解決しました。
    アップロード後のディレクトリ構成をローカル上に再現して、tar -Pcz で固めてやればOKです。

    たとえば、新しいほうのWikiのディレクトリ構成が /var/www/newsite.com/iijima/wiki-data/*/ になる必要があるなら、ローカルに同じ構成のフォルダを作ってやればいいのです。

    ~$ tar zxf oldsite.tar.gz
    (~/usr/local/etc/www/oldsite.com/delmonta/wiki-data/ に展開される)
    ~$ cd /var/www
    ~$ sudo mkdir -k newsite.com/iijima
    ~$ cd newsite.com/iijima
    ~$ ln -s ~/usr/local/etc/www/oldsite.com/delmonta/wiki-data .
    ~$ cd /
    ~$ bsdtar PLczf /tmp/to-new-wiki.tar.gz /var/www/newsite.com
    (できたtar ballをPukiWikiにアップロードして、成功を見届ける)
    ~$ sudo rm -rf /var/www/newsite.com

    UNIX系OS(Mac含む)なら /var なり /usr/local/etc なりに書き込むためにroot権限が必要ですが、Windowsならば、tar.exeの選び方次第ではUSBメモリに u:\var\www のようなフォルダを作ってそのまま固められるはずです。

    ではでは。

    • すみません、「~$」はカレントディレクトリの表示のつもりでしたが、cdするたびに書き直すのを忘れていました^^; この2文字とスペースの合計3文字が固定のプロンプトである、と読み替えてくださいませ。

      …あ、見直してもう一つ気付きました。ln -sもsudoで実行する必要がありますね。
      ウチのサイトに書き直す際には訂正します。

      • sugihey

        有益な情報をありがとうございます。

        確かに手っ取り早くていいアイデアですね。

        是非参考にさせていただきます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください