-+  Associazione
-+  Documenti
-+  Eventi
-+  Community
-+  Blog
-+  Link

Ottobre 2013

Dom Lun Mar Mer Gio Ven Sab
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Cerca






 

« TuxJournal, primo numero. Con Perl! | Home | Software Libero nel mercato tecnologico »

Un orologio atomico in Perl
20.04.05

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

Il nome deriva da Network Time Protocol, la cui specifica è la 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 (IEN) Galileo Ferraris 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' e' 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

Inviato da Cosimo il 20.04.05 19:41
Ti è piaciuto questo articolo? Iscriviti al feed!

Inviato da .mau. il 02.05.05 00:29

Alcuni sono facili:
'Receive Timestamp' => '1114016142.49566',
'Transmit Timestamp' => '1114016142.49567',
sono quando gli è arrivata la richiesta e quando l'ha spedita.

'Originate Timestamp' => '1114016142.00781',
'Reference Timestamp' => '1114016132.92965',
queste dovrebbero essere quelle che si usano per sincronizzare considerando il fatto che ci vuole un po' di tempo perché tu invii la richiesta e ricevi la risposta (un tempo di ping, insomma)

Leap Indicator dovrebbe dire se siamo nel secondo bisestile aggiunto spesso alla fine dell'anno per mantenersi coerenti con la rotazione terrestre.










Devo ricordare i dati personali?






D:
Sull'autore...
D:
La ML di Perl.it
Iscriviti! mongers@lists.perl.it è la lista ufficiale di Perl Mongers Italia per porre quesiti di tipo tecnico, per rimanere aggiornato su meeting, incontri, manifestazioni e novità su Perl.it.
D:
Annunci Google