Ñò
B xic           @   sù   d  Z  d d k Z d d k Z d d k Z d d k Z d e f d „  ƒ  YZ d d d „  ƒ  YZ d d d „  ƒ  YZ d	 e f d
 „  ƒ  YZ	 d d d „  ƒ  YZ
 d „  Z d d „ Z d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z d S(   se   Python NTP library.

Implementation of client-side NTP (RFC-1305), and useful NTP-related
functions.
iÿÿÿÿNt   NTPExceptionc           B   s   e  Z d  Z RS(   s    Exception raised by this module.(   t   __name__t
   __module__t   __doc__(    (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyR    %   s   t   NTPc           B   s±  e  Z d  Z e i e i d ƒ d d !Œ  Z e i d d d ƒ Z e e i	 d d Z
 h  d d 6d	 d
 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d  6d! d" 6d# d$ 6d% d& 6d% d' 6d( d) 6d* d+ 6d, d- 6d. d/ 6d0 d1 6d2 d3 6d4 d5 6d6 d7 6d8 d9 6d: d; 6d< d= 6d> d? 6d@ dA 6dB dC 6dD dE 6Z h dF d 6dG d 6Z h dH d 6dI d 6dJ dK 6dL d 6dM dN 6dO dP 6dQ dR 6dS dT 6Z h dU d 6dV d 6dW dK 6dX d 6Z RS(Y   s    Helper class defining constants.i    i   il  i   i   i  s)   Geostationary Orbit Environment Satellitet   GOESs   Global Position Systemt   GPS s   Galileo Positioning Systemt   GAL s   Generic pulse-per-secondt   PPS s!   Inter-Range Instrumentation Groupt   IRIGs$   LF Radio WWVB Ft. Collins, CO 60 kHzt   WWVBs'   LF Radio DCF77 Mainflingen, DE 77.5 kHzt   DCF s    LF Radio HBG Prangins, HB 75 kHzt   HBG s   LF Radio MSF Anthorn, UK 60 kHzt   MSF s2   LF Radio JJY Fukushima, JP 40 kHz, Saga, JP 60 kHzt   JJY s!   MF Radio LORAN C station, 100 kHzt   LORCs   MF Radio Allouis, FR 162 kHzt   TDF s   HF Radio CHU Ottawa, Ontariot   CHU s   HF Radio WWV Ft. Collins, COt   WWV s   HF Radio WWVH Kauai, HIt   WWVHs   NIST telephone modemt   NISTt   ACTSs   USNO telephone modemt   USNOs   European telephone modemt   PTB s   uncalibrated local clockt   LOCLs   calibrated Cesium clockt   CESMs   calibrated Rubidium clockt   RBDMs   OMEGA radionavigation systemt   OMEGs   DCN routing protocolt   DCN s   TSP time protocolt   TSP s   Digital Time Servicet   DTS s   Atomic clock (calibrated)t   ATOMs   VLF radio (OMEGA,, etc.)t   VLF s   External 1 PPS inputt   1PPSs   (Internal clock)t   FREEs   (Initialization)t   INITt   NULLt       s   unspecified or invalids   primary reference (%s)t   reserveds   symmetric actives   symmetric passivei   t   clientt   serveri   t	   broadcasti   s!   reserved for NTP control messagesi   s   reserved for private usei   s
   no warnings%   last minute of the day has 61 secondss%   last minute of the day has 59 secondss   unknown (clock unsynchronized)(   R   R   R   t   datetimet   datet   timet   gmtimet   _SYSTEM_EPOCHt
   _NTP_EPOCHt   dayst	   NTP_DELTAt   REF_ID_TABLEt   STRATUM_TABLEt
   MODE_TABLEt
   LEAP_TABLE(    (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyR   *   sn   



t	   NTPPacketc           B   s8   e  Z d  Z d Z d d d d „ Z d „  Z d „  Z RS(   s:   NTP packet class.

    This represents an NTP packet.
    s   !B B B b 11Ii   i   i    c         C   sy   d |  _  | |  _ | |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _ d |  _	 d |  _
 d |  _ | |  _ d S(   sµ   Constructor.

        Parameters:
        version      -- NTP version
        mode         -- packet mode (client, server)
        tx_timestamp -- packet transmit timestamp
        i    N(   t   leapt   versiont   modet   stratumt   pollt	   precisiont
   root_delayt   root_dispersiont   ref_idt   ref_timestampt   orig_timestampt   recv_timestampt   tx_timestamp(   t   selfR8   R9   RC   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   __init__|   s    													c         C   s  yê t  i t i |  i d >|  i d >B|  i B|  i |  i |  i	 t
 |  i ƒ d >t |  i d ƒ Bt
 |  i ƒ d >t |  i d ƒ B|  i t
 |  i ƒ t |  i ƒ t
 |  i ƒ t |  i ƒ t
 |  i ƒ t |  i ƒ t
 |  i ƒ t |  i ƒ ƒ } Wn" t  i j
 o t d ƒ ‚ n X| S(   sÇ   Convert this NTPPacket to a buffer that can be sent over a socket.

        Returns:
        buffer representing this packet

        Raises:
        NTPException -- in case of invalid field
        i   i   i   s   Invalid NTP packet fields.(   t   structt   packR6   t   _PACKET_FORMATR7   R8   R9   R:   R;   R<   t   _to_intR=   t   _to_fracR>   R?   R@   RA   RB   RC   t   errorR    (   RD   t   packed(    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   to_dataŸ   s*    	 c      	   C   sZ  y, t  i t i | d t  i t i ƒ !ƒ } Wn" t  i j
 o t d ƒ ‚ n X| d d ?d @|  _ | d d ?d @|  _ | d d @|  _	 | d |  _
 | d |  _ | d |  _ t | d ƒ d |  _ t | d
 ƒ d |  _ | d |  _ t | d | d ƒ |  _ t | d | d ƒ |  _ t | d | d ƒ |  _ t | d | d ƒ |  _ d S(   sÚ   Populate this instance from a NTP packet payload received from
        the network.

        Parameters:
        data -- buffer payload

        Raises:
        NTPException -- in case of invalid packet format
        i    s   Invalid NTP packet.i   i   i   i   i   i   i   i   i   i	   i
   i   i   i   i   Ni   i   (   RF   t   unpackR6   RH   t   calcsizeRK   R    R7   R8   R9   R:   R;   R<   t   floatR=   R>   R?   t   _to_timeR@   RA   RB   RC   (   RD   t   datat   unpacked(    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt	   from_data¾   s$    
 (   R   R   R   RH   RE   RM   RT   (    (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyR6   s   s
   #	t   NTPStatsc           B   s€   e  Z d  Z d „  Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 e d „  ƒ Z RS(	   s“   NTP statistics.

    Wrapper for NTPPacket, offering additional statistics like offset and
    delay, and timestamps converted to system time.
    c         C   s   t  i |  ƒ d |  _ d S(   s   Constructor.i    N(   R6   RE   t   dest_timestamp(   RD   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyRE   ä   s    	c         C   s    |  i  |  i |  i |  i d S(   t   offseti   (   RB   RA   RC   RV   (   RD   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyRW   ê   s    c         C   s   |  i  |  i |  i |  i S(   s   round-trip delay(   RV   RA   RC   RB   (   RD   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   delayð   s    c         C   s   t  |  i ƒ S(   s"   Transmit timestamp in system time.(   t   ntp_to_system_timeRC   (   RD   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   tx_timeö   s    c         C   s   t  |  i ƒ S(   s!   Receive timestamp in system time.(   RY   RB   (   RD   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt	   recv_timeû   s    c         C   s   t  |  i ƒ S(   s#   Originate timestamp in system time.(   RY   RA   (   RD   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt	   orig_time   s    c         C   s   t  |  i ƒ S(   s#   Reference timestamp in system time.(   RY   R@   (   RD   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   ref_time  s    c         C   s   t  |  i ƒ S(   s%   Destination timestamp in system time.(   RY   RV   (   RD   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt	   dest_time
  s    (   R   R   R   RE   t   propertyRW   RX   RZ   R[   R\   R]   R^   (    (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyRU   Ý   s   	t	   NTPClientc           B   s)   e  Z d  Z d „  Z d d d d „ Z RS(   s   NTP client session.c         C   s   d S(   s   Constructor.N(    (   RD   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyRE     s    i   t   ntpi   c         C   s6  t  i | | ƒ d } | d | d } } t  i  | t  i ƒ } zÅ y˜ | i | ƒ t d d d | d t t i ƒ  ƒ ƒ }	 | i |	 i ƒ  | ƒ d
 }
 x/ |
 d | d j o | i
 d ƒ \ } }
 q™ Wt t i ƒ  ƒ } Wn& t  i j
 o t d | ƒ ‚ n XWd	 | i ƒ  Xt ƒ  } | i | ƒ | | _ | S(   s÷   Query a NTP server.

        Parameters:
        host    -- server name/address
        version -- NTP version to use
        port    -- server port
        timeout -- timeout on socket operations

        Returns:
        NTPStats object
        i    i   R9   i   R8   RC   i   s   No response received from %s.N(   N(   t   sockett   getaddrinfot
   SOCK_DGRAMt
   settimeoutR6   t   system_to_ntp_timeR,   t   sendtoRM   t   Nonet   recvfromt   timeoutR    t   closeRU   RT   RV   (   RD   t   hostR8   t   portRj   t   addrinfot   familyt   sockaddrt   st   query_packett   src_addrt   response_packetRV   t   stats(    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   request  s*      		(   R   R   R   RE   Rv   (    (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyR`     s   	c         C   s
   t  |  ƒ S(   s|   Return the integral part of a timestamp.

    Parameters:
    timestamp -- NTP timestamp

    Retuns:
    integral part
    (   t   int(   t	   timestamp(    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyRI   H  s    	i    c         C   s"   t  t |  t |  ƒ ƒ d | ƒ S(   s·   Return the fractional part of a timestamp.

    Parameters:
    timestamp -- NTP timestamp
    n         -- number of bits of the fractional part

    Retuns:
    fractional part
    i   (   Rw   t   absRI   (   Rx   t   n(    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyRJ   T  s    
c         C   s   |  t  | ƒ d | S(   sÔ   Return a timestamp from an integral and fractional part.

    Parameters:
    integ -- integral part
    frac  -- fractional part
    n     -- number of bits of the fractional part

    Retuns:
    timestamp
    i   (   RP   (   t   integt   fracRz   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyRQ   a  s    c         C   s   |  t  i S(   s‹   Convert a NTP time to system time.

    Parameters:
    timestamp -- timestamp in NTP time

    Returns:
    corresponding system time
    (   R   R1   (   Rx   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyRY   o  s    	c         C   s   |  t  i S(   s   Convert a system time to a NTP time.

    Parameters:
    timestamp -- timestamp in system time

    Returns:
    corresponding NTP time
    (   R   R1   (   Rx   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyRf   {  s    	c         C   s,   |  t  i j o t  i |  St d ƒ ‚ d S(   sÃ   Convert a leap indicator to text.

    Parameters:
    leap -- leap indicator value

    Returns:
    corresponding message

    Raises:
    NTPException -- in case of invalid leap indicator
    s   Invalid leap indicator.N(   R   R5   R    (   R7   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   leap_to_text‡  s    c         C   s,   |  t  i j o t  i |  St d ƒ ‚ d S(   s­   Convert a NTP mode value to text.

    Parameters:
    mode -- NTP mode

    Returns:
    corresponding message

    Raises:
    NTPException -- in case of invalid mode
    s   Invalid mode.N(   R   R4   R    (   R9   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   mode_to_text™  s    c         C   sm   |  t  i j o t  i |  |  Sd |  j  o
 d j  n o	 d |  S|  d j o	 d |  St d ƒ ‚ d S(   sµ   Convert a stratum value to text.

    Parameters:
    stratum -- NTP stratum

    Returns:
    corresponding message

    Raises:
    NTPException -- in case of invalid stratum
    i   i   s   secondary reference (%s)s   unsynchronized (%s)s   Invalid stratum or reserved.N(   R   R3   R    (   R:   (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   stratum_to_text«  s    		i   c         C   sµ   |  d ?d @|  d ?d @|  d ?d @|  d @f } d | j o
 d j n o2 d | } | t  i j o t  i | Sd | Sn4 d	 | j o
 d j  n o	 d
 | St d ƒ ‚ d S(   s  Convert a reference clock identifier to text according to its stratum.

    Parameters:
    ref_id  -- reference clock indentifier
    stratum -- NTP stratum

    Returns:
    corresponding message

    Raises:
    NTPException -- in case of invalid stratum
    i   iÿ   i   i   i    i   s   %c%c%c%cs"   Unidentified reference source '%s'i   s   %d.%d.%d.%ds   Invalid stratum.N(   R   R2   R    (   R?   R:   t   fieldst   text(    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   ref_id_to_textÁ  s    
	(    (    (    (   R   R*   Rb   RF   R,   t	   ExceptionR    R   R6   RU   R`   RI   RJ   RQ   RY   Rf   R}   R~   R   R‚   (    (    (    s-   /usr/local/qcloud/monitor/barad/lib/ntplib.pyt   <module>   s$   Ij38						