realtime with node.js

Je poursuis ma série d'exemples sur le développement avec node.js, ce superbe outil qui permet de réaliser des applications serveur en javascript. J'aborde ici le temps réel, avec une démonstration tail -f http, une autre qui inclue un filtrage IP.

Le but de ce premier script node.js est d'afficher en continu, un fichier de log passé en paramètre, à la façon d'un tail -f. Une fois le serveur démarré, il faut faire pointer son navigateur préféré sur l'adresse suivante : http://adresse:8080. Le fichier de log s'affiche alors dans le navigateur.

#!/usr/local/bin/node

var sys = require('sys');
var fs  = require('fs');

/*
------------------------------
 Process réalisant le tail -f
------------------------------
*/
function Spawn() {
  var spawn = require('child_process').spawn;
  var tail = spawn("tail", ["-f", filename]);
  return tail;
}

/*
------------------------------
 Le serveur http
------------------------------
*/
function Server() {
  var http = require("http");
  http.createServer(function(req,res){
    res.writeHead(200,{'Content-Type': 'text/plain'});
    tail.stdout.addListener('data', function (data) {
      res.write(data);
    });
  sys.puts("Listen on 8080");
  }).listen(8080);
}

var filename = process.ARGV[2];
if (!filename)return sys.puts("Usage: ./tail.js filename");
var tail = Spawn();
Server();

Maintenant, il peut être intéressant de n'autoriser que certaines adresses IP à se connecter sur cette console. On va pour cela créer un fichier iplist.txt, qui contiendra les adresses autorisées.

Il peut être intéressant de demander au programme de surveiller, et de prendre en compte les modifications des adresses IP du fichier iplist.txt : pour cela utilisez la fonction fs.watchFile.

Avant d'afficher le flux http, on test la série d'adresses IP.

#!/usr/local/bin/node

var sys = require('sys');
var fs  = require('fs');

/*
------------------------------
 Chargement des IPs autorisées
------------------------------
*/
function IPLoad() {
  sys.puts("Updating iplist.");
  iplist = fs.readFileSync('./iplist.txt').toString().split('\n')
           .filter(function(ip) { return ip.length });
}

/*
------------------------------
 Process réalisant le tail -f
------------------------------
*/
function Spawn() {
  var spawn = require('child_process').spawn;
  var tail = spawn("tail", ["-f", filename]);
  return tail;
}

/*
------------------------------
 Le serveur http
------------------------------
*/
function Server() {
  var http = require("http");
  http.createServer(function(req,res){
    var allowed_ip = false;
    for(i in iplist) {
      sys.puts("loop");
      if (iplist[i] == req.connection.remoteAddress) {
        allowed_ip = true;
        break;
      }
    }
    if(allowed_ip == true) {
      res.writeHead(200,{'Content-Type': 'text/plain'});
      tail.stdout.addListener('data', function (data) {
        res.write(data);});
      }
    else {
      res.writeHead(401);
      res.write("Forbidden !!");
      res.end();
    }
    sys.puts("Listen open port 8080");
  }).listen(8080);
}

var filename = process.ARGV[2];
var iplist;
if (!filename)return sys.puts("Usage: ./tail.js filename");
IPLoad();
/*
------------------------------
 Process réalisant la mise
 une observation des 
 modifications
 du fichier iplist.txt
------------------------------
*/
fs.watchFile('./iplist.txt', function(c,p) { IPLoad(); });
var tail = Spawn();
Server();

Voilà de quoi vous amuser un peu avec node.js, en attendant mon prochaine article !