
Dcc           @   s  d  Z  d d l m 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	 Z	 d d l
 Z
 d d l Z d d l Z d d l Z d d l m Z 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 d d l m Z d d l m Z d d l m Z d d l  m! Z! e j" Z" e j# Z# e$ Z% e j& ry d d l% Z% Wn e' k
 rn Xn  d Z( d Z) e j* d k r7y d d l+ Z+ Wn e' k
 rnN Xe+ j, e+ j-  \ Z. Z/ e0 e/ e1 e. d d   Z2 e+ j3 e+ j- e2 e/ f  n  y e4 e5 f Wn e6 k
 rdd Z4 d Z5 n Xe$ d  Z7 d   Z8 d   Z9 d   Z: d Z; e$ d  Z< e j= d  Z> e j= d e j?  Z@ e j= d  ZA e j= d  e j?  ZB e j= d!  ZC e j= d" e j?  ZD e j= d# e j?  ZE e j= d$  ZF i  ZG i  ZH e$ e$ e$ d%  ZI d& e jJ f d'     YZJ d( e jK f d)     YZL d S(*   sl  HyperArch: Pipermail archiving for Mailman

     - The Dragon De Monsyne <dragondm@integral.org>

   TODO:
     - Should be able to force all HTML to be regenerated next time the
       archive is run, in case a template is changed.
     - Run a command to generate tarball of html archives for downloading
       (probably in the 'update_dirty_archives' method).
i(   t   nested_scopesN(   t   decode_headert   make_header(   t   HeaderParseError(   t   Charset(   t   mm_cfg(   t   Utils(   t   Errors(   t   LockFile(   t   MailList(   t   i18n(   t   SafeDict(   t   syslog(   t   ArchiverMailboxt    s   
t   darwini   i   i   i    c         C   sK   d	 d
 d d f } x& | D] \ } } |  j  | |  }  q Wt j |  |  S(   Nt   &s   &amp;t   <s   &lt;t   >s   &gt;t   "s   &quot;(   R   s   &amp;(   R   s   &lt;(   R   s   &gt;(   R   s   &quot;(   t   replaceR   t
   uncanonstr(   t   st   langt   replst   thingt   repl(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt
   html_quotec   s    	c         C   s   t  j |   S(   N(   t   urllibt   quote(   R   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt	   url_quotem   s    c         C   s   |  j  d d  S(   Ns    t    (   R   (   R   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   null_to_spaceq   s    c         C   s   y t  j j |   } Wn2 t k
 rJ } | j t j k r@   n  t d  SX| d k  r t j   } z t j	 |  t d  } Wd  t j
 |  X| S| d k  r d | d Sd | d S(   Ns   size not availablei  s    %(size)i bytes i@B s    %d KB s    %d MB (   t   ost   patht   getsizet   OSErrort   errnot   ENOENTt   _R
   t   get_translationt   set_languaget   set_translation(   t   filenameR   t   sizet   et   otranst   out(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   sizeofu   s      s@   <META http-equiv="Content-Type" content="text/html; charset=%s">c         C   sU   t  |  t j  r$ t j |   } n t j t |    } t j | j d d  |  S(   NR   s   &quot;(   t
   isinstancet   typest   UnicodeTypeR   t   websafet   strR   R   (   t   argR   R   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt	   CGIescape   s    s
   ([(].*[)])s   \s*RE\s*(\[\d+\]\s*)?:\s*s   ([-+,.\w]+@[-+.\w]+)s&   ([a-z]+://.*?)(?:_\s|_$|$|[]})>\'"\s])s   ^\s*$s   ^\s*<HTML>\s*$s   ^\s*</HTML>\s*$s   ^([>|:]|&gt;)+c         C   s  | d  k r d } n	 | j } | d  k rN | d  k rB t j } qN | j } n  |  | | f } t j |  } | r t j |  } n  | d  k s | d  k r t j	 |  d | d t
 d | \ } } | t | <| t | <n  | } | d  k	 rya t |  }	 y |	 j |  } Wn; t k
 rKt | t j |  d  }
 |	 j |
  } n XWqt t f k
 r{} t d d | |  qXn  t j | |  S(   NR   R   t   rawt   mlistR   t   errors   broken template: %s
%s(   t   Nonet   _internal_nameR   t   DEFAULT_SERVER_LANGUAGEt   preferred_languaget   _templatefilepathcachet   gett   _templatecacheR   t   findtextt   TrueR   t   interpolatet   UnicodeErrort   unicodet
   GetCharSett	   TypeErrort
   ValueErrorR   R   (   t   templatefilet   dictR   R9   t   listnamet   cachekeyt   filepatht   templatet   textt   sdictt	   utemplateR-   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   quick_maketext   s<    		
	t   Articlec           B   s  e  Z e j j Z e j j Z e j   Z	 d d  g  e j d d  Z e j   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z e j d  Z e j d  Z d   Z  d   Z! d   Z" d   Z d   Z# d   Z$ RS(   i    c         C   s*  |  j  | | |  d  |  _ d  |  _ d } xq | d k r t j |  j  } | r | j d  } |  j | |  _ |  j d k r t d  |  _ q q. d } q. W| |  _	 | |  _
 t j rIt j   } zo t j |  |  j |  j k rt j d t d  |  j  |  _ |  _ n! t j d t d  |  j  |  _ Wd  t j |  Xn  | j d d  }	 | j d	 d  }
 |	 j   |  _ |
 j   |  _ i  |  _ t j | j  } t |  j p| } t | t   r| j! d
  } n  | j" |  } | r| j   j#   } | d d k r3| d d k r3| d d !} n  | d d k rc| d d k rc| d d !} n  y | j$ d t%  } Wn t& j' k
 rd  } n X| r| t j |  j	  k ry t  | |  } Wqt( t) f k
 rd  } qXn  | rg  | j*   D] } | d ^ q|  _+ qn  |  j,   d  S(   Ni    iR   s
   No subjectt   @s    at s   Content-Types
   text/plains   Content-Transfer-Encodings   us-asciiR   i   t   't   decodes   
(-   t   _Article__super_initR;   t   prevt   nextt   REpatt   matcht   subjectt   endR'   t   _langt   _mlistR   t   ARCHIVER_OBSCURES_EMAILADDRSR
   R(   R)   t   authort   emailt   ret   subR*   R@   t   lowert   ctypet   cenct   decodedR   RG   R>   R   t   output_charsetR1   RF   t   encodet   get_content_charsett   stript   get_payloadRC   t   binasciit   ErrorRE   t   LookupErrort
   splitlinest   bodyt   decode_headers(   t   selft   messaget   sequencet   keepHeadersR   R9   t   it   resultR.   Rg   Rh   t   csett   cset_outt   charsetRs   t   l(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   __init__  sf    		
			%	  
,c         C   sr   |  j  j |  } | sn y t j | d d } Wn* t j k
 r] } t d d | |  d  SX| |  j  | <n  | S(   Nt   locki    R:   s   error opening list: %s
%s(   t
   _listcacheR@   R	   R   t   MMListErrorR   R;   (   Ru   RL   R9   R-   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt
   _open_listV  s    c         C   s   |  j  j   } | j d  r2 | d } | d =n d  } | rT |  j j   | d <n
 d  | d <x' d D] } | j |  re | | =qe qe Wg  | d <| S(   NR`   t
   __listnameRY   RZ   Rs   (   RY   RZ   Rs   (   t   __dict__t   copyt   has_keyR;   R`   t   internal_name(   Ru   t   dR9   t   attr(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   __getstate__e  s    



c         C   s   | |  _  | j d  } | r; | d =|  j |  | d <n  | j d  sz t |  d  rk |  j j |  _ qz t j	 |  _ n  | j d  s d  |  _ n  | j d  s i  |  _ n  d  S(   NR   R`   R_   Rh   Ri   (   R   R@   R   R   t   hasattrR`   R>   R_   R   R=   R;   Rh   Ri   (   Ru   R   RL   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   __setstate__y  s    	c         C   s(   t  |  d d   d  k r$ | |  _ n  d  S(   NR`   (   t   getattrR;   R`   (   Ru   R9   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   setListIfUnset  s    c         C   s   t  | |  j  S(   N(   R   R_   (   Ru   t   buf(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR     s    c         C   s  |  j  |  j  } |  j  |  j  } | rb | |  j d <|  j  |  j  } | rb | |  j d <qb n  | r t j r t j   } zR t j	 |  j
  t t d  t j |  j
   } t j d d | d |  } Wd t j |  Xn  | |  j d <n  |  j | p|  j  |  j d	 <d S(
   s  MIME-decode headers.

        If the email, subject, or author attributes contain non-ASCII
        characters using the encoded-word syntax of RFC 2047, decoded versions
        of those attributes are placed in the self.decoded (a dictionary).

        If the list's charset differs from the header charset, an attempt is
        made to decode the headers as Unicode.  If that fails, they are left
        undecoded.
        Rb   Rc   s    at s   ([-+,.\w]+)@([-+.\w]+)s   \g<1>s   \g<2>NR]   t   stripped(   t   decode_charsetRb   R]   Ri   Rc   R   Ra   R
   R(   R)   R_   RF   R'   R   RG   Rd   Re   R*   t   strip_subject(   Ru   Rb   R]   Rc   R.   t   atmark(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyRt     s$    	!	c         C   s   |  j  j j   } | rl t j |  } d j | j d   } t j d d |  } t j | d |  } n  | j   } t j	 d t j
  } | j d |  } t j d d |  } | S(   Nt   %s   \%s   %\d*ds	   \s*\d+\s*R   s   ^((RE|AW|SV|VS)(\[\d+\])?:\s*)+s   \s(   R`   t   subject_prefixRm   Rd   t   escapet   joint   splitRe   t   lstript   compilet   I(   Ru   R]   t   prefixt
   prefix_patt	   strip_patR   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR     s    c         C   s   y" t  |  } t |  j   } WnY t t t t f k
 r} t j |  j	 j
  } | d k rh d } n  t | | d  } n Xd j | j    S(   Ns   us-asciis
   iso-8859-1R   u    (   R   R   t   __unicode__Rq   RE   RI   R   R   RG   R`   R>   RF   R   Rr   (   Ru   t   fieldt   pairst   ustrR{   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR     s    	c         C   s  |  j  j   } t j   } t j |  j  z|  j   \ | d <| d <|  j   \ | d <| d <|  j |  j	  | d <|  j |  j
  | d <|  j |  j
  | d <|  j |  j  | d <t d	 |  j
  | d
 <t |  j  | d <t j rt j d t d  |  j  } |  j j   } n |  j } |  j	 } |  j |  | d <t |  | d <|  j t j t |  j    | d <|  j   | d <|  j j d d d | d <|  j j | d <d | d <Wd  t j |  Xt j |  j  } t | | d <|  j |  t  d | d |  j d |  j S(   NRY   t
   prev_wsubjRZ   t
   next_wsubjt
   email_htmlt   titlet   subject_htmlt
   message_ids   Re: t   subject_urlt   in_reply_to_urlRU   s    at t   author_htmlt	   email_urlt   datestr_htmlRs   t   listinfot   absolutei   t   listurlRL   R   t   encodings   article.htmlR   R9   (!   R   R   R
   R(   R)   R_   t	   _get_prevt	   _get_nextR   Rc   R]   t   _message_idR   R   Ra   Rd   Re   R'   Rb   R`   t   GetListEmailt   ctimet   intt   datet	   _get_bodyt   GetScriptURLt	   real_nameR*   R   RG   t   html_charsett   _add_decodedRS   (   Ru   R   R.   Rb   t   emailurlR}   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   as_html  s>    			%	c         C   s{   |  j  rg |  j |  j   } d t |  j  j  } d t d  d t |  j  j  |  j |  f } n
 d } } | | f S(   s4   Return the href and subject for the previous messages    <LINK REL="Previous"  HREF="%s">s   <LI>s   Previous message (by thread):s    <A HREF="%s">%s
</A></li>R   (   RY   t   _get_subject_encR   R+   R'   R   (   Ru   R]   RY   R   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR     s    	
c         C   s   | j  j d | j  S(   s   Return the subject of art, decoded if possible.

        If the charset of the current message and art match and the
        article's subject is encoded, decode it.
        R]   (   Ri   R@   R]   (   Ru   t   art(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR   	  s    c         C   s{   |  j  rg |  j |  j   } d t |  j  j  } d t d  d t |  j  j  |  j |  f } n
 d } } | | f S(   s4   Return the href and subject for the previous messages   <LINK REL="Next"  HREF="%s">s   <LI>s   Next message (by thread):s    <A HREF="%s">%s
</A></li>R   (   RZ   R   R   R+   R'   R   (   Ru   R]   RZ   R   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR     s    	
s   =([A-F0-9][A-F0-9])s   =[ 	]*$c         C   s=   y |  j  } Wn t k
 r) |  j } n Xt t j |   S(   s<   Return the message body ready for HTML, decoded if necessary(   t	   html_bodyt   AttributeErrorRs   R    t   EMPTYSTRINGR   (   Ru   Rs   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR   "  s
    c         C   sV   xO d	 d
 d d f D]; \ } } |  j  j |  r |  j |  j  |  | | <q q Wd S(   s$   Add encoded-word keys to HTML outputRb   R   Rc   R   R]   R   R   N(   Rb   R   (   Rc   R   (   R]   R   (   R]   R   (   Ri   R   R   (   Ru   R   t   srct   dst(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR   *  s    c         C   s  |  j  j   } | j d d  j   sC t j t j    | d <n  | j d d  j   sh d | d <n  | j d d  j   s t j t j    | d <n  d d d d	 g } | d
 r | j d  n  | d r | j d  n  | d r | j d  n  t j |  j	  } t
 j |  j  } t | t j  sGt | | d  } n  t j rt j   } zF t j |  j  t t d  |  } t j d d | d |  } Wd  t j |  Xn  | j | d  } t j |  | d | d S(   Nt   fromdateR   Rc   s   bogus@does.not.exist.comt   datestrs   From %(email)s  %(fromdate)ss   From: %(email)s (%(author)s)s   Date: %(datestr)ss   Subject: %(subject)st   _in_reply_tos   In-Reply-To: %(_in_reply_to)st   _referencess   References: %(_references)sR   s   Message-ID: %(_message_id)sR   s    at s   ([-+,.\w]+)@([-+.\w]+)s   \g<1>s   \g<2>s   

s   
(   R   R   R@   Rm   t   timeR   t   appendR   R   Rs   R   RG   R_   R1   R2   R3   RF   R   Ra   R
   R(   R)   R'   Rd   Re   R*   Rk   t   NL(   Ru   R   t   headersRs   R{   R.   R   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   as_text3  s>    	


		c         C   s,   |  j  |  t j t |  j   |  _ d  S(   N(   t   _Article__super_set_dateR   R   R   R   R   (   Ru   Rv   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt	   _set_dateZ  s    c         C   s}   g  |  _  d } xg | j   } | s( Pn  | sO | j   d k r d } q q n  | j   d k re Pn  |  j  j |  q Wd  S(   Ni    s   <!--beginarticle-->i   s   <!--endarticle-->(   Rs   t   readlineRm   R   (   Ru   t   fileobjt   begint   line(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   loadbody_fromHTML^  s    		c         C   s+   g  |  _  y
 |  ` Wn t k
 r& n Xd  S(   N(   Rs   R   R   (   Ru   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   finished_update_articlem  s
    	
N(%   t   __name__t
   __module__t	   pipermailRT   R   RX   R   R   R   t   _last_article_timeR;   R   R=   t   weakreft   WeakValueDictionaryR   R   R   R   R   R   Rt   R   R   R   R   R   R   Rd   R   t	   _rx_quotet   _rx_softlineR   R   R   R   R   (    (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyRT     s4   	L									*							'		t   HyperArchivec           B   s  e  Z e j j Z e j j Z e j j Z	 e j j
 Z d  Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d Z d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z  d   Z! d   Z" d   Z# d   Z$ d   Z% d   Z& d   Z' d   Z( d   Z) d   Z* d   Z+ d   Z, d   Z- d   Z d( Z. d#   Z/ d$   Z0 d%   Z1 d&   Z2 d'   Z3 RS()   i  i  i    t   threadt   monthi   i   c         C   sv  | j    } t j | |  } |  j | d d d | | |  _ d  |  _ | j |  _ t j	 | j  |  _
 t |  j d  r |  j j d k r d |  _ q |  j j d k r d |  _ q |  j j d	 k r d
 |  _ q |  j j d k r d |  _ q d |  _ n  d } d } d } i d | d d 6d | d d 6d | d d 6d | | | d
 6d | | | d d 6|  _ d  S(   Nt   reloadi   t   databaset   archive_volume_frequencyi    t   yeari   t   quarteri   t   weeki   t   dayR   s   (?P<year>[0-9]{4,4})s   (?P<month>[01][0-9])s   (?P<day>[0123][0-9])t   ^t   $s   q(?P<quarter>[1234])$s   -(?P<month>[a-zA-Z]+)$s   ^Week-of-Mon-(   t   archive_dirt   HyperDatabaset   _HyperArchive__super_initt   maillistR;   t
   _lock_fileR>   R   R   RG   R}   R   R   t   ARCHIVE_PERIODt   _volre(   Ru   R   t   dirt   dbt   yret   mret   dre(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR     s4    		c         C   s"   t  | | d |  j j d |  j S(   NR   R9   (   RT   R   R>   (   Ru   t   msgRw   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   _makeArticle  s    c            s]    j  } t j   } t j | j    f d   } z i |   j  d 6|   j  d 6| j d d d d 6  j d 6t	 | j
   j  d 6} i t d	  d	 6t d
  d
 6t d  d 6t d  d 6} Wd  t j |  Xxh | j   D]Z } | d j   | d }   j | k r*d | d | <q d | | | f | d | <q Wt d | d | S(   Nc            s   t  t j |     j  S(   N(   R   R
   R   R   (   R   (   Ru   (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt	   quotetime  s    t   lastdatet   archivedateR   R   i   t   versionRL   R   R]   Rb   R   i    R   s   %s_refs"   <a href="%s.html#start">[ %s ]</a>s   archidxfoot.htmlR9   (   R   R
   R(   R)   R>   R   R   R   R   R   R   R   R'   R*   t   keyst   uppert   typeRS   (   Ru   R9   R.   R   R   Ry   t   tt   cap(    (   Ru   s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt	   html_foot  s0    	
	c            s    j  } t j   } t j | j    f d   } z i t | j   j  d 6  j d 6  j	   j
  d 6| j d d d d 6|   j  d 6|   j  d	 6  j d
 6} i t d  d 6t d  d 6t d  d 6t d  d 6} Wd  t j |  Xxv | j   D]h } | d j   | d }   j | k rUd | d | <| | | d <q	d | | | f | d | <q	W  j rt   j | d <n
 d | d <t d | d | S(   Nc            s   t  t j |     j  S(   N(   R   R
   R   R   (   R   (   Ru   (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR     s    RL   t   archtypet   archiveR   R   i   t	   firstdateR   R,   R   R]   Rb   R   i    R   s   %s_refs"   <a href="%s.html#start">[ %s ]</a>R   s   archidxhead.htmlR9   (   R   R
   R(   R)   R>   R   R   R   R  t   volNameToDescR  R   R  R   R,   R'   R*   R   R   R}   R   RS   (   Ru   R9   R.   R   R   Ry   R  R  (    (   Ru   s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt	   html_head  s<    	
	
	c   	      C   s  |  j  } | j   } t j j | j   d | d  } i | j d 6| j d d d d 6d | | f d 6t | | j	  d 6d	 d
 6} t
 j   } t
 j | j	  z |  j s t d  | d <d	 | d <d	 | d <d	 | d <n d	 | d <t d d | j	 d | | d <t d d | | d <g  } x' |  j D] } | j |  j |   q1Wt j |  | d <Wd  t
 j |  X| d
 c t t j | j	  7<t j rd } n d } t | | d | S(   Ns   .mboxRL   R   R   i   s   ../%s.mbox/%s.mboxt   fullarchR,   R   t   metas)   <P>Currently, there are no archives. </P>t   noarchive_msgt   archive_listing_startt   archive_listing_endt   archive_listings   archliststart.htmlR   R9   s   archlistend.htmls   archtoc.htmls   archtocnombox.html(   R   R   R!   R"   R   R   R   R   R0   R>   R
   R(   R)   t   archivesR'   RS   R   t   html_TOC_entryR   R*   R   R   RG   R   t   PUBLIC_MBOX(	   Ru   R9   RL   t   mboxR   R.   t   accumt   aRO   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   html_TOC   sF    	#
	


	 		c         C   s  t  j j |  j j   | d  } | d } t  j j |  re | } | d } d t d  d } n? t  j j |  r | } | d } d t d  d } n d  } | r | i | d 6t | |  j j	  d	 6} n d
 } t
 d i | d 6|  j |  d 6| d 6d |  j S(   Ns   .txts   .gzs   .txt.gzs   <td><A href="%(url)s">[ s   Gzip'd Text%(sz)ss
   ]</a></td>s
   Text%(sz)st   urlt   szR   s   archtocentry.htmlR  t   archivelabelt   textlinkR9   (   R!   R"   R   R   R   t   existsR'   R;   R0   R>   RS   R  (   Ru   t   archt   txtfilet   gzfilet   fileR  t   templR  (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR  -  s,    "




c         C   sq   |  j  r d St j t j j t j |  j j   d   |  _  y |  j  j	 d d  Wn t j
 k
 rl d SXd S(   Ni   s
   -arch.lockt   timeoutg      ?i    (   R   R   R!   R"   R   R   t   LOCK_DIRR   R   R   t   TimeOutError(   Ru   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   GetArchLockO  s    	c         C   s,   |  j  r( |  j  j d d  d  |  _  n  d  S(   Nt   unconditionallyi   (   R   t   unlockR;   (   Ru   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   DropArchLock[  s    	c         C   s  |  j  j   } | d } | d } y t j |  Wn t t j f k
 rQ d  SX|  j   sb d  Sy t |  } t d d | |  t j	 d  } z t | d  } Wd  t j	 |  X| j
 d d  | j d  d	 k r | j d	  n  | j | j    | j   | j   t j |  Wn t k
 r4n Xt j | |  t |  } |  j |  | j   t j |  |  j   d  S(
   Ns   .workings   .err_unarchivedR:   sG   Archive working file %s present.  Check %s for possibly unarchived msgsi   s   a+i   i   s   
(   R   t   ArchiveFileNameR!   t   statt   IOErrorR:   R$  t   openR   t   umaskt   seekt   readt   writet   closet   unlinkt   renamet   processUnixMailboxR'  (   Ru   t   namet   wnamet   enamet   wft   omaskt   eft   archfile(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   processListArch`  sB    





c         C   s   d | j  f S(   Ns	   %06i.html(   Rw   (   Ru   t   article(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   get_filename  s    c         C   s@   |  j  t | j   } |  j t d   |  j | d  | S(   s   Return a list of indexes where the article should be filed.
        A string can be returned if the list only contains one entry,
        and the empty list is legal.s   figuring article archives
s   
(   t   dateToVolNamet   floatR   Rv   t   C_(   Ru   R<  t   res(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   get_archives  s    c         C   sx  | j    } d t d  t d  t d  t d  t d  t d  t d  t d	  t d
  t d  t d  t d  g } x|  j j   D]} t j |  j | |  } | r t | j d   } | d k r'd t d  t d  t d  t d  g } | t | j d   } t d  S| d k r| j d  j   } xp t	 d d  D]_ }	 t
 j d d |	 d d d d d d d f	  }
 | j   |
 j   k rX| |	 } t d  SqXWt d |  qc| d k r| t | j d   } t | j d   } t d  S| d k rS| t | j d   } t | j d   } t d   S| j d  Sq q Wt d! |  d  S("   NR   t   Januaryt   Februaryt   Marcht   Aprilt   Mayt   Junet   Julyt   Augustt	   Septembert   Octobert   Novembert   DecemberR   R   t   Firstt   Secondt   Thirdt   Fourths   %(ord)s quarter %(year)iR   i   i   s   %Bi  i    s   %(month)s %(year)is   %s is not a month!R   R   s-   The Week Of Monday %(day)i %(month)s %(year)is   %(day)i %(month)s %(year)is   %s is not a valid volname(   Rm   R'   R   R   Rd   R\   R   t   groupRf   t   rangeR   t   strftimeRI   (   Ru   t   volnamet	   monthdictt   eachR\   R   R   t   ordt   monthstrRy   t	   monthnameR   R   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR    s>    $$*-
-


c         C   s4  t  j |  } |  j d k r. t  j d |  S|  j d k r | d d k r] t  j d |  S| d d k r} t  j d |  S| d d k r t  j d |  St  j d |  Sn |  j d k r t  j d |  S|  j d k r t  j |  | d
 d d d } t  j |  } t  j d |  St  j d |  Sd  S(   NR   s   %YR   i   i   i   s   %Yq1i   i   i   s   %Yq2i   i   i	   s   %Yq3s   %Yq4R   s   %Y%m%dR   i   i<   s   Week-of-Mon-%Y%m%ds   %Y-%B(   i   i   i   (   i   i   i   (   i   i   i	   (   R   t	   localtimeR   RU  t   mktime(   Ru   R   t	   datetuplet   monday(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR>    s$    #c         C   s  | j    } x|  j j   D]} t j |  j | |  } | r t | j d   } d } d } | d k r t | j d   } | d d } n | d k r=| j d  j   } g  }	 xQ t d d  D]@ }
 |	 j	 t
 j d d	 |
 d d
 d
 d
 d
 d d
 f	  j    q Wy |	 j |  d } Wqt k
 r9qXnE | d k sU| d k rt | j d   } t | j d   } n  y, t
 j | | d d
 d
 d
 d
 d d f	  SWqt k
 rd SXq q Wd S(   NR   i   R   i   i   R   i   s   %Bi  i    R   R   ig        (   Rm   R   R   Rd   R\   R   RS  Rf   RT  R   R   RU  t   indexRI   R]  t   OverflowError(   Ru   RV  RX  R\   R   R   R   t   qRZ  t   mRy   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   volNameToDate  s8    8,c            sO     f d   }   j  d k r1   j j |  n   j j     j j   d  S(   Nc            sF     j  |   }   j  |  } | | k r. d S| | k  r> d Sd Sd  S(   Ni   ii    (   Rd  (   R  t   bt   alt   bl(   Ru   (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   sf  s    R   R   R   (   R   R   R   (   R   R  t   sortt   reverse(   Ru   Rh  (    (   Ru   s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   sortarchives  s
    	c         C   sP   |  j  rL t j } | j |  | d d k r? | j d  n  | j   n  d  S(   Nis   
(   t   VERBOSEt   syst   stderrR/  t   flush(   Ru   R   t   f(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyRv   
  s    		c         C   sK   t  j j | d  } y t  j |  Wn n Xt  j |  j d |  d  S(   Ns
   index.htmls   .html(   R!   R"   R   R1  t   symlinkt   DEFAULTINDEX(   Ru   R  t
   archivedirt
   index_html(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   open_new_archive  s    c         C   sQ   d |  _  |  j   GH|  j rM |  j d k rM |  j t d   |  j   n  d  S(   Ni    t   Threads   Computing threaded index
(   t   depthR	  t
   THREADLAZYR  Rv   R@  t   updateThreadedIndex(   Ru   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   write_index_header  s
    	c         C   s.   x t  |  j  D] } d GHq W|  j   GHd  S(   Ns   </UL>(   RT  Rw  R  (   Ru   Ry   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   write_index_footer!  s    	c         C   s   |  j  d |  } |  j  d |  } t j rc y t j d t d  |  } Wqc t k
 r_ qc Xn  t | |  j  } t | |  j  } i t	 j
 | j  d 6| d 6| j d 6| d 6} t d | d |  j GHd  S(	   NR]   Rb   RU   s    at R+   Rw   s   archidxentry.htmlR9   (   t
   get_headerR   Ra   Rd   Re   R'   RE   R7   R   R   R   R+   Rw   RS   R   (   Ru   R<  R]   Rb   R   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   write_index_entry&  s"    	

	c         C   s/   | j  j |  } | d  k r+ t | |  S| S(   N(   Ri   R@   R;   R   (   Ru   R   R<  Rz   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR|  <  s    c         C   s   | d k  r" |  j  d  d } n  | |  j k r= |  j } n  | |  j k  rr xX t |  j |  D] } d GHq` Wn5 | |  j k r x# t | |  j  D] } d GHq Wn  d | | j f GH| |  _ |  j |  d  S(   Ni    s   depth<0s   </UL>s   <UL>s   <!--%i %s -->(   Rv   t   THREADLEVELSRw  RT  t	   threadKeyR}  (   Ru   R<  Rw  Ry   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   write_threadindex_entryD  s    		c         C   sp   |  j    t j d  } z% t t j j |  j d  d  } Wd  t j |  X| j |  j    | j	   d  S(   Ni   s
   index.htmlt   w(
   Rk  R!   R,  R+  R"   R   t   basedirR/  R  R0  (   Ru   R8  t   toc(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt	   write_TOCT  s    
%c         C   s   t  j d  } z t | d  } Wd  t  j |  X| j | j    | j   t  j j |  j d |  } t  j d  } z t | d  } Wd  t  j |  X| j | j	    | j   d  S(   Ni   R  s   %s.txts   a+(
   R!   R,  R+  R/  R   R0  R"   R   R  R   (   Ru   R`  R<  R"   R8  Rp  (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   write_article^  s    
c   	      C   s  |  j  |  t rd  } d  } t j j |  j d |  } t j j |  j d |  } t j j |  j d |  } y t |  } Wn t k
 r d  SXy# t j	 | |  t j |  } Wn t t
 t j f k
 r n Xz% t j d  } t j | d  } Wd  t j |  X| rD| j | j    | j   t j |  n  y+ | j | j    | j   | j   Wn t k
 rn Xt j |  n  d  S(   Ns   %s.txts	   %s.txt.gzs   %s.old.txt.gzi   R  (   t#   _HyperArchive__super_update_archivet   gzipR;   R!   R"   R   R  R+  R*  R2  t   RuntimeErrorR:   R,  R/  R.  R0  R1  (	   Ru   R  t   archzt   archtR  t   gzipfilet   oldgzipt   out   newz(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   update_archiver  s>    

R   R   R}   c         C   sY   i  } xL |  j  j   D]; } | |  j k p: | j   | k s |  j  | | | <q q W| S(   N(   R   R   t   _skip_attrsR   (   Ru   R   RX  (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   getstate  s    c         C   se  t  d  } | rI t | d t j  rI t | t j |  j  d  } n  | } | } d } xt d t	 |   D]} | | } } d }	 }
 | d  k r qr n  |  j r:t j |  } | d  k r d } q:| j d  } t | |  |  j  d }	 d }
 |  j r'|
 d 7}
 | s'd |	 }	 q'n  | | } d } n  d } t j |  } t j |  } x| d  k	 sy| d  k	 r	| d  k rd	 } n | j d  } | d  k rd	 } n | j d  } | d	 k rL| | k  s| d	 k rL| j d  } t	 |  } t j r9t j d
 | |  } |  j j d d d } n
 d | } | } nU | d	 k r| | k sp| d	 k r| j d  } } t	 |  } | } n	 t d  | d t | |  |  j  t |  t | |  j  f 7} | | | } t j |  } t j |  } qaW| d  k r7| d  k r7t | |  j  } n  |	 | | |
 } d  | | <| | | <qr Wd  S(   Ns    at i    R   R   s   <i>s   </I>s   <BR>i   iRU   R   R   s   mailto:s   j==k: This can't happen!s   %s<A HREF="%s">%s</A>(   R'   R1   R2   R3   RF   R   RG   R   t   xranget   lenR;   t   IQUOTESt	   quotedpatR\   R^   R7   t   SHOWHTMLt   emailpatt   searcht   urlpatt   startRS  R   Ra   Rd   Re   R   R   RI   R   (   Ru   t   linesR   t   sourcet   destt   last_line_was_quotedRy   t   Lorigt   LR   t   suffixt   quotedt   L2t   jrt   krt   jt   kRP   t   lengtht   URLt   pos(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   __processbody_URLquote  sv    !
			

			$		
	$		 
c         C   s  | } | } t  |  } d } x | | k  r x3 | | k  rc t j | |  d  k rc | d } q1 W| | k  r d  | | <| d } n  xL | | k  r t j | |  d  k r | | d  | | <| | <| d } q W| | k  r" d  | | <| d } q" q" Wd  S(   Ni    i   (   R  t   htmlpatR\   R;   t	   nohtmlpat(   Ru   R  R  R  R~   Ry   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   __processbody_HTML  s     (
(
c         C   s   t  d  | j  } |  j r+ |  j |  n  |  j |  |  j rh | rh | j d d  | j d  nl |  j	 r t
 d   |  } nN xK t d t |   D]4 } | | } | d d !d k r d | | | <q q W| | _ | S(   Ni    s   <PRE>s   </PRE>c         S   s   |  d S(   Ns   <BR>(    (   t   x(    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   <lambda>  R   i   s    	
s   <P>(   t   filterR;   Rs   t	   ALLOWHTMLt   _HyperArchive__processbody_HTMLt#   _HyperArchive__processbody_URLquoteR  t   insertR   t   SHOWBRt   mapRT  R  R   (   Ru   R<  R  Ry   R   (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   format_article
  s    		
	c   
      C   s  | j  } t j j | | j  } |  j t d   y' t |  } | j |  | j	   Wn> t
 k
 r } | j t j k r   n  |  j t d   n X| | _ | | _ t j d  }	 z t | d  } Wd  t j |	  X| j | j    | j	   d  S(   Ns!   Updating HTML for article %(seq)ss%   article file %(filename)s is missing!i   R  (   Rw   R!   R"   R   R+   Rv   R@  R+  R   R0  R*  R%   R&   RY   RZ   R,  R/  R   (
   Ru   t   arcdirR<  RY   RZ   t   seqR+   Rp  R-   R8  (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   update_article$  s&    	 		(   R   R   R}   (4   R   R   R   t   TR   R   R  R  t   update_dirty_archivest*   _HyperArchive__super_update_dirty_archivest   add_articlet    _HyperArchive__super_add_articlet   DIRMODEt   FILEMODERl  Rr  R   Rx  R~  R  R  R  R  R   R  R	  R  R  R$  R'  R;  R=  RB  R  R>  Rd  Rk  Rv   Ru  Rz  R{  R}  R|  R  R  R  R  R  R  R  R  R  (    (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyR   u  s\   	%		"	)	-	"			,				)											
		(	
	Q		(M   t   __doc__t
   __future__R    Rm  Rd   R%   R   R   R!   R2   R   R   R   Ro   t   email.HeaderR   R   t   email.ErrorsR   t   email.CharsetR   t   MailmanR   R   R   R   R	   R
   t   Mailman.SafeDictR   t   Mailman.Logging.SyslogR   t   Mailman.MailboxR   R'   R@  R;   R  t   GZIP_ARCHIVE_TXT_FILESt   ImportErrorR   R   t   platformt   resourcet	   getrlimitt   RLIMIT_STACKt   softt   hardt   mint   maxt   newsoftt	   setrlimitRC   t   Falset	   NameErrorR   R   R    R0   R   R7   R   t   paren_name_patt
   IGNORECASER[   R  R  t   blankpatR  R  R  R?   RA   RS   RT   R  R   (    (    (    s9   /export/web/mailman/mailman/Mailman/Archiver/HyperArch.pyt   <module>   s   			

			< u