a
    a                     @   s|  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dl	mZ d dl	m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 d dlmZmZmZmZ d dlmZmZ d dlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% dd Z&dd Z'dd Z(dd Z)dd Z*dd Z+dd Z,dd Z-dd  Z.d!d" Z/d#d$ Z0d%d& Z1d'd( Z2d)d* Z3d+d, Z4d-d. Z5d/d0 Z6d1d2 Z7d3d4 Z8d5d6 Z9d7d8 Z:d9d: Z;d;d< Z<d=d> Z=d?d@ Z>G dAdB dBeZ?G dCdD dDeZ@G dEdF dFeZAG dGdH dHeZBG dIdJ dJeZCG dKdL dLeZDG dMdN dNeZEG dOdP dPeZFG dQdR dReZGG dSdT dTeZHG dUdV dVeZIG dWdX dXeZJdS )Y    N)WERRORError)werror)pack)	inet_ntoa)	inet_ntop)AF_INET)AF_INET6)	remove_dc)SamDB)system_session)CommandCommandErrorOptionSuperCommand)dnsp	dnsserver)	ARecord
AAAARecord	PTRRecordCNameRecordNSRecordMXRecord	SOARecord	SRVRecord	TXTRecordc              
   C   sd   |   dkrd} d|  }zt|||}W n4 ty^ } ztd| |f W Y d }~n
d }~0 0 |S )NZ	localhostz	127.0.0.1zncacn_ip_tcp:%s[sign]z.Connecting to DNS RPC server %s failed with %s)lowerr   RuntimeErrorr   )serverlpcredsZbinding_strdns_conne r"   2/usr/lib/python3/dist-packages/samba/netcmd/dns.pydns_connect.   s    &r$   c                 C   s(   | dkrd}n| dkrd}nd|  }|S )Nr   ZFALSE   ZTRUEUNKNOWN (0x%x)r"   )flagretr"   r"   r#   bool_string:   s    r)   c                 C   s4   d }|D ]}|t | |kr|} q$q|s0d| }|S )Nr&   getattr)module	enum_defsvaluer(   r!   r"   r"   r#   enum_stringD   s    r/   c                 C   s4   d}|D ]}|t | |@ r|d| 7 }q|s0d}|S )N z%s ZNONEr*   )r,   bitmap_defsr.   r(   br"   r"   r#   bitmap_stringO   s    r3   c                 C   s   g d}t t|| S )N)ZDNS_BOOT_METHOD_UNINITIALIZEDZDNS_BOOT_METHOD_FILEZDNS_BOOT_METHOD_REGISTRYZDNS_BOOT_METHOD_DIRECTORYr/   r   )Zboot_methodr-   r"   r"   r#   boot_method_stringY   s    r5   c                 C   s   g d}t t|| S )N)ZDNS_ALLOW_RFC_NAMES_ONLYZDNS_ALLOW_NONRFC_NAMESZDNS_ALLOW_MULTIBYTE_NAMESZDNS_ALLOW_ALL_NAMESr4   )Z
check_flagr-   r"   r"   r#   name_check_flag_string_   s    r6   c                 C   s   g d}t t|| S )N)ZDNS_ZONE_TYPE_CACHEDNS_ZONE_TYPE_PRIMARYZDNS_ZONE_TYPE_SECONDARYZDNS_ZONE_TYPE_STUBZDNS_ZONE_TYPE_FORWARDERZDNS_ZONE_TYPE_SECONDARY_CACHEr/   r   )Z	zone_typer-   r"   r"   r#   zone_type_stringe   s    r9   c                 C   s   g d}t t|| S )N)ZDNS_ZONE_UPDATE_OFFZDNS_ZONE_UPDATE_UNSECUREDNS_ZONE_UPDATE_SECUREr8   )Zzone_updater-   r"   r"   r#   zone_update_stringl   s    r;   c                 C   s   g d}t t|| S )N)ZDNS_ZONE_SECSECURE_NO_SECURITYZDNS_ZONE_SECSECURE_NS_ONLYZDNS_ZONE_SECSECURE_LIST_ONLYZDNS_ZONE_SECSECURE_NO_XFERr4   )Zsecurityr-   r"   r"   r#   zone_secondary_security_stringr   s    r<   c                 C   s   g d}t t|| S )N)ZDNS_ZONE_NOTIFY_OFFZDNS_ZONE_NOTIFY_ALL_SECONDARIESZDNS_ZONE_NOTIFY_LIST_ONLYr4   )Znotify_levelr-   r"   r"   r#   zone_notify_level_stringx   s    r=   c                 C   s   g d}t t|| S )N)ZDNS_DP_AUTOCREATEDZDNS_DP_LEGACYDNS_DP_DOMAIN_DEFAULTZDNS_DP_FOREST_DEFAULTZDNS_DP_ENLISTEDZDNS_DP_DELETEDr3   r   )Zdp_flagsr1   r"   r"   r#   dp_flags_string~   s    r@   c                 C   s   g d}t t|| S )N)	ZDNS_RPC_ZONE_PAUSEDZDNS_RPC_ZONE_SHUTDOWNZDNS_RPC_ZONE_REVERSEZDNS_RPC_ZONE_AUTOCREATEDZDNS_RPC_ZONE_DSINTEGRATEDZDNS_RPC_ZONE_AGINGZDNS_RPC_ZONE_UPDATE_UNSECUREZDNS_RPC_ZONE_UPDATE_SECUREZDNS_RPC_ZONE_READONLYr?   )flagsr1   r"   r"   r#   zone_flags_string   s    rB   c                 C   s@   g }| s|S t | jD ]$}tttd| j| }|| q|S )NI)range	AddrCountr   r   r   	AddrArrayappend)arrayr(   iaddrr"   r"   r#   ip4_array_string   s    rK   c                 C   s   g }| s|S t | jD ]}| j| jd dkr\tjdg| j| jdd R  }tt|}nF| j| jd dkrtjdg| j| jdd R  }tt|}nd	}|	| q|S )
Nr      Z4B         Z16B   ZUNKNOWN)
rD   rE   rF   ZMaxSastructr   r   r   r   rG   )rH   r(   rI   xrJ   r"   r"   r#   dns_addr_array_string   s    ""rS   c                 C   s   |   }|dkrtj}n|dkr(tj}n|dkr8tj}n||dkrHtj}nl|dkrXtj}n\|dkrhtj}nL|dkrxtj}n<|dkrtj	}n,|d	krtj
}n|d
krtj}ntd|  |S )NAAAAAPTRNSCNAMESOAMXSRVTXTZALLzUnknown type of DNS record %s)upperr   
DNS_TYPE_ADNS_TYPE_AAAADNS_TYPE_PTRDNS_TYPE_NSDNS_TYPE_CNAMEDNS_TYPE_SOADNS_TYPE_MXDNS_TYPE_SRVDNS_TYPE_TXTZDNS_TYPE_ALLr   )Zrec_typertyperecord_typer"   r"   r#   dns_type_flag   s.    ri   c                 C   sH   |   }|dkrtj}n,|dkr(tj}n|dkr8tj}ntd|  |S )NZW2KZDOTNETZLONGHORNzUnknown client version %s)r]   r   DNS_CLIENT_VERSION_W2KDNS_CLIENT_VERSION_DOTNETDNS_CLIENT_VERSION_LONGHORNr   )Zcli_versionversionclient_versionr"   r"   r#   dns_client_version   s    ro   c                 C   s  |  d|j  |  dt|j  |  dt|j  |  dt|j  |  dt|j  |  d|j  |  d|j	  |t
jkr|  dt|j  |  d	t|j  |  d
t|j  n<|  dt|j  |  d	t|j  |  d
t|j  |  d|j  |  d|j  |  d|j  |  d|j  |  dt|j  |  d|j  |  d|j  |  d|j  |  d|j  |  d|j  |  d|j  |  d|j  |  d|j  |  dt|j  |  dt|j   |  dt|j!  |  dt|j"  |  dt|j#  |  dt|j$  |  dt|j%  |  dt|j&  |  d t|j'  |  d!t|j(  |  d"t|j)  |  d#t|j*  |  d$t|j+  |t
j,kr|  d%|j-  |  d&t|j.  |  d'|j/  |  d(|j0  |  d)|j1  |  d*|j2  |  d+|j3  |  d,|j4  |  d-|j5  |  d.|j6  |  d/|j7  |  d0|j8  |  d1|j9  |  d2|j:  |t
jkr|  d3t|j;  d S )4Nz%  dwVersion                   : 0x%x
z#  fBootMethod                 : %s
z#  fAdminConfigured            : %s
#  fAllowUpdate                : %s
z#  fDsAvailable                : %s
z#  pszServerName               : %s
z#  pszDsContainer              : %s
z#  aipServerAddrs              : %s
z#  aipListenAddrs              : %s
z#  aipForwarders               : %s
z#  dwLogLevel                  : %d
z#  dwDebugLevel                : %d
z#  dwForwardTimeout            : %d
z%  dwRpcPrototol               : 0x%x
z#  dwNameCheckFlag             : %s
z#  cAddressAnswerLimit         : %d
z#  dwRecursionRetry            : %d
z#  dwRecursionTimeout          : %d
z#  dwMaxCacheTtl               : %d
z#  dwDsPollingInterval         : %d
z#  dwScavengingInterval        : %d
z#  dwDefaultRefreshInterval    : %d
z#  dwDefaultNoRefreshInterval  : %d
z#  fAutoReverseZones           : %s
z#  fAutoCacheUpdate            : %s
z#  fRecurseAfterForwarding     : %s
z#  fForwardDelegations         : %s
z#  fNoRecursion                : %s
z#  fSecureResponses            : %s
z#  fRoundRobin                 : %s
z#  fLocalNetPriority           : %s
z#  fBindSecondaries            : %s
z#  fWriteAuthorityNs           : %s
z#  fStrictFileParsing          : %s
z#  fLooseWildcarding           : %s
z#  fDefaultAgingState          : %s
%  dwRpcStructureVersion       : 0x%x
z#  aipLogFilter                : %s
z#  pwszLogFilePath             : %s
z#  pszDomainName               : %s
z#  pszForestName               : %s
z#  pszDomainDirectoryPartition : %s
z#  pszForestDirectoryPartition : %s
z%  dwLocalNetPriorityNetMask   : 0x%x
z#  dwLastScavengeTime          : %d
z#  dwEventLogLevel             : %d
z#  dwLogFileMaxSize            : %d
z#  dwDsForestVersion           : %d
z#  dwDsDomainVersion           : %d
z#  dwDsDsaVersion              : %d
z#  fReadOnlyDC                 : %s
)<writeZ	dwVersionr5   ZfBootMethodr)   ZfAdminConfiguredfAllowUpdateZfDsAvailableZpszServerNameZpszDsContainerr   ZDNSSRV_TYPEID_SERVER_INFOrK   ZaipServerAddrsZaipListenAddrsZaipForwardersrS   Z
dwLogLevelZdwDebugLevelZdwForwardTimeoutZdwRpcProtocolr6   ZdwNameCheckFlagZcAddressAnswerLimitZdwRecursionRetryZdwRecursionTimeoutZdwMaxCacheTtlZdwDsPollingIntervalZdwScavengingIntervalZdwDefaultRefreshIntervalZdwDefaultNoRefreshIntervalZfAutoReverseZonesZfAutoCacheUpdateZfRecurseAfterForwardingZfForwardDelegationsZfNoRecursionZfSecureResponsesZfRoundRobinZfLocalNetPriorityZfBindSecondariesZfWriteAuthorityNsZfStrictFileParsingZfLooseWildcardingZfDefaultAgingStateZDNSSRV_TYPEID_SERVER_INFO_W2KdwRpcStructureVersionZaipLogFilterZpwszLogFilePathZpszDomainNameZpszForestNameZpszDomainDirectoryPartitionZpszForestDirectoryPartitionZdwLocalNetPriorityNetMaskZdwLastScavengeTimeZdwEventLogLevelZdwLogFileMaxSizeZdwDsForestVersionZdwDsDomainVersionZdwDsDsaVersionZfReadOnlyDC)outftypeid
serverinfor"   r"   r#   print_serverinfo   s    
rx   c                 C   s:  |  d|j  |  dt|j  |  dt|j  |  dt|j  |  dt|j  |  dt|j	  |  dt|j
  |  dt|j  |  d	|j  |tjkr|  d
t|j  n|  d
t|j  |  dt|j  |  dt|j  |tjkr>|  dt|j  |  dt|j  n(|  dt|j  |  dt|j  |  dt|j  |  dt|j  |  dt|j  |  d|j  |  d|j  |  d|j  |tjkr|  dt|j  n|  dt|j  |tjkr|  d|j   |  d|j!  |  d|j"  |tjkrf|  dt|j#  n|  dt|j#  |  dt$|j%  |  d|j&  |  d|j'  |  d|j(  |  d|j)  |tjkr6|  dt|j*  |  d t|j+  |  d!t|j,  |  d"|j-  |  d#|j.  d S )$N#  pszZoneName                 : %s
z#  dwZoneType                  : %s
z#  fReverse                    : %s
rp   z#  fPaused                     : %s
z#  fShutdown                   : %s
z#  fAutoCreated                : %s
z#  fUseDatabase                : %s
z#  pszDataFile                 : %s
z#  aipMasters                  : %s
z#  fSecureSecondaries          : %s
z#  fNotifyLevel                : %s
z#  aipSecondaries              : %s
z#  aipNotify                   : %s
z#  fUseWins                    : %s
z#  fUseNbstat                  : %s
z#  fAging                      : %s
z#  dwNoRefreshInterval         : %d
z#  dwRefreshInterval           : %d
z#  dwAvailForScavengeTime      : %d
z#  aipScavengeServers          : %s
rq   z#  dwForwarderTimeout          : %d
z#  fForwarderSlave             : %d
z#  aipLocalMasters             : %s
#  dwDpFlags                   : %s
#  pszDpFqdn                   : %s
z#  pwszZoneDn                  : %s
z#  dwLastSuccessfulSoaCheck    : %d
z#  dwLastSuccessfulXfr         : %d
z#  fQueuedForBackgroundLoad    : %s
z#  fBackgroundLoadInProgress   : %s
z#  fReadOnlyZone               : %s
z#  dwLastXfrAttempt            : %d
z#  dwLastXfrResult             : %d
)/rr   pszZoneNamer9   
dwZoneTyper)   ZfReverser;   rs   ZfPausedZ	fShutdownZfAutoCreatedZfUseDatabaseZpszDataFiler   ZDNSSRV_TYPEID_ZONE_INFOrK   Z
aipMastersrS   r<   ZfSecureSecondariesr=   ZfNotifyLevelZaipSecondariesZ	aipNotifyZfUseWinsZ
fUseNbstatfAgingZdwNoRefreshIntervalZdwRefreshIntervalZdwAvailForScavengeTimeZaipScavengeServersZDNSSRV_TYPEID_ZONE_INFO_W2Krt   ZdwForwarderTimeoutZfForwarderSlaveZaipLocalMastersr@   	dwDpFlags	pszDpFqdnZ
pwszZoneDnZdwLastSuccessfulSoaCheckZdwLastSuccessfulXfrZfQueuedForBackgroundLoadZfBackgroundLoadInProgressZfReadOnlyZoneZdwLastXfrAttemptZdwLastXfrResult)ru   rv   zoneinfor"   r"   r#   print_zoneinfo  s    
r   c                 C   sz   |  d|j  |  dt|j  |  dt|j  |  d|j  |tjkrv|  dt	|j
  |  d|j  d S )Nry   z#  Flags                       : %s
z#  ZoneType                    : %s
z#  Version                     : %s
rz   r{   )rr   r|   rB   ZFlagsr9   ZZoneTypeZVersionr   DNSSRV_TYPEID_ZONE_W2Kr@   r   r   )ru   rv   zoner"   r"   r#   
print_zoneY  s    
r   c                 C   s6   |  d|j  |jD ]}|  d t| || qd S )Nz  %d zone(s) found

)rr   ZdwZoneCountZ	ZoneArrayr   )ru   rv   Zzonesr   r"   r"   r#   print_enumzonesd  s    

r   c                 C   sr  |j tjkrd|j }n8|j tjkr4d|j }n|j tjkrPd|jj }n|j tjkrjd|jj }n|j tjkrd|jj }n|j tj	krd|jj
|jj|jj|jj|jj|jjj|jjjf }n|j tjkrd|jjj|jjf }nf|j tjkrd|jjj|jj|jj|jjf }n4|j tjkrNd	d
 |jjD }dd| }nd}| d||j|j|jf  d S )NzA: %szAAAA: %szPTR: %szNS: %sz	CNAME: %szKSOA: serial=%d, refresh=%d, retry=%d, expire=%d, minttl=%d, ns=%s, email=%szMX: %s (%d)zSRV: %s (%d, %d, %d)c                 S   s   g | ]}d |j  qS )z"%s")str).0namer"   r"   r#   
<listcomp>      z$print_dns_record.<locals>.<listcomp>zTXT: %s,z	Unknown: z%    %s (flags=%x, serial=%d, ttl=%d)
)wTyper   r^   datar_   r`   r   ra   rb   rc   
dwSerialNo	dwRefreshdwRetrydwExpiredwMinimumTtlNamePrimaryServerZoneAdministratorEmailrd   nameExchangewPreferencere   
nameTargetwPort	wPrioritywWeightrf   joinrr   dwFlagsdwSerialdwTtlSeconds)ru   recZmesgslistr"   r"   r#   print_dns_recordk  sB    r   c                 C   sB   |j D ]6}| d|jj|j|jf  |jD ]}t| | q,qd S )Nz#  Name=%s, Records=%d, Children=%d
)r   rr   ZdnsNodeNamer   ZwRecordCountZdwChildCountrecordsr   )ru   r   r   Zdns_recr"   r"   r#   print_dnsrecords  s    

r   c              	   C   s  | t jkrt|}n| t jkr,t|}n| t jkrBt|}n| t jkrXt|}nz| t j	krnt
|}nd| t jkr| }t|dkrtd|d }t|d }t||}n| t jkr| }t|dkrtd|d }t|d }t|d }t|d }	t||||	d}n| t jkr| }t|d	krFtd
|d }
|d }t|d }t|d }t|d }t|d }t|d }t|
||||||d}n(| t jkrt|}t|}ntd|S )NrL   z2Data requires 2 elements - mail_server, preferencer   r%   rM   z9Data requires 4 elements - server, port, priority, weight   )priorityweight   zXData requires 7 elements - nameserver, email, serial, refresh, retry, expire, minimumttl      )serialrefreshretryexpireminimumzUnsupported record type)r   r^   r   r_   r   r`   r   rb   r   ra   r   rd   splitlenr   intr   re   r   rc   r   rf   shlexr   )rh   r   r   tmpZmail_serverZ
preferencer   Zportr   r   Z
nameserverZemailr   r   r   r   r   r   r"   r"   r#   data_to_dns_record  sZ    








r   c                 C   s    | j d |j d kS )N.)r   rstripr   )Zn1Zn2r"   r"   r#   dns_name_equal  s    r   c                 C   s  t ||}tj}z&| tjd|||d ||d d 
\}}	W nF ty| }
 z.|
jd tjkrdW Y d }
~
d S |
W Y d }
~
n
d }
~
0 0 |	r|	j	dkrd S |	j
d jD ]J}|j|krqd}|tjkr|j|jkrd}n|tjkr|j|jkrd}n|tjkrt|j|jrd}n|tjkr6t|j|jrd}n|tjkrZt|j|jrd}n|tjkrt|jj|jjr|jj|jjkrd}nH|tjkr|jj|jjkr|jj|jjkr|jj|jjkrt|jj|jjrd}n|tjkr|jj|jjkr|jj|jjkr|jj |jj kr|jj!|jj!kr|jj"|jj"krt|jj#|jj#rt|jj$|jj$rd}nX|tj%kr|jj	|jj	krd}t&|jj	D ](}|o|jj'| j'|jj'| j'k}q|r|  S qd S )Nr   FT)(r   r   DNS_RPC_VIEW_AUTHORITY_DATADnssrvEnumRecords2rl   r   argsr   "WERR_DNS_ERROR_NAME_DOES_NOT_EXISTcountr   r   r   r   r^   r   r_   r`   r   rb   ra   rd   r   r   re   r   r   r   r   rc   r   r   r   r   r   r   r   rf   rD   r   )r    r   r   r   rh   r   Zurecselect_flagsbuflenresr!   r   foundrI   r"   r"   r#   dns_record_match  s    



	
r   c                   @   sP   e Zd ZdZdZdgZejejej	dZ
eddddg d	d
dgZdddZdS )cmd_serverinfozQuery for Server information.%prog <server> [options]r   	sambaoptsversionoptscredopts--client-versionClient Versionlonghornw2k|dotnet|longhornZw2kZdotnetr   cli_verhelpdefaultmetavarchoicesdestNc           
      C   sX   |  | _|| j| _t|| j| j}t|}||d|d d\}}	t| j||	 d S )Nr   Z
ServerInfo)	get_loadparmr   get_credentialsr   r$   ro   DnssrvQuery2rx   ru   )
selfr   r   r   r   r   r    rn   rv   r   r"   r"   r#   run+  s    

zcmd_serverinfo.run)NNN__name__
__module____qualname____doc__synopsis
takes_argsoptionsSambaOptionsVersionOptionsCredentialsOptionstakes_optiongroupsr   Ztakes_optionsr   r"   r"   r"   r#   r     s     r   c                   @   sR   e Zd ZdZdZddgZejejej	dZ
edddd	g d
ddgZdddZdS )cmd_zoneinfozQuery for zone information.%prog <server> <zone> [options]r   r   r   r   r   r   r   r   r   r   Nc                 C   sX   |  | _|| j| _t|| j| j}t|}||d||d\}	}
t| j|	|
 d S )Nr   ZZoneInfo)	r   r   r   r   r$   ro   r   r   ru   )r   r   r   r   r   r   r   r    rn   rv   r   r"   r"   r#   r   K  s    
zcmd_zoneinfo.run)NNNr   r"   r"   r"   r#   r   8  s     r   c                   @   s   e Zd ZdZdZdgZejejej	dZ
eddddg d	d
dedddddedddddedddddedddddedddddeddddded d!dd"ded#d$dd%dg	Zd*d(d)Zd'S )+cmd_zonelistzQuery for zones.r   r   r   r   r   r   r   r   r   r   z	--primaryzList primary zones (default)
store_trueprimaryr   actionr   z--secondaryzList secondary zones	secondary--cachezList cached zonescachez--autoz List automatically created zonesautoz	--forwardzList forward zonesforwardz	--reversezList reverse zonesreversez--dszList directory integrated zonesdsz--non-dszList non-directory zonesnondsFNc              	   C   s   d}|r|t jO }|r |t jO }|r.|t jO }|r<|t jO }|rJ|t jO }|rX|t jO }|	rf|t jO }|
rt|t jO }|dkrt j}|	 | _
|| j
| _t|| j
| j}t|}||d|d dt j|\}}|t jkrt j}nt j}t| j|| d S )Nr   Z	EnumZones)r   ZDNS_ZONE_REQUEST_PRIMARYZDNS_ZONE_REQUEST_SECONDARYZDNS_ZONE_REQUEST_CACHEZDNS_ZONE_REQUEST_AUTOZDNS_ZONE_REQUEST_FORWARDZDNS_ZONE_REQUEST_REVERSEZDNS_ZONE_REQUEST_DSZDNS_ZONE_REQUEST_NON_DSr   r   r   r   r$   ro   ZDnssrvComplexOperation2ZDNSSRV_TYPEID_DWORDrj   r   ZDNSSRV_TYPEID_ZONEr   ru   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zrequest_filterr    rn   rv   r   r"   r"   r#   r   {  sB    









zcmd_zonelist.run)FFFFFFFFNNNr   r"   r"   r"   r#   r   X  sP      r   c                   @   sR   e Zd ZdZdZddgZejejej	dZ
edddd	g d
ddgZdddZdS )cmd_zonecreatezCreate a zone.r   r   r   r   r   r   r   r   r   r   r   Nc              
   C   s  |  | _|| j| _t|| j| j}| }t|}|tjkrrtj	}	t
 }
||
_tj|
_d|
_d|
_d|
_nx|tjkrtj}	t }
||
_tj|
_d|
_d|
_d|
_tj|
_n6tj}	t }
||
_tj|
_d|
_d|
_d|
_tj|
_||d|d dd|	|
}tj}	t }d|_tj|_z||d||dd|	|}W nH ty } z.|j d t!j"krj| j#$d |W Y d }~n
d }~0 0 | j#$d|  d S )Nr   r%   Z
ZoneCreateZAllowUpdateZResetDwordPropertyzZone already exists.zZone %s created successfully
)%r   r   r   r   r$   r   ro   r   rj   ZDNSSRV_TYPEID_ZONE_CREATE_W2KZDNS_RPC_ZONE_CREATE_INFO_W2Kr|   r   r7   r}   r~   ZfDsIntegratedZfLoadExistingrk   Z DNSSRV_TYPEID_ZONE_CREATE_DOTNETZDNS_RPC_ZONE_CREATE_INFO_DOTNETr>   r   ZDNSSRV_TYPEID_ZONE_CREATEZ!DNS_RPC_ZONE_CREATE_INFO_LONGHORNDnssrvOperation2ZDNSSRV_TYPEID_NAME_AND_PARAMZDNS_RPC_NAME_AND_PARAMZpszNodeNamer:   ZdwParamr   r   r   Z"WERR_DNS_ERROR_ZONE_ALREADY_EXISTSru   rr   )r   r   r   r   r   r   r   r    rn   rv   Zzone_create_infor   Zname_and_paramr!   r"   r"   r#   r     s`    



zcmd_zonecreate.run)NNNr   r"   r"   r"   r#   r     s     r   c                   @   s8   e Zd ZdZdZddgZejejej	dZ
d	ddZdS )
cmd_zonedeletezDelete a zone.r   r   r   r   Nc           	   
   C   s   |  | _|| j| _t|| j| j}| }z |tjd||ddtj	d }W n@ t
y } z(|jd tjkrxtd|W Y d }~n
d }~0 0 | jd|  d S )Nr   ZDeleteZoneFromDsz0Zone does not exist and so could not be deleted.zZone %s deleted successfully
)r   r   r   r   r$   r   r   r   rl   ZDNSSRV_TYPEID_NULLr   r   r   Z"WERR_DNS_ERROR_ZONE_DOES_NOT_EXISTr   ru   rr   )	r   r   r   r   r   r   r    r   r!   r"   r"   r#   r     s    

zcmd_zonedelete.run)NNNr   r   r   r   r   r   r   r   r   r   r   r   r"   r"   r"   r#   r     s     r   c                   @   s   e Zd ZdZdZg dZejejej	dZ
eddddd	ed
dddd	eddddd	eddddd	eddddd	eddddd	eddddd	gZd ddZdS )!	cmd_queryzQuery a name.zO%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|MX|NS|SOA|SRV|TXT|ALL> [options])r   r   r   rg   r   z--authorityz&Search authoritative records (default)r   	authorityr   r   zSearch cached recordsr   z--gluezSearch glue recordsgluez--rootzSearch root hintsrootz--additionalzList additional records
additionalz--no-childrenzDo not list childrenno_childrenz--only-childrenzList only childrenonly_childrenFNc                 C   sj  t |}|ddkr&| jd|  d}|r8|tjO }|rF|tjO }|rT|tjO }|rb|tjO }|	rp|tj	O }|
r~|tj
O }|r|tjO }|dkrtj}|tj	kr| jd | jd |tjO }| | _|| j| _t|| j| j}z&|tjd|||d ||d d 
\}}W nD tyX } z*|jd tjkr@td|W Y d }~n
d }~0 0 t| j| d S )N*z-use "@" to dump entire domain, looking up %s
r   z>Specify either --authority or --root along with --additional.
zAssuming --authority.
Record or zone does not exist.)ri   findru   rr   r   r   ZDNS_RPC_VIEW_CACHE_DATAZDNS_RPC_VIEW_GLUE_DATADNS_RPC_VIEW_ROOT_HINT_DATADNS_RPC_VIEW_ADDITIONAL_DATAZDNS_RPC_VIEW_NO_CHILDRENZDNS_RPC_VIEW_ONLY_CHILDRENr   r   r   r   r$   r   rl   r   r   r   r   r   r   )r   r   r   r   rg   r   r   r   r   r   r   r   r   r   r   rh   r   r    r   r   r!   r"   r"   r#   r   5  sN    










zcmd_query.run)
FFFFFFFNNNr   r"   r"   r"   r#   r     sD       r   c                   @   s8   e Zd ZdZdZddgZejejej	dZ
d
dd	ZdS )cmd_roothintszQuery root hints.z!%prog <server> [<name>] [options]r   zname?r   r   Nc                 C   sl   t j}tjtjB }| | _|| j| _t	|| j| j}|
tjd|d|d ||d d 
\}	}
t| j|
 d S )Nr   z..RootHints)r   ra   r   r  r  r   r   r   r   r$   r   rl   r   ru   )r   r   r   r   r   r   rh   r   r    r   r   r"   r"   r#   r   t  s    

zcmd_roothints.run)r   NNNr   r"   r"   r"   r#   r  g  s     r  c                   @   s8   e Zd ZdZdZg dZejejej	dZ
dddZdS )	cmd_add_recordak  Add a DNS record

       For each type data contents are as follows:
         A      ipv4_address_string
         AAAA   ipv6_address_string
         PTR    fqdn_string
         CNAME  fqdn_string
         NS     fqdn_string
         MX     "fqdn_string preference"
         SRV    "fqdn_string port priority weight"
         TXT    "'string1' 'string2' ..."
    D%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|NS|MX|SRV|TXT> <data>r   r   r   rg   r   r   Nc	              
   C   s   |  dvrtd| t|}	t|	|}
| | _|| j| _t|| j| j}t	
 }|
|_z|t	jd||||d  W nh ty } zP|jd tjkrtd||f |jd tjkrtd||f |W Y d }~n
d }~0 0 | jd d S )NrT   rU   rV   rX   rW   rZ   r[   r\   z)Adding record of type %s is not supportedr   zAZone does not exist; record could not be added. zone[%s] name[%s]zBRecord already exist; record could not be added. zone[%s] name[%s]zRecord added successfully
)r]   r   ri   r   r   r   r   r   r$   r   DNS_RPC_RECORD_BUFr   DnssrvUpdateRecord2rl   r   r   r   r   Z$WERR_DNS_ERROR_RECORD_ALREADY_EXISTSru   rr   )r   r   r   r   rg   r   r   r   r   rh   r   r    add_rec_bufr!   r"   r"   r#   r     s(    

zcmd_add_record.run)NNNr   r"   r"   r"   r#   r    s     r  c                   @   s8   e Zd ZdZdZg dZejejej	dZ
dddZdS )	cmd_update_recorda  Update a DNS record

       For each type data contents are as follows:
         A      ipv4_address_string
         AAAA   ipv6_address_string
         PTR    fqdn_string
         CNAME  fqdn_string
         NS     fqdn_string
         MX     "fqdn_string preference"
         SOA    "fqdn_dns fqdn_email serial refresh retry expire minimumttl"
         SRV    "fqdn_string port priority weight"
         TXT    "'string1' 'string2' ..."
    zU%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|NS|MX|SOA|SRV|TXT> <olddata> <newdata>)r   r   r   rg   olddatanewdatar   Nc
              
   C   s  |  dvrtd| t|}
t|
|}| | _|| j| _t|| j| j}t	|||||
|}|sptd|j
|_
|j|_|j|_|j|_t }||_t }||_z|tjd||||| W nB ty
 } z(|jd tjkrtd|W Y d }~n
d }~0 0 | jd d S )N)	rT   rU   rV   rX   rW   rZ   rY   r[   r\   z+Updating record of type %s is not supportedr  r   z1Zone does not exist; record could not be updated.zRecord updated successfully
)r]   r   ri   r   r   r   r   r   r$   r   r   r   r   ZdwTimeStampr   r  r   r  rl   r   r   r   r   ru   rr   )r   r   r   r   rg   r  r  r   r   r   rh   r   r    Z	rec_matchr  del_rec_bufr!   r"   r"   r#   r     sD    

zcmd_update_record.run)NNNr   r"   r"   r"   r#   r    s    r  c                   @   s8   e Zd ZdZdZg dZejejej	dZ
dddZdS )	cmd_delete_recordan  Delete a DNS record

       For each type data contents are as follows:
         A      ipv4_address_string
         AAAA   ipv6_address_string
         PTR    fqdn_string
         CNAME  fqdn_string
         NS     fqdn_string
         MX     "fqdn_string preference"
         SRV    "fqdn_string port priority weight"
         TXT    "'string1' 'string2' ..."
    r	  r
  r   Nc	              
   C   s   |  dvrtd| t|}	t|	|}
| | _|| j| _t|| j| j}t	
 }|
|_z|t	jd|||d | W nh ty } zP|jd tjkrtd||f |jd tjkrtd||f |W Y d }~n
d }~0 0 | jd d S )Nr  z+Deleting record of type %s is not supportedr   zCZone does not exist; record could not be deleted. zone[%s] name[%s]zERecord does not exist; record could not be deleted. zone[%s] name[%s]zRecord deleted successfully
)r]   r   ri   r   r   r   r   r   r$   r   r  r   r  rl   r   r   r   r   Z$WERR_DNS_ERROR_RECORD_DOES_NOT_EXISTru   rr   )r   r   r   r   rg   r   r   r   r   rh   r   r    r  r!   r"   r"   r#   r     s2    

zcmd_delete_record.run)NNNr   r"   r"   r"   r#   r     s   r  c                   @   sX   e Zd ZdZdZddgZejejej	dZ
edddd	d
edddd	d
gZdddZdS )cmd_cleanup_recorda\  Cleanup DNS records for a DNS host.

    example:

        samba-tool dns cleanup dc1 dc1.samdom.test.site -U USER%PASSWORD

    NOTE: This command in many cases will only mark the `dNSTombstoned` attr
    as `TRUE` on the DNS records. Querying will no longer return results but
    there may still be some placeholder entries in the database.
    z%prog <server> <dnshostname>r   dnshostnamer   z-vz	--verbosez
Be verboser   )r   r   z-qz--quietzBe quietNFc                 C   sL   |  }||}	| j||d}
td| t |	|d}tj||
|dd d S )N)verbosequietz	ldap://%s)ZurlZsession_infoZcredentialsr   T)Zignore_no_name)r   r   Z
get_loggerr
   r   r	   Zremove_dns_references)r   r   r  r   r   r   r  r  r   r   ZloggerZsamdbr"   r"   r#   r   T  s    

zcmd_cleanup_record.run)NNNFFr   r"   r"   r"   r#   r  9  s     r  c                   @   s   e Zd ZdZi Ze ed< e ed< e ed< e ed< e	 ed< e
 ed< e ed< e ed	< e ed
< e ed< e ed< dS )cmd_dnsz%Domain Name Service (DNS) management.rw   r   ZzonelistZ
zonecreateZ
zonedeleteZqueryZ	roothintsaddupdatedeleteZcleanupN)r   r   r   r   Zsubcommandsr   r   r   r   r   r   r  r  r  r  r  r"   r"   r"   r#   r  c  s   









r  )KZloggingZsamba.getoptZgetoptr   Zsambar   r   rQ   r   Zsocketr   r   r   r   r   r	   Zsamba.samdbr
   Z
samba.authr   Zsamba.netcmdr   r   r   r   Zsamba.dcerpcr   r   Zsamba.dnsserverr   r   r   r   r   r   r   r   r   r$   r)   r/   r3   r5   r6   r9   r;   r<   r=   r@   rB   rK   rS   ri   ro   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r"   r"   r"   r#   <module>   sj   ,

	
HA"2I  OM"Q5G9*