發表於 程式分享

使用nodejs,比對檔案大小及異動日期,若有異動則透過http上傳通知

1.執行指令

node diff_file.js [path/to/directory]  [fileIdx]
Ex.node diff_file.js D:\GWork\04_UAT 1

2.執行後,若有遇到找不到  xxxx modules,請執行

npm install xxxx --verbose

3.執行後會產生log_[yyyy-mm-dd]_[fileIdx].txt (PS.yyyy-mm-dd為系統日),

並與前一日的檔案比較,若有異動,則傳送指定的http request做通知用。

4.node.js檔案,檔名diff_file.js

var fs = require('fs');

//0.設定值
var error_hostname = 'xxx.xxx.xxx.xxx';  //請記得調整

//1.傳入參數
if (process.argv.length <= 3) {
 console.log("Usage: " + __filename + " path/to/directory fileIdx");
 process.exit(-1);
}
var searchpath = process.argv[2];
var fileIdx = process.argv[3];

//2.取得日期及檔案
require('x-date') ;
var todayStr = new Date().format('yyyy-mm-dd');
var todayFile = 'log_' + todayStr + '_' + fileIdx + '.txt';
console.log('今日: ' + todayStr + ' => ' + todayFile);
var yesday = new Date();
yesday.setDate(yesday.getDate() - 1); // Yesterday!
var yesdayStr = yesday.format('yyyy-mm-dd')
console.log(yesdayStr);
var yesdayFile = 'log_' + yesdayStr + '_' + fileIdx + '.txt';
console.log('昨日: ' + yesdayStr + ' => ' + yesdayFile);

//3.主流程
gen_today_file();

/*產生比對檔*/
function gen_today_file() { 
    var walk = function(dir, done) {
        var results = [];
        fs.readdir(dir, function(err, list) {
            if (err) return done(err);
            var i = 0;
            (function next() {
                var file = list[i++];
                if (!file) return done(null, results);
                file = dir + '/' + file;
                fs.stat(file, function(err, stat) {
                    if (stat && stat.isDirectory()) {
                        walk(file, function(err, res) {
                            results = results.concat(res);
                            next();
                        });
                    } else {
                        results.push(file);
                        next();
                    }
                });
            })();
        });
    };

    var logStream = fs.createWriteStream(todayFile, {'flags': 'w'}); 
    logStream.on('open', function () {
        walk(searchpath, function(err, files) {
            if (err) 
                throw err;

            for (var fileIdx in files) {
                var stats = fs.statSync(files[fileIdx]);
                var buffer = files[fileIdx] + ',' +        
                                stats["size"] + ',' +
                                stats["atime"] + ',' + 
                                stats["mtime"] + ',' +
                                stats["ctime"] + ',' +
                                stats["uid"] + ',' + 
                                stats["gid"] + ',' +
                                (stats["mode"] & 0040000 ? 'd' : '-') +
                                (stats["mode"] & 400 ? 'r' : '-') + (stats["mode"] & 200 ? 'w' : '-') + (stats["mode"] & 100 ? 'x' : '-') +
                                (stats["mode"] & 40 ? 'r' : '-') + (stats["mode"] & 20 ? 'w' : '-') + (stats["mode"] & 10 ? 'x' : '-') +
                                (stats["mode"] & 4 ? 'r' : '-') + (stats["mode"] & 2 ? 'w' : '-') + (stats["mode"] & 1 ? 'x' : '-') + '\n';
                fs.appendFileSync(todayFile, buffer);
                logStream.write(buffer);
            }
            logStream.end();
        });
    }).on('error', function (err) {
        console.log('file has error: ' + err);
    }).on('finish', function () {
        console.log('file has been written');
        
        var identical = compare_file();
        send_error(identical);
    });
}

/*比對檔案*/
function compare_file() {
    var source = "";
    var target = "";

    try {
        source = fs.readFileSync(yesdayFile, 'utf8');
    } catch(e) {
        console.error("error reading " + yesdayFile + ": " + e.message);
        return false;
    }

    try {
        target = fs.readFileSync(todayFile, 'utf8');
    } catch(e) {
        console.error("error reading " + todayFile + ": " + e.message);
        return false;
    }

    var diff = require('diff');
    var results = diff.diffLines(source, target);
    var identical = true;

    results.forEach(function(part) {
      if(part.added) {
        console.log("added:   " + part.value);
        identical = false;
      }
      if(part.removed) {
        console.log("removed: " + part.value);
        identical = false;
      }
    });
    
    console.log("Identical? " + identical);
    return identical;
}

/*傳送錯誤訊息*/
function send_error(identical) {
    if (identical == false) {
        var http = require('http');
        var querystring = require("querystring");
        var keyWordVal = yesdayFile + ' vs. ' + todayFile + ' 不一致.';
        //Post內容,依server程式調整
        var postData = querystring.stringify({
            'kind' : 9 , 'keyWord' : keyWordVal
        });
        console.log('postData: ' + postData);
        var options = {
            hostname: error_hostname,
            port: 80,
            path: '/warrantweb/Analysis.action', //請自行寫server程式串接
            method: 'POST',
            headers:{
                "Content-Length":postData.length,
                "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",        
            }
        };

        var req = http.request(options, function(res) {
            console.log('STATUS: ' + res.statusCode);
            console.log('HEADERS: ' + JSON.stringify(res.headers));
            res.setEncoding('utf8');
            res.on('data', function (chunk) {
                console.log('BODY: ' + chunk);
            });
        });

        req.on('error', function(e) {
          console.log('problem with request: ' + e.message);
        });

        // write data to request body
        req.write(postData);
        req.end();
    }
}

4.執行結果

1.PNG

5.Linux設定cron

30      16       *       *       *      cd /root/grace/;/opt/nodejs/bin/node diff_file.js /usr/share/apache-tomcat-7.0.61/webapps/warrantweb 1 >> /root/grace/log.txt 2>&1
發表於 程式分享

redHat安裝nodeJS遇到之問題

在redHat安裝nodeJS,依網路上的指示

tar zxf node-v7.7.3.tar.gz
cd node-v7.7.3

./configure
make && make install

但在configure時即遇到error,經查是python版本過舊,
但換成python 3也不行,後來換成python 2.7.9,
指令如下

wget https://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz
tar zxf Python-2.7.9.tgz
cd Python-2.7.9
./configure --prefix=/usr/local
make && make install

後再執行node install的make出現

WARNING: C++ compiler too old, need g++ 4.8 or clang++ 3.4 (CXX=g++)
wget http://gcc.skazkaforyou.com/releases/gcc-4.8.2/gcc-4.8.2.tar.gz;
tar -zxvf gcc-4.8.2.tar.gz
cd gcc-4.8.2
mkdir build
cd build
yum install gmp-devel mpfr-devel libmpc-devel
../configure --prefix=/usr
make && make install

但出現太多error,最後決定放棄,直接用binary檔安裝,指令如下

wget https://nodejs.org/dist/latest/node-v7.7.3-linux-x86.tar.gz
tar -zvxf node-v7.7.3-linux-x86.tar.gz
mv node-v7.7.3-linux-x86 nodejs
mv nodejs /opt

再,編寫profile檔
vi /etc/profile,於檔尾加入如下

export NODE_HOME=/opt/nodejs
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules

source /etc/profile

最後
node -v
可看到版號,即安裝完成