ó
Tü½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 Td 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 j e j d ƒ Z e j j e j d ƒ Z e j j e j d ƒ Z e e Be Be Be Be BZ  y e! e" f Wn e# k
 rKd Z! d Z" n Xd „  Z$ d „  Z% d „  Z& d „  Z' d „  Z( d „  Z) d „  Z* d „  Z+ d „  Z, e" e" e" d „ Z- d „  Z. e" d „ Z/ d „  Z0 d S(   s,   Creation/deletion hooks for the Postfix MTA.iÿÿÿÿN(   t   *(   t   mm_cfg(   t   Utils(   t   LockFile(   t   C_(   t   MailList(   t   makealiases(   t   syslogt   creatort   aliasess   virtual-mailmani   i    c          C   s  d „  }  d } t  j d t } t j | ƒ d ?d @} | r{ t j | ƒ } t d | | | | ƒ t | | | | f ‚ n  |  t ƒ t j j	 t
 ƒ rt  j d t
 } t j | ƒ d ?d @} | rt j | ƒ } t d | | | | ƒ t | | | | f ‚ n  |  t
 ƒ n  d  S(   Nc         S   s"  t  j |  ƒ } | t t @t k r> t  j |  | t t Bƒ n  |  d } y t  j | ƒ } Wn, t k
 r‰ } | j t j k r… ‚  n  d  SX| t t @t k r¹ t  j | | t t Bƒ n  t j	 } | t
 t j | ƒ d k rt j | ƒ d } t j t j ƒ d } t  j | | | ƒ n  d  S(   Ns   .dbi   (   t   ost   statt   ST_MODEt
   targetmodet   chmodt   OSErrort   errnot   ENOENTR   t   MAILMAN_USERt   ST_UIDt   pwdt   getpwnamt   grpt   getgrnamt   MAILMAN_GROUPt   chown(   t   fileR   t   dbfilet   et   usert   uidt   gid(    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   fixom4   s"    
	s#   command failed: %s (status: %s, %s)t    i   iÿ   t   error(   R   t   POSTFIX_ALIAS_CMDt	   ALIASFILER
   t   systemt   strerrorR   t   RuntimeErrort   patht   existst   VIRTFILEt   POSTFIX_MAP_CMD(   R    t   msgt   acmdt   statust   errstrt   vcmd(    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   _update_maps2   s"    	
c           C   s   t  j  t ƒ S(   N(   R   t   LOCKFILE(    (    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   makelock]   s    c         C   s2   t  j j |  ƒ r. t |  d ƒ } | j ƒ  n  d  S(   Nt   w(   R
   R(   R)   t   opent   close(   t   filenamet   fp(    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   _zapfilea   s    c           C   s   t  t ƒ t  t ƒ d  S(   N(   R9   R$   R*   (    (    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   cleari   s    
c         C   s>  t  j t  j d d ƒ ƒ d } t j j t j d ƒ } | j d d ƒ | j	 ƒ  s‚ | d IJ| d IJ| d | | f IJ| Jn  |  d  k r’ d  S|  j ƒ  } t | ƒ t d	 ƒ } | d
 I| IJ| d It j t j ƒ  ƒ IJx@ t | ƒ D]2 \ } } | | d I| t | ƒ d | IJqð W| d I| IJ| Jd  S(   Nt   extrat   loopi    s   owner-bounces.mboxi   s  # This file is generated by Mailman, and is kept in sync with the
# binary hash file aliases.db.  YOU SHOULD NOT MANUALLY EDIT THIS FILE
# unless you know what you're doing, and can keep the two files properly
# in sync.  If you screw it up, you're on your own.
s#   # The ultimate loop stopper addresss   %s: %ss   -unsubscribes   # STANZA START:s
   # CREATED:t   :R!   s   # STANZA END:(   R   t
   ParseEmailt   get_site_emailR
   R(   t   joinR   t   DATA_DIRt   seekt   tellt   Nonet   internal_namet   lent   timet   ctimeR   (   t   mlistR8   t   loopaddrt   loopmboxt   listnamet   fieldszt   kt   v(    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   _addlisto   s&    
*c         C   s5   |  o4 |  j  j ƒ  g  t j D] } | j ƒ  ^ q k S(   N(   t	   host_namet   lowerR   t   POSTFIX_STYLE_VIRTUAL_DOMAINS(   RI   t   d(    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt
   _isvirtual”   s    c         C   sº  |  j  ƒ  } t | ƒ t d ƒ } |  j } t j |  j d d ƒ} t j | ƒ d } t j |  j ƒ } t j | ƒ d } t j |  j d d ƒ}	 t j |	 ƒ d }
 t j |  j d d ƒ} t j | ƒ d } t j |  j d d ƒ} t j | ƒ d } t j r]| d t j 7} | d t j 7} |
 d t j 7}
 | d t j 7} | d t j 7} n  t t j	 d	 t
 ƒj j ƒ  | j ƒ  k r²d
 | } d
 |	 }	 d
 | } d
 | } n  | j d d ƒ | j ƒ  sý| d | | | | |	 |
 | | | | f
 IJn  | d I| IJ| d It j t j ƒ  ƒ IJxs t | ƒ D]e \ } } d | | f } t j rtd | t j f } n | } | | I| t | ƒ d I| IJq9W| d I| IJ| Jd  S(   Ns   -unsubscribeR;   R<   i    t   ownert   bouncest   requestt   @t   lockt   #i   s  # This file is generated by Mailman, and is kept in sync with the binary hash
# file virtual-mailman.db.  YOU SHOULD NOT MANUALLY EDIT THIS FILE unless you
# know what you're doing, and can keep the two files properly in sync.  If you
# screw it up, you're on your own.
#
# Note that you should already have this virtual domain set up properly in
# your Postfix installation.  See README.POSTFIX for details.

# LOOP ADDRESSES START
%s	%s
# LOOP ADDRESSES END

# We also add the site list address in each virtual domain as that address
# is exposed on admin and listinfo overviews, and we add the site list-owner,
# -bounces and -request addresses as they are exposed in the list created
# and/or password reminder email notices.

# SITE ADDRESSES START
%s	%s
%s	%s
%s	%s
%s	%s
# SITE ADDRESSES END
s   # STANZA START:s
   # CREATED:s   %s@%sR!   s   # STANZA END:(   RE   RF   RQ   R   R?   R>   R   t   VIRTUAL_MAILMAN_LOCAL_DOMAINR   t   MAILMAN_SITE_LISTt   FalseRR   RB   RC   RG   RH   R   (   RI   R8   RL   RM   t   hostnameRJ   t   loopdestt   siteaddrt   sitedestt   siteowneraddrt   siteownerdestt   sitebouncesaddrt   sitebouncesdestt   siterequestaddrt   siterequestdestRN   RO   t   fqdnaddrt	   localaddr(    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   _addvirtual˜   sP    		


	(c         C   sñ  t  j |  j d d ƒ} t  j | ƒ d } t  j |  j ƒ } t  j | ƒ d } t  j |  j d d ƒ} t  j | ƒ d } t  j |  j d d ƒ} t  j | ƒ d }	 t  j |  j d d ƒ}
 t  j |
 ƒ d } t j r2| d t j 7} | d t j 7} | d t j 7} |	 d t j 7}	 | d t j 7} n  t t j d t ƒj j	 ƒ  |  j j	 ƒ  k rŠd	 | } d	 | } d	 | } d	 |
 }
 n  t
 | ƒ } t j d
 ƒ } z t
 | d d ƒ } Wd  t j | ƒ Xzôx@ t r| j ƒ  } | sïPn  | j | ƒ | j d ƒ rÓPqÓqÓWx t r–| j ƒ  } | s2Pn  | j d ƒ rf| d | | f IJ| j | ƒ Pq| j | ƒ r†| j | ƒ Pq| j | ƒ qWx@ t rÙ| j ƒ  } | s¶Pn  | j | ƒ | j d ƒ ršPqšqšWxÐ t r¬| j ƒ  } | sùPn  | j d ƒ ri| d | | f IJ| d | | f IJ| d | |	 f IJ| d |
 | f IJ| j | ƒ PqÝ| j | ƒ s‹| j d	 | ƒ rœ| j | ƒ PqÝ| j | ƒ qÝW| j | j ƒ  ƒ Wd  | j ƒ  | j ƒ  Xt j | d | ƒ d  S(   NR;   R<   i    RV   RW   RX   RY   RZ   R[   i   s   .tmpR4   s   # LOOP ADDRESSES STARTs   # LOOP ADDRESSES ENDs   %s	%ss   # SITE ADDRESSES STARTs   # SITE ADDRESSES END(   R   R?   RQ   R>   R   R\   R   R]   R^   RR   R5   R
   t   umaskt   Truet   readlinet   writet
   startswitht
   writelinest	   readlinesR6   t   rename(   RI   R7   RJ   R`   Ra   Rb   Rc   Rd   Re   Rf   Rg   Rh   t   infpt   omaskt   outfpt   line(    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   _check_for_virtual_loopaddrê   s’    	


				"
c         C   s³   y t  | d ƒ } Wn^ t k
 rs } | j t j k r= ‚  n  t j d ƒ } z t  | d ƒ } Wd  t j | ƒ Xn Xz | |  | ƒ Wd  | j ƒ  X| t k r¯ t |  | ƒ n  d  S(   Ns   r+i   s   w+(	   R5   t   IOErrorR   R   R
   Rl   R6   Rk   Rx   (   RI   t   textfilet   funcR8   R   Ru   (    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt
   _do_createJ  s     c         C   s†   d  } | s" t ƒ  } | j ƒ  n  zC t |  t t ƒ t |  ƒ rT t |  t t ƒ n  | sd t	 ƒ  n  Wd  | r | j
 d t ƒ n  Xd  S(   Nt   unconditionally(   RD   R3   RZ   R|   R$   RP   RU   R*   Rk   R1   t   unlockRm   (   RI   t   cgit   nolockt   quietRZ   (    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   create^  s    	c         C   st  |  j  ƒ  } d  } y t | ƒ } Wn, t k
 rP } | j t j k rL ‚  n  d  SXzó t j d ƒ } z t | d d ƒ } Wd  t j | ƒ Xt } d | }	 d | }
 d } x• | j	 ƒ  } | sÄ Pn  | r| j
 ƒ  |
 k rï t } | j	 ƒ  q?| j | ƒ r?t } | j | ƒ q?q® | j
 ƒ  |	 k r2t } q® | j | ƒ q® WWd  | j ƒ  | j ƒ  Xt j | d | ƒ d  S(   Ni   s   .tmpR4   s   # STANZA START: s   # STANZA END: (   RE   RD   R5   Ry   R   R   R
   Rl   R^   Rn   t   stripRp   Ro   Rm   R6   Rs   (   RI   Rz   t   virtualpRL   Rv   Rt   R   Ru   t
   filteroutpt   startt   endt   oopsRw   (    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt
   _do_removes  sD     

	
c         C   se   t  ƒ  } | j ƒ  z: t |  t t ƒ t |  ƒ rE t |  t t ƒ n  t ƒ  Wd  | j	 d t ƒ Xd  S(   NR}   (
   R3   RZ   R‰   R$   R^   RU   R*   Rm   R1   R~   (   RI   R   RZ   (    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   remove¨  s    	
c         C   s©  x¢t  t f D]”} |  j r* t d ƒ GHn  d  } y t j | ƒ } Wn+ t k
 rp } | j t j	 k rq ‚  qq n X| rç | t
 t @t k rç |  j d 7_ t | t
 ƒ } t d ƒ G|  j rã t d ƒ GHt j | | t
 t Bƒ qç Hn  | d } d  } y t j | ƒ } Wn. t k
 r:} | j t j	 k r ‚  q q n X|  j rRt d ƒ GHn  t j } | t t j | ƒ d k } | s+y t j | t ƒ d } Wn t k
 rºd	 | t } n Xt d
 ƒ G|  j d 7_ |  j r't d ƒ GHt j | ƒ d }	 t j t j ƒ d }
 t j | |	 |
 ƒ q+Hn  | r | t
 t @t k r |  j d 7_ t | t
 ƒ } t d ƒ G|  j rt d ƒ GHt j | | t
 t Bƒ q¡Hq q Wd  S(   Ns    checking permissions on %(file)si   s3   %(file)s permissions must be 0664 (got %(octmode)s)s   (fixing)s   .dbs    checking ownership of %(dbfile)si   i    s   uid %ds8   %(dbfile)s owned by %(owner)s (must be owned by %(user)ss5   %(dbfile)s permissions must be 0664 (got %(octmode)s)(   R$   R*   t   VERBOSER   RD   R
   R   R   R   R   R   R   t   ERRORSt   octt   FIXR   R   R   R   R   R   t   getpwuidt   KeyErrorR   R   R   R   (   t   stateR   R   R   t   octmodeR   R   t   ownerokRV   R   R   (    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt
   checkperms·  sf    	

	
			
	(1   t   __doc__R
   R   R   RG   R   R   t   MailmanR   R   R   t   Mailman.i18nR   t   Mailman.MailListR   t   Mailman.MTA.UtilsR   t   Mailman.Logging.SyslogR   R(   R@   t   LOCK_DIRR2   RA   R$   R*   t   S_IFREGt   S_IRUSRt   S_IWUSRt   S_IRGRPt   S_IWGRPt   S_IROTHR   Rm   R^   t	   NameErrorR1   R3   R9   R:   RP   RU   Rk   Rx   R|   R‚   R‰   RŠ   R”   (    (    (    s2   /export/web/mailman/mailman/Mailman/MTA/Postfix.pyt   <module>   sF   

	+				%		R	`		5