
    b<                         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dS )    N)
SCOPE_BASELdbError)nttime2unixdsdb)CommandError)SamDB)KCCc                 V   t          t          j                              }t          |d          }|                    | ||           |                                }t          |          }t          |          t          |          k    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      s    49;;H
h
&
&
&CNN3E"""}}Hx==D
4yyCMM!!/cjAAAA9    c                     |                                  }|t          |                                           d|                                 z  d|z  d|z  d}i }|                                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677 5#:#:#<#<<+g5+g5 M M##%%  1a-''r    c                     |Pt          |           \  }}|                    |                                |          }||vrt          d|z            |S )Nzunknown partition %s)r1   getupperr   )r+   partshort_partitionslong_partitionss       r   get_partitionr8   @   s^     ,>u,E,E)/##DJJLL$77&&5<===Kr    c           	         g }|                                  }t          j        | |          D ]}t          |j                  }|                     |d|z  ddg          }	 t          |d         d         d                   }|                    dd          \  }}	n# t          $ r
}
Y d}
~
~d}
~
ww xY w|d	k    rt          d
|z            |	                    |	|t          |j                  t          |j                  f           |S )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   sO   G''))I#E2.. ; ;Q/00ll	(@BH(I"5~!F  H H	c!f%89!<==K(..sA66NFFF 	 	 	HHHH	'''B* + , , , 	AM**#A$788: 	; 	; 	; 	; Ns    :B
B/*B/c                     |                      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   s`    
,,B'34  6 6C c!f*+A.
/
/C
dikk

C:r    c           	         i }|D ]}| j                             |t          dg          }d|d         d         d         z  }	 t          |||          }	t	          |	|          }
t          |	          \  }}||i}|
D ]\  }}}}|||<   n9# t          $ r,}t          d|d|dt          j	        	           Y d }~d }~ww xY w|||<   |S )
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   s0    J % %o$$V+5,9? % < < Q!6q!99
	hEbAAAEug..G .u 5 5GXw'G$+ " " D#q!" 	 	 	E111=z# # # #HHHH	 %
6s   AB


C "B;;C c                 H   i }|D ]}	 | |         |         }n# t           $ r}d}Y d }~nd }~ww xY wi }|||<   |D ]g}|| v rC|| |         v r|| |         |         z
  }|||<   't          d| d| t          j                   It          d|z  t          j                   h|S )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'DD 	 	 	DDDDDD		# 
	' 
	'Cj  *S/))*S/#"66D!AcFFKKKcKK"z+ + + + + :S@:' ' ' ' '
	' s   
-(-c                     d}|                                  D ])}|                                 D ]}t          ||          }*|S )Nr   )valuesmax)rk   max_distancevectordistances       r   get_utdv_max_distancerx      sU    L""$$ 7 7 	7 	7H|X66LL	7r    c                 :   dx}}d}g }|                                  D ]:\  }}|                                 D ] \  }}	||k    r|                    |	           !;|r|                                 |d         }t          |          }
|
dz  dk    r0|
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fd|D             S S )	Nr   g           r@   g       @)maximummedianfailurec                 "    i | ]}||         S  r   ).0keysummarys     r   
<dictcomp>z$get_utdv_summary.<locals>.<dictcomp>   s    555cWS\555r    )r*   rF   sortr   roundfloat)rk   filtersr|   r~   r}   rs   dn_outerrv   dn_innerrw   lengthindexexpected_lengthr   s                @r   get_utdv_summaryr      sk   GgFF%OO-- ( (&"(,,.. 	( 	(Hh8##h'''	(  +*VA:??AIMEUmfU1Wo5s:F61%%FFaZ!OEE]F6]]Fi..C	NNQ,>?!F*  G  5555W5555r    )N)r   r   ldbr   r   sambar   r   samba.netcmdr   samba.samdbr   	samba.kccr	   r   r1   r8   rS   rZ   rh   rq   rx   r   r   r    r   <module>r      s  ( 


  $ $ $ $ $ $ $ $ # # # # # # # # % % % % % %              ( ( (&    4    2  .  # # # # # #r    