a
    Wa                     @   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mZ ddlZddl	Z	ddl
mZ ddlmZ ddlmZmZ ddl	mZ ddlmZmZmZ dd	lmZmZmZmZmZ dd
lmZmZmZm Z m!Z!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ dd Z0dd Z1G dd dej2Z3G dd dej2Z4G dd dej2Z5G dd dej2Z6G dd dej2Z7G dd dej2Z8G dd dej2Z9G d d! d!ej:Z;G d"d# d#ej:Z<G d$d% d%ej:Z=G d&d' d'ej:Z>G d(d) d)ej:Z?G d*d+ d+ej:Z@G d,d- d-ej:ZAd.d/ ZBd0d1 ZCdjd3d4ZDd5d6 ZEd7d8 ZFd9d: ZGd;d< ZHd=d> ZId?d@ ZJdAdB ZKdCdD ZLdEdF ZMdGdH ZNdIdJ ZOdKdL ZPdMdN ZQdOdP ZRdQdR ZSdSdT ZTdUdV ZUdWdX ZVdYdZ ZWd[d\ ZXd]d^ ZYd_d` ZZdadb Z[dce(dcfdddeZ\dddde(dfdfdgZ]dkdhdiZ^dS )lzDNS-related provisioning    N)	b64encode)tdb_copy)mdb_copy)ndr_pack
ndr_unpack)
setup_file)dnspmiscsecurity)DS_DOMAIN_FUNCTION_2000DS_DOMAIN_FUNCTION_2003DS_DOMAIN_FUNCTION_2008_R2DS_DOMAIN_FUNCTION_2012_R2DS_DOMAIN_FUNCTION_2016)get_domain_descriptor'get_domain_delete_protected1_descriptor'get_domain_delete_protected2_descriptorget_dns_partition_descriptor'get_dns_forest_microsoft_dns_descriptor'get_dns_domain_microsoft_dns_descriptor)
setup_pathsetup_add_ldifsetup_modify_ldif	setup_ldb	FILL_FULLFILL_SUBDOMAINFILL_NT4SYNCFILL_DRS)get_default_backend_store)
get_stringc                 C   s4   | j |tjdgd}tttj|d d d }|S )NZ
objectGUIDbasescopeattrsr   )searchldb
SCOPE_BASEstrr   r	   ZGUID)samdbdomaindnres
domainguid r,   :/usr/lib/python3/dist-packages/samba/provision/sambadns.pyget_domainguidA   s    r.   c                 C   s4   | j d| tjdgd}ttj|d d d }|S )NzCN=DnsAdmins,CN=Users,%sZ	objectSidr    r   )r$   r%   r&   r   r
   Zdom_sid)r(   r)   r*   dnsadmins_sidr,   r,   r-   get_dnsadmins_sidG   s
    r0   c                       s&   e Zd Zddejf fdd	Z  ZS )ARecord     c                    s2   t t|   tj| _|| _|| _|| _|| _	d S N)
superr1   __init__r   Z
DNS_TYPE_AwTyperankdwSerialdwTtlSecondsdata)selfZip_addrserialttlr8   	__class__r,   r-   r6   P   s    zARecord.__init____name__
__module____qualname__r   ZDNS_RANK_ZONEr6   __classcell__r,   r,   r?   r-   r1   N   s   r1   c                       s&   e Zd Zddejf fdd	Z  ZS )
AAAARecordr2   r3   c                    s2   t t|   tj| _|| _|| _|| _|| _	d S r4   )
r5   rF   r6   r   ZDNS_TYPE_AAAAr7   r8   r9   r:   r;   )r<   Zip6_addrr=   r>   r8   r?   r,   r-   r6   [   s    zAAAARecord.__init__rA   r,   r,   r?   r-   rF   Y   s   rF   c                       s&   e Zd Zddejf fdd	Z  ZS )CNameRecordr2   r3   c                    s2   t t|   tj| _|| _|| _|| _|| _	d S r4   )
r5   rG   r6   r   ZDNS_TYPE_CNAMEr7   r8   r9   r:   r;   )r<   Zcnamer=   r>   r8   r?   r,   r-   r6   f   s    zCNameRecord.__init__rA   r,   r,   r?   r-   rG   d   s   rG   c                       s&   e Zd Zddejf fdd	Z  ZS )NSRecordr2   r3   c                    s2   t t|   tj| _|| _|| _|| _|| _	d S r4   )
r5   rH   r6   r   ZDNS_TYPE_NSr7   r8   r9   r:   r;   )r<   Z
dns_serverr=   r>   r8   r?   r,   r-   r6   q   s    zNSRecord.__init__rA   r,   r,   r?   r-   rH   o   s   rH   c                       s.   e Zd Zddddddejf fdd	Z  ZS )	SOARecordr2   r3   iX  iQ i  c
                    sd   t t|   tj| _|	| _|| _|| _t	 }
||
_
||
_||
_||
_||
_||
_||
_|
| _d S r4   )r5   rI   r6   r   ZDNS_TYPE_SOAr7   r8   r9   r:   soar=   refreshretryexpiremnamernameminimumr;   )r<   rN   rO   r=   rK   rL   rM   rP   r>   r8   rJ   r?   r,   r-   r6   |   s    zSOARecord.__init__rA   r,   r,   r?   r-   rI   z   s   
rI   c                       s*   e Zd Zddddejf fdd	Z  ZS )	SRVRecordr   d   r2   r3   c           	         sR   t t|   tj| _|| _|| _|| _t	 }||_
||_||_||_|| _d S r4   )r5   rQ   r6   r   ZDNS_TYPE_SRVr7   r8   r9   r:   srvZ
nameTargetZwPortZ	wPriorityZwWeightr;   )	r<   targetportZpriorityZweightr=   r>   r8   rS   r?   r,   r-   r6      s    zSRVRecord.__init__rA   r,   r,   r?   r-   rQ      s   rQ   c                       s&   e Zd Zddejf fdd	Z  ZS )	TXTRecordr2   r3   c                    sJ   t t|   tj| _|| _|| _|| _t	 }t
||_||_|| _d S r4   )r5   rV   r6   r   ZDNS_TYPE_TXTr7   r8   r9   r:   Zstring_listlencountr'   r;   )r<   Zslistr=   r>   r8   Z
stringlistr?   r,   r-   r6      s    
zTXTRecord.__init__rA   r,   r,   r?   r-   rV      s   rV   c                       s"   e Zd Zejf fdd	Z  ZS )TypePropertyc                    s,   t t|   d| _d| _tj| _|| _d S Nr2   )	r5   rY   r6   wDataLengthversionr   ZDSPROPERTY_ZONE_TYPEidr;   )r<   	zone_typer?   r,   r-   r6      s
    zTypeProperty.__init__)rB   rC   rD   r   ZDNS_ZONE_TYPE_PRIMARYr6   rE   r,   r,   r?   r-   rY      s   rY   c                       s"   e Zd Zejf fdd	Z  ZS )AllowUpdatePropertyc                    s,   t t|   d| _d| _tj| _|| _d S rZ   )	r5   r_   r6   r[   r\   r   ZDSPROPERTY_ZONE_ALLOW_UPDATEr]   r;   )r<   allow_updater?   r,   r-   r6      s
    zAllowUpdateProperty.__init__)rB   rC   rD   r   ZDNS_ZONE_UPDATE_SECUREr6   rE   r,   r,   r?   r-   r_      s   r_   c                       s   e Zd Zd fdd	Z  ZS )SecureTimePropertyr   c                    s,   t t|   d| _d| _tj| _|| _d S rZ   )	r5   ra   r6   r[   r\   r   ZDSPROPERTY_ZONE_SECURE_TIMEr]   r;   )r<   Zsecure_timer?   r,   r-   r6      s
    zSecureTimeProperty.__init__)r   rB   rC   rD   r6   rE   r,   r,   r?   r-   ra      s   ra   c                       s   e Zd Zd fdd	Z  ZS )NorefreshIntervalPropertyr   c                    s,   t t|   d| _d| _tj| _|| _d S rZ   )	r5   rc   r6   r[   r\   r   Z"DSPROPERTY_ZONE_NOREFRESH_INTERVALr]   r;   )r<   norefresh_intervalr?   r,   r-   r6      s
    z"NorefreshIntervalProperty.__init__)r   rb   r,   r,   r?   r-   rc      s   rc   c                       s   e Zd Zd fdd	Z  ZS )RefreshIntervalPropertyr   c                    s,   t t|   d| _d| _tj| _|| _d S rZ   )	r5   re   r6   r[   r\   r   Z DSPROPERTY_ZONE_REFRESH_INTERVALr]   r;   )r<   refresh_intervalr?   r,   r-   r6      s
    z RefreshIntervalProperty.__init__)r   rb   r,   r,   r?   r-   re      s   re   c                       s   e Zd Zd fdd	Z  ZS )AgingStatePropertyr   c                    s,   t t|   d| _d| _tj| _|| _d S rZ   )	r5   rg   r6   r[   r\   r   ZDSPROPERTY_ZONE_AGING_STATEr]   r;   )r<   Zaging_enabledr?   r,   r-   r6      s
    zAgingStateProperty.__init__)r   rb   r,   r,   r?   r-   rg      s   rg   c                       s   e Zd Zd fdd	Z  ZS )AgingEnabledTimePropertyr   c                    s,   t t|   d| _d| _tj| _|| _d S rZ   )	r5   rh   r6   r[   r\   r   Z"DSPROPERTY_ZONE_AGING_ENABLED_TIMEr]   r;   )r<   Znext_cycle_hoursr?   r,   r-   r6      s
    z!AgingEnabledTimeProperty.__init__)r   rb   r,   r,   r?   r-   rh      s   rh   c                 C   sj  d| }d| }t |}	t| td|t|	dd |tkr`t| td|t|	dd t| |}
tt	 }
t
| |  }t|}t|}t| td||
|||t|dt|dd t| td|||d	 |tkrft| |}tt	 }t
| |  }t| td|||||t|dt|dd t| td|||d	 d S )
NzDC=DomainDnsZones,%szDC=ForestDnsZones,%sz"provision_dnszones_partitions.ldifutf8)ZONE_DNZSECDESCzprovision_dnszones_add.ldif)rj   Z	ZONE_GUIDZZONE_DNSCONFIGDNSERVERDNZLOSTANDFOUND_DESCRIPTORZINFRASTRUCTURE_DESCRIPTORzprovision_dnszones_modify.ldif)rk   rl   rj   )r   r   r   r   decoder   r.   r'   uuidZuuid4r%   DnZcanonical_ex_strstripr   r   r   )r(   	domainsidr)   forestdnconfigdnserverdn
fill_levelZdomainzone_dnZforestzone_dn
descriptorZdomainzone_guidZdomainzone_dnsZprotected1_descZprotected2_descZforestzone_guidZforestzone_dnsr,   r,   r-   setup_dns_partitions   sb    



	



	
rw   c                 C   s   t | tdd|i d S )Nzprovision_dns_accounts_add.ldifDOMAINDN)r   r   )r(   r)   r,   r,   r-   add_dns_accounts-  s    
ry   Fc           	      C   sv   dt |i}|du r"t||d}nt||d}tt| d||f }ddg|d< t|tjd|d< | | d S )	NZ	DnsAdminsT)name_mapzCN=MicrosoftDNS,%s,%stopZ	containerobjectClassnTSecurityDescriptor)	r'   r   r   r%   Messagero   MessageElementFLAG_MOD_ADDadd)	r(   r)   prefixZ
domain_sidr/   forestrz   Zsd_valmsgr,   r,   r-   add_dns_container3  s    
r   c           
   
   C   s  i }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< i }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(||f }t t | |}g }|tttjd) |tttj	d* |tt
  |tt  |tt  |tt  |tt  d+d,g|d-< t d.t jd/|d/< t |t jd0|d0< | | g }|D ]"}	|tt|	d1d1tjd2 qt t | d3| }d+d4g|d-< t |t jd5|d5< | | |D ]f}	tt||	 d1d1tjd2g}t t | d6|	|f }d+d4g|d-< t |t jd5|d5< | | q$d S )7Nz
198.41.0.4za.root-servers.netz192.228.79.201zb.root-servers.netz192.33.4.12zc.root-servers.netz199.7.91.13zd.root-servers.netz192.203.230.10ze.root-servers.netz192.5.5.241zf.root-servers.netz192.112.36.4zg.root-servers.netz198.97.190.53zh.root-servers.netz192.36.148.17zi.root-servers.netz192.58.128.30zj.root-servers.netz193.0.14.129zk.root-servers.netz199.7.83.42zl.root-servers.netz202.12.27.33zm.root-servers.netz2001:503:ba3e::2:30z2001:500:84::bz2001:500:2::cz2001:500:2d::dz2001:500:a8::ez2001:500:2f::fz2001:500:12::d0dz2001:500:1::53z2001:7fe::53z2001:503:c27::2:30z2001:7fd::1z2001:500:9f::42z2001:dc3::35z'DC=RootDNSServers,CN=MicrosoftDNS,%s,%s)r^   )r`   r{   dnsZoner|   ZZoneZcndNSPropertyr   )r=   r>   r8   DC=@,%sdnsNode	dnsRecordzDC=%s,%s)r%   r~   ro   appendr   rY   r   ZDNS_ZONE_TYPE_CACHEr_   ZDNS_ZONE_UPDATE_OFFra   rc   re   rg   rh   r   r   r   rH   ZDNS_RANK_ROOT_HINTr1   )
r(   r)   r   ZrootserversZrootservers_v6container_dnr   propsrecordZrserverr,   r,   r-   add_rootserversD  sn    
 
r   c                 C   s   d||f }g }t |d| }	|t|	 t|}
|t|
 |d ur`t|}|t| |d ur~t|}|t| tt| d| }ddg|d< t	|tj
d|d< | | d S )N%s.%szhostmaster.%sr   r{   r   r|   r   )rI   r   r   rH   r1   rF   r%   r~   ro   r   r   r   )r(   r   r   hostname	dnsdomainhostiphostip6fqdn_hostnameZ
at_recordsZat_soa_recordZat_ns_recordZat_a_recordZat_aaaa_recordr   r,   r,   r-   add_at_record  s     r   c                 C   sV   t ||}tt| d||f }ddg|d< tt|tjd|d< | | d S N%s,%sr{   r   r|   r   )rQ   r%   r~   ro   r   r   r   r   )r(   r   r   hostrU   Z
srv_recordr   r,   r,   r-   add_srv_record  s
    
r   c                 C   sT   t |}tt| d||f }ddg|d< tt|tjd|d< | | d S r   )rH   r%   r~   ro   r   r   r   r   r(   r   r   r   Z	ns_recordr   r,   r,   r-   add_ns_record  s
    r   c                 C   sZ   t |tjd}tt| d||f }ddg|d< tt|tjd|d< | 	| d S )N)r8   r   r{   r   r|   r   )
rH   r   ZDNS_RANK_NS_GLUEr%   r~   ro   r   r   r   r   r   r,   r,   r-   add_ns_glue_record  s
    r   c                 C   sT   t |}tt| d||f }ddg|d< tt|tjd|d< | | d S r   )rG   r%   r~   ro   r   r   r   r   )r(   r   r   r   Zcname_recordr   r,   r,   r-   add_cname_record  s
    r   c           	      C   s   g }|rt |}|t| |r8t|}|t| |rtt| d||f }ddg|d< t|tjd|d< | 	| d S r   )
r1   r   r   rF   r%   r~   ro   r   r   r   )	r(   r   r   r   r   Zhost_recordsZa_recordZaaaa_recordr   r,   r,   r-   add_host_record  s    r   c           
   	   C   s   d| }t j||}g }|tt  |tt  |tt  |ttdd |tt	dd |tt
  |tt  tt| d|||f }	ddg|	d< tt|tjd	|	d
< t|tjd|	d< | |	 d S )Na{  O:SYG:BAD:AI(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;DA)(A;;CC;;;AU)(A;;RPLCLORC;;;WD)(A;;RPWPCRCCDCLCLORCWOWDSDDTSW;;;SY)(A;CI;RPWPCRCCDCLCRCWOWDSDDTSW;;;ED)(A;CIID;RPWPCRCCDCLCRCWOWDSDDTSW;;;%s)(A;CIID;RPWPCRCCDCLCRCWOWDSDDTSW;;;ED)(OA;CIID;RPWPCR;91e647de-d96f-4b70-9557-d63ff4f3ccd8;;PS)(A;CIID;RPWPCRCCDCLCLORCWOWDSDDTSW;;;EA)(A;CIID;LC;;;RU)(A;CIID;RPWPCRCCLCLORCWOWDSDSW;;;BA)S:AI   )rd   )rf   DC=%s,CN=MicrosoftDNS,%s,%sr{   r   r|   r}   ZntSecurityDescriptorr   )r
   rv   Z	from_sddlr   r   rY   r_   ra   rc   re   rg   rh   r%   r~   ro   r   r   r   )
r(   r)   r   r   rq   r/   ZsddlZsecr   r   r,   r,   r-   add_domain_record  s*    
r   c              	   C   s6   t t | d|||f }ddg|d< | | d S )N"DC=_msdcs.%s,CN=MicrosoftDNS,%s,%sr{   r   r|   )r%   r~   ro   r   )r(   rr   r   	dnsforestr   r,   r,   r-   add_msdcs_record  s
    r   c           
      C   s`  d||f }t | d|||f }	t| |	d|||| t| |	d| || t| |	d|d t| |	d| |d t| |	d|d t| |	d	|d
 t| |	d|d
 t| |	d|d t| |	d| |d t| |	d|d t| |	d| |d t| |	d| t| |	d| |d t| |	d| |d t| |	d|d t| |	d|d t| |	d|| t| |	d|| d S )Nr   r   DC=@DC=%szDC=_kerberos._tcpX   zDC=_kerberos._tcp.%s._siteszDC=_kerberos._udpzDC=_kpasswd._tcpi  zDC=_kpasswd._udpzDC=_ldap._tcp  zDC=_ldap._tcp.%s._siteszDC=_gc._tcp  zDC=_gc._tcp.%s._sitesz	DC=_msdcsz&DC=_ldap._tcp.%s._sites.DomainDnsZonesz&DC=_ldap._tcp.%s._sites.ForestDnsZoneszDC=_ldap._tcp.DomainDnsZoneszDC=_ldap._tcp.ForestDnsZonesDC=DomainDnsZonesDC=ForestDnsZones)r%   ro   r   r   r   r   )
r(   r)   r   siter   r   r   r   r   Zdomain_container_dnr,   r,   r-   add_dc_domain_records  s|    
	


r   c
                 C   s   d||f }
t | d|||f }t| |d||d d  t| |d|
d t| |d| |
d t| |d|
d t| |d	| |
d t| |d
| |
d t| |d|
d t| |d|
d t| |d|| t| |d| |
d t| |d|	 |
 d S )Nr   r   r   zDC=_kerberos._tcp.dcr   zDC=_kerberos._tcp.%s._sites.dczDC=_ldap._tcp.dcr   zDC=_ldap._tcp.%s._sites.dczDC=_ldap._tcp.%s._sites.gcr   zDC=_ldap._tcp.gczDC=_ldap._tcp.pdczDC=gczDC=_ldap._tcp.%s.domainsr   )r%   ro   r   r   r   r   )r(   rr   r   r   r   r   r   r   r+   ntdsguidr   Zforest_container_dnr,   r,   r-   add_dc_msdcs_records_  sN    

r   c	           	      C   s   z,t t j|| t t j|| W n ty>   Y n0 |du rLd}t| td|||t|d	dt
||jd|j |j f d dS )zAdd DNS specific bits to a secrets database.

    :param secretsdb: Ldb Handle to the secrets database
    :param names: Names shortcut
    :param machinepass: Machine password
    Nr2   zsecrets_dns.ldifzutf-8ri   r   )REALM	DNSDOMAIN
DNS_KEYTABZDNSPASS_B64ZKEY_VERSION_NUMBERHOSTNAMEDNSNAME)osunlinkpathjoinOSErrorr   r   r   encoderm   r'   r   netbiosnamelowerr   )		secretsdbnamesprivate_dirbinddns_dirrealmr   dns_keytab_pathdnspasskey_version_numberr,   r,   r-   secretsdb_setup_dns  s$    
r   c                 C   s   t j|j}zt|d W n ty0   Y n0 t |d |jdurz t 	|d|j t 
|d W n0 ty   dt jvr| d||jf  Y n0 dS )zWrite out a DNS zone file, from the info in the current database.

    :param logger: Logger object
    :param paths: paths object
    T  NSAMBA_SELFTEST!Failed to chown %s to bind gid %u)r   r   dirnamednsshutilZrmtreer   mkdirbind_gidchownchmodenvironerror)loggerpathsdns_dirr,   r,   r-   create_dns_dir  s    

r   c                 C   s  t |	tsJ |dur4d| }|d | }d| }nd}d}d}|durfd| }|d | }d| }nd}d}d}ttd	|j||||||	td
||
||||d |jdurz$t	|jd|j t
|jd W n6 ty   dtjvr|d|j|jf  Y n0 dS )a  Write out a DNS zone file, from the info in the current database.

    :param paths: paths object
    :param dnsdomain: DNS Domain name
    :param domaindn: DN of the Domain
    :param hostip: Local IPv4 IP
    :param hostip6: Local IPv6 IP
    :param hostname: Local hostname
    :param realm: Realm name
    :param domainguid: GUID of the domain.
    :param ntdsguid: GUID of the hosts nTDSDSA record.
    Nz            IN AAAA    z        IN AAAA    z#gc._msdcs               IN AAAA     z            IN A    z        IN A    z gc._msdcs               IN A    zprovision.zonez%Y%m%d%H)r   r   r   ZHOSTIP_BASE_LINEZHOSTIP_HOST_LINE
DOMAINGUIDZ
DATESTRINGZDEFAULTSITEZNTDSGUIDZHOSTIP6_BASE_LINEZHOSTIP6_HOST_LINEZGC_MSDCS_IP_LINEZGC_MSDCS_IP6_LINEr   i  r   r   )
isinstancer'   r   r   r   timestrftimer   r   r   r   r   r   r   )lpr   r   	targetdirr   r   r   r   r   r+   r   r   Zhostip6_base_lineZhostip6_host_lineZgc_msdcs_ip6_lineZhostip_base_lineZhostip_host_lineZgc_msdcs_ip_liner,   r,   r-   create_zone_file  sN    

r   c           $      C   s*  |j }tj|d}tj|j}tj|d}	i }
| jdtjddgd}|d d D ]"}t	|
d\}}||
| < qVt }d|d v rt	|d d d }|j }tj||
| }zt|	 t|d  d	||f }t|}| jd
tjd}||d  d| }tt|d}t|td|j|t	||d t|tdd W n   |d  Y n0 |
|= d|j  }d|j  }|
| }|
|}d}zttj||tj|	| ttj||tj|| |dkrttj||d tj||d  |rtttj||tj|| |dkrtttj||d tj||d  W n  ty   |d  Y n0 |
|= |r|
|= z~ttj|dtj|d |
D ]V}|
| }|dkrttj||tj|| nttj||tj|| qW n   |d  Y n0 |j durzt!|D ]\}}}|D ]0} tj|| }!t"|!d|j  t#|!d qh|D ]<}"|"$drtj||"}#t"|#d|j  t#|#d qqZW n* ty   dtj%vr|d Y n0 ndtj%vr&|&d dS ) zRCreate a copy of samdb and give write permissions to named for dns partitions
    z	sam.ldb.dz
@PARTITION	partitionZbackendStorer    r   :wz%s://%sz
@INDEXLIST)r!   r"   zobjectGUID: %s
-ri   zprovision_basedn.ldif)rx   r   Z	DOMAINSIDZ
DESCRIPTORzprovision_basedn_options.ldifNz>Failed to setup database for BIND, AD based DNS cannot be usedzDC=DOMAINDNSZONES,%szDC=FORESTDNSZONES,%szmetadata.tdbZmdbz-lockzsam.ldbr   r   )z.ldbz.tdbzldb-locki  r   z9Failed to set permissions to sam.ldb* files, fix manuallyz\Unable to find group id for BIND,
                set permissions to sam.ldb* files manually)'r   r   r   r   r   r   r$   r%   r&   r'   splitupperr   r)   r   openclosesambaZLdbr   r   r   rm   r   r   r   Zrootdngetlinkr   r   r   r   walkr   r   endswithr   warning)$r(   r   r   r   rq   r+   r   Z
samldb_dirr   Zdns_samldb_dirZpartfiler*   tmpZncfnamebackend_storer)   Zdomainpart_fileZdom_urlZdom_ldbZ	index_resZdomainguid_lineZdescrZdomainzonednZforestzonednZdomainzone_fileZforestzone_fileZmetadata_fileZpfiler   dirsfilesdZdpathfZfpathr,   r,   r-   create_samdb_copy  s    



	



r   c                 C   s(   t td|jd t td|jd dS )z Write out a dns_update_list filedns_update_listNspn_update_list)r   r   r   r   )r   r   r   r,   r,   r-   create_dns_update_list  s    r   c                 C   s&  ddl m} |dkrfttd| j||| jdd|ddd  | j| jd	 ttd
| j n|dkr"t	j
dgdt	jt	jdd d }t|}d}d}d}	d}
d}d}d}| ddkrd}n$| ddkrd}n
| ddkrd}	n| ddkrd}
n| ddkr8d}n| ddkrRd}n| ddkrld}n| ddkr|dnj| ddkr|dnL| ddkr|dn.| ddkr|dn|d| j  ttd | j| jtj |||	|
|||d!	 dS )"ac  Write out a file containing zone statements suitable for inclusion in a
    named.conf file (including GSS-TSIG configuration).

    :param paths: all paths
    :param realm: Realm name
    :param dnsdomain: DNS Domain name
    :param dns_backend: DNS backend type
    :param keytab_name: File name of DNS keytab file
    :param logger: Logger object
    r   )ProvisioningErrorBIND9_FLATFILEz
named.confz*..r2   N)r   r   Z	ZONE_FILEZREALM_WC
NAMED_CONFZNAMED_CONF_UPDATEznamed.conf.update	BIND9_DLZznamed -VT)shellstdoutstderrcwd#zBIND 9.8r   r   zBIND 9.9z	BIND 9.10z	BIND 9.11z	BIND 9.12z	BIND 9.14z	BIND 9.16zBIND 9.7z&DLZ option incompatible with BIND 9.7.z	BIND_9.13z/Only stable/esv releases of BIND are supported.z	BIND_9.15z	BIND_9.17z0BIND version unknown, please modify %s manually.znamed.conf.dlz)	r   Z
MODULESDIRZBIND9_8ZBIND9_9ZBIND9_10ZBIND9_11ZBIND9_12ZBIND9_14ZBIND9_16)Zsamba.provisionr   r   r   	namedconfr   r   r   Znamedconf_update
subprocessPopenPIPEZSTDOUTZcommunicater   r   findr   r   ZparamZmodules_dir)r   r   r   dns_backendr   r   Z	bind_infoZbind9_8Zbind9_9Zbind9_10Zbind9_11Zbind9_12Zbind9_14Zbind9_16r,   r,   r-   create_named_conf  sz    	





r  c                 C   s,   t td| ||||tj|||d dS )ab  Write out a file containing zone statements suitable for inclusion in a
    named.conf file (including GSS-TSIG configuration).

    :param path: Path of the new named.conf file.
    :param realm: Realm name
    :param dnsdomain: DNS Domain name
    :param binddns_dir: Path to bind dns directory
    :param keytab_name: File name of DNS keytab file
    z	named.txt)r   r   r   r   ZDNS_KEYTAB_ABSZPRIVATE_DIRN)r   r   r   r   r   )r   r   r   dnsnamer   keytab_namer,   r,   r-   create_named_txt  s    
r  c                 C   s   | dv S )N)r   r   SAMBA_INTERNALNONEr,   )r  r,   r,   r-   is_valid_dns_backend  s    r  c                 C   s   t |   kotkS   S r4   )r   r   )os_levelr,   r,   r-   is_valid_os_level  s    r  c                 C   s    t | |d|| t| |d d S Nz	CN=System)r   r   )r(   rq   rr   r/   r,   r,   r-   create_dns_legacy	  s    r  c	           	   	   C   s,   t | |d||| t| |d||||| d S r  )r   r   )	r(   rq   rr   r   r   r   r   r   r/   r,   r,   r-   fill_dns_data_legacy  s    r  c                 C   sH   t | ||||j|j| t| |d|| |tkrDt| |d||dd d S )Nr   r   T)r   )rw   rs   rt   r   r   )r(   rq   r   r)   rr   r/   ru   r,   r,   r-   create_dns_partitions  s    



r  Tc                 C   st   |rt | |d t| |d||| |r<t| |d|||||	 |tkrpt| |d| |rpt| |d|||||	|
|
 dS )a  Fill data in various AD partitions

    :param samdb: LDB object connected to sam.ldb file
    :param domainsid: Domain SID (as dom_sid object)
    :param site: Site name to create hostnames in
    :param domaindn: DN of the domain
    :param forestdn: DN of the forest
    :param dnsdomain: DNS name of the domain
    :param dnsforest: DNS name of the forest
    :param hostname: Host name of this DC
    :param hostip: IPv4 addresses
    :param hostip6: IPv6 addresses
    :param domainguid: Domain GUID
    :param ntdsguid: NTDS GUID
    :param dnsadmins_sid: SID for DnsAdmins group
    :param autofill: Create DNS records (using fixed template)
    r   r   N)r   r   r   r   r   r   )r(   rq   r   r)   rr   r   r   r   r   r   r+   r   r/   Zautofillru   Zadd_rootr,   r,   r-   fill_dns_data_partitions)  s     


r  c                 C   s  t |std| t|s(td| |dkr>|d dS |d t| |j |j}|   }|j	 }|}|j
}|j	 }t| |}t| |}|   z|d|  t| |j|| |tkr|d|  t| |j|||||	|
|	 nf|d	v rX|tkrX|d
 t| |j||||| |d t| |j|||||||	|
||j||d W n   |    Y n
0 |   |drt| ||||||||||	|
||d dS )aW  Provision DNS information (assuming GC role)

    :param samdb: LDB object connected to sam.ldb file
    :param secretsdb: LDB object connected to secrets.ldb file
    :param names: Names shortcut
    :param paths: Paths shortcut
    :param lp: Loadparm object
    :param logger: Logger object
    :param dns_backend: Type of DNS backend
    :param os_level: Functional level (treated as os level)
    :param dnspass: Password for bind's DNS account
    :param hostip: IPv4 address
    :param hostip6: IPv6 address
    :param targetdir: Target directory for creating DNS-related files for BIND9
    Invalid dns backend: %rInvalid os level: %rr  z'No DNS backend set, not configuring DNSNzAdding DNS accountsz%Creating CN=MicrosoftDNS,CN=System,%sz'Populating CN=MicrosoftDNS,CN=System,%s)r  r   z5Creating DomainDnsZones and ForestDnsZones partitionsz7Populating DomainDnsZones and ForestDnsZones partitions)ru   BIND9_)r   r   r   r   r   r   )r  	Exceptionr  infory   r)   Zget_root_basednZget_linearizedr   r   Zsitenamer   r0   r.   Ztransaction_startr  rq   r   r  r   r  r  r   Ztransaction_cancelZtransaction_commit
startswithsetup_bind9_dns)r(   r   r   r   r   r   r  r  r   r   r   r   ru   r   r)   rr   r   r   r   r   r/   r+   r,   r,   r-   setup_ad_dnsY  sb    











r  c                 C   s$  t |r|dstd| t|s2td| |j}t| |}t|||j|j|j	|j
|j|	|d	 t|| |dkrt||||||j
|
||j|j	||jd |dkr|tkrt| ||||j| t||j	|j
||d t|j|j	|j
d	|j|j
f |j|jd
 |d|j |d|j dS )a  Provision DNS information (assuming BIND9 backend in DC role)

    :param samdb: LDB object connected to sam.ldb file
    :param secretsdb: LDB object connected to secrets.ldb file
    :param names: Names shortcut
    :param paths: Paths shortcut
    :param lp: Loadparm object
    :param logger: Logger object
    :param dns_backend: Type of DNS backend
    :param os_level: Functional level (treated as os level)
    :param site: Site to create hostnames in
    :param dnspass: Password for bind's DNS account
    :param hostip: IPv4 address
    :param hostip6: IPv6 address
    :param targetdir: Target directory for creating DNS-related files for BIND9
    r  r  r  )r   r   r   r   r   r   )r   r   r   r   r   r   r+   r   r   )r   r   r  r   r   )r   r   r	  r   r
  z9See %s for an example configuration include file for BINDz@and %s for further documentation required for secure DNS updatesN)r  r  r  r  r)   r.   r   r   r   r   r   Z
dns_keytabr   r   r   r   r   r   rq   r  r  Znamedtxtr  r  )r(   r   r   r   r   r   r  r  r   r   r   r   r   r   r   r)   r+   r,   r,   r-   r    sX    

r  )F)NNNNNNN)___doc__r   rn   r   r   r%   base64r   r  r   Zsamba.tdb_utilr   Zsamba.mdb_utilr   Z	samba.ndrr   r   r   Zsamba.dcerpcr   r	   r
   Z
samba.dsdbr   r   r   r   r   Zsamba.descriptorr   r   r   r   r   r   Zsamba.provision.commonr   r   r   r   r   r   r   r   Zsamba.samdbr   Zsamba.compatr   r.   r0   ZDnssrvRpcRecordr1   rF   rG   rH   rI   rQ   rV   ZDnsPropertyrY   r_   ra   rc   re   rg   rh   rw   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r,   r,   r,   r-   <module>   s    (






:
G"]5> 	Q
1
f   