%red%+++'''Net::NTP'''+++%red%
[img://www.isogest.org/Home/guest/images/opliti.png|right|opliti]
La gerarchia Net::* all'interno di CPAN è molto popolata. Uno dei suoi abitanti più semplici, ma non per questo meno utili, è [http://search.cpan.org/search?query=Net%3A%3ANTP&mode=module|Net::NTP]
Il nome deriva da '''N'''etwork '''T'''ime '''P'''rotocol, la cui specifica è la [http://rfc.net/rfc2030.txt|RFC2030] . Questo protocollo permette a client e server di scambiarsi informazioni temporali.
Esistono diversi ''time server'' o ''ntp server'' in giro per il mondo che possono essere interrogati per sapere l'ora esatta, con vari gradi di precisione (orologi atomici, orologi al quarzo cinese a batterie, ...).
Il server italiano di riferimento è gestito dall' "Istituto Elettrotecnico Nazionale" http://www.ien.it (IEN) "Galileo Ferraris" http://www.museoelettrico.com/storia/ferraris.html di Torino.
Se non avete ancora installato Net::NTP, provvedete ora con un bel perl -MCPAN -e 'install Net::NTP', con il vostro utente privilegiato di fiducia.
Ecco un esempio di codice che stampa la data e ora esatte:
#!/usr/bin/perl
use strict;
use warnings;
use Net::NTP;
# `time.ien.it' è l'hostname del time server dello IEN
my %ntp_data = get_ntp_response('time.ien.it');
if(%ntp_data && exists $ntp_data{'Reference Timestamp'}) {
print localtime($ntp_data{'Reference Timestamp'})."\n";
}
A questo punto, pero', ci viene la curiosità di sapere in questo hash @%ntp_data@ quali altre chiavi sono presenti?
Eccoci accontentati:
#!/usr/bin/perl
use strict;
use warnings;
use Net::NTP;
use Data::Dumper;
my %ntp_data = get_ntp_response('time.ien.it');
print Dumper(\%ntp_data);
Il risultato è qualcosa di simile a:
$VAR1 = {
'Version Number' => 3,
'Root Delay' => '0',
'Precision' => -19,
'Leap Indicator' => 0,
'Stratum' => 1,
'Receive Timestamp' => '1114016142.49566',
'Transmit Timestamp' => '1114016142.49567',
'Originate Timestamp' => '1114016142.00781',
'Reference Timestamp' => '1114016132.92965',
'Poll Interval' => '0.0000',
'Reference Clock Identifier' => 'IEN',
'Root Dispersion' => '0.0000',
'Mode' => 4
};
Ovviamente, non ho la benchè minima idea di cosa vogliano dire tutte queste informazioni, tranne '''Stratum''', che se uguale a '''1''' (uno), significa che il time server che abbiamo interrogato è collegato ad un orologio atomico (!).
Rimangono due argomenti:
* come '''sincronizzare''' l'ora del mio sistema?
* come farlo in '''una riga sola'''?
Ecco uno script che sincronizza l'ora del server in base alla lettura NTP
(assumiamo che si tratti di un sistema unix/linux).
#!/usr/bin/perl
use strict;
use warnings;
use Net::NTP;
my %ntp_data = get_ntp_response('time.ien.it');
my @time = localtime $ntp_data{'Reference Timestamp'};
my $mydate = sprintf('%04d/%02d/%02d %02d:%02d:%02d', 1900+$time[5], ++$time[4], @time[3, 2, 1, 0]);
# $mydate ora sara' uguale a "2005/04/20 21:59:59"
print $mydate, "\n";
system("date --set=$mydate");
Punto due: come farlo '''in una riga sola'''?
perl -MNet::NTP -le
'my @d=localtime({get_ntp_response("time.ien.it")}->{"Reference Timestamp"});
system(sprintf(qq(date --set="%04d/%02d/%02d %d:%d:%d"), 1900+$d[5], ++$d[4], @d[3,2,1,0]));'
Ed ora, *il tocco finale*: salvate la data e ora di sistema nel BIOS:
/sbin/clock -w
Buon divertimento!
--
[cosimo] - cosimo at cpan dot org