
    Id<                         d dl Z d dlZd dlmZmZ d dlmZmZ d dlm	Z	 d dl
mZ d dlmZ d Zd Zd	 Zd
 Zd Zd Zd Zd ZddZy)    N)
SCOPE_BASELdbError)nttime2unixdsdb)CommandError)SamDB)KCCc                    t        t        j                               }t        |d      }|j                  | ||       |j	                         }t        |      }t        |      t        |      k7  rt        dt        j                         ||fS )z>Get a readonly KCC object and the list of DSAs it knows about.T)readonlyzThere seem to be duplicate dsasfile)
inttimer	   
load_samdb	list_dsassetlenprintsysstderr)urllpcredsunix_nowkccdsa_listdsass          4/usr/lib/python3/dist-packages/samba/uptodateness.pyget_kcc_and_dsasr      sk    499;H
h
&CNN3E"}}Hx=D
4yCM!/cjjA9    c                     | j                         }|t        | j                               d| j                         z  d|z  d|z  d}i }|j                         D ]
  \  }}|||<    ||fS )zOGenerate dictionaries mapping short partition names to the
    appropriate DNs.zCN=Schema,%szDC=DomainDnsZones,%szDC=ForestDnsZones,%s)DOMAINCONFIGURATIONSCHEMA	DNSDOMAIN	DNSFOREST)	domain_dnstrget_config_basednitems)samdbbase_dnshort_to_longlong_to_shortsls         r   get_partition_mapsr1   -   s     ooGU4467 5#:#:#<<+g5+g5M M##% 1a -''r    c                     |@t        |       \  }}|j                  |j                         |      }||vrt        d|z        |S )Nzunknown partition %s)r1   getupperr   )r+   partshort_partitionslong_partitionss       r   get_partitionr8   @   sP     ,>u,E)/##DJJL$7&5<==Kr    c           	         g }| j                         }t        j                  | |      D ]  }t        |j                        }| j                  |d|z  ddg      }	 t        |d   d   d         }|j                  dd      \  }}	|d	k7  rt        d
|z        |j                  |	|t        |j                        t        |j                        f        |S # t        $ r
}
Y d}
~
d}
~
ww xY w)z3This finds the uptodateness vector in the database.z)(&(invocationId=%s)(objectClass=nTDSDSA))distinguishedNameinvocationId)base
expressionattrsr   ,   NzCN=NTDS Settingsz!Expected NTDS Settings DN, got %s)r)   r   _dsdb_load_udv_v2r(   source_dsa_invocation_idsearchsplit
IndexErrorr   appendr   highest_usnr   last_sync_success)r+   dncursors	config_dncinv_idressettings_dnprefixdsa_dnes              r   get_utdvrS   K   s   G'')I##E2. ;Q//0ll	(@BH(I"5~!F  H	c!f%89!<=K(..sA6NFF ''B* + , , 	AMM*#A$7$78: 	;;& N  		s   )C	C)$C)c                     | j                  dt        dg      }t        |d   d   d         }t        t        j                               }||fS )N highestCommittedUSN)r<   scoper>   r   )rC   r   r   r   )r+   rN   usnnows       r   get_own_cursorrZ   e   sU    
,,B'34  6C c!f*+A.
/C
diik
C:r    c           	      r   i }|D ]w  }| j                   j                  |t        dg      }d|d   d   d   z  }	 t        |||      }	t	        |	|      }
t        |	      \  }}||i}|
D ]  \  }}}}|||<    	 |||<   y |S # t        $ r,}t        d|d|dt        j                  	       Y d }~d }~ww xY w)
NdNSHostName)rW   r>   z	ldap://%sr   )r   credentialsr   zCould not contact z ()r   )
r+   rC   r   r   rS   rZ   r   r   r   r   )	local_kccr   part_dnr   r   
utdv_edgesrQ   rN   ldap_urlr+   rJ   own_usnown_timeremotesrI   guidrX   trR   s                      r   get_utdv_edgesrh   n   s     J %oo$$V+5,9? % < Q!6q!99
	hEbAEug.G .u 5GXw'G$+ " D#q!" %
6!%"   	1=zz#	s   =B	B6
"B11B6c                 .   i }|D ]u  }	 | |   |   }i }|||<   |D ]^  }|| v r:|| |   v r|| |   |   z
  }|||<   t        d| d| t        j                         At        d|z  t        j                         ` w |S # t         $ r}d}Y d }~~d }~ww xY w)Nr   zMissing dn z from UTD vector for dsa r   z"missing dn %s from UTD vector list)KeyErrorr   r   r   )	ra   r   	distancesdn1peakrR   ddn2dists	            r   get_utdv_distancesrq      s    I '	c?3'D 	# 
	'Cj *S/)*S/#"66D!AcFKu,EcUK"zz+ :S@::'
	''$   	D	s   A??	BBBc                 v    d}| j                         D ]#  }|j                         D ]  }t        ||      } % |S )Nr   )valuesmax)rk   max_distancevectordistances       r   get_utdv_max_distancerx      sH    L""$ 7 	7H|X6L	77 r    c                    dx}}d}g }| j                         D ]4  \  }}|j                         D ]  \  }}	||k7  s|j                  |	        6 |r|j                          |d   }t        |      }
|
dz  dk(  r&|
dz  dz
  }||   ||dz      z   dz  }t	        |d      }n|
dz
  dz  }||   }t        |      }t        |       t        |       dz
  z  }||
z
  }|||d}|r|D ci c]  }|||   
 c}S |S c c}w )Nr   g           r@   g       @)maximummedianfailure)r*   rF   sortr   roundfloat)rk   filtersr|   r~   r}   rs   dn_outerrv   dn_innerrw   lengthindexexpected_lengthsummarykeys                  r   get_utdv_summaryr      s9   GgFF%OO- (&"(,,. 	(Hh8#h'	((
 *VA:?AIMEUmfU1Wo5s:F61%FaZ!OEE]F6]Fi.C	NQ,>?!F* G -45cWS\!55 6s   #C5)N)r   r   ldbr   r   sambar   r   samba.netcmdr   samba.samdbr   	samba.kccr	   r   r1   r8   rS   rZ   rh   rq   rx   r    r    r   <module>r      sI   (   $ # %  (&42.#r    