🍵
RaspberryPi上で排他制御付きのFTPサーバを動かす(ProFTPD)
TL;DR
ProFTPDを使え
- インストール
sudo apt-get install proftpd-basic
- 設定
sudo vi /etc/proftpd/proftpd.conf
HiddenStores on
やりたいこと
- IoT機器からラズパイへのデータ連携にftpを使いたい。
- 転送途中にデータを読んだり、書いたり、移動したり、消したりできると困るので、何らかの形で排他制御をいれたい。
そもそも「FTPでアプリ間通信を実装するな」という話
「ftp 排他制御」でググると上位にくる記事です。
とはいっても、なんだかんだでFTPが昔からあるし、世の中の知見も多いので、手軽に作りたい時の選択肢として出てくるのが現実です。複数の開発会社が関わってくるときとかは特に。
Vsftpdの排他制御
- ラズパイで使われるftpサーバーではVsftpdが最もメジャーだと思います
- Vsftpdには
lock_upload_files
というオプションがあり、これをONにすると排他制御してくれそうに見えます - しかし、実際にはftpで転送中にラズパイ側のアプリケーションからファイルをオープンできますし、なんなら移動も削除もできますので、求めている要件を満たしているかと言われるとNoです
よくやるFTPの排他制御処理
FTPの排他制御として、よく使われる方法として下記の方法があります。
- ファイルを別名でftpで転送
- 転送後にRenameで正しい名前に変更
- ラズパイ側のアプリでは正しい名前のファイルのみをアクセスする
この方法は、完璧な排他制御ではないですが、落とし所として実用できる方法だと思います。
しかし、普通にやるとサーバー側だけでは実現出来ず、クライアント側に「別名で転送した後にRename」という処理が必要になります。自社で全部やってるなら良いですが、、、という感じです。
そこでProFTPDを使う
ようやく本題です。
ProFTPDなら前章で書いた処理をサーバー側で自動でやってくれる機能があります!!
ProFTPDのインストール
apt-getでインストールできます。
apt-get update
sudo apt-get install proftpd-basic
排他制御の設定
proftpdの設定ファイルは /etc/proftpd/proftpd.conf
です。
このファイルを開いて HiddenStores on
という行を追加すれば、OKです。
sudo vi /etc/proftpd/proftpd.conf
# 送信中はファイル別名にRenameする[.in.{filename}.]
HiddenStores on
詳細はマニュアルを読みましょう。
以上で、最低限の排他制御付きのftpサーバーをラズパイ上に構築できました。
Discussion