2017-02-17 08:21:33 +03:00
# helper for 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/>.
#
from samba . dcerpc import dnsserver , dnsp
2021-03-26 10:42:49 +03:00
# Note: these are not quite the same as similar looking classes in
# provision/sambadns.py -- those ones are based on
# dnsp.DnssrvRpcRecord, these are based on dnsserver.DNS_RPC_RECORD.
# They encode the same information in slightly different ways.
2017-02-17 08:21:33 +03:00
#
2021-03-26 10:42:49 +03:00
# DNS_RPC_RECORD structures ([MS-DNSP]2.2.2.2.5 "DNS_RPC_RECORD") are
# used on the wire by DnssrvEnumRecords2. The dnsp.DnssrvRpcRecord
# versions have the in-database version of the same information, where
# the flags field is unpacked, and the struct ordering is different.
# See [MS-DNSP] 2.3.2.2 "DnsRecord".
2017-02-17 08:21:33 +03:00
#
2021-03-26 10:42:49 +03:00
# In both cases the structure and contents of .data depend on .wType.
# For example, if .wType is DNS_TYPE_A, .data is an IPv4 address. If
# the .wType is changed to DNS_TYPE_CNAME, the contents of .data will
# be interpreted as a cname blob, but the bytes there will still be
# those of the IPv4 address. If you don't also set the .data you may
# encounter stability problems. These DNS_RPC_RECORD subclasses
# attempt to hide that from you, but are only pretending -- any of
# them can represent any type of record.
2017-02-17 08:21:33 +03:00
2018-07-30 09:20:39 +03:00
2017-02-17 08:21:33 +03:00
class ARecord ( dnsserver . DNS_RPC_RECORD ) :
def __init__ ( self , ip_addr , serial = 1 , ttl = 900 , rank = dnsp . DNS_RANK_ZONE ,
2018-07-30 09:15:34 +03:00
node_flag = 0 ) :
2017-02-17 08:21:33 +03:00
super ( ARecord , self ) . __init__ ( )
self . wType = dnsp . DNS_TYPE_A
self . dwFlags = rank | node_flag
self . dwSerial = serial
self . dwTtlSeconds = ttl
2021-04-01 05:26:01 +03:00
self . data = ip_addr
2017-02-17 08:21:33 +03:00
class AAAARecord ( dnsserver . DNS_RPC_RECORD ) :
def __init__ ( self , ip6_addr , serial = 1 , ttl = 900 , rank = dnsp . DNS_RANK_ZONE ,
2018-07-30 09:15:34 +03:00
node_flag = 0 ) :
2017-02-17 08:21:33 +03:00
super ( AAAARecord , self ) . __init__ ( )
self . wType = dnsp . DNS_TYPE_AAAA
self . dwFlags = rank | node_flag
self . dwSerial = serial
self . dwTtlSeconds = ttl
2021-04-01 05:26:01 +03:00
self . data = ip6_addr
2017-02-17 08:21:33 +03:00
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 . dwTtlSeconds = ttl
ptr_name = dnsserver . DNS_RPC_NAME ( )
2021-04-01 05:26:01 +03:00
ptr_name . str = ptr
2017-02-17 08:21:33 +03:00
ptr_name . len = len ( ptr )
self . data = ptr_name
2021-03-26 08:22:17 +03:00
class CNAMERecord ( dnsserver . DNS_RPC_RECORD ) :
2017-02-17 08:21:33 +03:00
def __init__ ( self , cname , serial = 1 , ttl = 900 , rank = dnsp . DNS_RANK_ZONE ,
2018-07-30 09:15:34 +03:00
node_flag = 0 ) :
2021-03-26 08:22:17 +03:00
super ( ) . __init__ ( )
2017-02-17 08:21:33 +03:00
self . wType = dnsp . DNS_TYPE_CNAME
self . dwFlags = rank | node_flag
self . dwSerial = serial
self . dwTtlSeconds = ttl
cname_name = dnsserver . DNS_RPC_NAME ( )
2021-04-01 05:26:01 +03:00
cname_name . str = cname
2017-02-17 08:21:33 +03:00
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 ,
2018-07-30 09:15:34 +03:00
node_flag = 0 ) :
2017-02-17 08:21:33 +03:00
super ( NSRecord , self ) . __init__ ( )
self . wType = dnsp . DNS_TYPE_NS
self . dwFlags = rank | node_flag
self . dwSerial = serial
self . dwTtlSeconds = ttl
ns = dnsserver . DNS_RPC_NAME ( )
2021-04-01 05:26:01 +03:00
ns . str = dns_server
2017-02-17 08:21:33 +03:00
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
mx = dnsserver . DNS_RPC_RECORD_NAME_PREFERENCE ( )
mx . wPreference = preference
2021-04-01 05:26:01 +03:00
mx . nameExchange . str = mail_server
2017-02-17 08:21:33 +03:00
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
soa = dnsserver . DNS_RPC_RECORD_SOA ( )
soa . dwSerialNo = serial
soa . dwRefresh = refresh
soa . dwRetry = retry
soa . dwExpire = expire
soa . dwMinimumTtl = minimum
2021-04-01 05:26:01 +03:00
soa . NamePrimaryServer . str = mname
2017-02-17 08:21:33 +03:00
soa . NamePrimaryServer . len = len ( mname )
2021-04-01 05:26:01 +03:00
soa . ZoneAdministratorEmail . str = rname
2017-02-17 08:21:33 +03:00
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 ,
2018-07-30 09:16:12 +03:00
rank = dnsp . DNS_RANK_ZONE , node_flag = 0 ) :
2017-02-17 08:21:33 +03:00
super ( SRVRecord , self ) . __init__ ( )
self . wType = dnsp . DNS_TYPE_SRV
self . dwFlags = rank | node_flag
self . dwSerial = serial
self . dwTtlSeconds = ttl
srv = dnsserver . DNS_RPC_RECORD_SRV ( )
srv . wPriority = priority
srv . wWeight = weight
srv . wPort = port
2021-04-01 05:26:01 +03:00
srv . nameTarget . str = target
2017-02-17 08:21:33 +03:00
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 ,
2018-07-30 09:16:12 +03:00
node_flag = 0 ) :
2017-02-17 08:21:33 +03:00
super ( TXTRecord , self ) . __init__ ( )
self . wType = dnsp . DNS_TYPE_TXT
self . dwFlags = rank | node_flag
self . dwSerial = serial
self . dwTtlSeconds = ttl
names = [ ]
2021-04-01 05:26:01 +03:00
for s in slist :
2017-02-17 08:21:33 +03:00
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