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年ぐらい立ち上げっぱなしなので、
そんなに気にしてません。

広告