a
    Wa                     @   s   d dl mZ 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d	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd ZdddZdS )    )print_functionN)
SCOPE_BASELdbError)nttime2unixdsdb)CommandError)SamDB)KCCc                 C   s\   t t }t|dd}|| || | }t|}t|t|krTtdtj	d ||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	   Z
load_samdbZ	list_dsassetlenprintsysstderr)urllpcredsZunix_nowZkccZdsa_listdsas r   4/usr/lib/python3/dist-packages/samba/uptodateness.pyget_kcc_and_dsas    s    r   c                 C   sV   |   }|t|  d|   d| d| d}i }| D ]\}}|||< q<||fS )zOGenerate dictionaries mapping short partition names to the
    appropriate DNs.zCN=Schema,%szDC=DomainDnsZones,%szDC=ForestDnsZones,%s)ZDOMAINZCONFIGURATIONZSCHEMAZ	DNSDOMAINZ	DNSFOREST)Z	domain_dnstrget_config_basednitems)samdbZbase_dnZshort_to_longZlong_to_shortslr   r   r   get_partition_maps.   s    


r!   c                 C   s<   |d ur8t | \}}|| |}||vr8td| |S )Nzunknown partition %s)r!   getupperr   )r   partZshort_partitionsZlong_partitionsr   r   r   get_partitionA   s    r%   c                 C   s   g }|   }t| |D ]}t|j}| j|d| ddgd}z(t|d d d }|dd\}}	W nB ty }
 z*td| t	j
d	 W Y d
}
~
qW Y d
}
~
n
d
}
~
0 0 |dkrtd| ||	|t|jt|jf q|S )z3This finds the uptodateness vector in the database.z)(&(invocationId=%s)(objectClass=nTDSDSA))ZdistinguishedNameZinvocationId)baseZ
expressionattrsr   ,   zUnknown invocation ID %sr   NzCN=NTDS Settingsz!Expected NTDS Settings DN, got %s)r   r   Z_dsdb_load_udv_v2r   Zsource_dsa_invocation_idsearchsplit
IndexErrorr   r   r   r   appendr   Zhighest_usnr   Zlast_sync_success)r   dncursorsZ	config_dncZinv_idresZsettings_dnprefixdsa_dner   r   r   get_utdvL   s8    
"r5   c                 C   s:   | j dtdgd}t|d d d }tt }||fS )N ZhighestCommittedUSN)r&   scoper'   r   )r*   r   r   r   )r   r1   usnZnowr   r   r   get_own_cursorh   s    r9   c                 C   s   i }|D ]}| j j|tdgd}d|d d d  }zJt|||d}	t|	|}
t|	\}}||i}|
D ]\}}}}|||< qfW nF ty } z.td||f tj	d W Y d }~qW Y d }~n
d }~0 0 |||< q|S )NZdNSHostName)r7   r'   z	ldap://%sr   )r   Zcredentialsr   zCould not contact %s (%s)r   )
r   r*   r   r   r5   r9   r   r   r   r   )Z	local_kccr   Zpart_dnr   r   
utdv_edgesr3   r1   Zldap_urlr   r/   Zown_usnZown_timeZremotesr.   Zguidr8   tr4   r   r   r   get_utdv_edgesq   s*    
"
r<   c           	      C   s   i }|D ]}z| | | }W n( t yD } zd}W Y d }~n
d }~0 0 i }|||< |D ]X}|| v r|| | v r|| | |  }|||< qtd| tjd qVtd| tjd qVq|S )Nr   zMissing dn %s from UTD vectorr   z"missing dn %s from UTD vector list)KeyErrorr   r   r   )	r:   r   	distancesZdn1Zpeakr4   dZdn2Zdistr   r   r   get_utdv_distances   s(    

r@   c                 C   s.   d}|   D ]}|  D ]}t||}qq|S )Nr   )valuesmax)r>   Zmax_distancevectordistancer   r   r   get_utdv_max_distance   s
    rE   c                    s   d }}d}g }|   D ],\}}|  D ]\}}	||kr(||	 q(q|r|  |d }t|}
|
d dkr|
d d }|| ||d   d }t|d}n|
d d }|| }t|}t| t| d  }||
 }|||d |r fdd	|D S  S d S )
Nr   g           r)   g       @)maximummedianfailurec                    s   i | ]}| | qS r   r   ).0keyZsummaryr   r   
<dictcomp>       z$get_utdv_summary.<locals>.<dictcomp>)r   r-   sortr   roundfloat)r>   filtersrH   rJ   rI   rA   Zdn_outerrC   Zdn_innerrD   ZlengthindexZexpected_lengthr   rM   r   get_utdv_summary   s6    rU   )N)Z
__future__r   r   r   Zldbr   r   Zsambar   r   Zsamba.netcmdr   Zsamba.samdbr   Z	samba.kccr	   r   r!   r%   r5   r9   r<   r@   rE   rU   r   r   r   r   <module>   s    	