##やりたいこと
特定のファイルの変更を監視し、変更があればSFTPで他のサーバにアップロードしたい。
別にscpでもいいのですが、ある案件の要望がSFTPなので、SFTPで試します。
##方針
PHPとかでもinotify を利用すると目的の機能を実装できるようでしたが、linuxカーネルのバージョンに依存したり、WindowsやMacでは少しやり方を変える必要があったりするようなので、プラットフォーム依存を無くすためにここではnode.jsを利用することにしました。
なお、node.jsの場合は、基本的に実行するconsoleを閉じるとプロセスも終了してしまうので、consoleを閉じたり、ログアウトしても継続的に実行されるようにデーモン化?します。
##必要なツールのインストール
今回は、下記のツール、パッケージ等を利用しました。
- node 4.3.0(npm 2.14,12)
- chokidar(ファイルの状態監視)
- ssh2(SFTP clientとして利用)
- fs(ファイルシステムの利用)
- forever(デーモン化)
###インストール
node.js本体のインストールはこちらをご覧下さい。
その他のツールは、以下の通りです。
npm install --save chokidar
npm install ssh2
npm install fs
npm install -g forever
##実装
下記の様にしました。基本的には、ファイルの状態監視機能と、その中で呼び出すSFTP機能の実装に大きく別れます。
個別にメモした記事が下記になります(参考まで)。
いろいろ書いていますが、そんなに難しくはありません。
ファイル名はwatch.jsとしました。
//require
var chokidar = require("chokidar");
//chokidarの初期化
var watcher = chokidar.watch('./data/',{
ignored:/[\/\\]\./,
persistent:true
});
//イベント定義
watcher.on('ready',function(){
//ready
console.log("ready watching...");
//ファイルの追加
watcher.on('add',function(path){
console.log(path + " added.");
});
//ファイルの編集
watcher.on('change',function(path){
console.log(path + " changed.");
//upload
uploadFile(); //下で実装
});
});
/* uploadFileの実装 ======================================================= */
//Function upload by sftp
var uploadFile = function(){
var Client = require('ssh2').Client;
var conn = new Client();
conn.on('ready',function(){
//ready
console.log("ready sftp...");
//sftp
conn.sftp(function(err,sftp){
//throw if error
if(err) throw err;
//file path
var local = "./data/test.txt";
var remote = "./test_up.txt";
//upload
sftp.fastPut(local,remote,{},function(err){
if(err){
console.log("upload error.");
}else{
console.log("uploaded.");
}
});
});
//connection
}).connect({
host: 'servername',
port:22,
username:'hoge',
privateKey:require('fs').readFileSync('/Users/hoge/.ssh/id_rsa'),
passphrase:'hoge'
});
}
スクリプができたら、デーモン化する前に動作を確認しておきましょう。
node watch.js
とし、指定したフォルダ内のファイルを変更してみます(ここではdata/test.txt)。
アップロードが確認出来たら、デーモン化してみます。
##デーモン化する
デーモン化するためにはforeverライブラリを使えばよいようです。
インストールがまだならインストールします。任意の場所で利用するので-gをつけておきます。
npm install -g forever
foreverのインストールができたなら、スクリプトを登録します。
forever start watch.js
実際に登録されたかは、
forever list
で確認出来ます。
デーモン化を止めたい場合は、
forever stop watch.js
とします。その他、restartというのもあるようです。