ó
E®Uc           @   s+  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l j Z d  d l m Z d  d l m	 Z	 d  d l
 m Z d  d l m Z m Z m Z m Z m Z d  d l m Z m Z m Z i  a d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿN(   t   Ldb(   t
   ndr_unpack(   t   security(   t   SCOPE_SUBTREEt   SCOPE_ONELEVELt
   SCOPE_BASEt   ERR_NO_SUCH_OBJECTt   LdbError(   t   Commandt   CommandErrort   Optiont   LDAPBasec           B   s›   e  Z e e e e e d  d d e j e j e d „ Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z RS(   t   sectiont    t   SUBc      	   C   sP  g  } | } d | k rD t  j j | ƒ r7 d | } qD d | } n  | j ƒ  j d ƒ re d g } n  | |  _ | |  _ t d | d | d | d	 | ƒ |  _ |
 |  _	 | |  _
 | |  _ | |  _ | |  _ | |  _ |	 |  _ | |  _ | |  _ | |  _ t |  j j ƒ  ƒ |  _ t |  j j ƒ  ƒ |  _ t |  j j ƒ  ƒ |  _ t |  j j ƒ  ƒ |  _ |  j ƒ  |  _ |  j ƒ  |  _ t  j! d
 d |  j ƒ j" d d ƒ |  _# |  j$ ƒ  |  _% |  j& ƒ  |  j rL|  j rL|  j j' d |  j ƒ |  j j' d d |  j ƒ |  j j' d d |  j ƒ |  j j' d d |  j ƒ |  j j' d d |  j# ƒ n  d  S(   Ns   ://s   tdb://%ss	   ldap://%ss   ldap://s   modules:paged_searchest   urlt   credentialst   lpt   optionss	   [Dd][Cc]=R   t   ,t   .s   
* Place-holders for %s:
i   t    s   ${DOMAIN_DN}      => %s
s   ${DOMAIN_NETBIOS} => %s
s   ${SERVER_NAME}     => %s
s   ${DOMAIN_NAME}    => %s
s       s       s       s       ((   t   ost   patht   isfilet   lowert
   startswitht   outft   errfR    t   ldbt   search_baset   search_scopet   two_domainst   quiett
   descriptort	   sort_acest   viewt   verboset   hostt   skip_missing_dnt   strt   get_default_basednt   base_dnt   get_root_basednt   root_dnt   get_config_basednt	   config_dnt   get_schema_basednt	   schema_dnt   find_netbiost   domain_netbiost   find_serverst   server_namest   ret   subt   replacet   domain_namet   find_domain_sidt
   domain_sidt   get_sid_mapt   write(   t   selfR&   t   credsR   t   twoR!   R"   R#   R%   R$   t   baset   scopeR   R   R'   t   ldb_optionst	   samdb_url(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   __init__-   sV    												'
c         C   s@   |  j  j d |  j d d d t ƒ } t t j | d d d ƒ S(   NR@   t
   expressions   (objectClass=*)RA   i    t	   objectSid(   R   t   searchR*   R   R   R   t   dom_sid(   R=   t   res(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR9   b   s    $c      	   C   sy   |  j  j d d |  j d t d d d d g ƒ } t | ƒ d k sI t ‚ g  } x# | D] } | j | d d ƒ qV W| S(	   s	   
        R@   s   OU=Domain Controllers,%sRA   RE   s   (objectClass=computer)t   attrst   cni    (   R   RG   R*   R   t   lent   AssertionErrort   append(   R=   RI   t   srvt   x(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR3   f   s    c         C   sv   |  j  j d d |  j d t d d g ƒ } t | ƒ d k sC t ‚ x, | D]$ } d | j ƒ  k rJ | d d SqJ Wd  S(   NR@   s   CN=Partitions,%sRA   RJ   t   nETBIOSNamei    (   R   RG   R.   R   RL   RM   t   keys(   R=   RI   RP   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR1   q   s    c         C   sd   d  } y |  j j d | d t ƒ } Wn, t k
 rS \ } } | t k rM t S‚  n Xt | ƒ d k S(   NR@   RA   i   (   t   NoneR   RG   R   R   R   t   FalseRL   (   R=   t	   object_dnRI   t   enumt   estr(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   object_existsy   s    c         C   sI   y |  j  j | ƒ Wn. t j k
 rD } d t | ƒ k sE t ‚ n Xd  S(   Ns   No such object(   R   t   deleteR    R   R(   RM   (   R=   RU   t   e(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   delete_forceƒ   s    c         C   s;   t  j d ƒ } | j | ƒ } | d k r. | S| j d ƒ S(   si    Returns the real attribute name
            It resolved ranged results e.g. member;range=0-1499
        s   ^([^;]+);range=(\d+)-(\d+|\*)$i   N(   R5   t   compilet   matchRS   t   group(   R=   t   keyt   rt   m(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   get_attribute_name‰   s
    c         C   s°  t  j d ƒ } | j | ƒ } | d k r. | S| j d ƒ } t | j d ƒ ƒ } xWt r«d | | d f } |  j j d | d t	 d | g ƒ }	 t
 |	 ƒ d k s« t ‚ t |	 d ƒ }	 |	 d	 =d }
 d } xg |	 j ƒ  D]Y } | j | ƒ } | d k rqÛ n  | j d ƒ | k rqÛ n  | }
 t |	 | ƒ } PqÛ W|
 d k rHPn  | j | ƒ |
 j d ƒ d
 k rnPn  t |
 j d ƒ ƒ | d k s“t ‚ t |
 j d ƒ ƒ } qU W| S(   sp    Returns list with all attribute values
            It resolved ranged results e.g. member;range=0-1499
        s   ^([^;]+);range=(\d+)-(\d+|\*)$i   i   s   %s;range=%d-*R@   RA   RJ   i    t   dnt   *i   N(   R5   R\   R]   RS   R^   t   intt   TrueR   RG   R   RL   RM   t   dictRR   t   listt   extend(   R=   RU   R_   t   valsR`   Ra   t   attrt   hit   nRI   t   fmt   fvals(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   get_attribute_values–   s>    	$%c         C   s­   |  j  j d | d t d d g ƒ } t | ƒ d k s< t ‚ t | d ƒ } | d =xS | j ƒ  D]E } t | | ƒ } | | =|  j | ƒ } |  j	 | | | ƒ | | <q` W| S(   s:    Returns dict with all default visible attributes
        R@   RA   RJ   Rd   i   i    Rc   (
   R   RG   R   RL   RM   Rg   RR   Rh   Rb   Rp   (   R=   RU   RI   R_   Rj   t   name(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   get_attributesÌ   s    $c         C   sX   |  j  j d | d t d d g ƒ } | d d d } t t j | ƒ } | j |  j ƒ S(   NR@   RA   RJ   t   nTSecurityDescriptori    (   R   RG   R   R   R   R"   t   as_sddlR:   (   R=   RU   RI   t   desc(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   get_descriptor_sddlÜ   s    $c   
      C   s3  d | } d d d d d g } d } d } d } xÑ | t  | ƒ k  rd } d } x” | | | k  rè t t | | ƒ ƒ j d d ƒ }	 d d |	 |	 g t  |	 ƒ }	 d | t  | ƒ k  rÇ |	 | } n
 | |	 7} | d	 7} | d	 7} qU W| | d
 7} | d	 7} q4 W| t  | ƒ k st ‚ | j ƒ  j d
 d ƒ S(   s‡    Translate binary representation of schemaIDGUID to standard string representation.
            @gid_blob: binary schemaIDGUID
        s   %si   i   i   i    R   t   0xt   0i   R   t   -N(   RL   t   hext   ordR7   RS   RM   t   strip(
   R=   t	   guid_blobt   blobt   stopst   indexRI   RP   t   tmpt   yt   c(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   guid_as_stringâ   s(    
"

c      
   C   s“   i  |  _  |  j j d |  j d d d t d d d g ƒ } xS | D]K } y1 | d d |  j  d	 t t j | d d ƒ <Wq@ t k
 rŠ q@ Xq@ Wd
 S(   sa    Build dictionary that maps GUID to 'name' attribute found in Schema or Extended-Rights.
        R@   RE   s   (objectSid=*)RA   RJ   RF   t   sAMAccountNamei    s   %sN(	   t   sid_mapR   RG   R*   R   R   R   RH   t   KeyError(   R=   RI   t   item(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR;   ü   s    	1(   t   __name__t
   __module__RT   t   syst   stdoutt   stderrRf   RD   R9   R3   R1   RX   R[   Rb   Rp   Rr   Rv   R„   R;   (    (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR   +   s   	2				
			6			t
   Descriptorc           B   sA   e  Z e j e j d  „ Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   sk   | |  _  | |  _ | |  _ | |  _ |  j j |  j ƒ |  _ |  j ƒ  |  _ |  j j rg |  j j	 ƒ  n  d  S(   N(
   R   R   t   conRc   Rv   t   sddlt   extract_daclt	   dacl_listR#   t   sort(   R=   t
   connectionRc   R   R   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyRD   	  s    				c         C   sw   yR d |  j  k r3 t j d |  j  ƒ j d ƒ } n t j d |  j  ƒ j d ƒ } Wn t k
 rf g  SXt j d | ƒ S(   sG    Extracts the DACL as a list of ACE string (with the brakets).
        s   S:s   D:(.*?)(\(.*?\))S:i   s   D:(.*?)(\(.*\))s	   (\(.*?\))(   R   R5   RG   R^   t   AttributeErrort   findall(   R=   RI   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR‘     s    !"c         C   s   d | } t  j d | ƒ } t | ƒ d k r2 | SxH | D]@ } y& |  j j | } | j | | ƒ } Wq9 t k
 rx q9 Xq9 W| S(   Ns   %ss	   S-[-0-9]+i    (   R5   R–   RL   R   R†   R7   R‡   (   R=   t   aceRI   t   sidst   sidRq   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   fix_sid  s    
c   	      C   s…  d } t  |  j ƒ t  | j ƒ k rk | d d 7} | d d t  |  j ƒ 7} | d d t  | j ƒ 7} n  d } t } xt rzd  } d  } y d |  j | } Wn t k
 rº d } n Xy d | j | } Wn t k
 ré d } n Xt  | ƒ t  | ƒ d k r
Pn  d |  j | ƒ } d | j | ƒ } | | k rY| d	 | | f 7} t } n | d
 | | f 7} | d 7} qz W| | f S(   NR   i   R   s   Difference in ACE count:
i   s   => %s
i    s   %ss
   %60s * %s
s
   %60s | %s
i   s       s           s           (   RL   R’   Rf   RS   t
   IndexErrorRš   RT   (	   R=   t   otherRI   t   it   flagt   self_acet	   other_acet   self_ace_fixedt   other_ace_fixed(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   diff_1.  s8    	

	c   	      C   s­  d } t  |  j ƒ t  | j ƒ k rk | d d 7} | d d t  |  j ƒ 7} | d d t  | j ƒ 7} n  g  } g  } g  } g  } g  } g  |  j D] } | j |  j | ƒ ƒ ^ q“ g  | j D] } | j | j | ƒ ƒ ^ q¿ xM | D]E } y | j | ƒ Wn t k
 r| j | ƒ qè X| j | ƒ qè Wt | ƒ } t  | ƒ d k r| d d |  j j 7} x# | D] } | d | d	 7} qnWn  xM | D]E } y | j | ƒ Wn t k
 rË| j | ƒ q”X| j | ƒ q”Wt | ƒ } t  | ƒ d k r9| d d | j j 7} x# | D] } | d | d	 7} qWn  t t	 t
 | ƒ ƒ ƒ } |  j j r‘| d d
 7} x# | D] } | d | d	 7} qrWn  | g  k o¦| g  k | f S(   NR   i   R   s   Difference in ACE count:
i   s   => %s
i    s   ACEs found only in %s:
s   
s   ACEs found in both:
s       s           s           s       s           s       s           s       s           (   RL   R’   RN   Rš   R€   t
   ValueErrort   sortedR   R&   Rh   t   setR%   (	   R=   Rœ   RI   t   common_acest	   self_acest
   other_acest   self_dacl_list_fixedt   other_dacl_list_fixedR—   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   diff_2O  sP    ,,(
   R‰   RŠ   R‹   RŒ   R   RD   R‘   Rš   R£   R¬   (    (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyRŽ     s
   
			!t
   LDAPObjectc           B   se   e  Z e j e j d  „ Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z d „  Z d „  Z RS(	   c      #   C   sà  | |  _  | |  _ | |  _ |  j j |  _ |  j j |  _ |  j j |  _ | |  _ | j d |  j j ƒ |  _	 |  j	 j d d |  j j
 ƒ |  _	 x0 |  j j D]" } |  j	 j d d | ƒ |  _	 q› W|  j j |  j	 ƒ |  _ d d d d d	 d
 d d d d d d d d d d d d d d d d d d d d d d  d! d" d# g |  _ |  j |  _ |  j d$ g 7_ | ru|  j | 7_ n  g  |  _ g  |  _ g  |  _ g  |  _ g  |  _ |  j r·|  j d% d& d' d( d) d* d" d+ d d, d- d. d/ d0 d1 d2 d3 d4 d d5 d6 d7 d8 d9 d  d: d; d< d= d> d? d@ dA g! 7_ dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db g! |  _ g  |  j D] } | j ƒ  ^ q“|  _ dc dd de df dg dh di dj g |  _ g  |  j D] } | j ƒ  ^ qÙ|  _ dB dk dl dm dn dj dR dK dS dQ dJ g |  _ g  |  j D] } | j ƒ  ^ q(|  _ dj dl dB do dk g |  _ g  |  j D] } | j ƒ  ^ qe|  _ dk dp g |  _ g  |  j D] } | j ƒ  ^ q™|  _ n  g  |  j D] } | j ƒ  ^ qÁ|  _ d  S(q   Ns   ${DOMAIN_DN}s   CN=${DOMAIN_NETBIOS}s   CN=%ss   CN=${SERVER_NAME}t   badPasswordTimet   badPwdCountt   dSCorePropagationDatat
   lastLogofft	   lastLogont
   logonCountt   modifiedCounts   msDS-Cached-Memberships!   msDS-Cached-Membership-Time-Stamps   msDS-EnabledFeatureBLs   msDS-ExecuteScriptPasswords   msDS-NcTypes   msDS-ReplicationEpochs   msDS-RetiredReplNCSignaturess   msDS-USNLastSyncSuccesst   partialAttributeDeletionListt   partialAttributeSett   pekListt	   prefixMapt   replPropertyMetaDatat   replUpToDateVectort   repsFromt   repsTot
   rIDNextRIDt   rIDPreviousAllocationPoolt   schemaUpdatet   serverStatet   subRefst
   uSNChangedt
   uSNCreatedt   uSNLastObjRemt   msExchServer1HighestUSNt   objectCategoryt
   objectGUIDRF   t   whenCreatedt   whenChangedt
   pwdLastSett   creationTimet   priorSetTimet   rIDManagerReferencet   gPLinkt   ipsecNFAReferencet   fRSPrimaryMembert   fSMORoleOwnert
   masteredByt   ipsecOwnersReferencet   wellKnownObjectst   ipsecISAKMPReferencet   ipsecFilterReferences   msDs-masteredByt   lastSetTimet   ipsecNegotiationPolicyReferencet   gPCFileSysPatht   accountExpirest   invocationIdt   operatingSystemVersiont   oEMInformationt   targetAddresst   msExchMailboxGuidt   siteFolderGUIDt   distinguishedNamet   defaultObjectCategoryt   membert   memberOft   siteListt   nCNamet   homeMDBt   homeMTAt   interSiteTopologyGeneratort   serverReferences   msDS-HasInstantiatedNCst   hasMasterNCss   msDS-hasMasterNCss   msDS-HasDomainNCst   dMDLocations   msDS-IsDomainFort   rIDSetReferencest   serverReferenceBLt   msExchHomeRoutingGroupt   msExchResponsibleMTAServert   siteFolderServert   msExchRoutingMasterDNt   msExchRoutingGroupMembersBLt	   homeMDBBLt   msExchHomePublicMDBt   msExchOwningServert   templateRootst   addressBookRootst   msExchPolicyRootst   globalAddressListt   msExchOwningPFTreet   msExchResponsibleMTAServerBLt   msExchOwningPFTreeBLt   proxyAddressest   mailt   userPrincipalNamet"   msExchSmtpFullyQualifiedDomainNamet   dnsHostNamet   networkAddresst   dnsRoott   servicePrincipalNameRq   t   CNR…   t   dNSHostNameRQ   t   DC(   R   R   R   R    R!   R%   t   summaryR7   R*   Rc   R2   R4   Rr   t
   attributest   non_replicated_attributest   ignore_attributest   dn_attributest   domain_attributest   servername_attributest   netbios_attributest   other_attributest   upper(   R=   R”   Rc   R	  t   filter_listR   R   RP   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyRD     s¤    				" 							%%%%(c         C   s$   |  j  s  |  j j | d ƒ n  d S(   sE   
        Log on the screen if there is no --quiet option set
        s   
N(   R!   R   R<   (   R=   t   msg(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   logó  s    	c         C   sc   d | } |  j  s | S| j ƒ  j |  j j j ƒ  ƒ r_ | t | ƒ t |  j j ƒ  d } n  | S(   Ns   %ss   ${DOMAIN_DN}(   R    R  t   endswithR   R*   RL   (   R=   t   sRI   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   fix_dnú  s    
	!'c         C   sc   d | } |  j  s | S| j |  j j j ƒ  |  j j j ƒ  ƒ } | j |  j j j ƒ  d ƒ } | S(   Ns   %ss   ${DOMAIN_NAME}(   R    R7   R   R8   R   R  (   R=   R  RI   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   fix_domain_name  s    
	*c         C   sc   d | } |  j  s | S| j |  j j j ƒ  |  j j j ƒ  ƒ } | j |  j j j ƒ  d ƒ } | S(   Ns   %ss   ${DOMAIN_NETBIOS}(   R    R7   R   R2   R   R  (   R=   R  RI   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   fix_domain_netbios
  s    
	*c         C   sc   d | } |  j  s, t |  j j ƒ d k r0 | Sx, |  j j D] } | j ƒ  j | d ƒ } q= W| S(   Ns   %si   s   ${SERVER_NAME}(   R    RL   R   R4   R  R7   (   R=   R  RI   RP   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   fix_server_name  s    
"c         C   s&   |  j  j r |  j | ƒ S|  j | ƒ S(   N(   R   R"   t   cmp_desct	   cmp_attrs(   R=   Rœ   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   __eq__  s    c         C   sÌ   t  |  j |  j d |  j d |  j ƒ} t  | j | j d |  j d |  j ƒ} |  j j d k rr | j | ƒ } n0 |  j j d k r– | j | ƒ } n t d ƒ ‚ | d d  |  _	 | d d  | _	 | d S(	   NR   R   R   t	   collisions   Unknown --view option value.i   iÿÿÿÿi    (
   RŽ   R   Rc   R   R   R$   R¬   R£   t	   Exceptiont   screen_output(   R=   Rœ   t   d1t   d2RI   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR    s    ''c         C   s@  d } g  |  _  g  |  _ g  | _  |  j j ƒ  | j j ƒ  k r¨d d |  j j } xœ |  j j ƒ  D]‹ } | | j j ƒ  k rc | j ƒ  g  | j D] } | j ƒ  ^ q‘ k rc | rÉ | | d 7} d  } n  | d | d 7} |  j  j	 | ƒ qc qc Wd d | j j } xŸ | j j ƒ  D]‹ } | |  j j ƒ  k r| j ƒ  g  |  j D] } | j ƒ  ^ qDk r| r|| | d 7} d  } n  | d | d 7} | j  j	 | ƒ qqWn  g  |  j  D] } | j ƒ  ^ q²} | g  | j  D] } | j ƒ  ^ q×7} d d } x–|  j j ƒ  D]…} | j ƒ  |  j k s
| j ƒ  | k r=q
n  t
 |  j | t ƒ r t
 | j | t ƒ r t |  j | ƒ |  j | <t | j | ƒ | j | <n  |  j | | j | k r
d  } d  } d  } d  }	 | j ƒ  |  j k rng  |  j | D]% }
 |  j j j d ƒ d	 |
 k ^ qõ} g  | j | D]% }
 | j j j d ƒ d	 |
 k ^ q.} | | k rq
qn¥ | j ƒ  |  j k r| } | }	 | rº| rº|  j | } | j | }	 n  g  | D] }
 |  j |
 ƒ ^ qÁ} g  |	 D] }
 | j |
 ƒ ^ qã} | | k rq
qn  | j ƒ  |  j k r¸| } | }	 | r_| r_|  j | } | j | }	 n  g  | D] }
 |  j |
 ƒ ^ qf} g  |	 D] }
 | j |
 ƒ ^ qˆ} | | k r¸q
q¸n  | j ƒ  |  j k r]| } | }	 | r| r|  j | } | j | }	 n  g  | D] }
 |  j |
 ƒ ^ q} g  |	 D] }
 | j |
 ƒ ^ q-} | | k r]q
q]n  | j ƒ  |  j k r| } | }	 | r©| r©|  j | } | j | }	 n  g  | D] }
 |  j |
 ƒ ^ q°} g  |	 D] }
 | j |
 ƒ ^ qÒ} | | k rq
qn  | r| | d 7} d  } n  | rN| rN| d | d
 | | f d 7} n. | d | d
 |  j | | j | f d 7} |  j j	 | ƒ q
q
W|  j  | j  g  k rÄ|  j  | j  k sÄt ‚ n  |  j d c |  j  7<|  j d c |  j 7<| j d c | j  7<| j d c |  j 7<| d  |  _ | d  | _ | d k S(   NR   i   R   s   Attributes found only in %s:s   
i   s   Difference in attribute values:R   i    s
    => 
%s
%st   unique_attrst   df_value_attrsiÿÿÿÿs       s           s       s           s       s           s           (   R$  R%  R
  RR   R   R&   R  R  RS   RN   t
   isinstanceRh   R¥   R  R8   t   splitR  R  R  R  R  R  R  R  RM   R	  R!  (   R=   Rœ   RI   t   titleRP   t   qt   missing_attrst   pRa   Rm   t   j(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR  .  sÄ    			.	.	"&
',99	""	""	""	""		#.(   R‰   RŠ   R‹   RŒ   R   RD   R  R  R  R  R  R  R  R  (    (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR­   ~  s   s							t
   LDAPBundelc           B   sP   e  Z d d e j e j d  „ Z d „  Z d „  Z d „  Z	 d „  Z
 d „  Z RS(   c   
      C   s&  | |  _  | |  _ | |  _ |  j j |  _ |  j j |  _ |  j j |  _ |  j j |  _ |  j j |  _ |  j j |  _ i  |  _	 g  |  j	 d <g  |  j	 d <g  |  j	 d <g  |  j	 d <| |  _
 | rÍ | |  _ nB | j ƒ  d k r| j ƒ  |  _ |  j | ƒ |  _ n t d
 ƒ ‚ d } xÎ | t |  j ƒ k  rå|  j rå|  j | } | t | ƒ t |  j j ƒ  d } | j d |  j j d ƒ } t |  j j ƒ d k rËx- |  j j D] }	 | j d |	 d ƒ } q¨Wn  | |  j | <| d 7} qWt t |  j ƒ ƒ |  _ t |  j ƒ |  _ t |  j ƒ |  _ d  S(   NR$  R%  t   known_ignored_dnt   abnormal_ignored_dnt   DOMAINt   CONFIGURATIONt   SCHEMAt	   DNSDOMAINt	   DNSFORESTs-   Unknown initialization data for LDAPBundel().i    s   ${DOMAIN_DN}s   CN=%ss   CN=${DOMAIN_NETBIOS}i   s   CN=${SERVER_NAME}(   R0  R1  R2  R3  R4  (   R   R   R   R    R!   R%   R   R   R'   R	  R  t   dn_listR  t   contextt   get_dn_listR   RL   R*   R7   R2   R4   Rh   R¦   R¥   t   size(
   R=   R”   R6  R5  R  R   R   t   counterR   RP   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyRD   ¥  sD    					!$c         C   s$   |  j  s  |  j j | d ƒ n  d S(   sE   
        Log on the screen if there is no --quiet option set
        s   
N(   R!   R   R<   (   R=   R  (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR  Ì  s    	c         C   s(   t  |  j ƒ |  _ t |  j ƒ |  _ d  S(   N(   RL   R5  R8  R¥   (   R=   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   update_sizeÓ  s    c         C   sþ  t  } |  j | j k rJ |  j d |  j | j f ƒ |  j sJ t } qJ n  |  j t k r~d |  j j } x˜ |  j	 D] } | j
 ƒ  g  | j	 D] } | j
 ƒ  ^ qŒ k rs | rÓ |  j rÓ |  j | ƒ d  } t } n  |  j d | ƒ d |  j	 |  j	 j | ƒ <qs qs Wg  |  j	 D] } | r| ^ q|  _	 d | j j } x˜ | j	 D] } | j
 ƒ  g  |  j	 D] } | j
 ƒ  ^ q\k rC| r£|  j r£|  j | ƒ d  } t } n  |  j d | ƒ d | j	 | j	 j | ƒ <qCqCWg  | j	 D] } | rÞ| ^ qÞ| _	 |  j ƒ  | j ƒ  |  j | j k s%t ‚ t g  |  j	 D] } | j
 ƒ  ^ q2ƒ t g  | j	 D] } | j
 ƒ  ^ qWƒ k s~t ‚ n  |  j d |  j ƒ d } x_| |  j k  rùt } yG t d |  j d	 |  j	 | d
 |  j d |  j d |  j d |  j ƒ } WnI t k
 rB\ }	 }
 |	 t k r<|  j d |  j	 | ƒ t  } n  ‚  n XyG t d | j d	 | j	 | d
 | j d |  j d |  j d |  j ƒ } WnI t k
 rÕ\ }	 }
 |	 t k rÏ|  j d | j	 | ƒ t  } n  ‚  n X| rì| d 7} q›n  | | k rd|  j j rÔ|  j d ƒ |  j d | j | j j f ƒ |  j d | j | j j f ƒ |  j d ƒ qÔnp |  j d ƒ |  j d | j | j j f ƒ |  j d | j | j j f ƒ |  j | j ƒ |  j d ƒ t } | j |  _ | j | _ | d 7} q›W| S(   Ns)   
* DN lists have different size: %s != %ss   
* DNs found only in %s:i   R   R   s   
* Objects to be compared: %si    R”   Rc   R	  R  R   R   s   
!!! Object not found: %si   s   
Comparing:s	   '%s' [%s]t   OKt   FAILEDs       s       s       s       OKs       s
       FAILED(   Rf   R8  R  R'   RT   R   R   R   R&   R5  R  RS   R€   R:  RM   R¥   R­   R	  R  R   R   R   R   R%   Rc   R!  (   R=   Rœ   RI   R(  RP   R)  R€   t   skipt   object1RV   RW   t   object2(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR  ×  s–    	.	 %.	 %

Y						
    c         C   sÊ  | j  ƒ  d k r! |  j j } nŒ | j  ƒ  d k rB |  j j } nk | j  ƒ  d k rc |  j j } nJ | j  ƒ  d k rˆ d |  j j } n% | j  ƒ  d k r­ d |  j j } n  g  } |  j sÈ | |  _ n  |  j j  ƒ  |  _ |  j d k rõ t |  _ nB |  j d	 k rt	 |  _ n' |  j d
 k r+t
 |  _ n t d ƒ ‚ y1 |  j j j d |  j d |  j d d g ƒ } Wn3 t k
 r\ } } |  j j d |  j ƒ ‚  n Xx% | D] } | j | d j ƒ  ƒ q¥W| S(   s¿    Query LDAP server about the DNs of certain naming self.con.ext Domain (or Default), Configuration, Schema.
            Parse all DNs and filter those that are 'strange' or abnormal.
        R0  R1  R2  R3  s   DC=DomainDnsZones,%sR4  s   DC=ForestDnsZones,%sR   t   BASEt   ONEs0   Wrong 'scope' given. Choose from: SUB, ONE, BASER@   RA   RJ   Rc   s   Failed search of base=%s
(   R  R   R*   R.   R0   R,   R   R   R   R   R   t   StandardErrorR   RG   R   R   R<   RN   t   get_linearized(   R=   R6  R   R5  RI   RV   RW   RP   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR7  -  s:    	1c         C   s  t  t |  j d ƒ ƒ |  j d <t  t |  j d ƒ ƒ |  j d <|  j d r¥ |  j d |  j j ƒ |  j d j g  |  j d D] } t d d	 | ƒ ^ q~ ƒ ƒ n  |  j d r|  j d ƒ |  j d j g  |  j d D] } t d d
 | ƒ ^ qÙ ƒ ƒ g  |  j d <n  d  S(   NR$  R%  s   
Attributes found only in %s:R   s   
i   R   s"   
Attributes with different values:s       s       (   Rh   R¦   R	  R  R   R&   t   joinR(   (   R=   RP   (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   print_summaryT  s      A>N(   R‰   RŠ   RS   R‹   RŒ   R   RD   R  R:  R  R7  RE  (    (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyR-  £  s   &			V	't   cmd_ldapcmpc           B   s  e  Z d  Z d Z i e j d 6e j d 6e j d 6Z i e j d 6e j d 6e j d 6Z d d d d d	 d
 d g Z	 e
 d d d d d d d e d d ƒe
 d d d d d d d e d d ƒe
 d d d d d d d e d d ƒe
 d d d d d d e d d ƒe
 d  d d! d d d e d d" ƒe
 d# d d$ d d% d d& ƒe
 d' d d( d d) d d* ƒe
 d+ d d, d d) d d- ƒe
 d. d d/ d d0 d d1 ƒe
 d2 d d3 d d) d d4 ƒe
 d5 d d6 d d d e d d7 ƒg Z d9 d9 d9 d9 d9 e e e e e d% d) d) d0 d) d9 d9 d9 e d8 „ Z RS(:   s   Compare two ldap databases.sO   %prog <URL1> <URL2> (domain|configuration|schema|dnsdomain|dnsforest) [options]t	   sambaoptst   versionoptst   credoptst   URL1t   URL2s	   context1?s	   context2?s	   context3?s	   context4?s	   context5?s   -ws   --twot   destR?   t   actiont
   store_truet   defaultt   helps"   Hosts are in two different domainss   -qs   --quietR!   s1   Do not print anything but relay on just exit codes   -vs	   --verboseR%   s*   Print all DN pairs that have been compareds   --sdR"   s+   Compare nTSecurityDescriptor attibutes onlys   --sort-acesR#   s=   Sort ACEs before comparison of nTSecurityDescriptor attributes   --viewR$   R   sU   Display mode for nTSecurityDescriptor results. Possible values: section or collision.s   --baseR@   R   s:   Pass search base that will build DN list for the first DC.s   --base2t   base2sn   Pass search base that will build DN list for the second DC. Used when --two or when compare two different DNs.s   --scopeRA   R   s>   Pass search scope that builds DN list. Options: SUB, ONE, BASEs   --filtert   filters?   List of comma separated attributes to ignore in the comparisions   --skip-missing-dnR'   sC   Skip report and failure due to missing DNs in one server or anotherc   #       C   sI  | j  ƒ  } | j d ƒ p' | j d ƒ } | rH | j | d t ƒ} n d  } | j | d t ƒ} | j ƒ  rx | } n | j d ƒ | j	 d ƒ | r´ | j
 ƒ  r´ t d ƒ ‚ n  g  } | d  k rö | rÞ | rÞ d g } q`d d d d	 d
 g } nj xg | | | | | g D]P } | d  k r$qn  | j ƒ  d+ k rIt d | ƒ ‚ n  | j | j ƒ  ƒ qW|
 r{|	 r{t d ƒ ‚ n  | rˆ| s•| r¤| r¤t d ƒ ‚ n  | rË| j ƒ  d, k rËt d ƒ ‚ n  | j ƒ  d- k rìt d ƒ ‚ n  t | | | d | d |	 d | d | d |
 d | d | d | d |  j d |  j ƒ
} t | j ƒ d k s[t ‚ t | | | d | d |	 d | d | d |
 d | d | d | d |  j d |  j ƒ
} t | j ƒ d k sÊt ‚ | j d  ƒ } d } xD| D]<}  |	 s	|  j j d! |  ƒ n  t | d" |  d# | d |  j d |  j ƒ}! t | d" |  d# | d |  j d |  j ƒ}" |! |" k r‰|	 s"|  j j d$ |  ƒ q"qæ|	 s|  j j d% |  ƒ | st |! j d& ƒ t |" j d& ƒ k sÕt ‚ g  |" j d& <|  j j d' ƒ |  j j d( ƒ |! j ƒ  |" j ƒ  qn  d) } qæW| d k rEt d* | ƒ ‚ n  d  S(.   Nt   ldapt   fallback_machinet   guessR   s3   You must supply at least one username/password pairR0  R1  R2  R3  R4  s   Incorrect argument: %ss-   You cannot set --verbose and --quiet togethers<   You need to specify both --base and --base2 at the same timet   SECTIONt	   COLLISIONs7   Invalid --view value. Choose from: section or collisionR   RA  R@  s2   Invalid --scope value. Choose from: SUB, ONE, BASER?   R!   R"   R#   R%   R$   R@   RA   R   R   i    R   s   
* Comparing [%s] context...
R6  R  s   
* Result for [%s]: SUCCESS
s   
* Result for [%s]: FAILURE
R%  s	   
SUMMARY
s
   ---------
iÿÿÿÿs   Compare failed: %d(   s   DOMAINs   CONFIGURATIONs   SCHEMAs	   DNSDOMAINs	   DNSFOREST(   RV  RW  (   s   SUBs   ONEs   BASE(   t   get_loadparmR   t   get_credentialsRf   RS   t   get_credentials2RT   t   is_anonymoust
   set_domaint   set_workstationt   authentication_requestedR	   R  RN   R   R   R   RL   R*   RM   R'  R<   R-  R	  RE  (#   R=   RJ  RK  t   context1t   context2t   context3t   context4t   context5R?   R!   R%   R"   R#   R$   R@   RQ  RA   RR  RI  RG  RH  R'   R   t
   using_ldapR>   t   creds2t   contextsRƒ   t   con1t   con2R  t   statusR6  t   b1t   b2(    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   run  s„    	,

N(   R‰   RŠ   t   __doc__t   synopsisR   t   SambaOptionst   VersionOptionst   CredentialsOptionsDoublet   takes_optiongroupst
   takes_argsR
   RT   t   takes_optionsRS   Rl  (    (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyRF  b  sJ   



(   R   R5   R‹   t   sambat   samba.getoptt   getoptR   R    t	   samba.ndrR   t   samba.dcerpcR   R   R   R   R   R   R   t   samba.netcmdR   R	   R
   R	  t   objectR   RŽ   R­   R-  RF  (    (    (    s8   /usr/lib/python2.7/dist-packages/samba/netcmd/ldapcmp.pyt   <module>   s    (Ývÿ &¿