%red%+++'''Net::NTP'''+++%red% img://www.isogest.org/Home/guest/images/opliti.png La gerarchia Net::* all'interno di CPAN è molto popolata. Uno dei suoi abitanti più semplici, ma non per questo meno utili, è Net::NTP, http://search.cpan.org/search?query=Net%3A%3ANTP&mode=module 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