
Dcc           @   s  d  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 d l m Z d d	 l m Z d d
 l m Z y e e f Wn e k
 r d Z d Z n Xd   Z d   Z d d d     YZ d S(   s   Mixin class for putting new messages in the right place for archival.

Public archives are separated from private ones.  An external archival
mechanism (eg, pipermail) should be pointed to the right places, to do the
archival.
iN(   t   StringIO(   t   mm_cfg(   t   Mailbox(   t   Utils(   t   Site(   t   SafeDict(   t   syslog(   t   _i   i    c         C   sF   y t  j |  |  Wn+ t k
 rA } | j t j k rB   qB n Xd  S(   N(   t   ost   symlinkt   OSErrort   errnot   EEXIST(   t   oldt   newt   e(    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   makelink/   s
    c         C   sC   y t  j |   Wn+ t k
 r> } | j t j k r?   q? n Xd  S(   N(   R   t   unlinkR
   R   t   ENOENT(   t   linkR   (    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt	   breaklink6   s
    t   Archiverc           B   sY   e  Z d    Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 RS(	   c         C   s  t  j |  _ t  j |  _ t  j |  _ t j d  } z|y t j	 |  j
   d d  Wn+ t k
 r } | j t j k r   q n Xy t j	 |  j
   d  Wn+ t k
 r } | j t j k r   q n Xt j j |  j
   d  } d  } y t |  } Wn t k
 r} | j t j k r%  n  t j d  } z t | d  } Wd  t j |  X| j t j d i |  j d 6|  j d	 d
 d d	 6d |   n X| r| j   n  Wd  t j |  Xd  S(   Ni    s   .mboxi  s
   index.htmli   t   ws   emptyarchive.htmlt   listnamet   listinfot   absolutei   t   mlist(   R   t   DEFAULT_ARCHIVEt   archivet   DEFAULT_ARCHIVE_PRIVATEt   archive_privatet    DEFAULT_ARCHIVE_VOLUME_FREQUENCYt   archive_volume_frequencyR   t   umaskt   mkdirt   archive_dirR
   R   R   t   patht   joint   Nonet   opent   IOErrorR   t   writeR   t   maketextt	   real_namet   GetScriptURLt   close(   t   selft   omaskR   t	   indexfilet   fp(    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   InitVarsD   sD     
 
 c         C   s   t  j |  j    S(   N(   R   t   get_archpatht   internal_name(   R.   (    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyR#      s    c         C   s'   t  j j |  j   d |  j   d  S(   s?   The mbox name where messages are left for archive construction.s   .mbox(   R   R$   R%   R#   R4   (   R.   (    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   ArchiveFileName   s    c         C   s   |  j  d d d d } |  j r& | St j d |  j d  pG t j } t j i |  j   d 6| d 6} | j	 d  s | d 7} n  | Sd  S(   Nt   privateR   i   t   /s   [^:]*://([^/]*)/.*R   t   hostname(
   R,   R   t   ret   matcht   groupR   t   DEFAULT_URL_HOSTt   PUBLIC_ARCHIVE_URLR4   t   endswith(   R.   t   urlR8   (    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   GetBaseArchiveURL   s    			c         C   s>   t  j d  } z t j t | d   SWd t  j |  Xd S(   s5   Open (creating, if necessary) the named archive file.i   s   a+N(   R   R!   R   R'   (   R.   t   afnR/   (    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   __archive_file   s    c         C   si   y9 |  j    } |  j |  } | j |  | j j   Wn) t k
 rd } t d d | |    n Xd S(   s2   Retain a text copy of the message in an mbox file.t   errors#   Archive file access failure:
	%s %sN(   R5   t   _Archiver__archive_filet   AppendMessageR1   R-   R(   R   (   R.   t   postRA   t   mboxt   msg(    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   __archive_to_mbox   s    c         C   s}   t  i |  j   d 6|  j d 6 } | | } t j | d  } | j |  | j   } | ry t d d | d @d ? n  d  S(   NR   R8   R   RC   s+   external archiver non-zero exit status: %d
i   i   (   R   R4   t	   host_nameR   t   popenR)   R-   R   (   R.   t   art   txtt   dt   cmdt   extarcht   status(    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   ExternalArchive   s    
	c         C   s   t  j d k r d St  j d k rE |  j |  t  j d k rE d Sn  t |  } |  j } t  j r | r |  j t  j |  nm t  j r | r |  j t  j |  nH t |  } d d l	 } | j
 |   } | j |  | j   | j   d S(   s;   Store postings in mbox and/or pipermail archive, depending.iNi   i   (   i   i   (   R   t   ARCHIVE_TO_MBOXt   _Archiver__archive_to_mboxt   strR   t   PUBLIC_EXTERNAL_ARCHIVERRR   t   PRIVATE_EXTERNAL_ARCHIVERR    t	   HyperArcht   HyperArchivet   processUnixMailboxR-   (   R.   RH   RM   t	   private_pt   fRX   t   h(    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   ArchiveMail   s$    	
c         C   s   t  j d k r d  St j |  j   d t } |  j   } | d } | d } |  j rn t |  t |  n& t	 | |  t  j
 r t	 | |  n  d  S(   Nit   publics   .mbox(   R   RS   R   R3   R4   t   TrueR#   R   R   R   t   PUBLIC_MBOX(   R.   t   pubdirt   privdirt   pubmboxt   privmbox(    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   CheckHTMLArchiveDir   s    

	
	(   t   __name__t
   __module__R2   R#   R5   R@   RD   RT   RR   R^   Rf   (    (    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyR   ?   s   	>							 (    (   t   __doc__R   R   t	   tracebackR9   t	   cStringIOR    t   MailmanR   R   R   R   t   Mailman.SafeDictR   t   Mailman.Logging.SyslogR   t   Mailman.i18nR   R`   t   Falset	   NameErrorR   R   R   (    (    (    s8   /export/web/mailman/mailman/Mailman/Archiver/Archiver.pyt   <module>   s(   
			