とにかく最小の手数でFlashAirをWebDAVサーバ化する

# TL;DR

* FlashAir内の `/SD_WLAN/CONFIG` を書き換え
* Ubuntuから `mount -t davfs http://192.168.0.1 /mnt`

これだけでOK

※davfs2 は inotify 非対応です (2017/2/26 追記, 当エントリーの最後をご覧ください)

# 概要

東芝の[FlashAir](http://www.flashair.info/)という **SDカードスロット to Wi-Fi ブリッジデバイス** があります (かなり歪曲した紹介)

LinuxからSDカード(`/dev/sd` や `/dev/mmcblk` )としてマウントできるのに、実はFlashAir自身がサーバとして動くこともできる、なかなかのクセモノです
最新版のW-03では、WebDAVサーバとして稼働します。すなわち、FlashAir内のファイルをWi-Fi経由でWebDAVでマウントできてしまいます

## 何に使うの？

**外部機器とのI/Fは、SDカードのみ** というデバイスを、Wi-Fi経由でWebDAV化できるというものです

![](https://docs.google.com/drawings/d/1oHbF6b3-X1mm-ISc-bedOUGvsr93idR22Zp3GvoojyY/pub?w=960&amp;h=720)

## 検証環境

* Linuxマシン: Ubuntu 16.04
* FlashAir: W-03 (ファームウェア 3.00.01)

# FlashAirの工場出荷時設定への戻し方

最初にFlashAirを工場出荷時設定（ファクトリーリセット）するには [FlashAir設定ソフトウェア](http://www.toshiba-personalstorage.net/support/download/flashair/index_j.htm) を使います
※それ以外の方法が見当たりませんでした。よって、SDカードが認識可能なWindows PCかMacを用意しておくと安心です

# `/SD_WLAN/CONFIG` を直接編集して、FlashAirをWebDAVサーバとして構成する

普通はFlashAir設定ソフトウェアを使うのが正攻法なのですが普通すぎるので、ここでは `/SD_WLAN/CONFIG` を編集して WebDAVサーバ化することにします

## 設定条件

* FlashAirを無線LANのAPとしての設定
    * IP: 192.168.0.1 (標準)
    * SSID: `flashair_<FlashAirのMACアドレス>` (標準)
    * パスフレーズを `flash_air` に変更(WPA2-PSK/AES)
    * APのタイムアウトを 無限 に変更
* FlashAirドライブ(WebDAV)としての設定
    * ReadOnlyとして公開
    * タイムゾーン: JST

## FlashAirへの作業

### マウント

UbuntuにFlashAirを挿すと、自動的に `/media/<USERNAME>/<HOGE-BAR0>` にストレージとしてマウントされます
そうでなければ `sudo mount /dev/mmcblk0p1 /mnt` としてマウントします

いづれにしても、このマウントポイントを `$FLASH_AIR_ROOT` とします

### `/SD_WLAN/CONFIG` の書き換え

転ばぬ先の杖として `$ (cd $FLASH_AIR_ROOT/SD_WLAN ; cp -p CONFIG CONFIG.origin)` とオリジナルのバックアップを取っておくと良いでしょう

```console
$ sed -i.before \
  -e "s/\(APPNETWORKKEY\)=.*$/\1=flash_air\r/" \
  -e "$ a\APPAUTOTIME=0\r" \
  -e "$ a\TIMEZONE=36\r" \
  -e "$ a\WEBDAV=1\r" \
  $FLASH_AIR_ROOT/SD_WLAN/CONFIG
```

これで `sudo umount $FLASH_AIR_ROOT` とした後にFlashAirを一旦SDカードのスロットから抜き、再度挿すと上記の設定で動き始めます
やっちまった！と思ったら先ほどの `CONFIG.origin` を戻すか、FlashAir設定ソフトウェアで回復するようにしましょう

## Ubuntuから WevDAV で接続する

### `davfs2` インストール

`davfs2` を利用します
FlashAirのAPに接続するとインターネットと切り離されますので、先にインストールを済ませてください

```console
$ sudo apt install -y davfs2
```

インストールの途中で "特権ユーザ以外にマウントさせるか否か" を聞いてくるので、お好きにお選びください（私はNoにしました)

### mount

FlashAirのAP (`flashair_<MACアドレス>`) に接続し [mount(8)](https://linuxjm.osdn.jp/html/util-linux/man8/mount.8.html) を実行します

```console
$ sudo mount -t davfs http://192.168.0.1 /mnt -o ro -o uid=$(id -u) -o gid=$(id -g)
Please enter the username to authenticate with server
http://192.168.0.1 or hit enter for none.
  Username: 
Please enter the password to authenticate user  with server
http://192.168.0.1 or hit enter for none.
  Password:  
/sbin/mount.davfs: warning: the server does not support locks
```

Username と Password は共に `enter` (=なし) で構いません。無事 `/mnt` にマウントできているはずです

```console
$ ls -lF /mnt
合計 0
drwxr-xr-x 3 ma2shita ma2shita 0  8月 29  2013 DCIM/
drwx------ 2 ma2shita ma2shita 0  2月 24 22:11 lost+found/
```

※mountオプションに `uid` と `gid` を自分自身にマップしています

取外しは [umount(8)](https://linuxjm.osdn.jp/html/util-linux/man8/umount.8.html) です

```console
$ sudo umount /mnt
/sbin/umount.davfs: waiting while mount.davfs (pid 15227) synchronizes the cache .. OK
```

※flashに若干時間がかかるようです

### TIPS: davfs接続時の Username と Password のダイアログを止めたい

`/etc/davfs2/secrets` に、下記のように書き込めばOKです

```
$ echo 'http://192.168.0.1 guest "guest"' | sudo tee -a /etc/davfs2/secrets
```

一般ユーザとしてマウントする場合は `~/.davfs2/secrets` になります。フォーマットは `/etc/davfs2/secrets` と全く同じです

### トラブルシュート

```
/sbin/mount.davfs: Mounting failed.
501 Not Implemented
```

と言われてマウントできない

**解決策:** `/SD_WLAN/CONFIG` のファイルフォーマットはINI形式ですが、改行コードが CRLF である必要があります
LFのみだと設定が反映されません

書き換え時のsedでも "\r" と CR を付けるようにしています。

# あとがき

~~次はこの `/mnt` を [inotify(7)](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/inotify.7.html) で監視できるか確認しちゃうよ~~

davfs2には *FUSE_POLL* が実装されていないため、[inotify(7)](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/inotify.7.html)によるファイルシステム監視ができません
[davfs2/src/kernel_interface.c](http://cvs.savannah.nongnu.org/viewvc/davfs2/davfs2/src/kernel_interface.c?view=markup#l504)

そのため、新しいファイルが作成されたか否かを調査して、それに対応するハンドリングを行う場合は *`ls`なりで変更検知を自力実装* する必要があります (つo`)

## 参考資料

* <a href="https://flashair-developers.com/ja/documents/api/config/" >FlashAir Developers - ドキュメント - APIガイド - CONFIG</a>
* <a href="http://aggregate.org/CACS/flashair.html" >Toshiba FlashAir</a>
* <a href="http://l-w-i.net/t/ubuntu/davfs2_001.txt" >[Ubuntu] WebDAVをマウントする(root, 一般ユーザ) - Life with IT</a>