-+  Documenti
-+  Eventi
-+  Contatti
-+  Blog
Gruppi di Mongers italiani

bologna.pm

nordest.pm

pisa.pm

roma.pm

salerno.pm

torino.pm


Progetto Opliti
Vuoi contribuire al progetto opliti ? Leggi come funziona IGWiki e inizia a tranquillamente a documentare il modulo che preferisci. Il sistema avviserà i revisiori delle tue modifiche. Se i tuoi contributi saranno ritenuti validi provvederemo subito a pubblicarli.




 

Net::NTP

opliti
La gerarchia Net::* all'interno di CPAN è molto popolata. Uno dei suoi abitanti più semplici, ma non per questo meno utili, è Net::NTP link

Il nome deriva da Network Time Protocol, la cui specifica è la RFC2030 link . 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 link (IEN) "Galileo Ferraris" http://www.museoelettrico.com/storia/ferraris.html link 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