Si vous avez un serveur NTP (Network Time Protocol) et que vous avez enregistré votre machine sur pool.ntp.org (ce qui est bien) vous avez sûrement remarqué qu’on peut consulter l’évolution de l’offset de son service via une représentation graphique.
REMARQUE : je n’ai pas créé de fil de digression sur ce tuto parce qu’à mon avis ça ne va pas faire vibrer les foules, si toutefois vous voulez en faire un pour causer je rajouterai le lien ici.
Voici une méthode pour avoir la représentation graphique des grandeurs significatives de son serveur NTP sur son service HTTP.
Elle est inspirée du tuto de lol sur iptraf http://forum.debian-fr.org/viewtopic.php?f=8&t=27644 (dont je vous conseille la lecture car je ne reviendrai pas sur ce qu’il a déjà dit) et de quelques recherches personnelles.
Elle requiert :
- un service ntpd,
- rrdtool,
- un service http prenant en charge les scripts CGI.
1. Création de la base de données
On s’attachera seulement à la représentation de l’offset mais sachez que de nombreuses autres grandeurs sont accessibles et qu’il n’est pas compliqué de mondifier ce tuto pour en ajouter.
2. Mise à jour de la base de données
On crée un script /usr/local/bin/ntp_upgrade contenant
#! /bin/bash
OFFSET=`ntpq -c rv | awk 'BEGIN{ RS=","}{ print }' | grep offset | awk 'BEGIN{FS="="}{print $2}'`
rrdtool update /var/lib/rrd/ntp.rrd N:${OFFSET}
On lance ce script régulièrement via cron, toutes les 5mn par exemple
3. Génération de la page web affichant le graphe
C’est là qu’il faut avoir un serveur prenant en charge les CGI.
Dans le répertoire qui va bien on crée le script ntp_graph.cgi
#!/usr/bin/perl -w
use strict;
use RRDs;
use POSIX qw(uname);
my $host = (POSIX::uname())[1];
my $rrd = '/var/lib/rrd/ntp.rrd';
sub refresh_graph
{
my $hour=$_[0];
my $fulltime=3600*$hour;
my $file="./ntp_offset.png";
RRDs::graph("$file",
"--end",
"now",
"--start",
"end-$fulltime",
"DEF:offset=$rrd:offset:AVERAGE",
"CDEF:noffset=offset,1000,/",
"LINE1:noffset#0000FF",
);
}
sub main
{
print "Content-Type: text/html\n\n";
# envoi du header
print <<HEADER;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Analyse du service NTP de $host</title>
<meta http-equiv="Refresh" content="300" />
<meta http-equiv="Pragma" content="no-cache" />
<link rel="stylesheet" href="mailgraph.css" type="text/css" />
</head>
<body>
HEADER
print "<h1>Analyse du service NTP de $host</h1>\n";
# recuperation de la periode d'analyse
my $time=$ENV{QUERY_STRING};
$time =~ s/\/[^\/]+$//;
$time =~ s/\//,/g;
$time =~ s/(\~|\%7E)/tilde,/g;
# test sur la valeur passee en argument : elle doit exister, etre positive et inferieure a 1 an
if ( ($time == '') || ($time<0) || ($time>8760) )
{
print "Periode d'analyse par defaut (6 heures)";
refresh_graph(6);
}
else
{
print "Periode d'analyse $time heures";
refresh_graph($time);
}
# affichage du graphe
print "<br><br>";
print "<img src=\"./ntp_offset.png\">";
print "<br><br>";
print <<FOOTER;
<br>
Mettez ce que vous voulez</a>
<br>
</body></html>
FOOTER
}
main;
Ce script est conçu pour qu’on lui passe la durée d’analyse en heure via la requête http://machine.domaine.org/ouvousvoulez/ntp_graph.cgi?2, soit 2 heures. Si on ne passe pas d’argument l’analyse est faite sur 6 heures.
EDIT : j’ai pris la CSS de mailgraph parce que c’est plus chouette chez moi mais virez cette ligne au besoin.
Vous aurez alors une page avec un joli graphe comme celui-là