どぅーちゅいむーにー

これ、Twitterでよくね?という日々の記録かも

OpenSlide メモ1:unoconv 周り

トップ画面は表示されたけど、ファイル(ppt)をアップしても、スライドが見つかりません状態に陥ってから、調べていったことのメモ。まぁ、大した情報にはならないと思いますが。


以下、OpenSlide のインストール先は /var/www/openslide/ と仮定します。
今回も OpenSlide のバージョンは 0.0.4a です。

  • とりあえず構造をみる。

add メニューをクリックしてファイル選択画面が表示されたとき、URLは


http://サーバ/openslide/index.cgi?action=REGISTER
となっていました。
ファイル選択画面のソース(HTML)を確認すると、

<form method="POST" enctype="multipart/form-data" action="index.cgi">
<input type="file" name="upfile" size="60" style="margin-left:100pt">
<input type="submit" value=" アップロード " style="margin-left:220pt;">
<input type="hidden" name="action" value="SINFO_REGISTER">
という感じになっていますので、基本、index.cgi がリクエストを受けて、hidden で定義された action で処理を分けているんだろうなぁ、ということはわかるかと思います。


index.cgi は openslide のトップ(/var/www/openslide/)にあるので、一応中身をみてみましたが、やはり SINFO_REGISTER ならどうこう、なんていうロジックはありません。
私は Perl にはあまり精通していないので、細かい部分はわかっていませんが、

・・・
my $action = $cgi->param("action");
・・・
my %action = $os->set_action();
・・・
if (defined $action{$action}) {
my $str = '$os->' . "$action{$action}";
%content = eval $str;
}
の部分で、action という HTTPパラメータ(今回は SINFO_REGISTER)に対応した $os のサブルーチンを実行しているんだろう、ということはわかりました。
で、$os のほうは、どうも lib/OS.pm のインスタンスだろうということはわかりましたが、また OS.pm の中身がよくわかりません。ただ、OS.pm 内の parse_plugin というサブルーチンの説明に

parse_plugin($str)
$str に記述されている {{function arg}} を
$os->function() の結果で入れ替える

とあったので、ここがどこからか呼ばれたあと、index.cgi の eval の部分で action 名に対応したサブルーチンが呼ばれるだろう、ということにしました(勝手に)。


というわけで、sinfo_register を探すべく、/var/www/openslide にて、以下の find を実行すると


% find . -name "*" -exec grep -iH sinfo_register {} \;
./plugin/install.pl: "SINFO_REGISTER" => "sinfo_register($os)",
./plugin/register.pl:<input type="hidden" name="action" value="SINFO_REGISTER">
./plugin/register.pl:sub sinfo_register {
./tmpl/sinfo.tmpl: <input type="hidden" name="action" value="SINFO_REGISTER">
という情報が得られましたので、register.pl を見ることにしました。
サブルーチン sinfo_register をみてみると、以下の実装を発見。

system "xvfb-run /var/www/openslide/unoconv.sh $upfile 2>&1 > /dev/null";
/var/www/openslide/unoconv.sh をみると、unoconv コマンドを -f pdf (PDFに変換)で実行していることがわかりましたので、ここが実行されているか、結果がどうなっているか?を調べることにしました。

system "xvfb-run /var/www/openslide/unoconv.sh $upfile 2>&1 >> /var/www/openslide/log_unoconv.log";
という感じに書き換えて、ブラウザからファイルをアップロードしたところログ(log_unoconv.log)に、以下のログが出力されていました。

/usr/bin/xvfb-run: 182: /var/www/openslide/unoconv.sh: Permission denied
/usr/bin/xvfb-run: 182: /var/www/openslide/unoconv.sh: Permission denied
/usr/bin/xvfb-run: 182: /var/www/openslide/unoconv.sh: Permission denied
/usr/bin/xvfb-run: 182: /var/www/openslide/unoconv.sh: Permission denied
/usr/bin/xvfb-run: 182: /var/www/openslide/unoconv.sh: Permission denied
で、xvfb-run って何?という話になっていきました。
その後、xvfb を apt-get install した後に再度実行したところ

I18N: Operating system doesn't support locale ""
I18N: Operating system doesn't support locale "en_US"
Error: Unable to connect or start own listener. Aborting.
/usr/lib/openoffice/program/soffice.bin X11 error: Can't open display: :99
Set DISPLAY environment variable, use -display option
or check permissions of your X-Server
(See "man X" resp. "man xhost" for details)
・・・
というログが表示され、今度は locale がうまく設定されていない?とか、やっぱ X が怪しいっぽい、とかが判明していきました。


このあとの話は xorg を入れてみたとか、ubuntu-desktop を入れてみた、という話につながるわけですが、ubuntu-desktop をインストールし、一応ファイルのアップロードが成功している現在でも、以下のような怪しいログは出力されています。

Leaking python objects bridged to UNO for reason pyuno runtime is not initialized, (the py
uno.bootstrap needs to be called before using any uno classes)
Leaking python objects bridged to UNO for reason pyuno runtime is not initialized, (the py
uno.bootstrap needs to be called before using any uno classes)
Leaking python objects bridged to UNO for reason pyuno runtime is not initialized, (the py
uno.bootstrap needs to be called before using any uno classes)
Leaking python objects bridged to UNO for reason pyuno runtime is not initialized, (the py
uno.bootstrap needs to be called before using any uno classes)
Leaking python objects bridged to UNO for reason pyuno runtime is not initialized, (the py
uno.bootstrap needs to be called before using any uno classes)
Leaking python objects bridged to UNO for reason pyuno runtime is not initialized, (the py
uno.bootstrap needs to be called before using any uno classes)

こんな感じで、まだまだ課題は残っております・・・