
    b                     
   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# 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/m0Z0 d Z1d Z2 G d dej3                  Z4 G d dej3                  Z5 G d dej3                  Z6 G d dej3                  Z7 G d dej3                  Z8 G d dej3                  Z9 G d dej3                  Z: G d dej;                  Z< G d  d!ej;                  Z= G d" d#ej;                  Z> G d$ d%ej;                  Z? G d& d'ej;                  Z@ G d( d)ej;                  ZA G d* d+ej;                  ZBd, ZCd- ZDdLd/ZEd0 ZFd1 ZGd2 ZHd3 ZId4 ZJd5 ZKd6 ZLd7 ZMd8 ZNd9 ZOd: ZPd; ZQd< ZRd= ZSd> ZTd? ZUd@ ZVdA ZWdB ZXdC ZYdD ZZdE Z[dF Z\dG Z]dHe)dHfdIZ^dddde)dfdJZ_	 	 	 dMdKZ`dS )Nz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_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                     |                      |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_domainguidr2   B   sJ    
,,HCN<.,
Q
QCZ	3q6,+?+BCCDDJ    c                    d|                      t          j        | |          t                    z  }|                     |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_dnr/   dnsadmins_sids        r1   get_dnsadmins_sidr;   H   sx    %"8"8,4:6 :67N#P #P PG
,,G3>+,
O
OCx/Q1DQ1GHHMr3   c                   0     e Zd Zddej        f fd	Z xZS )ARecord     c                     t          t          |                                            t          j        | _        || _        || _        || _        || _	        d S N)
superr=   __init__r	   
DNS_TYPE_AwTyperankdwSerialdwTtlSecondsdata)selfip_addrserialttlrF   	__class__s        r1   rC   zARecord.__init__[   sI    gt%%'''_
				r3   __name__
__module____qualname__r	   DNS_RANK_ZONErC   __classcell__rN   s   @r1   r=   r=   Y   sG        '(c8J          r3   r=   c                   0     e Zd Zddej        f fd	Z xZS )
AAAARecordr>   r?   c                     t          t          |                                            t          j        | _        || _        || _        || _        || _	        d S rA   )
rB   rW   rC   r	   DNS_TYPE_AAAArE   rF   rG   rH   rI   )rJ   ip6_addrrL   rM   rF   rN   s        r1   rC   zAAAARecord.__init__f   sJ    j$((***'
				r3   rO   rU   s   @r1   rW   rW   d   sG        ()s9K          r3   rW   c                   0     e Zd Zddej        f fd	Z xZS )CNAMERecordr>   r?   c                     t                                                       t          j        | _        || _        || _        || _        || _        d S rA   )	rB   rC   r	   DNS_TYPE_CNAMErE   rF   rG   rH   rI   )rJ   cnamerL   rM   rF   rN   s        r1   rC   zCNAMERecord.__init__q   sD    (
				r3   rO   rU   s   @r1   r\   r\   o   sG        %&Cd6H          r3   r\   c                   0     e Zd Zddej        f fd	Z xZS )NSRecordr>   r?   c                     t          t          |                                            t          j        | _        || _        || _        || _        || _	        d S rA   )
rB   ra   rC   r	   DNS_TYPE_NSrE   rF   rG   rH   rI   )rJ   
dns_serverrL   rM   rF   rN   s        r1   rC   zNSRecord.__init__|   sJ    h&&(((%
				r3   rO   rU   s   @r1   ra   ra   z   sG        *+4;M          r3   ra   c                   8     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
                 8   t          t          |                                            t          j        | _        |	| _        || _        || _        t          j	                    }
||
_
        ||
_        ||
_        ||
_        ||
_        ||
_        ||
_        |
| _        d S rA   )rB   rf   rC   r	   DNS_TYPE_SOArE   rF   rG   rH   soarL   refreshretryexpiremnamernameminimumrI   )rJ   rm   rn   rL   rj   rk   rl   ro   rM   rF   ri   rN   s              r1   rC   zSOARecord.__init__   s    i'')))&
	hjj
	
					r3   rO   rU   s   @r1   rf   rf      sP        ,-s#tD<N         r3   rf   c                   4     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	                    }||_
        ||_        ||_        ||_        || _        d S rA   )rB   rq   rC   r	   DNS_TYPE_SRVrE   rF   rG   rH   srv
nameTargetwPort	wPrioritywWeightrI   )
rJ   targetportpriorityweightrL   rM   rF   ru   rN   s
            r1   rC   zSRVRecord.__init__   sq    i'')))&
	hjj	 			r3   rO   rU   s   @r1   rq   rq      sL        ./A3(         r3   rq   c                   0     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          |          |_        ||_        || _        d S rA   )rB   r   rC   r	   DNS_TYPE_TXTrE   rF   rG   rH   string_listlencountr+   rI   )rJ   slistrL   rM   rF   
stringlistrN   s         r1   rC   zTXTRecord.__init__   sm    i'')))&
	%''
u::

			r3   rO   rU   s   @r1   r   r      sG        %&Cd6H 	 	 	 	 	 	 	 	 	 	r3   r   c                   ,     e Zd Zej        f fd	Z xZS )TypePropertyc                     t          t          |                                            d| _        d| _        t
          j        | _        || _        d S Nr>   )	rB   r   rC   wDataLengthversionr	   DSPROPERTY_ZONE_TYPEidrI   )rJ   	zone_typerN   s     r1   rC   zTypeProperty.__init__   sC    lD!!**,,,+			r3   )rP   rQ   rR   r	   DNS_ZONE_TYPE_PRIMARYrC   rT   rU   s   @r1   r   r      sC        !%!;          r3   r   c                   ,     e Zd Zej        f fd	Z xZS )AllowUpdatePropertyc                     t          t          |                                            d| _        d| _        t
          j        | _        || _        d S r   )	rB   r   rC   r   r   r	   DSPROPERTY_ZONE_ALLOW_UPDATEr   rI   )rJ   allow_updaterN   s     r1   rC   zAllowUpdateProperty.__init__   sD    !4((113333 			r3   )rP   rQ   rR   r	   DNS_ZONE_UPDATE_SECURErC   rT   rU   s   @r1   r   r      sC        $($? ! ! ! ! ! ! ! ! ! !r3   r   c                         e Zd Zd fd	Z xZS )SecureTimePropertyr   c                     t          t          |                                            d| _        d| _        t
          j        | _        || _        d S r   )	rB   r   rC   r   r   r	   DSPROPERTY_ZONE_SECURE_TIMEr   rI   )rJ   secure_timerN   s     r1   rC   zSecureTimeProperty.__init__   sD     $''002222			r3   r   rP   rQ   rR   rC   rT   rU   s   @r1   r   r      s=                           r3   r   c                         e Zd Zd fd	Z xZS )NorefreshIntervalPropertyr   c                     t          t          |                                            d| _        d| _        t
          j        | _        || _        d S r   )	rB   r   rC   r   r   r	   "DSPROPERTY_ZONE_NOREFRESH_INTERVALr   rI   )rJ   norefresh_intervalrN   s     r1   rC   z"NorefreshIntervalProperty.__init__   sD    '..779999&			r3   r   r   rU   s   @r1   r   r      s=        ' ' ' ' ' ' ' ' ' 'r3   r   c                         e Zd Zd fd	Z xZS )RefreshIntervalPropertyr   c                     t          t          |                                            d| _        d| _        t
          j        | _        || _        d S r   )	rB   r   rC   r   r   r	    DSPROPERTY_ZONE_REFRESH_INTERVALr   rI   )rJ   refresh_intervalrN   s     r1   rC   z RefreshIntervalProperty.__init__   sD    %t,,557777$			r3   r   r   rU   s   @r1   r   r      =        % % % % % % % % % %r3   r   c                         e Zd Zd fd	Z xZS )AgingStatePropertyr   c                     t          t          |                                            d| _        d| _        t
          j        | _        || _        d S r   )	rB   r   rC   r   r   r	   DSPROPERTY_ZONE_AGING_STATEr   rI   )rJ   aging_enabledrN   s     r1   rC   zAgingStateProperty.__init__   sD     $''002222!			r3   r   r   rU   s   @r1   r   r      s=        " " " " " " " " " "r3   r   c                         e Zd Zd fd	Z xZS )AgingEnabledTimePropertyr   c                     t          t          |                                            d| _        d| _        t
          j        | _        || _        d S r   )	rB   r   rC   r   r   r	   "DSPROPERTY_ZONE_AGING_ENABLED_TIMEr   rI   )rJ   next_cycle_hoursrN   s     r1   rC   z!AgingEnabledTimeProperty.__init__   sD    &--668889$			r3   r   r   rU   s   @r1   r   r      r   r3   r   c                 ,   d|z  }d|z  }t          |          }	t          | t          d          |t          |	                              d          d           |t
          k    rAt          | t          d          |t          |	                              d          d           t          t          j                              }
t          j
        | |                                                                          }t          |          }t          |          }t          | t          d          ||
|||t          |                              d          t          |                              d          d           t          | t          d          |||d	           |t
          k    rt          t          j                              }t          j
        | |                                                                          }t          | t          d          |||||t          |                              d          t          |                              d          d           t          | t          d          |||d	           d S d S )
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LOSTANDFOUND_DESCRIPTORINFRASTRUCTURE_DESCRIPTORzprovision_dnszones_modify.ldif)r   r   r   )r   r   r   r   decoder   r+   uuiduuid4r)   r7   canonical_ex_strstripr   r   r   )r-   	domainsidr.   forestdnconfigdnserverdn
fill_leveldomainzone_dnforestzone_dn
descriptordomainzone_guiddomainzone_dnsprotected1_descprotected2_descforestzone_guidforestzone_dnss                   r1   setup_dns_partitionsr      s   *X5M*X5M-i88J5*%IJJ Z((//77M M    ^##uj)MNN$ ,,33F;;Q
 Q
 	 	 	
 $*,,''OVE=11BBDDJJLLN=iHHO=iHHO5*%BCC $"#,_#=#=#D#DV#L#L%.%?%?%F%Fv%N%NF F    eZ(HII L L    ^##djll++}55FFHHNNPPuj)FGG$(&  '0'A'A'H'H'P'P)2?)C)C)J)J6)R)RJ
 J
 	 	 	 	%,L!M!M  $P
 P
 	 	 	 	 	 $#r3   c                 F    t          | t          d          d|i           d S )Nzprovision_dns_accounts_add.ldifDOMAINDN)r   r   )r-   r.   s     r1   add_dns_accountsr   6  s6    5*%FGGHJ     r3   Fc           	      N   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	<   |                     |           d S )
N	DnsAdminsT)name_mapzCN=MicrosoftDNS,,top	containerobjectClassnTSecurityDescriptor)	r+   r   r   r)   Messager7   MessageElementFLAG_MOD_ADDadd)	r-   r.   prefix
domain_sidr:   forestr   sd_valmsgs	            r1   add_dns_containerr   <  s    S//0H~~8BJL L L 9BJL L L +cfUUvvvxx$PQQ
R
RC-C63#31	3 	3  
IIcNNNNNr3   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 }|                    t	          t          t          j        *                               |                    t	          t          t          j	        +                               |                    t	          t                                           |                    t	          t                                           |                    t	          t                                           |                    t	          t                                           |                    t	          t                                           d,d-g|d.<   t          j        d/t           j        d0          |d0<   t          j        |t           j        d1          |d1<   |                     |           g }|D ]?}	|                    t	          t%          |	d2d2t          j        3                               @t          j        t          j        | d4|z                      }d,d5g|d.<   t          j        |t           j        d6          |d6<   |                     |           |D ]}	t	          t)          ||	         d2d2t          j        3                    g}t          j        t          j        | d7|	d)|                    }d,d5g|d.<   t          j        |t           j        d6          |d6<   |                     |           d S )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   )rL   rM   rF   DC=@,%sdnsNode	dnsRecordDC=)r)   r   r7   appendr   r   r	   DNS_ZONE_TYPE_CACHEr   DNS_ZONE_UPDATE_OFFr   r   r   r   r   r   r   r   ra   DNS_RANK_ROOT_HINTr=   )
r-   r.   r   rootserversrootservers_v6container_dnr   propsrecordrservers
             r1   add_rootserversr   M  s   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 +cfUL11
2
2CE	LL,1IJJJKKLLL	LL-4;STTTUUVVV	LL,..//000	LL35566777	LL13344555	LL,..//000	LL24455666+C"63+;TBBCI+E33C]SSC	IIcNNN F b bhxqtG^___``aaaa
+cfUI$<==
>
>C+C)&#2BKPPC	IIcNNN   7;w#7qtOfggghhi k#&ggg||(LMMNN#Y/M-fc6FTTK		# r3   c                    |d|}g }t          |d|z            }	|                    t          |	                     t          |          }
|                    t          |
                     |1t	          |          }|                    t          |                     |1t          |          }|                    t          |                     t          j        t          j        | d|z                      }ddg|d<   t          j	        |t          j
        d          |d<   |                     |           d S )N.zhostmaster.%sr   r   r   r   r   )rf   r   r   ra   r=   rW   r)   r   r7   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                 r1   add_at_recordr    s.   'xx3MJ m_y-HIIMh}--... M**Lh|,,---foo(;//000#G,,(>22333
+cfUI$<==
>
>C+C)*c6FTTC	IIcNNNNNr3   c                    t          ||          }t          j        t          j        | |d|                    }ddg|d<   t          j        t          |          t          j        d          |d<   |                     |           d S Nr   r   r   r   r   )rq   r)   r   r7   r   r   r   r   )r-   r   r   hostr{   
srv_recordr   s          r1   add_srv_recordr    s~    4&&J
+cfUvvv||$DEE
F
FC+C)(:*>*>@PR]^^C	IIcNNNNNr3   c                    t          |          }t          j        t          j        | |d|                    }ddg|d<   t          j        t          |          t          j        d          |d<   |                     |           d S r  )ra   r)   r   r7   r   r   r   r   r-   r   r   r	  	ns_recordr   s         r1   add_ns_recordr    sz    I
+cfUvvv||$DEE
F
FC+C)(9*=*=s?OQ\]]C	IIcNNNNNr3   c                 ,   t          |t          j                  }t          j        t          j        | |d|                    }ddg|d<   t          j        t          |          t          j        d          |d<   | 	                    |           d S )N)rF   r   r   r   r   r   )
ra   r	   DNS_RANK_NS_GLUEr)   r   r7   r   r   r   r   r  s         r1   add_ns_glue_recordr    s    D$9:::I
+cfUvvv||$DEE
F
FC+C)(9*=*=s?OQ\]]C	IIcNNNNNr3   c                    t          |          }t          j        t          j        | |d|                    }ddg|d<   t          j        t          |          t          j        d          |d<   |                     |           d S r  )r\   r)   r   r7   r   r   r   r   )r-   r   r   r	  cname_recordr   s         r1   add_cname_recordr    s|    t$$L
+cfUvvv||$DEE
F
FC+C)(<*@*@#BRT_``C	IIcNNNNNr3   c                    g }|r1t          |          }|                    t          |                     |r1t          |          }|                    t          |                     |rmt	          j        t	          j        | |d|                    }ddg|d<   t	          j        |t          j        d          |d<   | 	                    |           d S d S r  )
r=   r   r   rW   r)   r   r7   r   r   r   )	r-   r   r   r   r   host_recordsa_recordaaaa_recordr   s	            r1   add_host_recordr    s    L 06??HX../// 3 ))H[11222 k#&666<<(HIIJJ#Y/M-lC<LkZZK		#	 r3   c                    d|z  }t           j                            ||          }g }|                    t	          t                                           |                    t	          t                                           |                    t	          t                                           |                    t	          t          d                               |                    t	          t          d                               |                    t	          t                                           |                    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<   |                     |	           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   )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   r7   r   r   r   )
r-   r.   r   r   r   r:   sddlsecr   r   s
             r1   add_domain_recordr"    s    D 

'
'i
8
8CE	LL,..))***	LL-//00111	LL,..//000	LL3sKKKLLMMM	LL13GGGHHIII	LL,..//000	LL24455666
+cfUUYYYPVPVPVX`X`$abb
c
cC+C8C==+1	3 	3  +E33C]SSC	IIcNNNNNr3   c                     t          j        t          j        | d|d|d|                    }ddg|d<   |                     |           d S )N
DC=_msdcs.r  r   r   r   r   )r)   r   r7   r   )r-   r   r   	dnsforestr   s        r1   add_msdcs_recordr&    sb    
+cfUU%.YY%B C C D DC+C	IIcNNNNNr3   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||           d S )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)   r7   r  r  r  r  )
r-   r.   r   siter   r   r   r   r   domain_container_dns
             r1   add_dc_domain_recordsr1    s     (xx3M &"+))VVVXX)? @ @ %,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NN 5-;dBM  
 5-;dBM  
 5-/M #' ' ' 5-/M #' ' ' E.0CV   E.0CV    r3   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  |
           d S )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)   r7   r  r  r  r  )r-   r   r   r/  r%  r   r   r   r0   ntdsguidr   forest_container_dns               r1   add_dc_msdcs_recordsr5  h  s     (xx3M &"+))VVVXX)? @ @ %,fh	   5-/E "& & & 5-3d:M2O O O 5-/A #' ' ' 5-/K0&- - - 5-/K0&. . . 5-/A $( ( ( 5-/B #' ' ' E.III 5--
:M3P P P U/81C"$ $ $ $ $r3   c	                 6   	 t          j        t           j                            ||                     t          j        t           j                            ||                     n# t          $ r Y nw xY w|d}t          | t          d          |||t          |                    d                    	                    d          t          |          |j        |j                                        d|j                                        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
    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	            r1   secretsdb_setup_dnsrN    s   
	"',,{O<<===
	"',,{O<<====    ! i$677")$W^^G%<%<==DDVLL"%&8"9"9!''))))5?+@+@+B+B+BD	: 	: 	 	 	 	 	s   A$A' '
A43A4c                    t           j                            |j                  }	 t	          j        |d           n# t          $ r Y nw xY wt          j        |d           |j        t	 t          j	        |d|j                   t          j
        |d           dS # t          $ r4 dt           j        vr"|                     d||j        fz             Y dS Y dS w xY wdS )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)r>  r@  dirnamednsshutilrmtreerB  mkdirbind_gidchownchmodenvironerror)loggerpathsdns_dirs      r1   create_dns_dirra    s    gooei((Ggt$$$$    HWe~!	.HWb%.111HWe$$$$$ 	. 	. 	.rz11@U^D- - . . . . . . 211	. "!s!   < 
A	A	)0B 7CCc           	      R   t           j                            |j        |j                  }t           j                            |j        |j                  }t           j                            |          rt           j                            |          rM	 t          j        |           n7# t          $ r*}| 	                    d|d|j
                   Y d}~nd}~ww xY w	 t          j        ||           n:# t          $ r-}| 	                    d|d|d|j
                   Y d}~nd}~ww xY w|j        	 t          j        |j        d           t          j        |j        d|j                   n?# t          $ r2 dt           j        vr!|                     d	|j        |j                   Y nw xY w	 t          j        |d
           t          j        |d|j                   dS # t          $ r1 dt           j        vr|                     d	||j                   Y dS Y dS w xY wdS dS )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 -> rP  rQ  rR  rS  i  )r>  r@  rA  rH  
dns_keytabrI  isfiler?  rB  r]  strerrorlinkrY  r[  rZ  r\  info)r^  r_  private_dns_keytab_pathbind_dns_keytab_pathes        r1   create_dns_dir_keytab_linkrk    s    !gll5+<e>NOO7<<(95;KLL	w~~-.. F7>>.// 	AA	.//// A A A222AJJ@ A A A A A A A AA
	VG+-ABBBB 	V 	V 	VLLL1113G3G3GU V V V V V V V V	V
 >%C*E222*B???? C C C#2:55KK C % 15>C C CCF-u555-r5>BBBBB F F F#2:55KK C 4enF F F F F F 655F7F F  &%sT   B* *
C4 CC"C8 8
D/#D**D/::E5 59F10F150G' '4H"!H"c                 :   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        	 t          j	        |j        d|j                   t          j
        |j        d           dS # t          $ r9 dt          j        vr'|                    d|j        |j        fz             Y dS Y dS w xY w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<  r8  r7  HOSTIP_BASE_LINEHOSTIP_HOST_LINE
DOMAINGUID
DATESTRINGDEFAULTSITENTDSGUIDHOSTIP6_BASE_LINEHOSTIP6_HOST_LINEGC_MSDCS_IP_LINEGC_MSDCS_IP6_LINErQ  i  rR  rS  )
isinstancer+   r   r   rU  timestrftimerY  r>  rZ  r[  rB  r\  r]  )lpr^  r_  	targetdirr   r   r   r   rJ  r0   r3  r/  hostip6_base_linehostip6_host_linegc_msdcs_ip6_linehostip_base_linehostip_host_linegc_msdcs_ip_lines                     r1   create_zone_filer     s    j#&&&&&5?$'<<wFAGK1F:#&886A=Fz*++UY " 0 0$-
33 !2!2 0!29 9     ~!	0HUYEN333HUY&&&&& 	0 	0 	0rz11@Iu~D/ / 0 0 0 0 0 0 211	0 "!s   :C <DDc           	      .   |j         }t          j                            |d          }t          j                            |j                  }t          j                            |d          }	i }
|                     dt          j        ddg          }|d         d         D ]>}t          |          
                    d          \  }}||
|                                <   ?t                      }d|d         v r!t          |d         d         d                   }|j                                        }t          j                            ||
|                   }	 t          j        |	           t          |d                                           |d	|}t#          j        |          }|                     d
t          j                  }|                    |d                    d|z  }t)          t+          |                                        d          }t/          |t1          d          |j        |t          |          |d           t/          |t1          d          d           n#  |                    d            xY w|
|= d|j                                        z  }d|j                                        z  }|
|         }|
                    |          }d}	 t          j        t          j                            ||          t          j                            |	|                     t          j        t          j                            ||          t          j                            ||                     |dk    rWt          j        t          j                            ||dz             t          j                            ||dz                        |rt          j        t          j                            ||          t          j                            ||                     |dk    rWt          j        t          j                            ||dz             t          j                            ||dz                        n$# t:          $ r |                    d            w xY w|
|= |r|
|= 	 t=          t          j                            |d          t          j                            |d                     |
D ]}|
|         }|dk    rMt?          t          j                            ||          t          j                            ||                     ]t=          t          j                            ||          t          j                            ||                     n#  |                    d            xY w|j         	 t          j!        |          D ]\  }}}|D ]R} t          j                            ||           }!t          j"        |!d|j                    t          j#        |!d           S|D ]g}"|"$                    d          rPt          j                            ||"          }#t          j"        |#d|j                    t          j#        |#d           hdS # t:          $ r* dt          j%        vr|                    d           Y dS Y dS w xY wdt          j%        vr|&                    d           dS dS ) 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   rp  	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.ldbrQ  rP  )z.ldbz.tdbzldb-locki  rR  z9Failed to set permissions to sam.ldb* files, fix manuallyz\Unable to find group id for BIND,
                set permissions to sam.ldb* files manually)'rH  r>  r@  rA  rT  rU  r(   r)   r*   r+   splitupperr    r.   rX  openclosesambaLdbr   r   r   r   r   r   r]  rootdngetrf  rB  r   r   rY  walkrZ  r[  endswithr\  warning)$r-   r^  r_  rG  r   r0   rH  
samldb_dirr`  dns_samldb_dirpartfiler/   tmpncfnamebackend_storer.   domainpart_filedom_urldom_ldb	index_resdomainguid_linedescrdomainzonednforestzonedndomainzone_fileforestzone_filemetadata_filepfilerT  dirsfilesddpathffpaths$                                       r1   create_samdb_copyr  >  s    #Kk;77Jgooei((GW\\';77N H
,,L ^)>:  < <C 1vk" % %#hhnnS))U$-//MQCF>21566 ~##%%Hgll7HX,>??O
   _c""((***  -}}oo>)G$$ LLl#.LII	IaL!!!-
:/	::;;BB6JJw
+B C C)Y	F! F! 	" 	" 	"
 	w!"ABBD	J 	J 	J 	JL	N 	N 	N 	 *EN,@,@,B,BBL)EL,>,>,@,@@L|,Oll<00O"M
Z77^];;	= 	= 	=
[/::Wo66	8 	8 	8E!! GBGLLo.GHHGLL/G*CDDF F F 	JGBGLLo>>GLL/::< < <%% [/G2KLLWo.GHHJ J J   L	N 	N 	N 	 #\"k955gy11	3 	3 	3 	7 	7BRLE%%k599gu557 7 7 7 k599gu557 7 7 7	7L	N 	N 	N ~!	Q(*(8(8 	/ 	/$u + +AGLL!44EHUB777HUE**** / /Azz">?? / "Wa 8 8EN;;;...	/	/ 	/  	Q 	Q 	Qrz11OQ Q Q Q Q Q 211	Q
 2:--NN > ? ? ? ? ? .-s:   DI- -J#F/R !R4 C8V9 9WCZ9 9-[-,[-c                     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_  s      r1   create_dns_update_listr    sF     z+,,e.CTJJJz+,,e.CTJJJJJr3   c                    ddl m} |dk    rt          t          d          | j        ||| j        dd                    |                    d          dd                   z   | j        | j        d	           t          t          d
          | j                   dS |dk    r"t          j
        dgdt          j        t          j        d                                          d         }t          |          }d}d}d}	d}
d}d}d}d}|                                                    d          dk    rd}n=|                                                    d          dk    rd}n|                                                    d          dk    rd}	n|                                                    d          dk    rd}
n|                                                    d          dk    rd}n|                                                    d          dk    rd}nR|                                                    d          dk    rd}n#|                                                    d          dk    rd}n|                                                    d          dk    r |d          |                                                    d          dk    r |d          |                                                    d          dk    r |d          |                                                    d          dk    r |d          |                    d | j        z             t          t          d!          | j        | j        t$          j                                        |||	|
||||d"
           dS 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*.r   r>   N)r8  r7  	ZONE_FILEREALM_WC
NAMED_CONFNAMED_CONF_UPDATEznamed.conf.update	BIND9_DLZznamed -VT)shellstdoutstderrcwd#zBIND 9.8rQ  rm  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   	namedconfrU  rA  r  namedconf_update
subprocessPopenPIPESTDOUTcommunicater!   r  findr  r  parammodules_dir)r_  rJ  r   dns_backendr^  r  	bind_infobind9_8bind9_9bind9_10bind9_11bind9_12bind9_14bind9_16bind9_18s                  r1   create_named_confr    s   " 211111&&&:l++U_!*"!& $sxxC0@0@0D'E'E E"'/).)?? ? 	 	 	 	:122E4JKKKKK		#	#$j\,6O,6,=),. . . /:kmmA?	 y))	??!!*--33GG__##J//255GG__##K00B66HH__##K00B66HH__##K00B66HH__##K00B66HH__##K00B66HH__##K00B66HH__##J//255##$LMMM__##K00B66##$UVVV__##K00B66##$UVVV__##K00B66##$UVVVNNMPUP__```:.//"'/"'+"9"9";";&& ( ( ( ( ( (C C 	 	 	 	 	Q 
$	#r3   c                     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)r8  r=  r7  r9  DNS_KEYTAB_ABSPRIVATE_DIRN)r   r   r>  r@  rA  )r@  rJ  r   dnsnamerI  keytab_names         r1   create_named_txtr  #  sX     z+&&"% gll;DD&/ /     r3   c                 
    | dv S )N)r  r  SAMBA_INTERNALNONE )r  s    r1   is_valid_dns_backendr  8  s    SSSr3   c                 6    t           | cxk    o
t          k    nc S rA   )r   r   )os_levels    r1   is_valid_os_levelr  <  s%    "hIIII2IIIIIIr3   c                 N    t          | |d||           t          | |d           d S Nz	CN=System)r   r   )r-   r   r   r:   s       r1   create_dns_legacyr  @  s0    eX{I}MMME8[11111r3   c	           
      Z    t          | |d|||           t          | |d|||||           d S r  )r"  r1  )	r-   r   r   r   r/  r   r   r   r:   s	            r1   fill_dns_data_legacyr  G  sR     eX{Iy#% % % %;i"FG5 5 5 5 5r3   c           	          t          | ||||j        |j        |           t          | |d||           |t          k    rt          | |d||d           d S d S )Nr-  r.  T)r   )r   r   r   r   r   )r-   r   rG  r.   r   r:   r   s          r1   create_dns_partitionsr  R  s     	8XE E E eX':I#% % %^##%+>	'	6 	6 	6 	6 	6 	6 $#r3   Tc                     |rt          | |d           t          | |d|||           |rt          | |d|||||	           |t          k    r.t	          | |d|           |rt          | |d|||||	|
|
  
         dS dS 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"  r1  r   r&  r5  )r-   r   r/  r.   r   r   r%  r   r   r   r0   r3  r:   autofillr   add_roots                   r1   fill_dns_data_partitionsr  `  s    0  >x)<=== eX':I0 0 0  DeX/BD'67	D 	D 	D ^## 	*=yIII  	7 2Et!*Hfg!+X7 7 7 7 7 $#	7 	7r3   c                    t          |          st          d|z            t          |          st          d|z            |dk    r|                    d           dS |                    d           t	          | |j                   |j        }|                                                                 }|j        	                                }|}|j
        }|j        	                                }t          | |          }t          | |          }|                                  	 |                    d|z             t          | |j        ||           |t"          k    r5|                    d|z             t%          | |j        |||||	|
|	  	         nz|d	v rv|t&          k    rk|                    d
           t)          | |j        |||||           |                    d           t+          | |j        |||||||	|
||j        ||           |                                  n#  |                                   xY w|                    d          rt5          | ||||||||||	|
||           dS 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)r   BIND9_)r/  rL  r   r   r|  r  )r  	Exceptionr  rg  r   r.   get_root_basednget_linearizedr   rE  sitenamerD  r;   r2   transaction_startr  r   r   r  r   r  r  r3  transaction_committransaction_cancel
startswithsetup_bind9_dns)r-   rF  rG  r_  r{  r^  r  r  rL  r   r   r|  r   r  r.   r   r   r%  r/  r   r:   r0   s                         r1   setup_ad_dnsr    s   &  ,, A1K?@@@X&& ;.9:::f=>>> KK%&&&UEN+++" ~H$$&&5577H%%''II>D &&((H%eX66Mx00J	#;hFGGG%(MJJJ...KKAHLMMM 9d!)67MK K K K ;;;333 KKOPPP!%%8"/= = = KKQRRR$UEOT8X%.	8VW%/0:< < < < 	  """"	  """ h'' 5y%F#XD'RX '9&3	5 	5 	5 	5 	5 	55 5s   'C)H% %H<c                 d   t          |          r|                    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        
           |                    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  )rJ  r   rK  rL  rM  r  )r/  r   r   r   r   rJ  r0   r3  r  )rJ  r   r  r^  r   )rJ  r   r  rI  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.   r2   rN  rH  rI  rJ  r   rc  ra  rk  r  r   r3  r   r  r   r  r  namedtxtrg  r  )r-   rF  rG  r_  r{  r^  r  r  r/  rL  r   r   r|  rM  r  r.   r0   s                    r1   r  r    s   * !-- A""8,,A1K?@@@X&& ;.9:::~Hx00J	5))#k"'/(-(8'+=? ? ? ? 65!!!vu---&&&VUID#(?6!(5>${z"'.		2 	2 	2 	2 k!!h2I&I&I%*	> 	> 	> e5; %[#% % % % U^ ;%/(-H!&!2!&!1	3 3 3 3
 KKK! ! !
KK  >+ + + + +r3   )F)NNNNNNN)a__doc__r>  r   rV  ry  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   samba.provision.commonr   r   r   r   r   r   r   r   samba.samdbr    samba.commonr!   r2   r;   DnssrvRpcRecordr=   rW   r\   ra   rf   rq   r   DnsPropertyr   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r"  r&  r1  r5  rN  ra  rk  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r3   r1   <module>r     s  *   				    



            # # # # # # # # # # # # * * * * * * * *       - - - - - - - - - -                              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 2 1 1 1 1 1 # # # # # #    "    d"       %       $&       t#       $   (    $   "    $       4#   ! ! ! ! !$* ! ! !         )      ' ' ' ' ' 0 ' ' '% % % % %d. % % %" " " " ") " " "% % % % %t/ % % %5 5 5p     "D D DN  <            D  Z Z Zz2$ 2$ 2$j  >. . .4'F 'F 'FT;0 ;0 ;0|E? E? E?PK K KR R Rj  *T T TJ J J2 2 25 5 56 6 6  LP(1D-7 -7 -7 -7b 15T4ITb5 b5 b5 b5L LPEI"&B+ B+ B+ B+ B+ B+r3   