Moodle 3.2.3でのunoconv関連の設定メモ

#Moodleとunoconv
Moodle 3.1あたりからunoconv（とOpenOffice/LibreOffice）を用いたdocxなど（xlsx、オンラインテキストも対応）の提出レポートのPDF化機能に関連した設定。この機能はfile_storageとしてMoodleのコアに統合されている。Moodleのバージョンで異なる場合が少なくないので確認したMoodle 3.2.3での設定方法のメモとなる。

Moodle 3.3からはfileconverterプラグインとして独立しているため、Google Drive converterなどを利用する場合は設定不要。

#インストール手順
##メモ
[前回](http://qiita.com/papillon/items/4c82e2af320d631f0284)のインストールの続きとなる。また、CentOS 7ではLibreOfficeを使う。

##手順
libreofficeと必要なlibre-office-pyuno, libre-office-headlessをインストールする。libreoffice*と指定しているため実際には後者は指定する必要はない。

```
# yum install -y libreoffice* libreoffice-pyuno libreoffice-headless
```

さくらのクラウドでは必要無かったが、isoからインストールするとフォントが必要なためインストール。

```
# yum group install Fonts --setopt=group_package_types=default,optional
```

yumでインストール出来るunoconvパッケージはMoodleで利用出来ないため、最新版のunoconvを拾ってくる。

```
# yum install -y git
# cd /usr/local/src
# git clone https://github.com/dagwieers/unoconv.git
# cp unoconv/unoconv /usr/local/bin/
```

unoconvサービスを常駐させるスクリプトを作成。下記リンクを参考にして必要に応じて書き換える。
https://docs.moodle.org/32/en/mod/assign/feedback/editpdf/testunoconv/systemd
isoからインストールした際に文字化けしたので**LANG**を追加。

```
# vi /etc/systemd/system/unoconv.service
```

```
[Unit]
Description=Unoconv listener for document conversions
Documentation=https://github.com/dagwieers/unoconv
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
Environment="LANG=ja_JP.UTF-8;UNO_PATH=/usr/lib64/libreoffice/program"
ExecStart=/usr/local/bin/unoconv --listener

[Install]
WantedBy=multi-user.target
```

unoconvの起動と自動起動設定
フォントを追加した場合はrestartさせる必要がある

```
# systemctl start unoconv.service
# systemctl enable unoconv.service
```

Moodleにサイト管理者でログインして[サイト管理] > [サーバ] > [システムパス]と設定画面に入り、「unoconvドキュメントコンバータのパス」を「/usr/local/bin/unoconv」に変更して設定を保存する。


##動作確認
適当なコースに「課題」を作成し、適当なdocxファイルをアップロード、評定画面に進みPDFに変換されていればOK。
設定等に問題がある場合は白紙となったり全角文字が豆腐になったりするが、設定を変更した場合は再度課題ファイルをアップロードし直す必要がある。これはPDF変換結果がアップロードされたファイルを元にキャッシュされるためで、「すべてのキャッシュを削除する」ではこの変換結果はクリアされないので注意。
**このキャッシュはファイルのSHA1ハッシュを利用しているため、同じファイルの再アップロードやファイル名を変更しただけでは変更無しと見なされるため、少しでも内容を改変しておく必要がある。**

##SELinux対応
SELinuxがEnforcingだとPDFへの変換に失敗して白紙が表示されるため、[こちらの記事](http://qiita.com/100/items/f7f43994568836b4a453#%E9%81%95%E5%8F%8D%E3%83%AD%E3%82%B0%E3%81%8B%E3%82%89%E6%96%B0%E3%81%97%E3%81%84%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%92%E5%AE%9A%E7%BE%A9)を参考に対応する。

SELinuxがEnforcingの状態でMoodleの [サイト管理] > [プラグイン] > [課題プラグイン] > [フィードバックプラグイン] > [PDF注釈] > [unoconvパスをテストする] に移動し、「変換済みPDFテストファイルをダウンロードします。」をクリックする。
SELinuxによりunoconvでの変換に失敗してログが記録される。ブラウザ上にはPDFは表示されない。

リモートコンソール上で以下を実行する。

```
# yum install -y policycoreutils-python
# grep "python" /var/log/audit/audit.log | audit2allow --module=unoconv -all
```

他にブロックされたPythonスクリプトが無ければ以下のように表示される。

```
module unoconv 1.0;

require {
        type httpd_t;
        type unreserved_port_t;
        class process execmem;
        class tcp_socket name_connect;
}

#============= httpd_t ==============

#!!!! This avc can be allowed using the boolean 'httpd_execmem'
allow httpd_t self:process execmem;

#!!!! This avc can be allowed using one of the these booleans:
#     httpd_can_network_connect, nis_enabled
allow httpd_t unreserved_port_t:tcp_socket name_connect;
```

ブロックされたアクセス内容を許可するようにSELinuxのポリシーに追加する。

```
# grep "python" /var/log/audit/audit.log | audit2allow --module-package=unoconv -all
# semodule --install=unoconv.pp
```

再度unoconvの動作テストを実行して、今度は正常にPDFが表示されることを確認する。

#その他
unoconvでのドキュメント変換についてはlib/filestorage/file_storage.phpで処理している。