
    de                     D   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mZ dd
lmZ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l0m1Z1 d Z2d Z3 G d dejh                        Z5 G d dejh                        Z6 G d dejh                        Z7 G d dejh                        Z8 G d dejh                        Z9 G d dejh                        Z: G d dejh                        Z; G d dejx                        Z= G d  d!ejx                        Z> G d" d#ejx                        Z? G d$ d%ejx                        Z@ G d& d'ejx                        ZA G d( d)ejx                        ZB G d* d+ejx                        ZCd, ZDd- ZEdKd.ZFd/ ZGd0 ZHd1 ZId2 ZJd3 ZKd4 ZLd5 ZMd6 ZNd7 ZOd8 ZPd9 ZQd: ZRd; ZSd< ZTd= ZUd> ZVd? ZWd@ ZXdA ZYdB ZZdC Z[dD Z\dE Z]dF Z^dGe*dGfdHZ_dddde*dfdIZ`	 	 	 dLdJZay)Mz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DS_GUID_USERS_CONTAINER)get_deletedobjects_descriptor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                     | j                  |t        j                  dg      }t        t	        t
        j                  |d   d   d               }|S )N
objectGUIDbasescopeattrsr   )searchldb
SCOPE_BASEstrr   r
   GUID)samdbdomaindnres
domainguids       :/usr/lib/python3/dist-packages/samba/provision/sambadns.pyget_domainguidr3   C   sE    
,,HCNN<.,
QCZ		3q6,+?+BCDJ    c                     d| j                  t        j                  | |      t              z  }| j	                  |t        j
                  dg      }t        t        j                  |d   d   d         }|S )NzCN=DnsAdmins,%s	objectSidr%   r   )	get_wellknown_dnr*   Dnr   r)   r+   r   r   dom_sid)r.   r/   base_dnr0   dnsadmins_sids        r2   get_dnsadmins_sidr<   I   sn    %"8"8,4:67N#P PG
,,G3>>+,
OCx//Q1DQ1GHMr4   c                   :     e Zd Zddej                  f fd	Z xZS )ARecord     c                     t         t        |           t        j                  | _        || _        || _        || _        || _	        y N)
superr>   __init__r	   
DNS_TYPE_AwTyperankdwSerialdwTtlSecondsdata)selfip_addrserialttlrG   	__class__s        r2   rD   zARecord.__init__\   s8    gt%'__
		r4   __name__
__module____qualname__r	   DNS_RANK_ZONErD   __classcell__rO   s   @r2   r>   r>   Z   s    '(c8J8J  r4   r>   c                   :     e Zd Zddej                  f fd	Z xZS )
AAAARecordr?   r@   c                     t         t        |           t        j                  | _        || _        || _        || _        || _	        y rB   )
rC   rX   rD   r	   DNS_TYPE_AAAArF   rG   rH   rI   rJ   )rK   ip6_addrrM   rN   rG   rO   s        r2   rD   zAAAARecord.__init__g   s:    j$(*''
		r4   rP   rV   s   @r2   rX   rX   e   s    ()s9K9K  r4   rX   c                   :     e Zd Zddej                  f fd	Z xZS )CNAMERecordr?   r@   c                     t         |           t        j                  | _        || _        || _        || _        || _        y rB   )	rC   rD   r	   DNS_TYPE_CNAMErF   rG   rH   rI   rJ   )rK   cnamerM   rN   rG   rO   s        r2   rD   zCNAMERecord.__init__r   s8    ((
		r4   rP   rV   s   @r2   r]   r]   p   s    %&Cd6H6H  r4   r]   c                   :     e Zd Zddej                  f fd	Z xZS )NSRecordr?   r@   c                     t         t        |           t        j                  | _        || _        || _        || _        || _	        y rB   )
rC   rb   rD   r	   DNS_TYPE_NSrF   rG   rH   rI   rJ   )rK   
dns_serverrM   rN   rG   rO   s        r2   rD   zNSRecord.__init__}   s:    h&(%%
		r4   rP   rV   s   @r2   rb   rb   {   s    *+4;M;M  r4   rb   c                   B     e Zd Zddddddej                  f fd	Z xZS )	SOARecordr?   r@   iX  iQ i  c
                    t         t        |           t        j                  | _        |	| _        || _        || _        t        j                         }
||
_
        ||
_        ||
_        ||
_        ||
_        ||
_        ||
_        |
| _        y rB   )rC   rg   rD   r	   DNS_TYPE_SOArF   rG   rH   rI   soarM   refreshretryexpiremnamernameminimumrJ   )rK   rn   ro   rM   rk   rl   rm   rp   rN   rG   rj   rO   s              r2   rD   zSOARecord.__init__   sv    i')&&
	hhj
	
			r4   rP   rV   s   @r2   rg   rg      s#    ,-s#tD<N<N r4   rg   c                   >     e Zd Zddddej                  f fd	Z xZS )	SRVRecordr   d   r?   r@   c                     t         t        |           t        j                  | _        || _        || _        || _        t        j                         }||_
        ||_        ||_        ||_        || _        y rB   )rC   rr   rD   r	   DNS_TYPE_SRVrF   rG   rH   rI   srv
nameTargetwPort	wPrioritywWeightrJ   )
rK   targetportpriorityweightrM   rN   rG   rv   rO   s
            r2   rD   zSRVRecord.__init__   sa    i')&&
	hhj	 	r4   rP   rV   s   @r2   rr   rr      s    ./A3(( r4   rr   c                   :     e Zd Zddej                  f fd	Z xZS )	TXTRecordr?   r@   c                     t         t        |           t        j                  | _        || _        || _        || _        t        j                         }t        |      |_        ||_        || _        y rB   )rC   r   rD   r	   DNS_TYPE_TXTrF   rG   rH   rI   string_listlencountr,   rJ   )rK   slistrM   rN   rG   
stringlistrO   s         r2   rD   zTXTRecord.__init__   s[    i')&&
	%%'
u:

	r4   rP   rV   s   @r2   r   r      s    %&Cd6H6H 	 	r4   r   c                   6     e Zd Zej                  f fd	Z xZS )TypePropertyc                 ~    t         t        |           d| _        d| _        t
        j                  | _        || _        y Nr?   )	rC   r   rD   wDataLengthversionr	   DSPROPERTY_ZONE_TYPEidrJ   )rK   	zone_typerO   s     r2   rD   zTypeProperty.__init__   s3    lD*,++	r4   )rQ   rR   rS   r	   DNS_ZONE_TYPE_PRIMARYrD   rU   rV   s   @r2   r   r      s    !%!;!;  r4   r   c                   6     e Zd Zej                  f fd	Z xZS )AllowUpdatePropertyc                 ~    t         t        |           d| _        d| _        t
        j                  | _        || _        y r   )	rC   r   rD   r   r   r	   DSPROPERTY_ZONE_ALLOW_UPDATEr   rJ   )rK   allow_updaterO   s     r2   rD   zAllowUpdateProperty.__init__   s4    !41333 	r4   )rQ   rR   rS   r	   DNS_ZONE_UPDATE_SECURErD   rU   rV   s   @r2   r   r      s    $($?$? ! !r4   r   c                         e Zd Zd fd	Z xZS )SecureTimePropertyc                 ~    t         t        |           d| _        d| _        t
        j                  | _        || _        y r   )	rC   r   rD   r   r   r	   DSPROPERTY_ZONE_SECURE_TIMEr   rJ   )rK   secure_timerO   s     r2   rD   zSecureTimeProperty.__init__   s4     $0222	r4   r   rQ   rR   rS   rD   rU   rV   s   @r2   r   r      s       r4   r   c                         e Zd Zd fd	Z xZS )NorefreshIntervalPropertyc                 ~    t         t        |           d| _        d| _        t
        j                  | _        || _        y r   )	rC   r   rD   r   r   r	   "DSPROPERTY_ZONE_NOREFRESH_INTERVALr   rJ   )rK   norefresh_intervalrO   s     r2   rD   z"NorefreshIntervalProperty.__init__   s4    '7999&	r4   r   r   rV   s   @r2   r   r      s    ' 'r4   r   c                         e Zd Zd fd	Z xZS )RefreshIntervalPropertyc                 ~    t         t        |           d| _        d| _        t
        j                  | _        || _        y r   )	rC   r   rD   r   r   r	    DSPROPERTY_ZONE_REFRESH_INTERVALr   rJ   )rK   refresh_intervalrO   s     r2   rD   z RefreshIntervalProperty.__init__   s4    %t5777$	r4   r   r   rV   s   @r2   r   r          % %r4   r   c                         e Zd Zd fd	Z xZS )AgingStatePropertyc                 ~    t         t        |           d| _        d| _        t
        j                  | _        || _        y r   )	rC   r   rD   r   r   r	   DSPROPERTY_ZONE_AGING_STATEr   rJ   )rK   aging_enabledrO   s     r2   rD   zAgingStateProperty.__init__   s4     $0222!	r4   r   r   rV   s   @r2   r   r      s    " "r4   r   c                         e Zd Zd fd	Z xZS )AgingEnabledTimePropertyc                 ~    t         t        |           d| _        d| _        t
        j                  | _        || _        y r   )	rC   r   rD   r   r   r	   "DSPROPERTY_ZONE_AGING_ENABLED_TIMEr   rJ   )rK   next_cycle_hoursrO   s     r2   rD   z!AgingEnabledTimeProperty.__init__   s4    &6899$	r4   r   r   rV   s   @r2   r   r      r   r4   r   c                    d|z  }d|z  }t        |      }	t        |      }
t        | t        d      |t	        |	      j                  d      d       |t        k7  r1t        | t        d      |t	        |	      j                  d      d       t        t        j                               }t        j                  | |      j                         j                         }t        |      }t        |      }t        | t        d      |||||t	        |
      j                  d      t	        |      j                  d      t	        |      j                  d      d       t!        | t        d      |||d	       |t        k7  rt        t        j                               }t        j                  | |      j                         j                         }t        | t        d      |||||t	        |
      j                  d      t	        |      j                  d      t	        |      j                  d      d       t!        | t        d      |||d	       y y )
NzDC=DomainDnsZones,%szDC=ForestDnsZones,%sz"provision_dnszones_partitions.ldifutf8)ZONE_DNSECDESCzprovision_dnszones_add.ldif)r   	ZONE_GUIDZONE_DNSCONFIGDNSERVERDNDELETEDOBJECTS_DESCRIPTORLOSTANDFOUND_DESCRIPTORINFRASTRUCTURE_DESCRIPTORzprovision_dnszones_modify.ldif)r   r   r   )r   r   r   r   r   decoder   r,   uuiduuid4r*   r8   canonical_ex_strstripr   r   r   )r.   	domainsidr/   forestdnconfigdnserverdn
fill_leveldomainzone_dnforestzone_dn
descriptordeletedobjects_descdomainzone_guiddomainzone_dnsprotected1_descprotected2_descforestzone_guidforestzone_dnss                    r2   setup_dns_partitionsr      s"   *X5M*X5M-i8J7	B5*%IJ Z(//7M  ^#uj)MN$ ,33F;Q
 	
 $**,'OVVE=1BBDJJLN=iHO=iHO5*%BC $"%./B%C%J%J6%R#,_#=#D#DV#L%.%?%F%Fv%N	F 	 eZ(HI L  ^#djjl+}5FFHNNPuj)FG$(&  )23F)G)N)Nv)V'0'A'H'H'P)2?)C)J)J6)R	J
 		 	%,L!M  $P
 	 $r4   c                 4    t        | t        d      d|i       y )Nzprovision_dns_accounts_add.ldifDOMAINDN)r   r   )r.   r/   s     r2   add_dns_accountsr   :  s    5*%FGHJ r4   c           	      :   dt        |      i}|du rt        ||      }nt        ||      }t        j                  t        j
                  | d|d|            }ddg|d<   t        j                  |t        j                  d	      |d	<   | j                  |       y )
N	DnsAdminsT)name_mapzCN=MicrosoftDNS,,top	containerobjectClassnTSecurityDescriptor)	r,   r   r   r*   Messager8   MessageElementFLAG_MOD_ADDadd)	r.   r/   prefix
domain_sidr;   forestr   sd_valmsgs	            r2   add_dns_containerr   @  s    S/0H~8BJL 9BJL ++cffUvx$PQ
RC-C63#3#31	3  
IIcNr4   c                    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(|d)|}t        j                  t        j                  | |            }g }|j                  t	        t        t        j                  *                   |j                  t	        t        t        j                  +                   |j                  t	        t                            |j                  t	        t                            |j                  t	        t                            |j                  t	        t                            |j                  t	        t                            d,d-g|d.<   t        j                  d/t         j                   d0      |d0<   t        j                  |t         j                   d1      |d1<   | j#                  |       g }|D ]7  }	|j                  t	        t%        |	d2d2t        j&                  3                   9 t        j                  t        j                  | d4|z              }d,d5g|d.<   t        j                  |t         j                   d6      |d6<   | j#                  |       |D ]  }	t	        t)        ||	   d2d2t        j&                  3            g}t        j                  t        j                  | d7|	d)|            }d,d5g|d.<   t        j                  |t         j                   d6      |d6<   | j#                  |        y )8Nz
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,r   )r   )r   r   dnsZoner   ZonecndNSPropertyr   )rM   rN   rG   DC=@,%sdnsNode	dnsRecordDC=)r*   r   r8   appendr   r   r	   DNS_ZONE_TYPE_CACHEr   DNS_ZONE_UPDATE_OFFr   r   r   r   r   r   r   r   rb   DNS_RANK_ROOT_HINTr>   )
r.   r/   r   rootserversrootservers_v6container_dnr   propsrecordrservers
             r2   add_rootserversr   Q  sm   K(4K$%(8K$%(5K$%(5K$%(8K$%(5K$%(6K$%(7K$%(7K$%(7K$%(6K$%(5K$%(6K$%N+@N'(+;N'(+:N'(+;N'(+;N'(+;N'(+=N'(+;N'(+9N'(+?N'(+8N'(+<N'(+9N'(@FQL ++cffUL1
2CE	LL,1I1IJKL	LL-4;S;STUV	LL,./0	LL3567	LL1345	LL,./0	LL2456+C""63+;+;TBCI++E33C3C]SC	IIcN F bhxqtG^G^_`ab ++cffUI$<=
>C+C))&#2B2BKPC	IIcN  7;w#7qtOfOfghi kk#&&g|(LMN#Y/M--fc6F6FTK		#r4   c                 &   |d|}g }t        |d|z        }	|j                  t        |	             t        |      }
|j                  t        |
             |%t	        |      }|j                  t        |             |%t        |      }|j                  t        |             t        j                  t        j                  | d|z              }ddg|d<   t        j                  |t        j                  d      |d<   | j                  |       y )N.zhostmaster.%sr   r   r   r   r   )rg   r   r   rb   r>   rX   r*   r   r8   r   r   r   )r.   r   r   hostname	dnsdomainhostiphostip6fqdn_hostname
at_recordsat_soa_recordat_ns_recordat_a_recordat_aaaa_recordr   s                 r2   add_at_recordr	    s    '3MJ m_y-HIMh}-. M*Lh|,-fo(;/0#G,(>23
++cffUI$<=
>C+C))*c6F6FTC	IIcNr4   c                 
   t        ||      }t        j                  t        j                  | |d|            }ddg|d<   t        j                  t        |      t        j                  d      |d<   | j                  |       y Nr   r   r   r   r   )rr   r*   r   r8   r   r   r   r   )r.   r   r   hostr|   
srv_recordr   s          r2   add_srv_recordr    sk    4&J
++cffUv|$DE
FC+C))(:*>@P@PR]^C	IIcNr4   c                    t        |      }t        j                  t        j                  | |d|            }ddg|d<   t        j                  t        |      t        j                  d      |d<   | j                  |       y r  )rb   r*   r   r8   r   r   r   r   r.   r   r   r  	ns_recordr   s         r2   add_ns_recordr    sh    I
++cffUv|$DE
FC+C))(9*=s?O?OQ\]C	IIcNr4   c                 (   t        |t        j                        }t        j                  t        j
                  | |d|            }ddg|d<   t        j                  t        |      t        j                  d      |d<   | j                  |       y )N)rG   r   r   r   r   r   )
rb   r	   DNS_RANK_NS_GLUEr*   r   r8   r   r   r   r   r  s         r2   add_ns_glue_recordr    sq    D$9$9:I
++cffUv|$DE
FC+C))(9*=s?O?OQ\]C	IIcNr4   c                    t        |      }t        j                  t        j                  | |d|            }ddg|d<   t        j                  t        |      t        j                  d      |d<   | j                  |       y r  )r]   r*   r   r8   r   r   r   r   )r.   r   r   r  cname_recordr   s         r2   add_cname_recordr    si    t$L
++cffUv|$DE
FC+C))(<*@#BRBRT_`C	IIcNr4   c                    g }|r%t        |      }|j                  t        |             |r%t        |      }|j                  t        |             |rot	        j
                  t	        j                  | |d|            }ddg|d<   t	        j                  |t        j                  d      |d<   | j                  |       y y r  )
r>   r   r   rX   r*   r   r8   r   r   r   )	r.   r   r   r  r  host_recordsa_recordaaaa_recordr   s	            r2   add_host_recordr    s    L6?HX./ )H[12kk#&&6<(HIJ#Y/M--lC<L<LkZK		#	 r4   c                 |   d|z  }t         j                  j                  ||      }g }|j                  t	        t                            |j                  t	        t                            |j                  t	        t                            |j                  t	        t        d                   |j                  t	        t        d                   |j                  t	        t                            |j                  t	        t                            t        j                  t        j                  | d|d|d|            }	dd	g|	d
<   t        j                  t	        |      t        j                   d      |	d<   t        j                  |t        j                   d      |	d<   | j#                  |	       y )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   )r   )r   r   ,CN=MicrosoftDNS,r   r   r   r   r   ntSecurityDescriptorr   )r   r   	from_sddlr   r   r   r   r   r   r   r   r   r*   r   r8   r   r   r   )
r.   r/   r   r   r   r;   sddlsecr   r   s
             r2   add_domain_recordr%    sO    D 


'
'i
8CE	LL,.)*	LL-/01	LL,./0	LL3sKLM	LL13GHI	LL,./0	LL2456
++cffUYPVX`$ab
cC+C8C=++1	3  ++E33C3C]SC	IIcNr4   c                     t        j                  t        j                  | d|d|d|            }ddg|d<   | j                  |       y )N
DC=_msdcs.r   r   r   r   r   )r*   r   r8   r   )r.   r   r   	dnsforestr   s        r2   add_msdcs_recordr)    sF    
++cffU%.%B C DC+C	IIcNr4   c           	         |d|}t        j                  | d|d|d|      }	t        | |	d||||       t        | |	d|z  ||       t	        | |	d|d       t	        | |	d	|z  |d       t	        | |	d
|d       t	        | |	d|d       t	        | |	d|d       t	        | |	d|d       t	        | |	d|z  |d       t	        | |	d|d       t	        | |	d|z  |d       t        | |	d|       t	        | |	d|z  |d       t	        | |	d|z  |d       t	        | |	d|d       t	        | |	d|d       t        | |	d||       t        | |	d||       y )Nr   r   r   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*   r8   r	  r  r  r  )
r.   r/   r   siter   r   r  r  r  domain_container_dns
             r2   add_dc_domain_recordsr4    s     (3M &&"+VX)? @ %,fh	'# E.(0BF 5-/B "& 5-/L0&, 5-/B "& 5-/A #' 5-/A #' 5- 5-/H0&- 5-}m 5-/F/M $( u1;N 5-;dBM
 5-;dBM
 5-/M #' 5-/M #' E.0CV E.0CVr4   c
           	         |d|}
t        j                  | d|d|d|      }t        | |d||d d        t        | |d|
d       t        | |d|z  |
d       t        | |d	|
d
       t        | |d|z  |
d
       t        | |d|z  |
d       t        | |d|
d       t        | |d|
d
       t	        | |d||       t        | |d|z  |
d
       t        | |d|	z  |
       y )Nr   r'  r   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*   r8   r	  r  r  r  )r.   r   r   r2  r(  r   r  r  r1   ntdsguidr  forest_container_dns               r2   add_dc_msdcs_recordsr8  l  sF     (3M &&"+VX)? @ %,fh	 5-/E "& 5-3d:M2O 5-/A #' 5-/K0&- 5-/K0&. 5-/A $( 5-/B #' E.I 5--
:M3P U/81C"$r4   c	                    	 t        j                  t         j                  j                  ||             t        j                  t         j                  j                  ||             |d}t        | t        d      |||t        |j                  d            j                  d      t        |      |j                  |j                  j                         d|j                  j                         d       y# t        $ r Y w xY w)zAdd DNS specific bits to a secrets database.

    :param secretsdb: Ldb Handle to the secrets database
    :param names: Names shortcut
    :param machinepass: Machine password
    Nr?   zsecrets_dns.ldifzutf-8r   r   )REALM	DNSDOMAIN
DNS_KEYTABDNSPASS_B64KEY_VERSION_NUMBERHOSTNAMEDNSNAME)osunlinkpathjoinOSErrorr   r   r   encoder   r,   r   netbiosnamelowerr   )		secretsdbnamesprivate_dirbinddns_dirrealmr   dns_keytab_pathdnspasskey_version_numbers	            r2   secretsdb_setup_dnsrQ    s    
		"'',,{O<=
		"'',,{O<= ! i$67")$W^^G%<=DDVL"%&8"9!!'')5??+@+@+BD	: 	  s   A&C: :	DDc                    t         j                  j                  |j                        }	 t	        j
                  |d       t        j                  |d       |j                  9	 t        j                  |d|j                         t        j                  |d       yy# t        $ r Y gw xY w# t        $ r7 dt         j                  vr"| j                  d||j                  fz         Y yY yw xY w)zx(Re)create the DNS directory and chown it to bind.

    :param logger: Logger object
    :param paths: paths object
    T  NSAMBA_SELFTEST!Failed to chown %s to bind gid %u)rA  rC  dirnamednsshutilrmtreerE  mkdirbind_gidchownchmodenvironerror)loggerpathsdns_dirs      r2   create_dns_dirrd    s     ggooeii(Ggt$ HHWe~~!	.HHWb%..1HHWe$	 "    	.rzz1@U^^D- - . 2	.s#   B $7B, 	B)(B),;C,+C,c           	         t         j                  j                  |j                  |j                        }t         j                  j                  |j
                  |j                        }t         j                  j                  |      rt         j                  j                  |      r	 t        j                  |       	 t        j                  ||       |j                  	 t        j                  |j
                  d       t        j                  |j
                  d|j                         	 t        j                  |d
       t        j                  |d|j                         yyy# t        $ r+}| j                  d|d|j                         Y d}~d}~ww xY w# t        $ r.}| j                  d|d|d|j                         Y d}~d}~ww xY w# t        $ r< dt         j                  vr'| j!                  d	|j
                  |j                         Y w xY w# t        $ r4 dt         j                  vr| j!                  d	||j                         Y yY yw xY w)zhCreate link for BIND to DNS keytab

    :param logger: Logger object
    :param paths: paths object
    zFailed to remove z: NzFailed to create link z -> rS  rT  rU  rV  i  )rA  rC  rD  rK  
dns_keytabrL  isfilerB  rE  r`  strerrorlinkr\  r^  r]  r_  info)ra  rb  private_dns_keytab_pathbind_dns_keytab_pathes        r2   create_dns_dir_keytab_linkrn    s    !ggll5+<+<e>N>NO77<<(9(95;K;KL	ww~~-.77>>./A		./	VGG+-AB >>%C**E2**B?
F-u5-r5>>B &! /  A2AJJ@ A AA  	VLL13GU V V	V  C#2::5KK C % 1 15>>CC  F#2::5KK C 4ennF 6FsV   (E' >F !AG -7H  '	F0!FF	G'$GGAHH 8IIc                 b   t        |	t              sJ |d|z   }|dz   |z   }d|z   }nd}d}d}|d|z   }|dz   |z   }d|z   }nd}d}d}t        t        d	      |j                  ||||||	t        j                  d
      ||
||||d       |j                  M	 t        j                  |j                  d|j                         t        j                  |j                  d       yy# t        $ rA dt        j                  vr,|j                  d|j                  |j                  fz         Y yY yw xY w)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:  HOSTIP_BASE_LINEHOSTIP_HOST_LINE
DOMAINGUID
DATESTRINGDEFAULTSITENTDSGUIDHOSTIP6_BASE_LINEHOSTIP6_HOST_LINEGC_MSDCS_IP_LINEGC_MSDCS_IP6_LINErT  i  rU  rV  )
isinstancer,   r   r   rX  timestrftimer\  rA  r]  r^  rE  r_  r`  )lpra  rb  	targetdirr   r  r  r   rM  r1   r6  r2  hostip6_base_linehostip6_host_linegc_msdcs_ip6_linehostip_base_linehostip_host_linegc_msdcs_ip_lines                     r2   create_zone_filer    sf    j#&&&5?$'<<wFAGK1F:#&886A=Fz*+UYY " 0 0$--
3 !2!2 0!29   ~~!	0HHUYYENN3HHUYY&	 "
  	0rzz1@IIu~~D/ / 0 2	0s   AC$ $AD.-D.c           	         |j                   }t        j                  j                  |d      }t        j                  j	                  |j
                        }t        j                  j                  |d      }	i }
| j                  dt        j                  ddg      }|d   d   D ]2  }t        |      j                  d      \  }}||
|j                         <   4 t               }d|d   v rt        |d   d   d         }|j                  j                         }t        j                  j                  ||
|         }	 t        j                  |	       t        |d      j!                          |d	|}t#        j$                  |      }| j                  d
t        j                        }|j'                  |d          d|z  }t)        t+        |            j-                  d      }t/        |t1        d      |j                  |t        |      |d       t/        |t1        d      d       |
|= d|j                  j                         z  }d|j4                  j                         z  }|
|   }|
j7                  |      }d}	 t        j8                  t        j                  j                  ||      t        j                  j                  |	|             t        j8                  t        j                  j                  ||      t        j                  j                  ||             |dk(  rXt        j8                  t        j                  j                  ||dz         t        j                  j                  ||dz                |rt        j8                  t        j                  j                  ||      t        j                  j                  ||             |dk(  rXt        j8                  t        j                  j                  ||dz         t        j                  j                  ||dz                |
|= |r|
|= 	 t=        t        j                  j                  |d      t        j                  j                  |d             |
D ]  }|
|   }|dk(  rIt?        t        j                  j                  ||      t        j                  j                  ||             Vt=        t        j                  j                  ||      t        j                  j                  ||              	 |j@                  	 t        jB                  |      D ]  \  }}}|D ]Y  } t        j                  j                  ||       }!t        jD                  |!d|j@                         t        jF                  |!d       [ |D ]k  }"|"jI                  d      st        j                  j                  ||"      }#t        jD                  |#d|j@                         t        jF                  |#d       m  ydt        jJ                  vr|jM                  d       yy#  |j3                  d        xY w# t:        $ r |j3                  d        w xY w#  |j3                  d        xY w# t:        $ r( dt        jJ                  vr|j3                  d       Y yY yw xY w) zRCreate a copy of samdb and give write permissions to named for dns partitions
    z	sam.ldb.dz
@PARTITION	partitionbackendStorer%   r   :wz://z
@INDEXLIST)r&   r'   zobjectGUID: %s
-r   zprovision_basedn.ldif)r   rs  	DOMAINSID
DESCRIPTORzprovision_basedn_options.ldifNz>Failed to setup database for BIND, AD based DNS cannot be usedzDC=DOMAINDNSZONES,%szDC=FORESTDNSZONES,%szmetadata.tdbmdbz-lockzsam.ldbrT  rS  )z.ldbz.tdbzldb-locki  rU  z9Failed to set permissions to sam.ldb* files, fix manuallyz\Unable to find group id for BIND,
                set permissions to sam.ldb* files manually)'rK  rA  rC  rD  rW  rX  r)   r*   r+   r,   splitupperr!   r/   r[  openclosesambaLdbr   r   r   r   r   r   r`  rootdngetri  rE  r   r   r\  walkr]  r^  endswithr_  warning)$r.   ra  rb  rJ  r   r1   rK  
samldb_dirrc  dns_samldb_dirpartfiler0   tmpncfnamebackend_storer/   domainpart_filedom_urldom_ldb	index_resdomainguid_linedescrdomainzonednforestzonedndomainzone_fileforestzone_filemetadata_filepfilerW  dirsfilesddpathffpaths$                                       r2   create_samdb_copyr  B  s    ##Kk;7Jggooeii(GWW\\';7N H
,,L ^^)>:  <C 1vk" %#hnnS)U$% ./MQCF>2156 ~~##%Hggll7HX,>?O
 _c"((*  -o>))G$ LLl#..LI	IaL!-
:/	:;BB6Jw
+B C)Y	F! 	"
 	w!"ABD	J 	 *ENN,@,@,BBL)ELL,>,>,@@L|,Oll<0O"M
Z7^];	=
[/:Wo6	8E! GGBGGLLo.GHGGLL/G*CDFGGBGGLLo>GGLL/:<% [/G2KLWo.GHJ 	\"k95gy1	3 	7BRLE%k59gu57 k59gu57	7 ~~!	Q(*(8 	/$u +AGGLL!4EHHUB7HHUE*+  /Azz">? "Wa 8ENN;.	/	/ 2::-NN > ? .iL	NJ  L	N*L	N  	Qrzz1OQ 2	QsA   <C,Y >F2Y 9C*Y9 1BZ AZ YY69Z,[ [c                     t        t        d      |j                  d       t        t        d      |j                  d       y)z Write out a dns_update_list filedns_update_listNspn_update_list)r   r   r  r  )r~  ra  rb  s      r2   create_dns_update_listr    s4     z+,e.C.CTJz+,e.C.CTJr4   c                    ddl m} |dk(  rt        t        d      | j                  ||| j
                  ddj                  |j                  d      dd       z   | j                  | j                  d	       t        t        d
      | j                         y|dk(  rt        j                  dgdt        j                  t        j                  d      j                         d   }t        |      }d}d}d}	d}
d}d}d}d}|j                         j!                  d      dk7  rd}n|j                         j!                  d      dk7  rd}n|j                         j!                  d      dk7  rd}	n|j                         j!                  d      dk7  rd}
n\|j                         j!                  d      dk7  rd}n6|j                         j!                  d      dk7  rd}n|j                         j!                  d      dk7  rd}n|j                         j!                  d      dk7  rd}n|j                         j!                  d      dk7  r |d      |j                         j!                  d      dk7  r |d      |j                         j!                  d      dk7  r |d      |j                         j!                  d      dk7  r |d      |j#                  d | j                  z         t        t        d!      | j                  | j                  t$        j&                  j)                         |||	|
||||d"
       yy)#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*.r   r?   N)r;  r:  	ZONE_FILEREALM_WC
NAMED_CONFNAMED_CONF_UPDATEznamed.conf.update	BIND9_DLZznamed -VT)shellstdoutstderrcwd#zBIND 9.8rT  rp  zBIND 9.9z	BIND 9.10z	BIND 9.11z	BIND 9.12z	BIND 9.14z	BIND 9.16z	BIND 9.18z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  
MODULESDIRBIND9_8BIND9_9BIND9_10BIND9_11BIND9_12BIND9_14BIND9_16BIND9_18)samba.provisionr  r   r   	namedconfrX  rD  r  namedconf_update
subprocessPopenPIPESTDOUTcommunicater"   r  findr  r  parammodules_dir)rb  rM  r   dns_backendra  r  	bind_infobind9_8bind9_9bind9_10bind9_11bind9_12bind9_14bind9_16bind9_18s                  r2   create_named_confr    s   " 2&&:l+U__!*"!& $sxxC0@0D'E E"'//).)?)?? 	 	:12E4J4JK		#$$j\,6OO,6,=,=),. /:kmA?	 y)	??!!*-3G__##J/25G__##K0B6H__##K0B6H__##K0B6H__##K0B6H__##K0B6H__##K0B6H__##J/25#$LMM__##K0B6#$UVV__##K0B6#$UVV__##K0B6#$UVVNNMPUP_P__`:./"'//"'++"9"9";&& ( ( ( ( ( (C 	Q 
$r4   c                 z    t        t        d      | ||||t        j                  j	                  ||      |d       y)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<  DNS_KEYTAB_ABSPRIVATE_DIRN)r   r   rA  rC  rD  )rC  rM  r   dnsnamerL  keytab_names         r2   create_named_txtr  '  s;     z+&"% ggll;D&/ r4   c                 
    | dv S )N)r  r  SAMBA_INTERNALNONE )r  s    r2   is_valid_dns_backendr  <  s    SSSr4   c                 2    t         | cxk  xr	 t        k  S c S rB   )r   r   )os_levels    r2   is_valid_os_levelr  @  s    "hI2IIIIIr4   c                 <    t        | |d||       t        | |d       y Nz	CN=System)r   r   )r.   r   r   r;   s       r2   create_dns_legacyr  D  s    eX{I}ME8[1r4   c	           
      H    t        | |d|||       t        | |d|||||       y r  )r%  r4  )	r.   r   r   r   r2  r   r  r  r;   s	            r2   fill_dns_data_legacyr  K  s4     eX{Iy#% %;i"FG5r4   c           	          t        | ||||j                  |j                  |       t        | |d||       |t        k7  rt        | |d||d       y y )Nr0  r1  T)r   )r   r   r   r   r   )r.   r   rJ  r/   r   r;   r   s          r2   create_dns_partitionsr  V  s]     	8XE eX':I#%^#%+>	'	6 $r4   Tc                     |rt        | |d       t        | |d|||       |rt        | |d|||||	       |t        k7  r&t	        | |d|       |rt        | |d|||||	|
|
       yyy)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)
    r0  r1  N)r   r%  r4  r   r)  r8  )r.   r   r2  r/   r   r   r(  r   r  r  r1   r6  r;   autofillr   add_roots                   r2   fill_dns_data_partitionsr  d  s    0 x)<= eX':I0 eX/BD'67	D ^# 	*=yI  2Et!*Hfg!+X7  $r4   c                 l   t        |      st        d|z        t        |      st        d|z        |dk(  r|j                  d       y|j                  d       t	        | |j
                         |j
                  }| j                         j                         }|j                  j                         }|}|j                  }|j                  j                         }t        | |      }t        | |      }| j                          	 |j                  d|z         t        | |j                   ||       |t"        k(  r2|j                  d|z         t%        | |j                   |||||	|
|	       nw|d	v rs|t&        k\  rj|j                  d
       t)        | |j                   |||||       |j                  d       t+        | |j                   |||||||	|
||j,                  ||       | j/                          |j3                  d      rt5        | ||||||||||	|
||       yy#  | j1                           xY w)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)r   BIND9_)r2  rO  r  r  r  r  )r  	Exceptionr  rj  r   r/   get_root_basednget_linearizedr   rH  sitenamerG  r<   r3   transaction_startr  r   r   r  r   r  r  r6  transaction_committransaction_cancel
startswithsetup_bind9_dns)r.   rI  rJ  rb  r~  ra  r  r  rO  r  r  r  r   r  r/   r   r   r(  r2  r   r;   r1   s                         r2   setup_ad_dnsr
    s$   &  ,1K?@@X&.9::f=> KK%&UENN+" ~~H$$&557H%%'II>>D  &&(H%eX6Mx0J	#;hFG%(MJ..KKAHLM 9d!)67MK ;;33 KKOP!%%8"/= KKQR$UEOOT8X%.	8VW%/0:< 	  "h'y%F#XD'RX '9&3	5 (  "s   CH   H3c                    t        |      r|j                  d      st        d|z        t        |      st        d|z        |j                  }t        | |      }t        |||j                  |j                  |j                  |j                  |j                  |	|	       t        ||       t        ||       |dk(  r?t        ||||||j                  |
||j                  |j                  ||j                          |dk(  r#|t"        k\  rt%        | ||||j&                  |       t)        ||j                  |j                  ||       t+        |j,                  |j                  |j                  |j                  d	|j                  |j                  |j                  
       |j/                  d|j0                         |j/                  d|j,                         y)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  )rM  r   rN  rO  rP  r  )r2  r   r  r  r   rM  r1   r6  r  )rM  r   r  ra  r   )rM  r   r  rL  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/   r3   rQ  rK  rL  rM  r   rf  rd  rn  r  r   r6  r   r  r   r  r  namedtxtrj  r  )r.   rI  rJ  rb  r~  ra  r  r  r2  rO  r  r  r  rP  r  r/   r1   s                    r2   r	  r	    s   * !-""8,1K?@@X&.9::~~Hx0J	5))))#kk"'//(-(8(8'+=? 65!vu-&&VUID#(??6!(5>>${{z"'..		2 k!h2I&I%*	> e5;; %[#% U^^ ;;%//(-H!&!2!2!&!1!1	3
 KKK!
KK  >>+r4   )F)NNNNNNN)b__doc__rA  r   rY  r|  r*   base64r   r  r  samba.tdb_utilr   samba.mdb_utilr   	samba.ndrr   r   r   samba.dcerpcr	   r
   r   
samba.dsdbr   r   r   r   r   r   samba.descriptorr   r   r   r   r   r   r   samba.provision.commonr   r   r   r   r   r   r   r    samba.samdbr!   samba.commonr"   r3   r<   DnssrvRpcRecordr>   rX   r]   rb   rg   rr   r   DnsPropertyr   r   r   r   r   r   r   r   r   r   r   r	  r  r  r  r  r  r%  r)  r4  r8  rQ  rd  rn  r  r  r  r  r  r  r  r  r  r  r  r
  r	  r  r4   r2   <module>r     s>  *  	    
    # # *  - -   	 	 	 2 #"d"" %% $&& t## $$ ($$ "$$ 4## !$** ! ))  ' 0 0 '%d.. %")) "%t// %8v"DN<DZz2$j>.4'FT;0|E?PKRj*TJ256  LP(1D-7b 15T4ITb5L LPEI"&B+r4   