2017年1月3日火曜日

ftpでアップロードしたファイルを操作

最近pure-ftpdなるftpサーバソフトがあることを知りました。
何がいいってファイルがアップロードされたことを契機に
コマンドを実行することができる機能があることです。
常時ではないもののネットワークカメラから静止画をftpサーバに送る
ようなことをやっており、
最新の静止画のみが見られるようにしているのですが、
pure-ftpdの機能を使えばアップデートしたファイルを
バックアップディレクトリにファイル名を変えて保存し、
あとでまとめて見るようなことが、
カメラ側の機能に頼らずにできます。
ということでUbuntu 14.04のVPS環境でやってみることに。

最初に今動作しているproftpdを停止します。
# /etc/init.d/proftpd stop
# update-rc.d -f proftpd remove
ただこれは必要ないかもしれません。
と言うのは
# apt-get install pure-ftpd
でpure-ftpdをインストールする時にproftpdは
自動的にアンインストールされるようだからです。
なお設定ファイルはそのまま保持されるので、
# apt-get install proftpd
を実行すればpure-ftpdが消えて元の状態に戻ります。
で、設定ですがとりあえず
# echo no > /etc/pure-ftpd/conf/PAMAuthentication
# echo yes > /etc/pure-ftpd/conf/UnixAuthentication
# echo yes > /etc/pure-ftpd/conf/ChrootEveryone
# echo yes > /etc/pure-ftpd/conf/CallUploadScript
な感じにしてみました。
# /etc/init.d/pure-ftpd stop
# /etc/init.d/pure-ftpd start
で再起動すれば特に問題なく動作しているようです。

しかしトラブルはここから。
どうやらpure-uploadscriptコマンドでアップロード時に
行いたい処理を指定すればよいようなのですが、
うまく行かない…
しょうがないので起動スクリプト"/etc/init.d/pure-ftpd"を
眺めていたのですが、pure-uploadscriptはpure-ftpdを
スタンドアロンで起動しないと動かないのに、
このスクリプトではinetd経由での起動しか
サポートしていないように見えます。どういうこと?

起動スクリプトを全面的に書き換えて対応しようとするも、
そっちがその気ならこっちにも考えがあるとばかりに
慣れたproftpdにinotifywaitを組み合わせるよう変更することに。

まずは
# apt-get install inotify-tools
でファイル(ディレクトリ)監視ツールをインストールします。
次いで、特定ファイルの"<監視コマンド>"を
適当なディレクトリに以下の内容で作成します。
#!/bin/bash
while :
do
 event=`inotifywait <画像ファイル(フルパス)> -e close_write --format '%T' --timefmt '%Y%m%d%H%M%S' 2> /dev/null`
 mkdir -p <画像ファイルのバックアップ先ディレクトリ(フルパス)>
 cp -f <画像ファイル(フルパス)> <画像ファイルのバックアップ先ディレクトリ(フルパス)>/$event.jpg
done
この<監視コマンド>に実行権限を
# chmod 755 <監視コマンド(フルパス)>
で与えておきます。
これを実行中に、<画像ファイル(フルパス)>を新しいファイルに
上書きすると、その画像ファイルが
<画像ファイルのバックアップ先ディレクトリ>に
アップロード時刻をファイル名としたファイルとしてコピーされます。

なおコンソールにログインして
# nohup <監視コマンド(フルパス)> &
を実行しログアウトすれば、バックグラウンドで実行を維持できます。
停止させるのは
# pkill <監視コマンド>
だけでいいと言いたいところですが、
残った子プロセスを停止させるために
$ pkill inotifywait
も必要です。ちょっと面倒です。

デーモンとして自動起動させたければ、
"/etc/init.d/skeleton"をテンプレートにして
起動スクリプトを作成し、
update-rc.dで自動起動するようにしておけばいいでしょう。
ですが私は面倒なのでやっていません。
VPSは2年ぐらい立ち上げっぱなしなので、
そんなに気にしてません。

0 件のコメント:

コメントを投稿