Les guerres d'un Responsable Informatique

Vous êtes passionnés comme moi de machines basse-consommation, ARM, Atom : rendez visite à mon partenaire !

Temps réel avec node.js

lundi 30 août 2010 à 21:40 | Dev
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 !

A propos de Vincent RABAH

Directeur des systemes d'information

Je suis DSI depuis 10 ans. Spécialiste en systèmes d'information et réseaux.
Expert en management, GreenIT et virtualisation de serveurs. Vous pouvez consulter l'ensemble de mon parcours.

I do speak English even if my blog is written in French ... Feel free to leave comments, I'll answer you !


Partagez cet article :



Fil des commentaires de cet article

4 commentaire(s) Commentaires »

  1. Bien heureux, que mon script node.js profite à quelques uns !
    Cordialement,
    Vincent

  2. C'est exactement le code que je cherchais. Merci !

  3. Dear Stephen,
    Yes I read your English :) Thank's for your comment!
    I will write other examples in a near futur, and perhaps a websocket one ?!
    I will try to post you some links with node.js and websocket scripts.

    Regards,

  4. Hello,

    I do read French, anyway I hope you read my English ?... This are really good examples ! They do work perfectly.

    I just want to know if you planned to make some examples using websockets ?

    Thank's.

    Stephen.

Laisser un Commentaire

Quelle est la première lettre du mot pjzf ? :