
    g                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJ	r	J
r
  S SKJr  S SKJr  S SKrS SKrS SKrS SKJrJr  S SKrS S	KJrJr  S S
KJr  S SKJr  S SKJrJrJrJr  S SKJrJ r   S SK!J"r"J#r#J$r$  S SK!J%r%  S r& " S S5      r'S r(S r)S r*S r+S r,S r-S r.S r/S r0S r1S r2S r3S r4S  r5S! r6S" r7S# r8S$ r9S% r:S& r;S' r<S( r= " S) S*\5      r>S+ r? " S, S-\5      r@ " S. S/\5      rA " S0 S1\5      rB " S2 S3\5      rC " S4 S5\5      rD " S6 S7\5      rE " S8 S9\5      rF " S: S;\5      rG " S< S=\5      rH " S> S?\5      rI " S@ SA\5      rJ " SB SC\5      rKg)D    N)WERRORError)werror)pack)	inet_ntop	inet_pton)AF_INET)AF_INET6)
ndr_unpackndr_pack)	remove_dcdsdb_dns)SamDB)system_session)CommandCommandErrorOptionSuperCommand)dnsp	dnsserver)record_from_stringDNSParseErrorflag_from_string)dns_record_matchc                     U R                  5       S:X  a  Sn SU -  n [        R                  " X1U5      nU$ ! [         a  n[        SU < SU< 35      eS nAff = f)N	localhostz	127.0.0.1zncacn_ip_tcp:%s[sign]zConnecting to DNS RPC server z failed with )lowerr   RuntimeErrorr   )serverlpcredsbinding_strdns_connes         2/usr/lib/python3/dist-packages/samba/netcmd/dns.pydns_connectr%   /   sc    ||~$)F2K[&&{> O  [vWXYZZ[s   6 
A AAc            
           \ rS rSrSr\R                  S\R                  S\R                  S\R                  S\R                  S0rS rS	 rS
rg)DnsConnWrapper;   a  A wrapper around a dnsserver.dnsserver connection that makes it
harder not to report friendly messages.

If, rather than

    dns_conn = dns_connect(server, lp, creds)

you use

    dns_conn = DnsConnWrapper(server, lp, creds)

then various common errors (for example, misspelled zones) on
common operations will raise CommandErrors that turn into
relatively nice messages (when compared to tracebacks).

In addition, if you provide a messages keyword argument, it will
override the defaults. Note that providing None will turn off the
default, letting the original exception shine through.

    messages = {
        werror.WERR_DNS_ERROR_ZONE_DOES_NOT_EXIST: (
            f'Zone {zone} does not exist and so could not be deleted.'),
        werror.WERR_DNS_ERROR_NAME_DOES_NOT_EXIST: None
    }
    res = dns_conn.DnssrvOperation2( # ...
                                    messages=messages)

This example changes the message for ZONE_DOES_NOT_EXIST and
avoids catching NAME_DOES_NOT_EXIST.

Only WERRORErrors are intercepted.
zCould not contact RPC serverzZone already existszThe record does not existzThe zone does not existzInsufficient permissionsc                 &    [        XU5      U l        g N)r%   r"   )selfr   r   r    s       r$   __init__DnsConnWrapper.__init__e   s    #F6    c                 \   ^ ^ [        T R                  U5      mUS;  a  T$ S S.UU 4S jjnU$ )N>   DnssrvQuery2DnssrvOperation2DnssrvEnumRecords2DnssrvUpdateRecord2DnssrvComplexOperation2messagesc                    > U c  0 n  T" U6 $ ! [          a`  nUR                  u  p4X0;   a  Uc  e [        X    SU S3U5      eUTR                  ;   a  [        TR                  U    SU S3U5      ee S nAff = f)N [])r   argsr   default_messages)r6   r:   r#   werrerrstrattrr+   s        r$   f%DnsConnWrapper.__getattr__.<locals>.fr   s    T{" 	 vv#|&(.)9F81'EqII4000&$*?*?*E)FbPQ'RTUVV	s    
A7AA22A7)getattrr"   )r+   namer?   r>   s   `  @r$   __getattr__DnsConnWrapper.__getattr__h   s;    t}}d+ ' ' K" 	 	" r.   )r"   N)__name__
__module____qualname____firstlineno____doc__r   WERR_DNS_ERROR_DS_UNAVAILABLE"WERR_DNS_ERROR_ZONE_ALREADY_EXISTS$WERR_DNS_ERROR_RECORD_DOES_NOT_EXIST"WERR_DNS_ERROR_NAME_DOES_NOT_EXISTWERR_ACCESS_DENIEDr;   r,   rC   __static_attributes__ r.   r$   r'   r'   ;   sX    D 	,,.L113H335P114M!!#=7r.   r'   c                 8    U S:X  a  SnU$ U S:X  a  SnU$ SU -  nU$ )Nr   FALSE   TRUEUNKNOWN (0x%x)rP   )flagrets     r$   bool_stringrX      s;    qy
 J	 
 J %Jr.   c                 Z    S nU H  nU[        X5      :X  d  M  Un  O   U(       d  SU-  nU$ )NrU   rA   )module	enum_defsvaluerW   r#   s        r$   enum_stringr^      s:    
CGF&&C  &Jr.   c                 h    SnU H   nU[        X5      -  (       d  M  USU-  -  nM"     U(       d  SnU$ )N z%s NONErZ   )r[   bitmap_defsr]   rW   bs        r$   bitmap_stringrd      s>    
C76%%%519C  Jr.   c                 *    / SQn[        [        X5      $ )N)DNS_BOOT_METHOD_UNINITIALIZEDDNS_BOOT_METHOD_FILEDNS_BOOT_METHOD_REGISTRYDNS_BOOT_METHOD_DIRECTORYr^   r   )boot_methodr\   s     r$   boot_method_stringrl      s    JIy)99r.   c                 *    / SQn[        [        X5      $ )N)DNS_ALLOW_RFC_NAMES_ONLYDNS_ALLOW_NONRFC_NAMESDNS_ALLOW_MULTIBYTE_NAMESDNS_ALLOW_ALL_NAMESrj   )
check_flagr\   s     r$   name_check_flag_stringrs      s    EIy)88r.   c                 *    / SQn[        [        X5      $ )N)DNS_ZONE_TYPE_CACHEDNS_ZONE_TYPE_PRIMARYDNS_ZONE_TYPE_SECONDARYDNS_ZONE_TYPE_STUBDNS_ZONE_TYPE_FORWARDERDNS_ZONE_TYPE_SECONDARY_CACHEr^   r   )	zone_typer\   s     r$   zone_type_stringr}      s    MI tY22r.   c                 *    / SQn[        [        X5      $ )N)DNS_ZONE_UPDATE_OFFDNS_ZONE_UPDATE_UNSECUREDNS_ZONE_UPDATE_SECUREr{   )zone_updater\   s     r$   zone_update_stringr      s    +ItY44r.   c                 *    / SQn[        [        X5      $ )N)DNS_ZONE_SECSECURE_NO_SECURITYDNS_ZONE_SECSECURE_NS_ONLYDNS_ZONE_SECSECURE_LIST_ONLYDNS_ZONE_SECSECURE_NO_XFERrj   )securityr\   s     r$   zone_secondary_security_stringr      s    OIy)66r.   c                 *    / SQn[        [        X5      $ )N)DNS_ZONE_NOTIFY_OFFDNS_ZONE_NOTIFY_ALL_SECONDARIESDNS_ZONE_NOTIFY_LIST_ONLYrj   )notify_levelr\   s     r$   zone_notify_level_stringr      s    .Iy)::r.   c                 *    / SQn[        [        X5      $ )N)DNS_DP_AUTOCREATEDDNS_DP_LEGACYDNS_DP_DOMAIN_DEFAULTDNS_DP_FOREST_DEFAULTDNS_DP_ENLISTEDDNS_DP_DELETEDrd   r   )dp_flagsrb   s     r$   dp_flags_stringr      s    QKK::r.   c                 *    / SQn[        [        X5      $ )N)	DNS_RPC_ZONE_PAUSEDDNS_RPC_ZONE_SHUTDOWNDNS_RPC_ZONE_REVERSEDNS_RPC_ZONE_AUTOCREATEDDNS_RPC_ZONE_DSINTEGRATEDDNS_RPC_ZONE_AGINGDNS_RPC_ZONE_UPDATE_UNSECUREDNS_RPC_ZONE_UPDATE_SECUREDNS_RPC_ZONE_READONLYr   )flagsrb   s     r$   zone_flags_stringr      s    ,K
 K77r.   c           	          / nU (       d  U$ [        U R                  5       H;  n[        [        [	        SU R
                  U   5      5      nUR                  U5        M=     U$ )NI)range	AddrCountr   r   r   	AddrArrayappend)arrayrW   iaddrs       r$   ip4_array_stringr      sQ    
C
5??#$sEOOA,>"?@

4 $ Jr.   c                    / nU (       d  U$ [        U R                  5       H  nU R                  U   R                  S   S:X  aB  [        R
                  " S/U R                  U   R                  SS Q76 n[        [        U5      nOdU R                  U   R                  S   S:X  aB  [        R
                  " S/U R                  U   R                  SS Q76 n[        [        U5      nOS	nUR                  U5        M     U$ )
Nr      4B         16B   UNKNOWN)
r   r   r   MaxSastructr   r   r   r	   r   )r   rW   r   xr   s        r$   dns_addr_array_stringr      s    
C
5??#??1##A&$.DA5??1#5#;#;Aa#@AAWa(D__Q%%a(D0ECEOOA$6$<$<Qr$BCAXq)DD

4 $ Jr.   c                 b     [        U 5      $ ! [         a  n[        UR                  6 eS nAff = fr*   )r   r   r   r:   )rec_typer#   s     r$   dns_type_flagr      s1    $)) $AFF##$s   
 
.).c                     U R                  5       nUS:X  a  [        R                  nU$ US:X  a  [        R                  nU$ US:X  a  [        R                  nU$ [        SU -  5      e)NW2KDOTNETLONGHORNzUnknown client version %s)upperr   DNS_CLIENT_VERSION_W2KDNS_CLIENT_VERSION_DOTNETDNS_CLIENT_VERSION_LONGHORNr   )cli_versionversionclient_versions      r$   dns_client_versionr      sx    !G%"99  
H	"<<
 	 
J	">>  6DEEr.   c                    U R                  SUR                  -  5        U R                  S[        UR                  5      -  5        U R                  S[	        UR
                  5      -  5        U R                  S[	        UR                  5      -  5        U R                  S[	        UR                  5      -  5        U R                  SUR                  -  5        U R                  SUR                  -  5        U[        R                  :w  av  U R                  S[        UR                  5      -  5        U R                  S	[        UR                  5      -  5        U R                  S
[        UR                  5      -  5        OuU R                  S[!        UR                  5      -  5        U R                  S	[!        UR                  5      -  5        U R                  S
[!        UR                  5      -  5        U R                  SUR"                  -  5        U R                  SUR$                  -  5        U R                  SUR&                  -  5        U R                  SUR(                  -  5        U R                  S[+        UR,                  5      -  5        U R                  SUR.                  -  5        U R                  SUR0                  -  5        U R                  SUR2                  -  5        U R                  SUR4                  -  5        U R                  SUR6                  -  5        U R                  SUR8                  -  5        U R                  SUR:                  -  5        U R                  SUR<                  -  5        U R                  S[	        UR>                  5      -  5        U R                  S[	        UR@                  5      -  5        U R                  S[	        URB                  5      -  5        U R                  S[	        URD                  5      -  5        U R                  S[	        URF                  5      -  5        U R                  S[	        URH                  5      -  5        U R                  S[	        URJ                  5      -  5        U R                  S[	        URL                  5      -  5        U R                  S [	        URN                  5      -  5        U R                  S![	        URP                  5      -  5        U R                  S"[	        URR                  5      -  5        U R                  S#[	        URT                  5      -  5        U R                  S$[	        URV                  5      -  5        U[        RX                  :w  Ga  U R                  S%URZ                  -  5        U R                  S&[!        UR\                  5      -  5        U R                  S'UR^                  -  5        U R                  S(UR`                  -  5        U R                  S)URb                  -  5        U R                  S*URd                  -  5        U R                  S+URf                  -  5        U R                  S,URh                  -  5        U R                  S-URj                  -  5        U R                  S.URl                  -  5        U R                  S/URn                  -  5        U R                  S0URp                  -  5        U R                  S1URr                  -  5        U R                  S2URt                  -  5        U[        R                  :X  a(  U R                  S3[	        URv                  5      -  5        g g )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
)<write	dwVersionrl   fBootMethodrX   fAdminConfiguredfAllowUpdatefDsAvailablepszServerNamepszDsContainerr   DNSSRV_TYPEID_SERVER_INFOr   aipServerAddrsaipListenAddrsaipForwardersr   
dwLogLeveldwDebugLeveldwForwardTimeoutdwRpcProtocolrs   dwNameCheckFlagcAddressAnswerLimitdwRecursionRetrydwRecursionTimeoutdwMaxCacheTtldwDsPollingIntervaldwScavengingIntervaldwDefaultRefreshIntervaldwDefaultNoRefreshIntervalfAutoReverseZonesfAutoCacheUpdatefRecurseAfterForwardingfForwardDelegationsfNoRecursionfSecureResponsesfRoundRobinfLocalNetPriorityfBindSecondariesfWriteAuthorityNsfStrictFileParsingfLooseWildcardingfDefaultAgingStateDNSSRV_TYPEID_SERVER_INFO_W2KdwRpcStructureVersionaipLogFilterpwszLogFilePathpszDomainNamepszForestNamepszDomainDirectoryPartitionpszForestDirectoryPartitiondwLocalNetPriorityNetMaskdwLastScavengeTimedwEventLogLeveldwLogFileMaxSizedwDsForestVersiondwDsDomainVersiondwDsDsaVersionfReadOnlyDC)outftypeid
serverinfos      r$   print_serverinfor	    s   JJ7*:N:NNOJJ58J:KaKa8bbcJJ5JD_D_8``aJJ5JD[D[8\\]JJ5JD[D[8\\]JJ5
8P8PPQJJ5
8Q8QQR444

9#J$=$=>? 	@

9#J$=$=>? 	@

9#J$<$<=> 	? 	

9()B)BCD 	E

9()B)BCD 	E

9()A)ABC 	D 	JJ5
8M8MMNJJ5
8O8OOPJJ5
8S8SSTJJ7*:R:RRSJJ58NzOiOi8jjkJJ5
8V8VVWJJ5
8S8SSTJJ5
8U8UUVJJ5
8P8PPQJJ5
8V8VVWJJ5
8W8WWXJJ5
8[8[[\JJ5
8]8]]^JJ5JD`D`8aabJJ5JD_D_8``aJJ5JDfDf8gghJJ5JDbDb8ccdJJ5JD[D[8\\]JJ5JD_D_8``aJJ5JDZDZ8[[\JJ5JD`D`8aabJJ5JD_D_8``aJJ5JD`D`8aabJJ5JDaDa8bbcJJ5JD`D`8aabJJ5JDaDa8bbc888

;j>^>^^_

9<QR\RiRi<jjk

9J<V<VVW

9J<T<TTU

9J<T<TTU

9J<b<bbc

9J<b<bbc

;j>b>bbc

9J<Y<YYZ

9J<V<VVW

9J<W<WWX

9J<X<XXY

9J<X<XXY

9J<U<UUV444

9K
H^H^<__` 5r.   c                 4   U R                  SUR                  -  5        U R                  S[        UR                  5      -  5        U R                  S[	        UR
                  5      -  5        U R                  S[        UR                  5      -  5        U R                  S[	        UR                  5      -  5        U R                  S[	        UR                  5      -  5        U R                  S[	        UR                  5      -  5        U R                  S[	        UR                  5      -  5        U R                  S	UR                  -  5        U[        R                  :w  a(  U R                  S
[        UR                   5      -  5        O'U R                  S
[#        UR                   5      -  5        U R                  S[%        UR&                  5      -  5        U R                  S[)        UR*                  5      -  5        U[        R                  :w  aO  U R                  S[        UR,                  5      -  5        U R                  S[        UR.                  5      -  5        ONU R                  S[#        UR,                  5      -  5        U R                  S[#        UR.                  5      -  5        U R                  S[	        UR0                  5      -  5        U R                  S[	        UR2                  5      -  5        U R                  S[	        UR4                  5      -  5        U R                  SUR6                  -  5        U R                  SUR8                  -  5        U R                  SUR:                  -  5        U[        R                  :w  a(  U R                  S[        UR<                  5      -  5        O'U R                  S[#        UR<                  5      -  5        U[        R>                  :w  Ga\  U R                  SUR@                  -  5        U R                  SURB                  -  5        U R                  SURD                  -  5        U[        R                  :w  a(  U R                  S[        URF                  5      -  5        O'U R                  S[#        URF                  5      -  5        U R                  S[I        URJ                  5      -  5        U R                  SURL                  -  5        U R                  SURN                  -  5        U R                  SURP                  -  5        U R                  SURR                  -  5        U[        R                  :X  a  U R                  S[	        URT                  5      -  5        U R                  S [	        URV                  5      -  5        U R                  S![	        URX                  5      -  5        U R                  S"URZ                  -  5        U R                  S#UR\                  -  5        g g )$N#  pszZoneName                 : %s
z#  dwZoneType                  : %s
z#  fReverse                    : %s
r   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
r   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
)/r   pszZoneNamer}   
dwZoneTyperX   fReverser   r   fPaused	fShutdownfAutoCreatedfUseDatabasepszDataFiler   DNSSRV_TYPEID_ZONE_INFOr   
aipMastersr   r   fSecureSecondariesr   fNotifyLevelaipSecondaries	aipNotifyfUseWins
fUseNbstatfAgingdwNoRefreshIntervaldwRefreshIntervaldwAvailForScavengeTimeaipScavengeServersDNSSRV_TYPEID_ZONE_INFO_W2Kr   dwForwarderTimeoutfForwarderSlaveaipLocalMastersr   	dwDpFlags	pszDpFqdn
pwszZoneDndwLastSuccessfulSoaCheckdwLastSuccessfulXfrfQueuedForBackgroundLoadfBackgroundLoadInProgressfReadOnlyZonedwLastXfrAttemptdwLastXfrResult)r  r  zoneinfos      r$   print_zoneinfor2  P  s   JJ58L8LLMJJ58HI\I\8]]^JJ5HDUDU8VVWJJ58J8K`K`8aabJJ5HDTDT8UUVJJ5HDVDV8WWXJJ5HDYDY8ZZ[JJ5HDYDY8ZZ[JJ58L8LLM222

9#H$7$789 	: 	

9()<)<=> 	?JJ58VW_WrWr8sstJJ58PQYQfQf8ggh222

9#H$;$;<= 	>

9#H$6$678 	9 	

9()@)@AB 	C

9(););<= 	>JJ5HDUDU8VVWJJ5HDWDW8XXYJJ5HOO8TTUJJ58T8TTUJJ58R8RRSJJ58W8WWX222

9#H$?$?@A 	B 	

9()D)DEF 	G 666

;h>\>\\]

9H<W<WWX

9H<T<TTUY666JJ='(@(@AB C JJ=,X-E-EFG H

9OHL^L^<__`

9H<N<NNO

9H<O<OOP

9H<]<]]^

9H<X<XXY222

9KHiHi<jjk

9KHjHj<kkl

9KH^H^<__`

9H<U<UUV

9H<T<TTU 3r.   c                    U R                  SUR                  -  5        U R                  S[        UR                  5      -  5        U R                  S[	        UR
                  5      -  5        U R                  SUR                  -  5        U[        R                  :w  aF  U R                  S[        UR                  5      -  5        U R                  SUR                  -  5        g g )Nr  z#  Flags                       : %s
z#  ZoneType                    : %s
z#  Version                     : %s
r  r  )r   r  r   Flagsr}   ZoneTypeVersionr   DNSSRV_TYPEID_ZONE_W2Kr   r'  r(  )r  r  zones      r$   
print_zoner9    s    JJ58H8HHIJJ58I$**8UUVJJ58H8WWXJJ5DE111

9ODNN<[[\

9DNNJK 2r.   c                     U R                  SUR                  -  5        UR                   H   nU R                  S5        [        XU5        M"     g )Nz  %d zone(s) found

)r   dwZoneCount	ZoneArrayr9  )r  r  zonesr8  s       r$   print_enumzonesr?    s>    JJ%(9(99:

44&  r.   c                    UR                   [        R                  :X  a  SUR                  -  nGOUR                   [        R                  :X  a  SUR                  -  nGOUR                   [        R
                  :X  a  SUR                  R                  -  nGOUR                   [        R                  :X  a  SUR                  R                  -  nGOGUR                   [        R                  :X  a  SUR                  R                  -  nGOUR                   [        R                  :X  a  SUR                  R                  UR                  R                  UR                  R                  UR                  R                  UR                  R                  UR                  R                  R                  UR                  R                   R                  4-  nGOBUR                   [        R"                  :X  a:  SUR                  R$                  R                  UR                  R&                  4-  nOUR                   [        R(                  :X  ad  SUR                  R*                  R                  UR                  R,                  UR                  R.                  UR                  R0                  4-  nOhUR                   [        R2                  :X  aH  UR                  R                   Vs/ s H  nS	UR                  -  PM     nnS
SR5                  U5      -  nOSnU R7                  SX!R8                  UR:                  UR<                  4-  5        g s  snf )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)z"%s"zTXT: %s,z	Unknown: z%    %s (flags=%x, serial=%d, ttl=%d)
)wTyper   
DNS_TYPE_AdataDNS_TYPE_AAAADNS_TYPE_PTRstrDNS_TYPE_NSDNS_TYPE_CNAMEDNS_TYPE_SOA
dwSerialNo	dwRefreshdwRetrydwExpiredwMinimumTtlNamePrimaryServerZoneAdministratorEmailDNS_TYPE_MXnameExchangewPreferenceDNS_TYPE_SRV
nameTargetwPort	wPrioritywWeightDNS_TYPE_TXTjoinr   dwFlagsdwSerialdwTtlSeconds)r  recmesgrB   slists        r$   print_dns_recordrb    sN   
yyDOO##((#	d((	(SXX&	d''	'CHHLL)	d&&	&388<<(	d))	)chhll+	d''	'\HH''HH&&HH$$HH%%HH))HH..22HH3377`9 9 
d&&	& 5 5 9 9388;O;OPP	d''	'%)<)<)@)@#((..),););SXX=M=M)O O	d''	'/2xx||<|t$(("|<388E?*JJ7kk3<<1A1A;C C D	 =s   &Mc                     UR                    H`  nU R                  SUR                  R                  UR                  UR
                  4-  5        UR                   H  n[        X5        M     Mb     g )Nz#  Name=%s, Records=%d, Children=%d
)r_  r   dnsNodeNamerG  wRecordCountdwChildCountrecordsrb  )r  rg  r_  dns_recs       r$   print_dnsrecordsri    s`    {{

9OO''$$$$=& & 	' {{G / # r.   c                 h     [        X5      nU$ ! [         a  n[        UR                  6 S eS nAff = fr*   )r   r   r   r:   )record_typerD  r_  r#   s       r$   data_to_dns_recordrl    s;    . 3 J  .AFF#-.s    
1,1c            	           \ rS rSrSrSrS/r\R                  \R                  \R                  S.r\" SSSS	/ S
QSS9/r  SS jrSrg)cmd_serverinfoi  zQuery for Server information.%prog <server> [options]r   	sambaoptsversionoptscredopts--client-versionClient Versionlonghornw2k|dotnet|longhornw2kdotnetrv  cli_verhelpdefaultmetavarchoicesdestNc                    UR                  5       U l        UR                  U R                  5      U l        [	        XR                  U R                  5      n[        U5      nUR                  USUS S5      u  p[        U R                  X5        g )Nr   
ServerInfo)	get_loadparmr   get_credentialsr    r'   r   r0   r	  r  )
r+   r   r{  rq  rs  rr  r"   r   r  ress
             r$   runcmd_serverinfo.run  sr    ((*--dgg6
!&''4::>+G4++NAv,0,@F0r.   r    r   NNNrE   rF   rG   rH   rI   synopsis
takes_argsoptionsSambaOptionsVersionOptionsCredentialsOptionstakes_optiongroupsr   takes_optionsr  rO   rP   r.   r$   rn  rn    sg    ')HJ ))--.. 	!(8!+@49	FM =A
1r.   rn  c           
          U  HR  u  p4pVSUR                  5       -   n[        UU SU SU S3SUS9nUR                  U5        UR                  X5Xg45        MT     g)z$Generate options for cmd_zoneoptionsz--r8   -r9   int)r}  typer  N)r   r   r   )	tabler  integer_propertieskdoc_min_maxoopts	            r$   _add_integer_optionsr    sl    #1779a!U"TF!D63  	S!!!1D"45 $r.   c                   
   \ rS rSrSrSrSS/r\R                  \R                  \R                  S.r\" SSS	S
/ SQSS9\" SSSS9\" SSSS9\" SSSS9\" SSSSS9/r/ r\" / SQ\\5             S$S jrS rS  rS! rS" rS#rg)%cmd_zoneoptionsi  zChange zone aging options.%prog <server> <zone> [options]r   r8  rp  rt  ru  rv  rw  rx  r{  r|  z--mark-old-records-staticz
YYYY-MM-DDz0Make records older than this (YYYY-MM-DD) static)r  r}  z--mark-records-static-regexREGEXPz4Make records matching this regular expression staticz--mark-records-dynamic-regexz5Make records matching this regular expression dynamicz-nz	--dry-run
store_truez,Don't change anything, say what would happen)actionr}  ))AgingzEnable record agingr   rS   )NoRefreshIntervalz3Aging no refresh interval in hours (0: use default)r   0V )RefreshIntervalz0Aging refresh interval in hours (0: use default)r   r  Nc                    UR                  5       U l        UR                  U R                  5      U l        [	        XR                  U R                  5      n[        U5      n[        R                  nU R                   H  u  nnnnUR                  U5      c  M  X   nUb  UU:  a  [        U SU 35      eUb  UU:  a  [        U SU 35      e[        R                  " 5       nUUl        UUl        U(       a  [        SU SU SU 3U R                  S9  M   UR!                  USUUSSUU5        [        S
U SU 3U R                  S9  M     SnUU	U
4 H  nUc  M  US-  nM     US:  a  [        S5      eUb  U R%                  XUU5        U	b  U R'                  UUU	U5        U
b  U R)                  UUU
U5        g g ! ["         a  n[        S	U SU 35      S eS nAff = f)Nz must be at least z can't exceed z
would set z to z for filer   ResetDwordPropertyzCould not set zSet rS   z(Multiple --mark-* options will not work
)r  r   r  r    r'   r   r   DNSSRV_TYPEID_NAME_AND_PARAMr  getr   DNS_RPC_NAME_AND_PARAMdwParampszNodeNameprintr  r1   r   mark_old_records_staticmark_records_static_regexmark_records_dynamic_regex)r+   r   r8  r{  rq  rs  rr  dry_runr  r  r  kwargsr"   r   nap_typer  r  r  r  v
name_paramr#   n_mark_optionsr   s                           r$   r  cmd_zoneoptions.run5  s+    ((*--dgg6
!&''4::>+G499 $ 7 7AtT1zz!}$	AAH"aS(:4&#ABBAH"aStf#=>>"99;J!"J%&J"
1#T!E$8tyyI
J)).*+*0*.*+*>*2*46 D4s#$))47 !8@ )+,.A }!#	. AJKK".(()@)02 %0**6+/+D+24
 &1++F,0,F,35 2;  J"^A3d1##>?TIJs   F>>
GGGc                     [        SU-  [        5       U R                  U R                  S9nSU SUR	                  5        3nUR                  U[        R                  SSS/S9nX54$ )	N	ldap://%surlsession_infocredentialsr   zDC=z#,CN=MicrosoftDNS,DC=DomainDNSZones,z/(&(objectClass=dnsNode)(!(dNSTombstoned=TRUE)))	dnsRecordrB   )basescope
expressionattrs)r   r   r    r   get_default_basednsearchldbSCOPE_SUBTREE)r+   r   	zone_namesamdbzone_dnnodess         r$   _get_dns_nodescmd_zoneoptions._get_dns_nodes~  s    +.#1#3"&**: #F..013 '#&#4#4*D$/#8	  :
 |r.   c                     [         R                  " US5      n[         R                  " U5      n[
        R                  " [        U5      5      nU R                  X5      u  pU
 GHO  nSU;  a  M  [        US   5      nSn[        U5       H\  u  p[        [        R                  U5      nUR                  U:  d  M1  UR                  S:w  d  MC  SUl        [        U5      X'   US-  nM^     US:X  a  M  US   S   R!                  5       nU(       a,  [#        SU S	[%        U5       S
U SU S3	U R&                  S9  M  [(        R*                  R-                  U	UR.                  US.[(        R0                  5      nU	R3                  U5        [#        SU S	[%        U5       S
U SU S3	U R&                  S9  GMR     g ! [         a  n[	        SU S35      eS nAff = f)Nz%Y-%m-%dzInvalid date z: should be YYY-MM-DDr  r   rS   rB   would make / records static on .r  dnr  made )timestrptimemktime
ValueErrorr   r   unix_to_dns_timestampr  r  list	enumerater
   r   DnssrvRpcRecorddwTimeStampr   decoder  lenr  r  Message	from_dictr  FLAG_MOD_REPLACEmodify)r+   r   r  date_stringr  tstr#   	thresholdr  r  nodevalueschangesr   r  r_  rB   msgs                      r$   r  'cmd_zoneoptions.mark_old_records_static  s   	S{J7BBA 223q6:	**6=D$&${+,FG!&) !5!5q9??Y.3??a3G&'CO (FIqLG * !|<?))+DG9Ac&k] ; 69+Q06:iiA++''/3ww6<)* ),(<(<	>C
 LLE'!CK=0CF!I;a)/3yy:;   	S{m;PQRR	Ss   -F8 8
GGGc                 0   [         R                  " U5      nU R                  X5      u  pgU GHf  nUS   S   R                  5       n	UR	                  U	5      (       d  M2  SU;  a  M:  [        US   5      n
[        U
5      S:X  a  MY  Sn[        U
5       HJ  u  p[        [        R                  U5      nUR                  S:w  d  M1  SUl        [        U5      X'   US-  nML     US:X  a  M  U(       a,  [        SU S[        U
5       SU	 SU S3	U R                  S	9  M  [        R                   R#                  UUR$                  U
S
.[        R&                  5      nUR)                  U5        [        SU S[        U
5       SU	 SU S3	U R                  S	9  GMi     g)z>Make the records of nodes with matching names static.
        rB   r   r  rS   r  r  r  r  r  r  r  N)recompiler  r  r  r  r  r  r
   r   r  r  r   r  r  r  r  r  r  r  r  )r+   r   r  regexr  rr  r  r  rB   r  r  r   r  r_  r  s                   r$   r  )cmd_zoneoptions.mark_records_static_regex  s    JJu**6=D<?))+D88D>>$&${+,F6{aG!&) !5!5q9??a'&'CO (FIqLG * !|G9Ac&k] ; 69+Q06:iiA++''/3ww6<)* ),(<(<	>C
 LLE'!CK=0CF!I;a)/3yy:C r.   c                    [         R                  " U5      nU R                  X5      u  pg[        R                  " 5       n[        R
                  " [        U5      5      n	[        R                  [        R                  [        R                  1n
U GHz  nUS   S   R                  5       nUR                  U5      (       d  M2  SU;  a  M:  [        US   5      n[        U5      S:X  a  MY  Sn[        U5       H]  u  nn[!        [        R"                  U5      nUR$                  U
;   d  M2  UR&                  S:X  d  MD  U	Ul        [)        U5      X'   US-  nM_     US:X  a  M  U(       a-  [+        SU S[        U5       SU SU S3	U R,                  S	9  GM  [.        R0                  R3                  UUR4                  US
.[.        R6                  5      nUR9                  U5        [+        SU S[        U5       SU SU S3	U R,                  S	9  GM}     g)zMake the records of nodes with matching names dynamic, with a
current timestamp. In this case we only adjust the A, AAAA,
and TXT records.
rB   r   r  rS   r  r  z records dynamic on r  r  r  r  N)r  r  r  r  r   r  r  r   rC  rE  rZ  r  r  r  r  r  r
   r  rB  r  r   r  r  r  r  r  r  r  r  )r+   r   r  r  r  r  r  r  nowdns_timestampsafe_wtypesr  rB   r  r  r   r  r_  r  s                      r$   r  *cmd_zoneoptions.mark_records_dynamic_regex  s   
 JJu**6=iik 66s3x@OO
 D<?))+D88D>>$&${+,F6{aG!&)1 !5!5q999+10D&3CO (FIqLG * !|G9Ac&k] ; 69+Q06:iiA++''/3ww6<)* ),(<(<	>C
 LLE'!CK=0DF!I;a)/3yy:C r.   r  )NNNFNNN)rE   rF   rG   rH   rI   r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  rO   rP   r.   r$   r  r    s    $0HF#J ))--.. 	!(8!+@49	F 	*LF	H,hJ	L-xK	Mt[B	DM   	 '+- CG&+$(&*'+	F5R(:T(:T1:r.   r  c            	           \ rS rSrSrSrSS/r\R                  \R                  \R                  S.r\" SSS	S
/ SQSS9/r  SS jrSrg)cmd_zoneinfoi  zQuery for zone information.r  r   r8  rp  rt  ru  rv  rw  rx  r{  r|  Nc                    UR                  5       U l        UR                  U R                  5      U l        [	        XR                  U R                  5      n[        U5      nUR                  USXS5      u  p[        U R                  X5        g )Nr   ZoneInfo)	r  r   r  r    r'   r   r0   r2  r  )r+   r   r8  r{  rq  rs  rr  r"   r   r  r  s              r$   r  cmd_zoneinfo.run(  so    ((*--dgg6
!&''4::>+G4++NAv,68tyy&.r.   r  r  r  rP   r.   r$   r   r     sk    %0HF#J ))--.. 	!(8!+@49	FM CG
/r.   r   c                      \ rS rSrSrSrS/r\R                  \R                  \R                  S.r\" SSSS	/ S
QSS9\" SSSSS9\" SSSSS9\" SSSSS9\" SSSSS9\" SSSSS9\" SSSS S9\" S!S"SS#S9\" S$S%SS&S9/	r   S*S( jrS)rg')+cmd_zonelisti5  zQuery for zones.ro  r   rp  rt  ru  rv  rw  rx  r{  r|  z	--primaryzList primary zones (default)r  primaryr}  r  r  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nondsNc           	      |   SnU(       a  U[         R                  -  nU(       a  U[         R                  -  nU(       a  U[         R                  -  nU(       a  U[         R                  -  nU(       a  U[         R
                  -  nU(       a  U[         R                  -  nU	(       a  U[         R                  -  nU
(       a  U[         R                  -  nUS:X  a  [         R                  nUR                  5       U l
        UR                  U R                  5      U l        [        XR                  U R                  5      n[        U5      nUR                  USUS S[         R                   U5      u  nnU[         R"                  :X  a  [         R$                  nO[         R&                  n[)        U R*                  UU5        g )Nr   	EnumZones)r   DNS_ZONE_REQUEST_PRIMARYDNS_ZONE_REQUEST_SECONDARYDNS_ZONE_REQUEST_CACHEDNS_ZONE_REQUEST_AUTODNS_ZONE_REQUEST_FORWARDDNS_ZONE_REQUEST_REVERSEDNS_ZONE_REQUEST_DSDNS_ZONE_REQUEST_NON_DSr  r   r  r    r'   r   r4   DNSSRV_TYPEID_DWORDr   r7  DNSSRV_TYPEID_ZONEr?  r  )r+   r   r{  r  r  r
  r  r  r  r  r  rq  rs  rr  request_filterr"   r   r  r  s                      r$   r  cmd_zonelist.runX  s[    i@@@NiBBBNi>>>Ni===Ni@@@Ni@@@Ni;;;Ni???NQ&??N((*--dgg6
!&''4::>+G466~78&$7B7@7T7T7E	G Y===55F11F		63/r.   r  )FFFFFFFFNNNr  rP   r.   r$   r  r  5  s    )HJ ))--.. 	!(8!+@49	F 	{!?"	4}#9"	6y2"	2x@"	1{!5"	4{!5"	4v="	/z :"	2%M, JOFK7;)0r.   r  c            
           \ rS rSrSrSrSS/r\R                  \R                  \R                  S.r\" SSS	S
/ SQSS9\" SSSSSS/SS9/r   SS jrSrg)cmd_zonecreatei  zCreate a zone.r  r   r8  rp  rt  ru  rv  rw  rx  r{  r|  z--dns-directory-partitionzSpecify the naming context for the new zone, which affects the replication scope (domain or forest wide replication, default: domain).domainzdomain|forestforestdns_dpNc                    UR                  5       U l        UR                  U R                  5      U l        [	        XR                  U R                  5      nUR                  5       n[        R                  n	US:X  a  [        R                  n	[        U5      n
U
[        R                  :X  aV  [        R                  n[        R                  " 5       nX,l        [        R                  Ul        SUl        SUl        SUl        OU
[        R(                  :X  a\  [        R*                  n[        R,                  " 5       nX,l        [        R                  Ul        SUl        SUl        SUl        Xl        O[[        R0                  n[        R2                  " 5       nX,l        [        R                  Ul        SUl        SUl        SUl        Xl        UR5                  U
SUS SSUU5        [        R6                  n[        R8                  " 5       nSUl        [        R<                  Ul        [@        RB                  SU S30nUR5                  U
SXSSUXS	9	  U RD                  RG                  S
U-  5        g )Nr!  r   rS   
ZoneCreateAllowUpdatezZone "z" already exists.r  r5   zZone %s created successfully
)$r  r   r  r    r'   r   r   r   r   r   r   DNSSRV_TYPEID_ZONE_CREATE_W2KDNS_RPC_ZONE_CREATE_INFO_W2Kr  r   rv   r  r  fDsIntegratedfLoadExistingr    DNSSRV_TYPEID_ZONE_CREATE_DOTNETDNS_RPC_ZONE_CREATE_INFO_DOTNETr'  DNSSRV_TYPEID_ZONE_CREATE!DNS_RPC_ZONE_CREATE_INFO_LONGHORNr1   r  r  r  r   r  r   rK   r  r   )r+   r   r8  r{  r"  rq  rs  rr  r"   dns_directorypartitionr   r  zone_create_infoname_and_paramr6   s                  r$   r  cmd_zonecreate.run  s(    ((*--dgg6
!&''4::>zz|!*!@!@X%.%D%D"+G4Y===<<F(EEG+/(*.*D*D'&'#-.*-.*yBBB??F(HHJ+/(*.*D*D'&'#-.*-.*)?&88F(JJL+/(*.*D*D'&'#-.*-.*)?&!!.!VT"#\6"2	4 77"99;%2"!%!<!< 55/0

 	!!.!V"#%96"0 	" 	E 			84?@r.   r  r  r  rP   r.   r$   r  r    s    0HF#J ))--.. 	!(8!+@49	F 	*5  & (+		M& @Ar.   r  c                   z    \ rS rSrSrSrSS/r\R                  \R                  \R                  S.r  S
S jrS	rg)cmd_zonedeletei  zDelete a zone.r  r   r8  rp  Nc                    UR                  5       U l        UR                  U R                  5      U l        [	        XR                  U R                  5      nUR                  5       n[        R                  SU S30nUR                  [        R                  SXSS[        R                  S US9	nU R                  R                  SU-  5        g )NZone z, does not exist and so could not be deleted.r   DeleteZoneFromDsr5   zZone %s deleted successfully
)r  r   r  r    r'   r   r   "WERR_DNS_ERROR_ZONE_DOES_NOT_EXISTr1   r   r   DNSSRV_TYPEID_NULLr  r   )	r+   r   r8  rq  rs  rr  r"   r6   r  s	            r$   r  cmd_zonedelete.run  s     ((*--dgg6
!&''4::>zz| 55vIJ
 ''	(M(M()6<N(1(D(D(,x ( A
 			84?@r.   r  r  rE   rF   rG   rH   rI   r  r  r  r  r  r  r  r  rO   rP   r.   r$   r3  r3    sG    0HF#J ))--.. :>Ar.   r3  c                       \ rS rSrSrSr/ SQr\R                  \R                  \R                  S.r\" SSSS	S
9\" SSSSS
9\" SSSSS
9\" SSSSS
9\" SSSSS
9\" SSSSS
9\" SSSSS
9/r    S S jrSrg)!	cmd_queryi  zQuery a name.zO%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|MX|NS|SOA|SRV|TXT|ALL> [options])r   r8  rB   rtyperp  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_childrenNc                 "   [        U5      nUR                  S5      S:w  a  U R                  R                  SU-  5        SnU(       a  U[        R
                  -  nU(       a  U[        R                  -  nU(       a  U[        R                  -  nU(       a  U[        R                  -  nU	(       a  U[        R                  -  nU
(       a  U[        R                  -  nU(       a  U[        R                  -  nUS:X  a  [        R
                  nU[        R                  :X  aI  U R                  R                  S5        U R                  R                  S5        U[        R
                  -  nUR                  5       U l        UR                  U R                  5      U l        [!        XR                  U R                  5      n["        R$                  S0nUR'                  [        R(                  SXUS UUS S US9u  nn[+        U R                  U5        g )	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.r5   )r   findr  r   r   DNS_RPC_VIEW_AUTHORITY_DATADNS_RPC_VIEW_CACHE_DATADNS_RPC_VIEW_GLUE_DATADNS_RPC_VIEW_ROOT_HINT_DATADNS_RPC_VIEW_ADDITIONAL_DATADNS_RPC_VIEW_NO_CHILDRENDNS_RPC_VIEW_ONLY_CHILDRENr  r   r  r    r'   r   rM   r2   r   ri  )r+   r   r8  rB   r=  r>  r
  r?  r@  rA  rB  rC  rq  rs  rr  rk  select_flagsr"   r6   buflenr  s                        r$   r  cmd_query.run#  s    $E*99S>RIIOOL ! " IAAALI===LI<<<LIAAALIBBBLI>>>LI@@@L1$@@L9AAAIIOO]^IIOO56IAAAL((*--dgg6
!&''4::> 550
 11111fD+|T4 2 
 	C(r.   r  )
FFFFFFFNNNr  rP   r.   r$   r<  r<    s    EH 5J ))--.. 	}#K"	6y6"	2x3"	1x1"	1~$="	7%;"	8 ';"	:M" EJBG:>/)r.   r<  c                   z    \ rS rSrSrSrSS/r\R                  \R                  \R                  S.r  S
S jrS	rg)cmd_roothintsiU  zQuery root hints.z!%prog <server> [<name>] [options]r   zname?rp  Nc                    [         R                  n[        R                  [        R                  -  nUR                  5       U l        UR                  U R                  5      U l        [        XR                  U R                  5      nUR                  [        R                  SUSUS XgS S 5
      u  p[        U R                  U
5        g )Nr   z..RootHints)r   rH  r   rL  rM  r  r   r  r    r'   r2   r   ri  r  )r+   r   rB   rq  rs  rr  rk  rP  r"   rQ  r  s              r$   r  cmd_roothints.runb  s    &&!==!>>? ((*--dgg6
!&''4::>11111fm$4? 	C(r.   r  )r  NNNr:  rP   r.   r$   rT  rT  U  sG    2HG$J ))--.. >B)r.   rT  c                   z    \ rS rSrSrSr/ SQr\R                  \R                  \R                  S.r  S	S jrSrg)
cmd_add_recordir  a(  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   r8  rB   r=  rD  rp  Nc	                 ,   UR                  5       S;  a  [        SU-  5      e[        U5      n	[        X5      n
UR	                  5       U l        UR                  U R
                  5      U l        [        XR
                  U R                  5      n[        R                  " 5       nXl        [        R                  SU SU 3[        R                  SU SU S30nUR                  [        R                   SXX<S US9  U R"                  R%                  S	5        g )
NAAAAAPTRCNAMENSMXSRVTXTz)Adding record of type %s is not supportedz5Zone does not exist; record could not be added. zone[] name[z7Record already exists; record could not be added. zone[r9   r   r5   zRecord added successfully
r   r   r   rl  r  r   r  r    r'   r   DNS_RPC_RECORD_BUFr_  r   rM   $WERR_DNS_ERROR_RECORD_ALREADY_EXISTSr3   r   r  r   )r+   r   r8  rB   r=  rD  rq  rs  rr  rk  r_  r"   add_rec_bufr6   s                 r$   r  cmd_add_record.run  s    ;;= WWJURSS#E* 3((*--dgg6
!&''4::>224 55vWTF,77vWTF!-
 	$$Y%J%J%&d.6 	% 	8 			56r.   r  r  r:  rP   r.   r$   rX  rX  r  sG     VH<J ))--.. >B'+7r.   rX  c                   x    \ rS rSrSrSr/ SQr\R                  \R                  \R                  S.r S	S jrSrg)
cmd_update_recordi  aq  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   r8  rB   r=  olddatanewdatarp  Nc
                    UR                  5       nUS;  a  [        SU-  5      e US:X  a  [        [        U5        OUS:X  a  [        [        U5        [        U5      n[        X5      nUR                  5       U l	        UR                  U R                  5      U l        [        XR                  U R                  5      n [        UR                  XX;U5      nU(       d  [        S5      eUR"                  Ul        UR$                  Ul        UR&                  Ul        UR(                  Ul        [*        R,                  " 5       nXl        [*        R,                  " 5       nUUl        [0        R2                  SU S	30nUR5                  [*        R6                  S
UUUUUUS9  U R8                  R;                  S5        g ! [
         a  n
[        SU SU
< 35      eS n
A
ff = f! [         a  n
[        U
R                   6 S eS n
A
ff = f)N)	r]  r^  r_  r`  ra  rb  SOArc  rd  z+Updating record of type %s is not supportedr]  r^  zbad data for z: rG  r5  z- does not exist; record could not be updated.r   r5   zRecord updated successfully
)r   r   r   r   r	   OSErrorr   rl  r  r   r  r    r'   r   r"   r   r:   r\  r]  r^  r  r   rg  r_  r   rM   r3   r   r  r   )r+   r   r8  rB   r=  rm  rn  rq  rs  rr  r#   rk  r_  r"   	rec_matchri  del_rec_bufr6   s                     r$   r  cmd_update_record.run  s    VVLuTUU	?|'7+&(G, $E* 6((*--dgg6
!&''4::>	2():):F)-GEI
 ?@@  '' ))$11#//224224# 55vJK

 	$$Y%J%J%&%+%)%)%0%0.6 	% 	8 			78[  	?ugRu=>>	?  	2'T1	2s4   F: F: ?G :
GGG
H (G;;H r  r  r:  rP   r.   r$   rl  rl    sC     gHJJ ))--.. 8<99r.   rl  c                   v    \ rS rSrSrSr/ SQr\R                  \R                  \R                  S.rS	S jrSrg)
cmd_delete_recordi  a+  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' ..."
rY  rZ  rp  Nc	                 0   UR                  5       S;  a  [        SU-  5      e[        U5      n	[        X5      n
UR	                  5       U l        UR                  U R
                  5      U l        [        XR
                  U R                  5      n[        R                  " 5       nXl        [        R                  SU SU 3[        R                  SU SU S30nUR                  [        R                   SUUUS UUS9  U R"                  R%                  S	5        g )
Nr\  z+Deleting record of type %s is not supportedz7Zone does not exist; record could not be deleted. zone[re  z9Record already exists; record could not be deleted. zone[r9   r   r5   zRecord deleted successfully
rf  )r+   r   r8  rB   r=  rD  rq  rs  rr  rk  r_  r"   rs  r6   s                 r$   r  cmd_delete_record.run  s   ;;= WWLuTUU#E* 3((*--dgg6
!&''4::>224 55vWTF,77vWTF!-
 	$$Y%J%J%&%+%)%)%)%0.6 	% 	8 			78r.   r  r  r:  rP   r.   r$   rv  rv    s>     VH<J ))--.. 9r.   rv  c                       \ rS rSrSrSrSS/r\R                  \R                  \R                  S.r\" SSS	S
S9\" SSSS
S9/r  SS jrSrg)cmd_cleanup_recordi9  aD  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   dnshostnamerp  z-vz	--verbosez
Be verboser  )r}  r  z-qz--quietzBe quietNc                     UR                  5       nUR                  U5      n	U R                  XgS9n
[        SU-  [	        5       XS9n[
        R                  " XUSS9  g )N)verbosequietr  r  T)ignore_no_name)r  r  
get_loggerr   r   r   remove_dns_references)r+   r   r{  rq  rs  rr  r}  r~  r   r    loggerr  s               r$   r  cmd_cleanup_record.runT  sa    ##%((,>+.#1#3"'0 	''{7;	=r.   rP   )NNNFFr  rP   r.   r$   rz  rz  9  sq    	 .HM*J ))--.. 	t[|LItYZEM
 AE38=r.   rz  c                      \ rS rSrSr0 r\" 5       \S'   \" 5       \S'   \" 5       \S'   \	" 5       \S'   \
" 5       \S'   \" 5       \S'   \" 5       \S	'   \" 5       \S
'   \" 5       \S'   \" 5       \S'   \" 5       \S'   \" 5       \S'   Srg)cmd_dnsic  z%Domain Name Service (DNS) management.r  zoneoptionsr1  zonelist
zonecreate
zonedeletequery	roothintsaddupdatedeletecleanuprP   N)rE   rF   rG   rH   rI   subcommandsrn  r  r   r  r  r3  r<  rT  rX  rl  rv  rz  rO   rP   r.   r$   r  r  c  s    /K . 0K!0!2K*nK
*nK
 . 0K . 0K$;K,K')K-/K-/K/1K	r.   r  )Lsamba.getoptgetoptr  sambar   r   r   r   socketr   r   r   r	   r  r  	samba.ndrr
   r   r  r   r   samba.samdbr   
samba.authr   samba.netcmdr   r   r   r   samba.dcerpcr   r   samba.dnsserverr   r   r   r   r%   r'   rX   r^   rd   rl   rs   r}   r   r   r   r   r   r   r   r   r   r	  r2  r9  r?  rb  ri  rl  rn  r  r  r   r  r  r3  r<  rT  rX  rl  rv  rz  r  rP   r.   r$   <module>r     s  $     '     
 * 	 %  %  ) O O ,	H HV:9357;;8"$
EaP>VBL'DD01W 1@	6M:g M:`/7 /@L07 L0^[AW [A|AW ADN) N)b)G ):47W 47nR9 R9j89 89v'= '=T2l 2r.   