
    Id                        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	m
Z
 d dlmZ d dlmZ d dlZd dlZd dlZd dlmZmZ d dlZd d	lmZ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$ d dl!m%Z% d Z& G d d      Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d Z/d Z0d Z1d Z2d Z3d Z4d  Z5d! Z6d" Z7d# Z8d$ Z9d% Z:d& Z;d' Z<d( Z= G d) d*e      Z>d+ Z? G d, d-e      Z@ G d. d/e      ZA G d0 d1e      ZB G d2 d3e      ZC G d4 d5e      ZD G d6 d7e      ZE G d8 d9e      ZF G d: d;e      ZG G d< d=e      ZH G d> d?e      ZI G d@ dAe      ZJ G dB dCe      ZKy)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                     | j                         dk(  rd} d| z  }	 t        j                  |||      }|S # t        $ r}t        d| d|      d }~ww xY w)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%   /   se    ||~$)F2K[&&{B> O  [vWXYZZ[s   5 	AAAc            
           e Zd ZdZej
                  dej                  dej                  dej                  dej                  diZ
d Zd Zy	)
DnsConnWrappera^  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                 (    t        |||      | _        y N)r%   r"   )selfr   r   r    s       r$   __init__zDnsConnWrapper.__init__e   s    #FB6    c                 T     t         j                  |      |dvrS d d fd
}|S )N>   DnssrvQuery2DnssrvOperation2DnssrvEnumRecords2DnssrvUpdateRecord2DnssrvComplexOperation2messagesc                     | i } 	  | S # t         $ r^}|j                  \  }}|| v r| t        | |    d| d|      |j                  v rt        j                  |    d| d|       d }~ww xY w)N [])r   argsr   default_messages)r4   r8   r#   werrerrstrattrr*   s        r$   fz%DnsConnWrapper.__getattr__.<locals>.fr   s    T{" 	 vvf8#|&(4.)9F81'EqII4000&$*?*?*E)FbPQ'RTUVV	s    	A3AA..A3)getattrr"   )r*   namer=   r<   s   `  @r$   __getattr__zDnsConnWrapper.__getattr__h   s6    t}}d+ ' ' K" 	" r,   N)__name__
__module____qualname____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_DENIEDr9   r+   r@    r,   r$   r'   r'   ;   sX    D 	,,.L113H335P114M!!#=7r,   r'   c                 4    | dk(  rd}|S | dk(  rd}|S d| z  }|S )Nr   FALSE   TRUEUNKNOWN (0x%x)rJ   )flagrets     r$   bool_stringrR      s;    qy
 J	 
 J %Jr,   c                 L    d }|D ]  }|t        | |      k(  s|} n |sd|z  }|S )NrO   r>   )module	enum_defsvaluerQ   r#   s        r$   enum_stringrX      sA    
C GFA&&C &Jr,   c                 P    d}|D ]  }|t        | |      z  s|d|z  z  } |sd}|S )N z%s NONErT   )rU   bitmap_defsrW   rQ   bs        r$   bitmap_stringr^      sB    
C 761%%519C Jr,   c                 ,    g d}t        t        ||       S )N)DNS_BOOT_METHOD_UNINITIALIZEDDNS_BOOT_METHOD_FILEDNS_BOOT_METHOD_REGISTRYDNS_BOOT_METHOD_DIRECTORYrX   r   )boot_methodrV   s     r$   boot_method_stringrf      s    JIy)[99r,   c                 ,    g d}t        t        ||       S )N)DNS_ALLOW_RFC_NAMES_ONLYDNS_ALLOW_NONRFC_NAMESDNS_ALLOW_MULTIBYTE_NAMESDNS_ALLOW_ALL_NAMESrd   )
check_flagrV   s     r$   name_check_flag_stringrm      s    EIy)Z88r,   c                 ,    g d}t        t        ||       S )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rX   r   )	zone_typerV   s     r$   zone_type_stringrw      s    MI tY	22r,   c                 ,    g d}t        t        ||       S )N)DNS_ZONE_UPDATE_OFFDNS_ZONE_UPDATE_UNSECUREDNS_ZONE_UPDATE_SECUREru   )zone_updaterV   s     r$   zone_update_stringr}      s    +ItY44r,   c                 ,    g d}t        t        ||       S )N)DNS_ZONE_SECSECURE_NO_SECURITYDNS_ZONE_SECSECURE_NS_ONLYDNS_ZONE_SECSECURE_LIST_ONLYDNS_ZONE_SECSECURE_NO_XFERrd   )securityrV   s     r$   zone_secondary_security_stringr      s    OIy)X66r,   c                 ,    g d}t        t        ||       S )N)DNS_ZONE_NOTIFY_OFFDNS_ZONE_NOTIFY_ALL_SECONDARIESDNS_ZONE_NOTIFY_LIST_ONLYrd   )notify_levelrV   s     r$   zone_notify_level_stringr      s    .Iy)\::r,   c                 ,    g d}t        t        ||       S )N)DNS_DP_AUTOCREATEDDNS_DP_LEGACYDNS_DP_DOMAIN_DEFAULTDNS_DP_FOREST_DEFAULTDNS_DP_ENLISTEDDNS_DP_DELETEDr^   r   )dp_flagsr\   s     r$   dp_flags_stringr      s    QKK::r,   c                 ,    g d}t        t        ||       S )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   )flagsr\   s     r$   zone_flags_stringr      s    ,K
 K77r,   c           	          g }| s|S t        | j                        D ]:  }t        t        t	        d| j
                  |               }|j                  |       < |S )NI)range	AddrCountr   r   r   	AddrArrayappend)arrayrQ   iaddrs       r$   ip4_array_stringr      sV    
C
5??# $sEOOA,>"?@

4 Jr,   c                    g }| s|S t        | j                        D ]  }| j                  |   j                  d   dk(  rAt	        j
                  dg| j                  |   j                  dd  }t        t        |      }nb| j                  |   j                  d   dk(  rAt	        j
                  dg| j                  |   j                  dd  }t        t        |      }nd	}|j                  |        |S )
Nr      4B         16B   UNKNOWN)
r   r   r   MaxSastructr   r   r   r	   r   )r   rQ   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                 `    	 t        |       S # t        $ r}t        |j                   d }~ww xY wr)   )r   r   r   r8   )rec_typer#   s     r$   dns_type_flagr      s1    $)) $AFF##$s   
 	-(-c                     | j                         }|dk(  rt        j                  }|S |dk(  rt        j                  }|S |dk(  rt        j                  }|S t        d| z        )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                    | j                  d|j                  z         | j                  dt        |j                        z         | j                  dt	        |j
                        z         | j                  dt	        |j                        z         | j                  dt	        |j                        z         | j                  d|j                  z         | j                  d|j                  z         |t        j                  k7  rv| j                  dt        |j                        z         | j                  d	t        |j                        z         | j                  d
t        |j                        z         nu| j                  dt!        |j                        z         | j                  d	t!        |j                        z         | j                  d
t!        |j                        z         | j                  d|j"                  z         | j                  d|j$                  z         | j                  d|j&                  z         | j                  d|j(                  z         | j                  dt+        |j,                        z         | j                  d|j.                  z         | j                  d|j0                  z         | j                  d|j2                  z         | j                  d|j4                  z         | j                  d|j6                  z         | j                  d|j8                  z         | j                  d|j:                  z         | j                  d|j<                  z         | j                  dt	        |j>                        z         | j                  dt	        |j@                        z         | j                  dt	        |jB                        z         | j                  dt	        |jD                        z         | j                  dt	        |jF                        z         | j                  dt	        |jH                        z         | j                  dt	        |jJ                        z         | j                  dt	        |jL                        z         | j                  d t	        |jN                        z         | j                  d!t	        |jP                        z         | j                  d"t	        |jR                        z         | j                  d#t	        |jT                        z         | j                  d$t	        |jV                        z         |t        jX                  k7  r| j                  d%|jZ                  z         | j                  d&t!        |j\                        z         | j                  d'|j^                  z         | j                  d(|j`                  z         | j                  d)|jb                  z         | j                  d*|jd                  z         | j                  d+|jf                  z         | j                  d,|jh                  z         | j                  d-|jj                  z         | j                  d.|jl                  z         | j                  d/|jn                  z         | j                  d0|jp                  z         | j                  d1|jr                  z         | j                  d2|jt                  z         |t        j                  k(  r(| j                  d3t	        |jv                        z         y y )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	dwVersionrf   fBootMethodrR   fAdminConfiguredfAllowUpdatefDsAvailablepszServerNamepszDsContainerr   DNSSRV_TYPEID_SERVER_INFOr   aipServerAddrsaipListenAddrsaipForwardersr   
dwLogLeveldwDebugLeveldwForwardTimeoutdwRpcProtocolrm   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                 (   | j                  d|j                  z         | j                  dt        |j                        z         | j                  dt	        |j
                        z         | j                  dt        |j                        z         | j                  dt	        |j                        z         | j                  dt	        |j                        z         | j                  dt	        |j                        z         | j                  dt	        |j                        z         | j                  d	|j                  z         |t        j                  k7  r(| j                  d
t        |j                         z         n'| j                  d
t#        |j                         z         | j                  dt%        |j&                        z         | j                  dt)        |j*                        z         |t        j                  k7  rO| j                  dt        |j,                        z         | j                  dt        |j.                        z         nN| j                  dt#        |j,                        z         | j                  dt#        |j.                        z         | j                  dt	        |j0                        z         | j                  dt	        |j2                        z         | j                  dt	        |j4                        z         | j                  d|j6                  z         | j                  d|j8                  z         | j                  d|j:                  z         |t        j                  k7  r(| j                  dt        |j<                        z         n'| j                  dt#        |j<                        z         |t        j>                  k7  r[| j                  d|j@                  z         | j                  d|jB                  z         | j                  d|jD                  z         |t        j                  k7  r(| j                  dt        |jF                        z         n'| j                  dt#        |jF                        z         | j                  dtI        |jJ                        z         | j                  d|jL                  z         | j                  d|jN                  z         | j                  d|jP                  z         | j                  d|jR                  z         |t        j                  k(  r| j                  dt	        |jT                        z         | j                  d t	        |jV                        z         | j                  d!t	        |jX                        z         | j                  d"|jZ                  z         | j                  d#|j\                  z         y y )$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   pszZoneNamerw   
dwZoneTyperR   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_zoneinfor,  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                    | j                  d|j                  z         | j                  dt        |j                        z         | j                  dt	        |j
                        z         | j                  d|j                  z         |t        j                  k7  rF| j                  dt        |j                        z         | j                  d|j                  z         y y )Nr  z#  Flags                       : %s
z#  ZoneType                    : %s
z#  Version                     : %s
r  r  )r   r  r   Flagsrw   ZoneTypeVersionr   DNSSRV_TYPEID_ZONE_W2Kr   r!  r"  )r   r  zones      r$   
print_zoner3    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                     | j                  d|j                  z         |j                  D ]   }| j                  d       t        | ||       " y )Nz  %d zone(s) found

)r   dwZoneCount	ZoneArrayr3  )r   r  zonesr2  s       r$   print_enumzonesr9    sE    JJ%(9(99: '

44&'r,   c                    |j                   t        j                  k(  rd|j                  z  }n|j                   t        j                  k(  rd|j                  z  }n|j                   t        j
                  k(  rd|j                  j                  z  }nw|j                   t        j                  k(  rd|j                  j                  z  }n?|j                   t        j                  k(  rd|j                  j                  z  }n|j                   t        j                  k(  rd|j                  j                  |j                  j                  |j                  j                  |j                  j                  |j                  j                  |j                  j                  j                  |j                  j                   j                  fz  }n<|j                   t        j"                  k(  r:d|j                  j$                  j                  |j                  j&                  fz  }n|j                   t        j(                  k(  rdd|j                  j*                  j                  |j                  j,                  |j                  j.                  |j                  j0                  fz  }nd|j                   t        j2                  k(  rE|j                  j                  D cg c]  }d	|j                  z   }}d
dj5                  |      z  }nd}| j7                  d||j8                  |j:                  |j<                  fz         y c c}w )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mesgr?   slists        r$   print_dns_recordr\    sO   
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ckk3<<1A1A;C C D	 =s   Mc                     |j                   D ]^  }| j                  d|j                  j                  |j                  |j
                  fz         |j                  D ]  }t        | |        ` y )Nz#  Name=%s, Records=%d, Children=%d
)rY  r   dnsNodeNamerA  wRecordCountdwChildCountrecordsr\  )r   ra  rY  dns_recs       r$   print_dnsrecordsrc    sl    {{ 0

9OO''$$$$=& & 	' {{ 	0G w/	00r,   c                 h    	 t        | |      }|S # t        $ r}t        |j                   d d }~ww xY wr)   )r   r   r   r8   )record_typer>  rY  r#   s       r$   data_to_dns_recordrf    s=    . d3 J  .AFF#-.s    	1,1c                       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
      gZ	 	 ddZy)cmd_serverinfozQuery for Server information.%prog <server> [options]r   	sambaoptsversionoptscredopts--client-versionClient Versionlonghornw2k|dotnet|longhornw2kdotnetrp  cli_verhelpdefaultmetavarchoicesdestNc                 $   |j                         | _        |j                  | j                        | _        t	        || j                  | j                        }t        |      }|j                  |d|d d      \  }}	t        | j                  ||	       y )Nr   
ServerInfo)	get_loadparmr   get_credentialsr    r'   r   r.   r  r   )
r*   r   ru  rk  rm  rl  r"   r   r  ress
             r$   runzcmd_serverinfo.run  sx    ((*--dgg6
!&$''4::>+G4++NAv,0,@FC0r,   NNNrA   rB   rC   rD   synopsis
takes_argsoptionsSambaOptionsVersionOptionsCredentialsOptionstakes_optiongroupsr   takes_optionsr  rJ   r,   r$   rh  rh    sg    ')HJ ))--.. 	!(8!+@49	FM =A
1r,   rh  c           
          | D ]X  \  }}}}d|j                         z   }t        || d| d| dd|      }|j                  |       |j                  ||||f       Z y)z$Generate options for cmd_zoneoptionsz--r6   -r7   int)rw  typer{  N)r   r   r   )	tabler  integer_propertieskdoc_min_maxoopts	            r$   _add_integer_optionsr    sy    # 63d1779a!U"TF!D63  	S!!!1dD!"456r,   c            
          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       eddd       eddd       eddd       edddd      gZg Z eg dee       	 	 	 	 	 d"dZd Zd Zd  Zd! Zy)#cmd_zoneoptionszChange zone aging options.%prog <server> <zone> [options]r   r2  rj  rn  ro  rp  rq  rr  ru  rv  z--mark-old-records-staticz
YYYY-MM-DDz0Make records older than this (YYYY-MM-DD) static)ry  rw  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)actionrw  ))AgingzEnable record agingr   rM   )NoRefreshIntervalz3Aging no refresh interval in hours (0: use default)r   0V )RefreshIntervalz0Aging refresh interval in hours (0: use default)r   r  Nc                    |j                         | _        |j                  | j                        | _        t	        || j                  | j                        }t        |      }t        j                  }| j                  D ]  \  }}}}|j                  |      ||   }|||k  rt        | d|       |||kD  rt        | d|       t        j                         }||_        ||_        |r!t        d| d| d| | j                         	 |j!                  |d||dd||       t        d
| d| | j                          d}||	|
fD ]
  }||dz  } |dkD  rt        d      || j%                  ||||       |	| j'                  |||	|       |
| j)                  |||
|       y y # t"        $ r}t        d	| d|       d d }~ww xY w)Nz must be at least z can't exceed z
would set z to z for filer   ResetDwordPropertyzCould not set zSet rM   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   r/   r   mark_old_records_staticmark_records_static_regexmark_records_dynamic_regex)r*   r   r2  ru  rk  rm  rl  dry_runr  r  r  kwargsr"   r   nap_typer  r  r  r  v
name_paramr#   n_mark_optionsr   s                           r$   r  zcmd_zoneoptions.run5  s;    ((*--dgg6
!&$''4::>+G499 $ 7 7 	5AtT1zz!}$q	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	5@ )+,. 	$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   F00	G9GGc                     t        d|z  t               | j                  | j                        }d| d|j	                          }|j                  |t        j                  dddg      }||fS )	N	ldap://%surlsession_infocredentialsr   zDC=z#,CN=MicrosoftDNS,DC=DomainDNSZones,z/(&(objectClass=dnsNode)(!(dNSTombstoned=TRUE)))	dnsRecordr?   )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_nodeszcmd_zoneoptions._get_dns_nodes~  s    +.#1#3"&**: #F..013 '#&#4#4*D$/#8	  :
 e|r,   c                    	 t        j                  |d      }t        j                  |      }t        j                  t        |            }| j                  ||      \  }	}
|
D ]E  }d|vr	t        |d         }d}t        |      D ]Y  \  }}t        t        j                  |      }|j                  |k  s0|j                  dk7  s@d|_        t        |      ||<   |dz  }[ |dk(  r|d   d   j!                         }|r.t#        d| d	t%        |       d
| d| d	| j&                         t(        j*                  j-                  |	|j.                  |dt(        j0                        }|	j3                  |       t#        d| d	t%        |       d
| d| d	| j&                         H y # t        $ r}t	        d| d      d }~ww xY w)Nz%Y-%m-%dzInvalid date z: should be YYY-MM-DDr  r   rM   r?   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  rY  r?   msgs                      r$   r  z'cmd_zoneoptions.mark_old_records_static  s   	S{J7BBA 223q6:	**69=u 	:D$&${+,FG!&) !1 !5!5q9??Y.3??a3G&'CO (F1I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   +F, ,	G	5GG	c                    t        j                  |      }| j                  ||      \  }}|D ]V  }|d   d   j                         }	|j	                  |	      s,d|vr1t        |d         }
t        |
      dk(  rNd}t        |
      D ]I  \  }}t        t        j                  |      }|j                  dk7  s0d|_        t        |      |
|<   |dz  }K |dk(  r|r.t        d| dt        |
       d|	 d| d	| j                  	       t        j                   j#                  ||j$                  |
d
t        j&                        }|j)                  |       t        d| dt        |
       d|	 d| d	| j                  	       Y y)z>Make the records of nodes with matching names static.
        r?   r   r  rM   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  r?   r  r  r   r  rY  r  s                   r$   r  z)cmd_zoneoptions.mark_records_static_regex  s    JJu**69=u "	:D<?))+D88D>$&${+,F6{aG!&) !1 !5!5q9??a'&'CO (F1IqLG! !|G9Ac&k] ; 69+Q06:iiA++''/3ww6<)* ),(<(<	>C
 LLE'!CK=0CF!I;a)/3yy:C"	:r,   c                    t        j                  |      }| j                  ||      \  }}t        j                         }t	        j
                  t        |            }	t        j                  t        j                  t        j                  h}
|D ]e  }|d   d   j                         }|j                  |      s,d|vr1t        |d         }t        |      dk(  rNd}t        |      D ]X  \  }}t!        t        j"                  |      }|j$                  |
v s/|j&                  dk(  s?|	|_        t)        |      ||<   |dz  }Z |dk(  r|r.t+        d| dt        |       d| d| d	| j,                  	       t.        j0                  j3                  ||j4                  |d
t.        j6                        }|j9                  |       t+        d| dt        |       d| d| d	| j,                  	       h y)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.
        r?   r   r  rM   r  r  z records dynamic on r  r  r  r  N)r  r  r  r  r   r  r  r   r=  r?  rT  r  r  r  r  r  r
   r  r<  r  r   r  r   r  r  r  r  r  r  )r*   r   r  r  r  r  r  r  nowdns_timestampsafe_wtypesr  r?   r  r  r   r  rY  r  s                      r$   r  z*cmd_zoneoptions.mark_records_dynamic_regex  s   
 JJu**69=uiik 66s3x@OO
  "	:D<?))+D88D>$&${+,F6{aG!&) !1 !5!5q999+10D&3CO (F1IqLG! !|G9Ac&k] ; 69+Q06:iiA++''/3ww6<)* ),(<(<	>C
 LLE'!CK=0DF!I;a)/3yy:C"	:r,   )NNNFNNN)rA   rB   rC   rD   r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  rJ   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                       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      gZ	 	 ddZy)cmd_zoneinfozQuery for zone information.r  r   r2  rj  rn  ro  rp  rq  rr  ru  rv  Nc                 $   |j                         | _        |j                  | j                        | _        t	        || j                  | j                        }t        |      }|j                  |d||d      \  }	}
t        | j                  |	|
       y )Nr   ZoneInfo)	r~  r   r  r    r'   r   r.   r,  r   )r*   r   r2  ru  rk  rm  rl  r"   r   r  r  s              r$   r  zcmd_zoneinfo.run(  sw    ((*--dgg6
!&$''4::>+G4++NAvt,68tyy&#.r,   r  r  rJ   r,   r$   r  r    sk    %0HF#J ))--.. 	!(8!+@49	FM CG
/r,   r  c                   B   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
       edddd       edddd       edddd       edddd       edddd       edddd       ed d!dd"       ed#d$dd%      g	Z	 	 	 d(d'Zy&))cmd_zonelistzQuery for zones.ri  r   rj  rn  ro  rp  rq  rr  ru  rv  z	--primaryzList primary zones (default)r  primaryrw  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           	      *   d}|r|t         j                  z  }|r|t         j                  z  }|r|t         j                  z  }|r|t         j                  z  }|r|t         j
                  z  }|r|t         j                  z  }|	r|t         j                  z  }|
r|t         j                  z  }|dk(  rt         j                  }|j                         | _
        |j                  | j                        | _        t        || j                  | j                        }t        |      }|j                  |d|d dt         j                   |      \  }}|t         j"                  k(  rt         j$                  }nt         j&                  }t)        | j*                  ||       y )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   r2   DNSSRV_TYPEID_DWORDr   r1  DNSSRV_TYPEID_ZONEr9  r   )r*   r   ru  r  r  r  r  r  r  r   r  rk  rm  rl  request_filterr"   r   r  r  s                      r$   r  z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,   )FFFFFFFFNNNr  rJ   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            	           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       eddddddgd      gZ	 	 	 ddZy)cmd_zonecreatezCreate a zone.r  r   r2  rj  rn  ro  rp  rq  rr  ru  rv  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                    |j                         | _        |j                  | j                        | _        t	        || j                  | j                        }|j                         }t        j                  }	|dk(  rt        j                  }	t        |      }
|
t        j                  k(  rVt        j                  }t        j                         }||_        t        j                  |_        d|_        d|_        d|_        n|
t        j(                  k(  r]t        j*                  }t        j,                         }||_        t        j                  |_        d|_        d|_        d|_        |	|_        n\t        j0                  }t        j2                         }||_        t        j                  |_        d|_        d|_        d|_        |	|_        |j5                  |
d|d dd||       t        j6                  }t        j8                         }d|_        t        j<                  |_        t@        jB                  d| di}|j5                  |
d||dd|||		       | jD                  jG                  d
|z         y )Nr  r   rM   
ZoneCreateAllowUpdatezZone "z" already exists.r  r3   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   rp   r	  r  fDsIntegratedfLoadExistingr    DNSSRV_TYPEID_ZONE_CREATE_DOTNETDNS_RPC_ZONE_CREATE_INFO_DOTNETr!  DNSSRV_TYPEID_ZONE_CREATE!DNS_RPC_ZONE_CREATE_INFO_LONGHORNr/   r  r  r  r{   r  r   rF   r   r   )r*   r   r2  ru  r  rk  rm  rl  r"   dns_directorypartitionr   r  zone_create_infoname_and_paramr4   s                  r$   r  z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

 	!!.!VT"#%96"08 	" 	E 			84?@r,   r  r  rJ   r,   r$   r  r    s    0HF#J ))--.. 	!(8!+@49	F 	*5  & (+		M& @Ar,   r  c                   p    e Zd ZdZdZddgZej                  ej                  ej                  dZ
	 	 ddZy)	cmd_zonedeletezDelete a zone.r  r   r2  rj  Nc                    |j                         | _        |j                  | j                        | _        t	        || j                  | j                        }|j                         }t        j                  d| di}|j                  t        j                  d||ddt        j                  d |	      }| j                  j                  d|z         y )NZone z, does not exist and so could not be deleted.r   DeleteZoneFromDsr3   zZone %s deleted successfully
)r~  r   r  r    r'   r   r   "WERR_DNS_ERROR_ZONE_DOES_NOT_EXISTr/   r   r   DNSSRV_TYPEID_NULLr   r   )	r*   r   r2  rk  rm  rl  r"   r4   r  s	            r$   r  zcmd_zonedelete.run  s     ((*--dgg6
!&$''4::>zz| 55vIJ
 ''	(M(M()64<N(1(D(D(,x ( A
 			84?@r,   r  rA   rB   rC   rD   r  r  r  r  r  r  r  r  rJ   r,   r$   r#  r#    sG    0HF#J ))--.. :>Ar,   r#  c                      e Zd ZdZdZg dZej                  ej                  ej                  dZ
 edddd	       ed
ddd	       edddd	       edddd	       edddd	       edddd	       edddd	      gZ	 	 	 	 ddZy)	cmd_queryzQuery a name.zO%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|MX|NS|SOA|SRV|TXT|ALL> [options])r   r2  r?   rtyperj  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                    t        |      }|j                  d      dk7  r| j                  j                  d|z         d}|r|t        j
                  z  }|r|t        j                  z  }|r|t        j                  z  }|r|t        j                  z  }|	r|t        j                  z  }|
r|t        j                  z  }|r|t        j                  z  }|dk(  rt        j
                  }|t        j                  k(  rI| j                  j                  d       | j                  j                  d       |t        j
                  z  }|j                         | _        |j                  | j                        | _        t!        || j                  | j                        }t"        j$                  di}|j'                  t        j(                  d|||d ||d d |      \  }}t+        | j                  |       y )	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.r3   )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   rH   r0   r   rc  )r*   r   r2  r?   r,  r-  r  r.  r/  r0  r1  r2  rk  rm  rl  re  select_flagsr"   r4   buflenr  s                        r$   r  z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11fdD+|T4 2 
 	C(r,   )
FFFFFFFNNNr  rJ   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                   p    e Zd ZdZdZddgZej                  ej                  ej                  dZ
	 	 ddZy)	cmd_roothintszQuery root hints.z!%prog <server> [<name>] [options]r   zname?rj  Nc                    t         j                  }t        j                  t        j                  z  }|j                         | _        |j                  | j                        | _        t        || j                  | j                        }|j                  t        j                  d|d|d ||d d 
      \  }	}
t        | j                  |
       y )Nr   z..RootHints)r   rB  r   r;  r<  r~  r   r  r    r'   r0   r   rc  r   )r*   r   r?   rk  rm  rl  re  r?  r"   r@  r  s              r$   r  zcmd_roothints.runb  s    &&!==!>>? ((*--dgg6
!&$''4::>11111fm$\4? 	C(r,   )r  NNNr)  rJ   r,   r$   rB  rB  U  sG    2HG$J ))--.. >B)r,   rB  c                   p    e Zd ZdZdZg dZej                  ej                  ej                  dZ
	 	 ddZy)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   r2  r?   r,  r>  rj  Nc	           
      6   |j                         dvrt        d|z        t        |      }	t        |	|      }
|j	                         | _        |j                  | j
                        | _        t        || j
                  | j                        }t        j                         }|
|_        t        j                  d| d| t        j                  d| d| di}|j                  t        j                   d||||d |       | j"                  j%                  d	       y )
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[r7   r   r3   zRecord added successfully
r   r   r   rf  r~  r   r  r    r'   r   DNS_RPC_RECORD_BUFrY  r   rH   $WERR_DNS_ERROR_RECORD_ALREADY_EXISTSr1   r   r   r   )r*   r   r2  r?   r,  r>  rk  rm  rl  re  rY  r"   add_rec_bufr4   s                 r$   r  zcmd_add_record.run  s    ;;= WWJURSS#E* d3((*--dgg6
!&$''4::>224 55vWTF,77vWTF!-
 	$$Y%J%J%&dK.6 	% 	8 			56r,   r  r)  rJ   r,   r$   rE  rE  r  sG     VH<J ))--.. >B'+7r,   rE  c                   n    e Zd ZdZdZg dZej                  ej                  ej                  dZ
	 ddZy)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   r2  r?   r,  olddatanewdatarj  Nc
           
         |j                         }|dvrt        d|z        	 |dk(  rt        t        |       n|dk(  rt        t        |       t        |      }t        ||      }|j                         | _	        |j                  | j                        | _        t        || j                  | j                        }	 t        |j                  |||||      }|st        d      |j"                  |_        |j$                  |_        |j&                  |_        |j(                  |_        t+        j,                         }||_        t+        j,                         }||_        t0        j2                  d| d	i}|j5                  t*        j6                  d
||||||       | j8                  j;                  d       y # t
        $ r}
t        d| d|
      d }
~
ww xY w# t        $ r}
t        |
j                    d d }
~
ww xY w)N)	rJ  rK  rL  rM  rN  rO  SOArP  rQ  z+Updating record of type %s is not supportedrJ  rK  zbad data for z: r6  r%  z- does not exist; record could not be updated.r   r3   zRecord updated successfully
)r   r   r   r   r	   OSErrorr   rf  r~  r   r  r    r'   r   r"   r   r8   rV  rW  rX  r  r   rT  rY  r   rH   r1   r   r   r   )r*   r   r2  r?   r,  rY  rZ  rk  rm  rl  r#   re  rY  r"   	rec_matchrV  del_rec_bufr4   s                     r$   r  zcmd_update_record.run  s    VVLuTUU	?|'7+&(G, $E* g6((*--dgg6
!&$''4::>	2():):FD)-{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	2s/   +F7 =G 7	G GG	G:"G55G:r  r)  rJ   r,   r$   rX  rX    sC     gHJJ ))--.. 8<99r,   rX  c                   l    e Zd ZdZdZg dZej                  ej                  ej                  dZ
ddZy)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' ..."
    rF  rG  rj  Nc	           
      6   |j                         dvrt        d|z        t        |      }	t        |	|      }
|j	                         | _        |j                  | j
                        | _        t        || j
                  | j                        }t        j                         }|
|_        t        j                  d| d| t        j                  d| d| di}|j                  t        j                   d|||d ||       | j"                  j%                  d	       y )
NrI  z+Deleting record of type %s is not supportedz7Zone does not exist; record could not be deleted. zone[rR  z9Record already exists; record could not be deleted. zone[r7   r   r3   zRecord deleted successfully
rS  )r*   r   r2  r?   r,  r>  rk  rm  rl  re  rY  r"   r_  r4   s                 r$   r  zcmd_delete_record.run  s   ;;= WWLuTUU#E* d3((*--dgg6
!&$''4::>224 55vWTF,77vWTF!-
 	$$Y%J%J%&%+%)%)%)%0.6 	% 	8 			78r,   r  r)  rJ   r,   r$   ra  ra    s>     VH<J ))--.. 9r,   ra  c                       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	
       edddd	
      gZ	 	 ddZy)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   dnshostnamerj  z-vz	--verbosez
Be verboser  )rw  r  z-qz--quietzBe quietNc                     |j                         }|j                  |      }	| j                  ||      }
t        d|z  t	               |	|      }t        j                  ||
|d       y )N)verbosequietr  r  T)ignore_no_name)r~  r  
get_loggerr   r   r   remove_dns_references)r*   r   re  rk  rm  rl  rg  rh  r   r    loggerr  s               r$   r  zcmd_cleanup_record.runT  sg    ##%((,>+.#1#3"'B0 	''v{7;	=r,   )NNNFFr  rJ   r,   r$   rd  rd  9  sq    	 .HM*J ))--.. 	t[|LItYZEM
 AE38=r,   rd  c                      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<    e       ed<   y)cmd_dnsz%Domain Name Service (DNS) management.r  zoneoptionsr+  zonelist
zonecreate
zonedeletequery	roothintsaddupdatedeletecleanupN)rA   rB   rC   rD   subcommandsrh  r  r  r  r  r#  r+  rB  rE  rX  ra  rd  rJ   r,   r$   rn  rn  c  s    /K . 0K!0!2K*nK
*nK
 . 0K . 0K$;K,K')K-/K-/K/1K	r,   rn  )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'   rR   rX   r^   rf   rm   rw   r}   r   r   r   r   r   r   r   r   r  r,  r3  r9  r\  rc  rf  rh  r  r  r  r  r  r#  r+  rB  rE  rX  ra  rd  rn  rJ   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,   