summaryrefslogtreecommitdiff
path: root/source4/scripting/python/samba/netcmd/dns.py
diff options
context:
space:
mode:
Diffstat (limited to 'source4/scripting/python/samba/netcmd/dns.py')
-rw-r--r--source4/scripting/python/samba/netcmd/dns.py1186
1 files changed, 0 insertions, 1186 deletions
diff --git a/source4/scripting/python/samba/netcmd/dns.py b/source4/scripting/python/samba/netcmd/dns.py
deleted file mode 100644
index c00d17ad72..0000000000
--- a/source4/scripting/python/samba/netcmd/dns.py
+++ /dev/null
@@ -1,1186 +0,0 @@
-# DNS management tool
-#
-# Copyright (C) Amitay Isaacs 2011-2012
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-import samba.getopt as options
-from struct import pack
-from socket import inet_ntoa
-import shlex
-
-from samba.netcmd import (
- Command,
- CommandError,
- Option,
- SuperCommand,
- )
-from samba.dcerpc import dnsp, dnsserver
-
-
-def dns_connect(server, lp, creds):
- if server.lower() == 'localhost':
- server = '127.0.0.1'
- binding_str = "ncacn_ip_tcp:%s[sign]" % server
- dns_conn = dnsserver.dnsserver(binding_str, lp, creds)
- return dns_conn
-
-
-def bool_string(flag):
- if flag == 0:
- ret = 'FALSE'
- elif flag == 1:
- ret = 'TRUE'
- else:
- ret = 'UNKNOWN (0x%x)' % flag
- return ret
-
-
-def enum_string(module, enum_defs, value):
- ret = None
- for e in enum_defs:
- if value == getattr(module, e):
- ret = e
- break
- if not ret:
- ret = 'UNKNOWN (0x%x)' % value
- return ret
-
-
-def bitmap_string(module, bitmap_defs, value):
- ret = ''
- for b in bitmap_defs:
- if value & getattr(module, b):
- ret += '%s ' % b
- if not ret:
- ret = 'NONE'
- return ret
-
-
-def boot_method_string(boot_method):
- enum_defs = [ 'DNS_BOOT_METHOD_UNINITIALIZED', 'DNS_BOOT_METHOD_FILE',
- 'DNS_BOOT_METHOD_REGISTRY', 'DNS_BOOT_METHOD_DIRECTORY' ]
- return enum_string(dnsserver, enum_defs, boot_method)
-
-
-def name_check_flag_string(check_flag):
- enum_defs = [ 'DNS_ALLOW_RFC_NAMES_ONLY', 'DNS_ALLOW_NONRFC_NAMES',
- 'DNS_ALLOW_MULTIBYTE_NAMES', 'DNS_ALLOW_ALL_NAMES' ]
- return enum_string(dnsserver, enum_defs, check_flag)
-
-
-def zone_type_string(zone_type):
- enum_defs = [ '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' ]
- return enum_string(dnsp, enum_defs, zone_type)
-
-
-def zone_update_string(zone_update):
- enum_defs = [ 'DNS_ZONE_UPDATE_OFF', 'DNS_ZONE_UPDATE_SECURE',
- 'DNS_ZONE_UPDATE_SECURE' ]
- return enum_string(dnsp, enum_defs, zone_update)
-
-
-def zone_secondary_security_string(security):
- enum_defs = [ 'DNS_ZONE_SECSECURE_NO_SECURITY', 'DNS_ZONE_SECSECURE_NS_ONLY',
- 'DNS_ZONE_SECSECURE_LIST_ONLY', 'DNS_ZONE_SECSECURE_NO_XFER' ]
- return enum_string(dnsserver, enum_defs, security)
-
-
-def zone_notify_level_string(notify_level):
- enum_defs = [ 'DNS_ZONE_NOTIFY_OFF', 'DNS_ZONE_NOTIFY_ALL_SECONDARIES',
- 'DNS_ZONE_NOTIFY_LIST_ONLY' ]
- return enum_string(dnsserver, enum_defs, notify_level)
-
-
-def dp_flags_string(dp_flags):
- bitmap_defs = [ 'DNS_DP_AUTOCREATED', 'DNS_DP_LEGACY', 'DNS_DP_DOMAIN_DEFAULT',
- 'DNS_DP_FOREST_DEFAULT', 'DNS_DP_ENLISTED', 'DNS_DP_DELETED' ]
- return bitmap_string(dnsserver, bitmap_defs, dp_flags)
-
-
-def zone_flags_string(flags):
- bitmap_defs = [ '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_READONLY']
- return bitmap_string(dnsserver, bitmap_defs, flags)
-
-
-def ip4_array_string(array):
- ret = []
- if not array:
- return ret
- for i in xrange(array.AddrCount):
- addr = '%s' % inet_ntoa(pack('i', array.AddrArray[i]))
- ret.append(addr)
- return ret
-
-
-def dns_addr_array_string(array):
- ret = []
- if not array:
- return ret
- for i in xrange(array.AddrCount):
- if array.AddrArray[i].MaxSa[0] == 0x02:
- addr = '%d.%d.%d.%d (%d)' % \
- tuple(array.AddrArray[i].MaxSa[4:8] + [array.AddrArray[i].MaxSa[3]])
- elif array.AddrArray[i].MaxSa[0] == 0x17:
- addr = '%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x (%d)' % \
- tuple(array.AddrArray[i].MaxSa[4:20] + [array.AddrArray[i].MaxSa[3]])
- else:
- addr = 'UNKNOWN'
- ret.append(addr)
- return ret
-
-
-def dns_type_flag(rec_type):
- rtype = rec_type.upper()
- if rtype == 'A':
- record_type = dnsp.DNS_TYPE_A
- elif rtype == 'AAAA':
- record_type = dnsp.DNS_TYPE_AAAA
- elif rtype == 'PTR':
- record_type = dnsp.DNS_TYPE_PTR
- elif rtype == 'NS':
- record_type = dnsp.DNS_TYPE_NS
- elif rtype == 'CNAME':
- record_type = dnsp.DNS_TYPE_CNAME
- elif rtype == 'SOA':
- record_type = dnsp.DNS_TYPE_SOA
- elif rtype == 'MX':
- record_type = dnsp.DNS_TYPE_MX
- elif rtype == 'SRV':
- record_type = dnsp.DNS_TYPE_SRV
- elif rtype == 'TXT':
- record_type = dnsp.DNS_TYPE_TXT
- elif rtype == 'ALL':
- record_type = dnsp.DNS_TYPE_ALL
- else:
- raise CommandError('Unknown type of DNS record %s' % rec_type)
- return record_type
-
-
-def dns_client_version(cli_version):
- version = cli_version.upper()
- if version == 'W2K':
- client_version = dnsserver.DNS_CLIENT_VERSION_W2K
- elif version == 'DOTNET':
- client_version = dnsserver.DNS_CLIENT_VERSION_DOTNET
- elif version == 'LONGHORN':
- client_version = dnsserver.DNS_CLIENT_VERSION_LONGHORN
- else:
- raise CommandError('Unknown client version %s' % cli_version)
- return client_version
-
-
-def print_serverinfo(outf, typeid, serverinfo):
- outf.write(' dwVersion : 0x%x\n' % serverinfo.dwVersion)
- outf.write(' fBootMethod : %s\n' % boot_method_string(serverinfo.fBootMethod))
- outf.write(' fAdminConfigured : %s\n' % bool_string(serverinfo.fAdminConfigured))
- outf.write(' fAllowUpdate : %s\n' % bool_string(serverinfo.fAllowUpdate))
- outf.write(' fDsAvailable : %s\n' % bool_string(serverinfo.fDsAvailable))
- outf.write(' pszServerName : %s\n' % serverinfo.pszServerName)
- outf.write(' pszDsContainer : %s\n' % serverinfo.pszDsContainer)
-
- if typeid != dnsserver.DNSSRV_TYPEID_SERVER_INFO:
- outf.write(' aipServerAddrs : %s\n' %
- ip4_array_string(serverinfo.aipServerAddrs))
- outf.write(' aipListenAddrs : %s\n' %
- ip4_array_string(serverinfo.aipListenAddrs))
- outf.write(' aipForwarders : %s\n' %
- ip4_array_string(serverinfo.aipForwarders))
- else:
- outf.write(' aipServerAddrs : %s\n' %
- dns_addr_array_string(serverinfo.aipServerAddrs))
- outf.write(' aipListenAddrs : %s\n' %
- dns_addr_array_string(serverinfo.aipListenAddrs))
- outf.write(' aipForwarders : %s\n' %
- dns_addr_array_string(serverinfo.aipForwarders))
-
- outf.write(' dwLogLevel : %d\n' % serverinfo.dwLogLevel)
- outf.write(' dwDebugLevel : %d\n' % serverinfo.dwDebugLevel)
- outf.write(' dwForwardTimeout : %d\n' % serverinfo.dwForwardTimeout)
- outf.write(' dwRpcPrototol : 0x%x\n' % serverinfo.dwRpcProtocol)
- outf.write(' dwNameCheckFlag : %s\n' % name_check_flag_string(serverinfo.dwNameCheckFlag))
- outf.write(' cAddressAnswerLimit : %d\n' % serverinfo.cAddressAnswerLimit)
- outf.write(' dwRecursionRetry : %d\n' % serverinfo.dwRecursionRetry)
- outf.write(' dwRecursionTimeout : %d\n' % serverinfo.dwRecursionTimeout)
- outf.write(' dwMaxCacheTtl : %d\n' % serverinfo.dwMaxCacheTtl)
- outf.write(' dwDsPollingInterval : %d\n' % serverinfo.dwDsPollingInterval)
- outf.write(' dwScavengingInterval : %d\n' % serverinfo.dwScavengingInterval)
- outf.write(' dwDefaultRefreshInterval : %d\n' % serverinfo.dwDefaultRefreshInterval)
- outf.write(' dwDefaultNoRefreshInterval : %d\n' % serverinfo.dwDefaultNoRefreshInterval)
- outf.write(' fAutoReverseZones : %s\n' % bool_string(serverinfo.fAutoReverseZones))
- outf.write(' fAutoCacheUpdate : %s\n' % bool_string(serverinfo.fAutoCacheUpdate))
- outf.write(' fRecurseAfterForwarding : %s\n' % bool_string(serverinfo.fRecurseAfterForwarding))
- outf.write(' fForwardDelegations : %s\n' % bool_string(serverinfo.fForwardDelegations))
- outf.write(' fNoRecursion : %s\n' % bool_string(serverinfo.fNoRecursion))
- outf.write(' fSecureResponses : %s\n' % bool_string(serverinfo.fSecureResponses))
- outf.write(' fRoundRobin : %s\n' % bool_string(serverinfo.fRoundRobin))
- outf.write(' fLocalNetPriority : %s\n' % bool_string(serverinfo.fLocalNetPriority))
- outf.write(' fBindSecondaries : %s\n' % bool_string(serverinfo.fBindSecondaries))
- outf.write(' fWriteAuthorityNs : %s\n' % bool_string(serverinfo.fWriteAuthorityNs))
- outf.write(' fStrictFileParsing : %s\n' % bool_string(serverinfo.fStrictFileParsing))
- outf.write(' fLooseWildcarding : %s\n' % bool_string(serverinfo.fLooseWildcarding))
- outf.write(' fDefaultAgingState : %s\n' % bool_string(serverinfo.fDefaultAgingState))
-
- if typeid != dnsserver.DNSSRV_TYPEID_SERVER_INFO_W2K:
- outf.write(' dwRpcStructureVersion : 0x%x\n' % serverinfo.dwRpcStructureVersion)
- outf.write(' aipLogFilter : %s\n' % dns_addr_array_string(serverinfo.aipLogFilter))
- outf.write(' pwszLogFilePath : %s\n' % serverinfo.pwszLogFilePath)
- outf.write(' pszDomainName : %s\n' % serverinfo.pszDomainName)
- outf.write(' pszForestName : %s\n' % serverinfo.pszForestName)
- outf.write(' pszDomainDirectoryPartition : %s\n' % serverinfo.pszDomainDirectoryPartition)
- outf.write(' pszForestDirectoryPartition : %s\n' % serverinfo.pszForestDirectoryPartition)
-
- outf.write(' dwLocalNetPriorityNetMask : 0x%x\n' % serverinfo.dwLocalNetPriorityNetMask)
- outf.write(' dwLastScavengeTime : %d\n' % serverinfo.dwLastScavengeTime)
- outf.write(' dwEventLogLevel : %d\n' % serverinfo.dwEventLogLevel)
- outf.write(' dwLogFileMaxSize : %d\n' % serverinfo.dwLogFileMaxSize)
- outf.write(' dwDsForestVersion : %d\n' % serverinfo.dwDsForestVersion)
- outf.write(' dwDsDomainVersion : %d\n' % serverinfo.dwDsDomainVersion)
- outf.write(' dwDsDsaVersion : %d\n' % serverinfo.dwDsDsaVersion)
-
- if typeid == dnsserver.DNSSRV_TYPEID_SERVER_INFO:
- outf.write(' fReadOnlyDC : %s\n' % bool_string(serverinfo.fReadOnlyDC))
-
-
-def print_zoneinfo(outf, typeid, zoneinfo):
- outf.write(' pszZoneName : %s\n' % zoneinfo.pszZoneName)
- outf.write(' dwZoneType : %s\n' % zone_type_string(zoneinfo.dwZoneType))
- outf.write(' fReverse : %s\n' % bool_string(zoneinfo.fReverse))
- outf.write(' fAllowUpdate : %s\n' % zone_update_string(zoneinfo.fAllowUpdate))
- outf.write(' fPaused : %s\n' % bool_string(zoneinfo.fPaused))
- outf.write(' fShutdown : %s\n' % bool_string(zoneinfo.fShutdown))
- outf.write(' fAutoCreated : %s\n' % bool_string(zoneinfo.fAutoCreated))
- outf.write(' fUseDatabase : %s\n' % bool_string(zoneinfo.fUseDatabase))
- outf.write(' pszDataFile : %s\n' % zoneinfo.pszDataFile)
- if typeid != dnsserver.DNSSRV_TYPEID_ZONE_INFO:
- outf.write(' aipMasters : %s\n' %
- ip4_array_string(zoneinfo.aipMasters))
- else:
- outf.write(' aipMasters : %s\n' %
- dns_addr_array_string(zoneinfo.aipMasters))
- outf.write(' fSecureSecondaries : %s\n' % zone_secondary_security_string(zoneinfo.fSecureSecondaries))
- outf.write(' fNotifyLevel : %s\n' % zone_notify_level_string(zoneinfo.fNotifyLevel))
- if typeid != dnsserver.DNSSRV_TYPEID_ZONE_INFO:
- outf.write(' aipSecondaries : %s\n' %
- ip4_array_string(zoneinfo.aipSecondaries))
- outf.write(' aipNotify : %s\n' %
- ip4_array_string(zoneinfo.aipNotify))
- else:
- outf.write(' aipSecondaries : %s\n' %
- dns_addr_array_string(zoneinfo.aipSecondaries))
- outf.write(' aipNotify : %s\n' %
- dns_addr_array_string(zoneinfo.aipNotify))
- outf.write(' fUseWins : %s\n' % bool_string(zoneinfo.fUseWins))
- outf.write(' fUseNbstat : %s\n' % bool_string(zoneinfo.fUseNbstat))
- outf.write(' fAging : %s\n' % bool_string(zoneinfo.fAging))
- outf.write(' dwNoRefreshInterval : %d\n' % zoneinfo.dwNoRefreshInterval)
- outf.write(' dwRefreshInterval : %d\n' % zoneinfo.dwRefreshInterval)
- outf.write(' dwAvailForScavengeTime : %d\n' % zoneinfo.dwAvailForScavengeTime)
- if typeid != dnsserver.DNSSRV_TYPEID_ZONE_INFO:
- outf.write(' aipScavengeServers : %s\n' %
- ip4_array_string(zoneinfo.aipScavengeServers))
- else:
- outf.write(' aipScavengeServers : %s\n' %
- dns_addr_array_string(zoneinfo.aipScavengeServers))
-
- if typeid != dnsserver.DNSSRV_TYPEID_ZONE_INFO_W2K:
- outf.write(' dwRpcStructureVersion : 0x%x\n' % zoneinfo.dwRpcStructureVersion)
- outf.write(' dwForwarderTimeout : %d\n' % zoneinfo.dwForwarderTimeout)
- outf.write(' fForwarderSlave : %d\n' % zoneinfo.fForwarderSlave)
- if typeid != dnsserver.DNSSRV_TYPEID_ZONE_INFO:
- outf.write(' aipLocalMasters : %s\n' %
- ip4_array_string(zoneinfo.aipLocalMasters))
- else:
- outf.write(' aipLocalMasters : %s\n' %
- dns_addr_array_string(zoneinfo.aipLocalMasters))
- outf.write(' dwDpFlags : %s\n' % dp_flags_string(zoneinfo.dwDpFlags))
- outf.write(' pszDpFqdn : %s\n' % zoneinfo.pszDpFqdn)
- outf.write(' pwszZoneDn : %s\n' % zoneinfo.pwszZoneDn)
- outf.write(' dwLastSuccessfulSoaCheck : %d\n' % zoneinfo.dwLastSuccessfulSoaCheck)
- outf.write(' dwLastSuccessfulXfr : %d\n' % zoneinfo.dwLastSuccessfulXfr)
-
- if typeid == dnsserver.DNSSRV_TYPEID_ZONE_INFO:
- outf.write(' fQueuedForBackgroundLoad : %s\n' % bool_string(zoneinfo.fQueuedForBackgroundLoad))
- outf.write(' fBackgroundLoadInProgress : %s\n' % bool_string(zoneinfo.fBackgroundLoadInProgress))
- outf.write(' fReadOnlyZone : %s\n' % bool_string(zoneinfo.fReadOnlyZone))
- outf.write(' dwLastXfrAttempt : %d\n' % zoneinfo.dwLastXfrAttempt)
- outf.write(' dwLastXfrResult : %d\n' % zoneinfo.dwLastXfrResult)
-
-
-def print_zone(outf, typeid, zone):
- outf.write(' pszZoneName : %s\n' % zone.pszZoneName)
- outf.write(' Flags : %s\n' % zone_flags_string(zone.Flags))
- outf.write(' ZoneType : %s\n' % zone_type_string(zone.ZoneType))
- outf.write(' Version : %s\n' % zone.Version)
-
- if typeid != dnsserver.DNSSRV_TYPEID_ZONE_W2K:
- outf.write(' dwDpFlags : %s\n' % dp_flags_string(zone.dwDpFlags))
- outf.write(' pszDpFqdn : %s\n' % zone.pszDpFqdn)
-
-
-def print_enumzones(outf, typeid, zones):
- outf.write(' %d zone(s) found\n' % zones.dwZoneCount)
- for zone in zones.ZoneArray:
- outf.write('\n')
- print_zone(outf, typeid, zone)
-
-
-def print_dns_record(outf, rec):
- if rec.wType == dnsp.DNS_TYPE_A:
- mesg = 'A: %s' % (rec.data)
- elif rec.wType == dnsp.DNS_TYPE_AAAA:
- mesg = 'AAAA: %s' % (rec.data)
- elif rec.wType == dnsp.DNS_TYPE_PTR:
- mesg = 'PTR: %s' % (rec.data.str)
- elif rec.wType == dnsp.DNS_TYPE_NS:
- mesg = 'NS: %s' % (rec.data.str)
- elif rec.wType == dnsp.DNS_TYPE_CNAME:
- mesg = 'CNAME: %s' % (rec.data.str)
- elif rec.wType == dnsp.DNS_TYPE_SOA:
- mesg = 'SOA: serial=%d, refresh=%d, retry=%d, expire=%d, ns=%s, email=%s' % (
- rec.data.dwSerialNo,
- rec.data.dwRefresh,
- rec.data.dwRetry,
- rec.data.dwExpire,
- rec.data.NamePrimaryServer.str,
- rec.data.ZoneAdministratorEmail.str)
- elif rec.wType == dnsp.DNS_TYPE_MX:
- mesg = 'MX: %s (%d)' % (rec.data.nameExchange.str, rec.data.wPreference)
- elif rec.wType == dnsp.DNS_TYPE_SRV:
- mesg = 'SRV: %s (%d, %d, %d)' % (rec.data.nameTarget.str, rec.data.wPort,
- rec.data.wPriority, rec.data.wWeight)
- elif rec.wType == dnsp.DNS_TYPE_TXT:
- slist = ['"%s"' % name.str for name in rec.data.str]
- mesg = 'TXT: %s' % ','.join(slist)
- else:
- mesg = 'Unknown: '
- outf.write(' %s (flags=%x, serial=%d, ttl=%d)\n' % (
- mesg, rec.dwFlags, rec.dwSerial, rec.dwTtlSeconds))
-
-
-def print_dnsrecords(outf, records):
- for rec in records.rec:
- outf.write(' Name=%s, Records=%d, Children=%d\n' % (
- rec.dnsNodeName.str,
- rec.wRecordCount,
- rec.dwChildCount))
- for dns_rec in rec.records:
- print_dns_record(outf, dns_rec)
-
-
-#
-# Always create a copy of strings when creating DNS_RPC_RECORDs
-# to overcome the bug in pidl generated python bindings.
-#
-
-class ARecord(dnsserver.DNS_RPC_RECORD):
- def __init__(self, ip_addr, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE,
- node_flag=0):
- super(ARecord, self).__init__()
- self.wType = dnsp.DNS_TYPE_A
- self.dwFlags = rank | node_flag
- self.dwSerial = serial
- self.dwTtlSeconds = ttl
- self._ip_addr = ip_addr[:]
- self.data = self._ip_addr
-
-
-class AAAARecord(dnsserver.DNS_RPC_RECORD):
-
- def __init__(self, ip6_addr, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE,
- node_flag=0):
- super(AAAARecord, self).__init__()
- self.wType = dnsp.DNS_TYPE_AAAA
- self.dwFlags = rank | node_flag
- self.dwSerial = serial
- self.dwTtlSeconds = ttl
- self._ip6_addr = ip6_addr[:]
- self.data = self._ip6_addr
-
-
-class PTRRecord(dnsserver.DNS_RPC_RECORD):
-
- def __init__(self, ptr, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE,
- node_flag=0):
- super(PTRRecord, self).__init__()
- self.wType = dnsp.DNS_TYPE_PTR
- self.dwFlags = rank | node_flag
- self.dwSerial = serial
- self.dwTtleSeconds = ttl
- self._ptr = ptr[:]
- ptr_name = dnsserver.DNS_RPC_NAME()
- ptr_name.str = self._ptr
- ptr_name.len = len(ptr)
- self.data = ptr_name
-
-
-class CNameRecord(dnsserver.DNS_RPC_RECORD):
-
- def __init__(self, cname, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE,
- node_flag=0):
- super(CNameRecord, self).__init__()
- self.wType = dnsp.DNS_TYPE_CNAME
- self.dwFlags = rank | node_flag
- self.dwSerial = serial
- self.dwTtlSeconds = ttl
- self._cname = cname[:]
- cname_name = dnsserver.DNS_RPC_NAME()
- cname_name.str = self._cname
- cname_name.len = len(cname)
- self.data = cname_name
-
-
-class NSRecord(dnsserver.DNS_RPC_RECORD):
-
- def __init__(self, dns_server, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE,
- node_flag=0):
- super(NSRecord, self).__init__()
- self.wType = dnsp.DNS_TYPE_NS
- self.dwFlags = rank | node_flag
- self.dwSerial = serial
- self.dwTtlSeconds = ttl
- self._dns_server = dns_server[:]
- ns = dnsserver.DNS_RPC_NAME()
- ns.str = self._dns_server
- ns.len = len(dns_server)
- self.data = ns
-
-
-class MXRecord(dnsserver.DNS_RPC_RECORD):
-
- def __init__(self, mail_server, preference, serial=1, ttl=900,
- rank=dnsp.DNS_RANK_ZONE, node_flag=0):
- super(MXRecord, self).__init__()
- self.wType = dnsp.DNS_TYPE_MX
- self.dwFlags = rank | node_flag
- self.dwSerial = serial
- self.dwTtlSeconds = ttl
- self._mail_server = mail_server[:]
- mx = dnsserver.DNS_RPC_RECORD_NAME_PREFERENCE()
- mx.wPreference = preference
- mx.nameExchange.str = self._mail_server
- mx.nameExchange.len = len(mail_server)
- self.data = mx
-
-
-class SOARecord(dnsserver.DNS_RPC_RECORD):
-
- def __init__(self, mname, rname, serial=1, refresh=900, retry=600,
- expire=86400, minimum=3600, ttl=3600, rank=dnsp.DNS_RANK_ZONE,
- node_flag=dnsp.DNS_RPC_FLAG_AUTH_ZONE_ROOT):
- super(SOARecord, self).__init__()
- self.wType = dnsp.DNS_TYPE_SOA
- self.dwFlags = rank | node_flag
- self.dwSerial = serial
- self.dwTtlSeconds = ttl
- self._mname = mname[:]
- self._rname = rname[:]
- soa = dnsserver.DNS_RPC_RECORD_SOA()
- soa.dwSerialNo = serial
- soa.dwRefresh = refresh
- soa.dwRetry = retry
- soa.dwExpire = expire
- soa.NamePrimaryServer.str = self._mname
- soa.NamePrimaryServer.len = len(mname)
- soa.ZoneAdministratorEmail.str = self._rname
- soa.ZoneAdministratorEmail.len = len(rname)
- self.data = soa
-
-
-class SRVRecord(dnsserver.DNS_RPC_RECORD):
-
- def __init__(self, target, port, priority=0, weight=100, serial=1, ttl=900,
- rank=dnsp.DNS_RANK_ZONE, node_flag=0):
- super(SRVRecord, self).__init__()
- self.wType = dnsp.DNS_TYPE_SRV
- self.dwFlags = rank | node_flag
- self.dwSerial = serial
- self.dwTtlSeconds = ttl
- self._target = target[:]
- srv = dnsserver.DNS_RPC_RECORD_SRV()
- srv.wPriority = priority
- srv.wWeight = weight
- srv.wPort = port
- srv.nameTarget.str = self._target
- srv.nameTarget.len = len(target)
- self.data = srv
-
-
-class TXTRecord(dnsserver.DNS_RPC_RECORD):
-
- def __init__(self, slist, serial=1, ttl=900, rank=dnsp.DNS_RANK_ZONE,
- node_flag=0):
- super(TXTRecord, self).__init__()
- self.wType = dnsp.DNS_TYPE_TXT
- self.dwFlags = rank | node_flag
- self.dwSerial = serial
- self.dwTtlSeconds = ttl
- self._slist = []
- for s in slist:
- self._slist.append(s[:])
- names = []
- for s in self._slist:
- name = dnsserver.DNS_RPC_NAME()
- name.str = s
- name.len = len(s)
- names.append(name)
- txt = dnsserver.DNS_RPC_RECORD_STRING()
- txt.count = len(slist)
- txt.str = names
- self.data = txt
-
-
-# Convert data into a dns record
-def data_to_dns_record(record_type, data):
- if record_type == dnsp.DNS_TYPE_A:
- rec = ARecord(data)
- elif record_type == dnsp.DNS_TYPE_AAAA:
- rec = AAAARecord(data)
- elif record_type == dnsp.DNS_TYPE_PTR:
- rec = PTRRecord(data)
- elif record_type == dnsp.DNS_TYPE_CNAME:
- rec = CNameRecord(data)
- elif record_type == dnsp.DNS_TYPE_NS:
- rec = NSRecord(data)
- elif record_type == dnsp.DNS_TYPE_MX:
- tmp = data.split(' ')
- if len(tmp) != 2:
- raise CommandError('Data requires 2 elements - mail_server, preference')
- mail_server = tmp[0]
- preference = int(tmp[1])
- rec = MXRecord(mail_server, preference)
- elif record_type == dnsp.DNS_TYPE_SRV:
- tmp = data.split(' ')
- if len(tmp) != 4:
- raise CommandError('Data requires 4 elements - server, port, priority, weight')
- server = tmp[0]
- port = int(tmp[1])
- priority = int(tmp[2])
- weight = int(tmp[3])
- rec = SRVRecord(server, port, priority=priority, weight=weight)
- elif record_type == dnsp.DNS_TYPE_SOA:
- tmp = data.split(' ')
- if len(tmp) != 7:
- raise CommandError('Data requires 7 elements - nameserver, email, serial, '
- 'refresh, retry, expire, minimumttl')
- nameserver = tmp[0]
- email = tmp[1]
- serial = int(tmp[2])
- refresh = int(tmp[3])
- retry = int(tmp[4])
- expire = int(tmp[5])
- minimum = int(tmp[6])
- rec = SOARecord(nameserver, email, serial=serial, refresh=refresh,
- retry=retry, expire=expire, minimum=minimum)
- elif record_type == dnsp.DNS_TYPE_TXT:
- slist = shlex.split(data)
- rec = TXTRecord(slist)
- else:
- raise CommandError('Unsupported record type')
- return rec
-
-
-# Match dns name (of type DNS_RPC_NAME)
-def dns_name_equal(n1, n2):
- return n1.str.rstrip('.').lower() == n2.str.rstrip('.').lower()
-
-
-# Match a dns record with specified data
-def dns_record_match(dns_conn, server, zone, name, record_type, data):
- urec = data_to_dns_record(record_type, data)
-
- select_flags = dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA
-
- try:
- buflen, res = dns_conn.DnssrvEnumRecords2(
- dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, server, zone, name, None,
- record_type, select_flags, None, None)
- except RuntimeError, e:
- return None
-
- if not res or res.count == 0:
- return None
-
- rec_match = None
- for rec in res.rec[0].records:
- if rec.wType != record_type:
- continue
-
- found = False
- if record_type == dnsp.DNS_TYPE_A:
- if rec.data == urec.data:
- found = True
- elif record_type == dnsp.DNS_TYPE_AAAA:
- if rec.data == urec.data:
- found = True
- elif record_type == dnsp.DNS_TYPE_PTR:
- if dns_name_equal(rec.data, urec.data):
- found = True
- elif record_type == dnsp.DNS_TYPE_CNAME:
- if dns_name_equal(rec.data, urec.data):
- found = True
- elif record_type == dnsp.DNS_TYPE_NS:
- if dns_name_equal(rec.data, urec.data):
- found = True
- elif record_type == dnsp.DNS_TYPE_MX:
- if dns_name_equal(rec.data.nameExchange, urec.data.nameExchange) and \
- rec.data.wPreference == urec.data.wPreference:
- found = True
- elif record_type == dnsp.DNS_TYPE_SRV:
- if rec.data.wPriority == urec.data.wPriority and \
- rec.data.wWeight == urec.data.wWeight and \
- rec.data.wPort == urec.data.wPort and \
- dns_name_equal(rec.data.nameTarget, urec.data.nameTarget):
- found = True
- elif record_type == dnsp.DNS_TYPE_SOA:
- if rec.data.dwSerialNo == urec.data.dwSerialNo and \
- rec.data.dwRefresh == urec.data.dwRefresh and \
- rec.data.dwRetry == urec.data.dwRetry and \
- rec.data.dwExpire == urec.data.dwExpire and \
- rec.data.dwMinimumTtl == urec.data.dwMinimumTtl and \
- dns_name_equal(rec.data.NamePrimaryServer,
- urec.data.NamePrimaryServer) and \
- dns_name_equal(rec.data.ZoneAdministratorEmail,
- urec.data.ZoneAdministratorEmail):
- found = True
- elif record_type == dnsp.DNS_TYPE_TXT:
- if rec.data.count == urec.data.count:
- found = True
- for i in xrange(rec.data.count):
- found = found and \
- (rec.data.str[i].str == urec.data.str[i].str)
-
- if found:
- rec_match = rec
- break
-
- return rec_match
-
-
-class cmd_serverinfo(Command):
- """Query for Server information."""
-
- synopsis = '%prog <server> [options]'
-
- takes_args = [ 'server' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- takes_options = [
- Option('--client-version', help='Client Version',
- default='longhorn', metavar='w2k|dotnet|longhorn',
- choices=['w2k','dotnet','longhorn'], dest='cli_ver'),
- ]
-
- def run(self, server, cli_ver, sambaopts=None, credopts=None,
- versionopts=None):
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- client_version = dns_client_version(cli_ver)
-
- typeid, res = dns_conn.DnssrvQuery2(client_version, 0, server,
- None, 'ServerInfo')
- print_serverinfo(self.outf, typeid, res)
-
-
-class cmd_zoneinfo(Command):
- """Query for zone information."""
-
- synopsis = '%prog <server> <zone> [options]'
-
- takes_args = [ 'server', 'zone' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- takes_options = [
- Option('--client-version', help='Client Version',
- default='longhorn', metavar='w2k|dotnet|longhorn',
- choices=['w2k','dotnet','longhorn'], dest='cli_ver'),
- ]
-
- def run(self, server, zone, cli_ver, sambaopts=None, credopts=None,
- versionopts=None):
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- client_version = dns_client_version(cli_ver)
-
- typeid, res = dns_conn.DnssrvQuery2(client_version, 0, server, zone,
- 'ZoneInfo')
- print_zoneinfo(self.outf, typeid, res)
-
-
-class cmd_zonelist(Command):
- """Query for zones."""
-
- synopsis = '%prog <server> [options]'
-
- takes_args = [ 'server' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- takes_options = [
- Option('--client-version', help='Client Version',
- default='longhorn', metavar='w2k|dotnet|longhorn',
- choices=['w2k','dotnet','longhorn'], dest='cli_ver'),
- Option('--primary', help='List primary zones (default)',
- action='store_true', dest='primary'),
- Option('--secondary', help='List secondary zones',
- action='store_true', dest='secondary'),
- Option('--cache', help='List cached zones',
- action='store_true', dest='cache'),
- Option('--auto', help='List automatically created zones',
- action='store_true', dest='auto'),
- Option('--forward', help='List forward zones',
- action='store_true', dest='forward'),
- Option('--reverse', help='List reverse zones',
- action='store_true', dest='reverse'),
- Option('--ds', help='List directory integrated zones',
- action='store_true', dest='ds'),
- Option('--non-ds', help='List non-directory zones',
- action='store_true', dest='nonds')
- ]
-
- def run(self, server, cli_ver, primary=False, secondary=False, cache=False,
- auto=False, forward=False, reverse=False, ds=False, nonds=False,
- sambaopts=None, credopts=None, versionopts=None):
- request_filter = 0
-
- if primary:
- request_filter |= dnsserver.DNS_ZONE_REQUEST_PRIMARY
- if secondary:
- request_filter |= dnsserver.DNS_ZONE_REQUEST_SECONDARY
- if cache:
- request_filter |= dnsserver.DNS_ZONE_REQUEST_CACHE
- if auto:
- request_filter |= dnsserver.DNS_ZONE_REQUEST_AUTO
- if forward:
- request_filter |= dnsserver.DNS_ZONE_REQUEST_FORWARD
- if reverse:
- request_filter |= dnsserver.DNS_ZONE_REQUEST_REVERSE
- if ds:
- request_filter |= dnsserver.DNS_ZONE_REQUEST_DS
- if nonds:
- request_filter |= dnsserver.DNS_ZONE_REQUEST_NON_DS
-
- if request_filter == 0:
- request_filter = dnsserver.DNS_ZONE_REQUEST_PRIMARY
-
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- client_version = dns_client_version(cli_ver)
-
- typeid, res = dns_conn.DnssrvComplexOperation2(client_version,
- 0, server, None,
- 'EnumZones',
- dnsserver.DNSSRV_TYPEID_DWORD,
- request_filter)
-
- if client_version == dnsserver.DNS_CLIENT_VERSION_W2K:
- typeid = dnsserver.DNSSRV_TYPEID_ZONE_W2K
- else:
- typeid = dnsserver.DNSSRV_TYPEID_ZONE
- print_enumzones(self.outf, typeid, res)
-
-
-class cmd_zonecreate(Command):
- """Create a zone."""
-
- synopsis = '%prog <server> <zone> [options]'
-
- takes_args = [ 'server', 'zone' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- takes_options = [
- Option('--client-version', help='Client Version',
- default='longhorn', metavar='w2k|dotnet|longhorn',
- choices=['w2k','dotnet','longhorn'], dest='cli_ver')
- ]
-
- def run(self, server, zone, cli_ver, sambaopts=None, credopts=None,
- versionopts=None):
-
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- zone = zone.lower()
-
- client_version = dns_client_version(cli_ver)
- if client_version == dnsserver.DNS_CLIENT_VERSION_W2K:
- typeid = dnsserver.DNSSRV_TYPEID_ZONE_CREATE_W2K
- zone_create_info = dnsserver.DNS_RPC_ZONE_CREATE_INFO_W2K()
- zone_create_info.pszZoneName = zone
- zone_create_info.dwZoneType = dnsp.DNS_ZONE_TYPE_PRIMARY
- zone_create_info.fAllowUpdate = dnsp.DNS_ZONE_UPDATE_SECURE
- zone_create_info.fAging = 0
- elif client_version == dnsserver.DNS_CLIENT_VERSION_DOTNET:
- typeid = dnsserver.DNSSRV_TYPEID_ZONE_CREATE_DOTNET
- zone_create_info = dnsserver.DNS_RPC_ZONE_CREATE_INFO_DOTNET()
- zone_create_info.pszZoneName = zone
- zone_create_info.dwZoneType = dnsp.DNS_ZONE_TYPE_PRIMARY
- zone_create_info.fAllowUpdate = dnsp.DNS_ZONE_UPDATE_SECURE
- zone_create_info.fAging = 0
- zone_create_info.dwDpFlags = dnsserver.DNS_DP_DOMAIN_DEFAULT
- else:
- typeid = dnsserver.DNSSRV_TYPEID_ZONE_CREATE
- zone_create_info = dnsserver.DNS_RPC_ZONE_CREATE_INFO_LONGHORN()
- zone_create_info.pszZoneName = zone
- zone_create_info.dwZoneType = dnsp.DNS_ZONE_TYPE_PRIMARY
- zone_create_info.fAllowUpdate = dnsp.DNS_ZONE_UPDATE_SECURE
- zone_create_info.fAging = 0
- zone_create_info.dwDpFlags = dnsserver.DNS_DP_DOMAIN_DEFAULT
-
- res = dns_conn.DnssrvOperation2(client_version, 0, server, None,
- 0, 'ZoneCreate', typeid,
- zone_create_info)
- self.outf.write('Zone %s created successfully\n' % zone)
-
-
-class cmd_zonedelete(Command):
- """Delete a zone."""
-
- synopsis = '%prog <server> <zone> [options]'
-
- takes_args = [ 'server', 'zone' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- def run(self, server, zone, sambaopts=None, credopts=None,
- versionopts=None):
-
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- zone = zone.lower()
- res = dns_conn.DnssrvOperation2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
- 0, server, zone, 0, 'DeleteZoneFromDs',
- dnsserver.DNSSRV_TYPEID_NULL,
- None)
- self.outf.write('Zone %s delete successfully\n' % zone)
-
-
-class cmd_query(Command):
- """Query a name."""
-
- synopsis = '%prog <server> <zone> <name> <A|AAAA|CNAME|MX|NS|SOA|SRV|TXT|ALL> [options]'
-
- takes_args = [ 'server', 'zone', 'name', 'rtype' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- takes_options = [
- Option('--authority', help='Search authoritative records (default)',
- action='store_true', dest='authority'),
- Option('--cache', help='Search cached records',
- action='store_true', dest='cache'),
- Option('--glue', help='Search glue records',
- action='store_true', dest='glue'),
- Option('--root', help='Search root hints',
- action='store_true', dest='root'),
- Option('--additional', help='List additional records',
- action='store_true', dest='additional'),
- Option('--no-children', help='Do not list children',
- action='store_true', dest='no_children'),
- Option('--only-children', help='List only children',
- action='store_true', dest='only_children')
- ]
-
- def run(self, server, zone, name, rtype, authority=False, cache=False,
- glue=False, root=False, additional=False, no_children=False,
- only_children=False, sambaopts=None, credopts=None,
- versionopts=None):
- record_type = dns_type_flag(rtype)
-
- select_flags = 0
- if authority:
- select_flags |= dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA
- if cache:
- select_flags |= dnsserver.DNS_RPC_VIEW_CACHE_DATA
- if glue:
- select_flags |= dnsserver.DNS_RPC_VIEW_GLUE_DATA
- if root:
- select_flags |= dnsserver.DNS_RPC_VIEW_ROOT_HINT_DATA
- if additional:
- select_flags |= dnsserver.DNS_RPC_VIEW_ADDITIONAL_DATA
- if no_children:
- select_flags |= dnsserver.DNS_RPC_VIEW_NO_CHILDREN
- if only_children:
- select_flags |= dnsserver.DNS_RPC_VIEW_ONLY_CHILDREN
-
- if select_flags == 0:
- select_flags = dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA
-
- if select_flags == dnsserver.DNS_RPC_VIEW_ADDITIONAL_DATA:
- self.outf.write('Specify either --authority or --root along with --additional.\n')
- self.outf.write('Assuming --authority.\n')
- select_flags |= dnsserver.DNS_RPC_VIEW_AUTHORITY_DATA
-
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- buflen, res = dns_conn.DnssrvEnumRecords2(
- dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, server, zone, name,
- None, record_type, select_flags, None, None)
- print_dnsrecords(self.outf, res)
-
-
-class cmd_roothints(Command):
- """Query root hints."""
-
- synopsis = '%prog <server> [<name>] [options]'
-
- takes_args = [ 'server', 'name?' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- def run(self, server, name='.', sambaopts=None, credopts=None,
- versionopts=None):
- record_type = dnsp.DNS_TYPE_NS
- select_flags = (dnsserver.DNS_RPC_VIEW_ROOT_HINT_DATA |
- dnsserver.DNS_RPC_VIEW_ADDITIONAL_DATA)
-
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- buflen, res = dns_conn.DnssrvEnumRecords2(
- dnsserver.DNS_CLIENT_VERSION_LONGHORN, 0, server, '..RootHints',
- name, None, record_type, select_flags, None, None)
- print_dnsrecords(self.outf, res)
-
-
-class cmd_add_record(Command):
- """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' ..."
- """
-
- synopsis = '%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|NS|MX|SRV|TXT> <data>'
-
- takes_args = [ 'server', 'zone', 'name', 'rtype', 'data' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- def run(self, server, zone, name, rtype, data, sambaopts=None,
- credopts=None, versionopts=None):
-
- if rtype.upper() not in ('A','AAAA','PTR','CNAME','NS','MX','SRV','TXT'):
- raise CommandError('Adding record of type %s is not supported' % rtype)
-
- record_type = dns_type_flag(rtype)
- rec = data_to_dns_record(record_type, data)
-
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- rec_match = dns_record_match(dns_conn, server, zone, name, record_type,
- data)
- if rec_match is not None:
- raise CommandError('Record already exists')
-
- add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
- add_rec_buf.rec = rec
-
- dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
- 0, server, zone, name, add_rec_buf, None)
- self.outf.write('Record added successfully\n')
-
-
-class cmd_update_record(Command):
- """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"
- SRV "fqdn_string port priority weight"
- TXT "'string1' 'string2' ..."
- """
-
- synopsis = '%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|NS|MX|SRV|TXT> <olddata> <newdata>'
-
- takes_args = [ 'server', 'zone', 'name', 'rtype', 'olddata', 'newdata' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- def run(self, server, zone, name, rtype, olddata, newdata,
- sambaopts=None, credopts=None, versionopts=None):
-
- if rtype.upper() not in ('A','AAAA','PTR','CNAME','NS','MX','SRV','TXT'):
- raise CommandError('Updating record of type %s is not supported' % rtype)
-
- record_type = dns_type_flag(rtype)
- rec = data_to_dns_record(record_type, newdata)
-
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- rec_match = dns_record_match(dns_conn, server, zone, name, record_type,
- olddata)
- if not rec_match:
- raise CommandError('Record does not exist')
-
- # Copy properties from existing record to new record
- rec.dwFlags = rec_match.dwFlags
- rec.dwSerial = rec_match.dwSerial
- rec.dwTtlSeconds = rec_match.dwTtlSeconds
- rec.dwTimeStamp = rec_match.dwTimeStamp
-
- add_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
- add_rec_buf.rec = rec
-
- del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
- del_rec_buf.rec = rec_match
-
- dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
- 0,
- server,
- zone,
- name,
- add_rec_buf,
- del_rec_buf)
- self.outf.write('Record updated succefully\n')
-
-
-class cmd_delete_record(Command):
- """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' ..."
- """
-
- synopsis = '%prog <server> <zone> <name> <A|AAAA|PTR|CNAME|NS|MX|SRV|TXT> <data>'
-
- takes_args = [ 'server', 'zone', 'name', 'rtype', 'data' ]
-
- takes_optiongroups = {
- "sambaopts": options.SambaOptions,
- "versionopts": options.VersionOptions,
- "credopts": options.CredentialsOptions,
- }
-
- def run(self, server, zone, name, rtype, data, sambaopts=None, credopts=None, versionopts=None):
-
- if rtype.upper() not in ('A','AAAA','PTR','CNAME','NS','MX','SRV','TXT'):
- raise CommandError('Deleting record of type %s is not supported' % rtype)
-
- record_type = dns_type_flag(rtype)
-
- self.lp = sambaopts.get_loadparm()
- self.creds = credopts.get_credentials(self.lp)
- dns_conn = dns_connect(server, self.lp, self.creds)
-
- rec_match = dns_record_match(dns_conn, server, zone, name, record_type, data)
- if not rec_match:
- raise CommandError('Record does not exist')
-
- del_rec_buf = dnsserver.DNS_RPC_RECORD_BUF()
- del_rec_buf.rec = rec_match
-
- dns_conn.DnssrvUpdateRecord2(dnsserver.DNS_CLIENT_VERSION_LONGHORN,
- 0,
- server,
- zone,
- name,
- None,
- del_rec_buf)
- self.outf.write('Record deleted succefully\n')
-
-
-class cmd_dns(SuperCommand):
- """Domain Name Service (DNS) management."""
-
- subcommands = {}
- subcommands['serverinfo'] = cmd_serverinfo()
- subcommands['zoneinfo'] = cmd_zoneinfo()
- subcommands['zonelist'] = cmd_zonelist()
- subcommands['zonecreate'] = cmd_zonecreate()
- subcommands['zonedelete'] = cmd_zonedelete()
- subcommands['query'] = cmd_query()
- subcommands['roothints'] = cmd_roothints()
- subcommands['add'] = cmd_add_record()
- subcommands['update'] = cmd_update_record()
- subcommands['delete'] = cmd_delete_record()