ó
Rü½cc           @   sû   d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l m Z d d l m	 Z	 d d l m
 Z
 d d l m Z d d l m Z d Z y e e f Wn e k
 rÑ d	 Z d
 Z n Xe Z d Z d Z d d d „  ƒ  YZ d S(   s:   Reading and writing message objects and message metadata.
iÿÿÿÿN(   t   mm_cfg(   t   Utils(   t   Message(   t   syslog(   t   sha_newl   ÿÿÿÿÿÿÿÿÿÿÿi   i    g-Cëâ6?i   t   Switchboardc           B   sY   e  Z d	 d  e d „ Z d „  Z i  d „ Z d „  Z e d „ Z d d „ Z	 d „  Z
 RS(
   i   c         C   sÜ   | |  _  t j d ƒ } zI y t j |  j  d ƒ Wn+ t k
 r_ } | j t j k r` ‚  q` n XWd  t j | ƒ Xd  |  _ d  |  _	 | d k rÅ t
 d | | |  _ t
 d | d | d |  _	 n  | rØ |  j ƒ  n  d  S(   Ni    iø  i   (   t   _Switchboard__whichqt   ost   umaskt   mkdirt   OSErrort   errnot   EEXISTt   Nonet   _Switchboard__lowert   _Switchboard__uppert   shamaxt   recover_backup_files(   t   selft   whichqt   slicet	   numslicest   recovert   omaskt   e(    (    s8   /export/web/mailman/mailman/Mailman/Queue/Switchboard.pyt   __init__J   s     	 		 c         C   s   |  j  S(   N(   R   (   R   (    (    s8   /export/web/mailman/mailman/Mailman/Queue/Switchboard.pyR   `   s    c         K   sË  | j  ƒ  } | j | ƒ | j d d ƒ } t j ƒ  } t rh | j d ƒ rh d } t j | | ƒ } n d } t j t | ƒ | ƒ } | | | }	 | j d | ƒ }
 |
 d t	 |	 ƒ j
 ƒ  } t j j |  j | d ƒ } | d	 } t j | d
 <x- | j ƒ  D] } | j d ƒ r| | =qqW| d k | d <t j d ƒ } zb t | d ƒ } zA | j | ƒ t j | | | ƒ | j ƒ  t j | j ƒ  ƒ Wd  | j ƒ  XWd  t j | ƒ Xt j | | ƒ | S(   Nt   listnames
   --nolist--t
   _plaintexti   i    t   received_timet   +s   .pcks   .tmpt   versiont   _t	   _parsemsgi   t   w(   t   copyt   updatet   gett   timet   SAVE_MSGS_AS_PICKLESt   cPicklet   dumpst   strt
   setdefaultR   t	   hexdigestR   t   patht   joinR   R    t   QFILE_SCHEMA_VERSIONt   keyst
   startswithR   t   opent   writet   dumpt   flusht   fsynct   filenot   closet   rename(   R   t   _msgt	   _metadatat   _kwst   dataR   t   nowt   protocolt   msgsavet   hashfoodt   rcvtimet   filebaset   filenamet   tmpfilet   kR   t   fp(    (    s8   /export/web/mailman/mailman/Mailman/Queue/Switchboard.pyt   enqueuec   s>    

c         C   sµ   t  j j |  j | d ƒ } t  j j |  j | d ƒ } t | ƒ } t  j | | ƒ z" t j | ƒ } t j | ƒ } Wd  | j ƒ  X| j	 d ƒ r« t
 j | t j ƒ } n  | | f S(   Ns   .pcks   .bakR    (   R   R,   R-   R   R1   R8   R'   t   loadR7   R$   t   emailt   message_from_stringR   (   R   RB   RC   t   backfileRF   t   msgR<   (    (    s8   /export/web/mailman/mailman/Mailman/Queue/Switchboard.pyt   dequeue•   s    c         C   sø   t  j j |  j | d ƒ } y¯ | r½ t  j j t j | d ƒ } t  j d ƒ } zI y t  j t j d ƒ Wn+ t k
 r— } | j	 t	 j
 k r˜ ‚  q˜ n XWd  t  j | ƒ Xt  j | | ƒ n t  j | ƒ Wn& t k
 ró } t d d | | ƒ n Xd  S(   Ns   .baks   .psvi    iø  t   errors,   Failed to unlink/preserve backup file: %s
%s(   R   R,   R-   R   R    t   BADQUEUE_DIRR   R	   R
   R   R   R8   t   unlinkt   EnvironmentErrorR   (   R   RB   t   preservet   bakfilet   psvfileR   R   (    (    s8   /export/web/mailman/mailman/Mailman/Queue/Switchboard.pyt   finish¨   s"     	s   .pckc         C   s  i  } |  j  } |  j } xÃ t j |  j ƒ D]¯ } t j j | ƒ \ } } | | k r[ q+ n  | j d ƒ \ } }	 | d  k s¡ | t	 |	 d ƒ k oœ | k n r+ t
 | ƒ }
 x | j |
 ƒ rÌ |
 t 7}
 q° W| | |
 <q+ q+ W| j ƒ  } | j ƒ  g  | D] } | | ^ qû S(   NR   i   (   R   R   R   t   listdirR   R,   t   splitextt   splitR   t   longt   floatt   has_keyt   DELTAR/   t   sort(   R   t	   extensiont   timest   lowert   uppert   fRB   t   extt   whent   digestt   keyR/   RE   (    (    s8   /export/web/mailman/mailman/Mailman/Queue/Switchboard.pyt   files¾   s     		1
c   
      C   sª  x£|  j  d ƒ D]’} t j j |  j | d ƒ } t j j |  j | d ƒ } t | d ƒ } z7y. t j | ƒ } | j ƒ  } t j | ƒ } Wn= t	 k
 rÍ } t
 d d d | | ƒ |  j | d t ƒnÆ X| j d d	 ƒ d
 | d <| j | ƒ | j d ƒ rd	 }	 n d
 }	 t j | | |	 ƒ | j ƒ  | j ƒ  t j | j ƒ  ƒ | d t k rƒt
 d d | ƒ |  j | d t ƒn t j | | ƒ Wd  | j ƒ  Xq Wd  S(   Ns   .baks   .pcks   rb+RN   s   Unpickling .bak exception: %s
s   preserving file: %sRR   t
   _bak_counti    i   R    s(   .bak file max count, preserving file: %s(   Rg   R   R,   R-   R   R1   R'   RH   t   tellt	   ExceptionR   RU   t   TrueR*   t   seekR$   R3   t   truncateR4   R5   R6   t   MAX_BAK_COUNTR8   R7   (
   R   RB   t   srct   dstRF   RL   t   data_posR<   t   sR>   (    (    s8   /export/web/mailman/mailman/Mailman/Queue/Switchboard.pyR   Ö   s:    		

N(   t   __name__t
   __module__R   t   FalseR   R   RG   RM   RU   Rg   R   (    (    (    s8   /export/web/mailman/mailman/Mailman/Queue/Switchboard.pyR   I   s   	2	(    (   t   __doc__R   R%   RI   R   R'   t   marshalt   MailmanR    R   R   t   Mailman.Logging.SyslogR   t   Mailman.UtilsR   R   Rk   Ru   t	   NameErrorR&   R\   Rn   R   (    (    (    s8   /export/web/mailman/mailman/Mailman/Queue/Switchboard.pyt   <module>   s*   
