【问题标题】:Read zone file with dnspython SOA error读取带有 dnspython SOA 错误的区域文件
【发布时间】:2014-10-27 12:41:50
【问题描述】:

我真的在努力让 dnspython 读取区域文件,我总是被 SOA 卡住,我尝试过不同区域文件和 python 脚本的组合。

区域文件(来自http://agiletesting.blogspot.com/2005/08/managing-dns-zone-files-with-dnspython.html):

$TTL 36000
example.com. IN      SOA     ns1.example.com. hostmaster.example.com. (
               2005081201      ; serial
               28800   ; refresh (8 hours)
               1800    ; retry (30 mins)
               2592000 ; expire (30 days)
               86400 ) ; minimum (1 day)

example.com.     86400   NS      ns1.example.com.
example.com.     86400   NS      ns2.example.com.
example.com.     86400   MX 10   mail.example.com.
example.com.     86400   MX 20   mail2.example.com.
example.com.     86400   A       192.168.10.10
ns1.example.com.        86400   A       192.168.1.10
ns2.example.com.        86400   A       192.168.1.20
mail.example.com.       86400   A       192.168.2.10
mail2.example.com.      86400   A       192.168.2.20
www2.example.com.       86400   A    192.168.10.20
www.example.com.        86400 CNAME     example.com.
ftp.example.com.        86400 CNAME     example.com.
webmail.example.com.    86400 CNAME     example.com.

脚本1(来自http://agiletesting.blogspot.com/2005/08/managing-dns-zone-files-with-dnspython.html):

import dns.zone
from dns.exception import DNSException
import dns.ipv4
import os.path
import sys

zone_file = sys.argv[1]
print "Command line argument: " + str(zone_file)

domain = os.path.basename(zone_file).replace(".hosts","")
print "Domain - "+domain

try:
        zone = dns.zone.from_file(zone_file, domain)
        print "Zone origin:", zone.origin

        for name, node in zone.nodes.items():
                rdatasets = node.rdatasets
                print "\n**** BEGIN NODE ****"
                print "node name:", name
                for rdataset in rdatasets:
                        print "--- BEGIN RDATASET ---"
                        print "rdataset string representation:", rdataset
                        print "rdataset rdclass:", rdataset.rdclass
                        print "rdataset rdtype:", rdataset.rdtype
                        print "rdataset ttl:", rdataset.ttl
                        print "rdataset has following rdata:"
                        for rdata in rdataset:
                                print "-- BEGIN RDATA --"
                                print "rdata string representation:", rdata
                                if rdataset.rdtype == SOA:
                                        print "** SOA-specific rdata **"
                                        print "expire:", rdata.expire
                                        print "minimum:", rdata.minimum
                                        print "mname:", rdata.mname
                                        print "refresh:", rdata.refresh
                                        print "retry:", rdata.retry
                                        print "rname:", rdata.rname
                                        print "serial:", rdata.serial
                                if rdataset.rdtype == MX:
                                        print "** MX-specific rdata **"
                                        print "exchange:", rdata.exchange
                                        print "preference:", rdata.preference
                                if rdataset.rdtype == NS:
                                        print "** NS-specific rdata **"
                                        print "target:", rdata.target
                                if rdataset.rdtype == CNAME:
                                        print "** CNAME-specific rdata **"
                                        print "target:", rdata.target
                                if rdataset.rdtype == A:
                                        print "** A-specific rdata **"
                                        print "address:", rdata.address

except DNSException, e:
        print e.__class__, e

错误:

python read_zonefile.py example.com.hosts

命令行参数:example.com.hosts

域 - example.com

区域来源:example.com。

** 开始节点 **

节点名称:@

--- 开始 RDATASET ---

rdataset 字符串表示:36000 IN SOA ns1 hostmaster 2005081201 28800 1800 2592000 86400

rdataset rdclass: 1

rdataset rdtype: 6

rdataset ttl: 36000

rdataset 有以下 rdata:

-- 开始读取数据--

rdata 字符串表示:ns1 hostmaster 2005081201 28800 1800 2592000 86400

Traceback(最近一次调用最后一次):

文件“read_zonefile.py”,第 31 行,在

if rdataset.rdtype == SOA:

NameError: 名称“SOA”未定义

脚本 2:

import dns.zone
import dns.ipv4
import os.path
import sys
reverse_map Olivia Munn= {}
for filename in sys.argv[1:]:
        zone = dns.zone.from_file(filename, os.path.basename(filename),relativize=False)
        for (name, ttl, rdata) in zone.iterate_rdatas('A'):
                try:
                        reverse_map[rdata.address].append(name.to_text())
                except KeyError:
                        reverse_map[rdata.address] = [name.to_text()]
keys = reverse_map.keys()
keys.sort(lambda a1, a2: cmp(dns.ipv4.inet_aton(a1), dns.ipv4.inet_aton(a2)))
for k in keys:
        v = reverse_map[k]
        v.sort()
        print k, v

错误:

python create_rev_dns.py example.com.hosts

Traceback(最近一次调用最后一次):

文件“create_rev_dns.py”,第 7 行,在

zone = dns.zone.from_file(filename, os.path.basename(filename),relativize=False)

文件“/usr/lib64/python2.6/site-packages/dns/zone.py”,第 977 行,在 from_file 中

filename, allow_include, check_origin)

文件“/usr/lib64/python2.6/site-packages/dns/zone.py”,第 924 行,在 from_text 中

reader.read()

文件“/usr/lib64/python2.6/site-packages/dns/zone.py”,第 882 行,正在读取中

self.zone.check_origin()

文件“/usr/lib64/python2.6/site-packages/dns/zone.py”,第 521 行,在 check_origin 中

raise NoSOA

dns.zone.NoSOA

关于区域文件,我从 Godaddy.com 下载了一个区域文件,同样的问题。我从 PRODUCTION Bind 服务器(辅助区域)获取了一个区域文件,同样的错误。

所以我真的很难过,任何帮助都会得到很大的拨款。

【问题讨论】:

    标签: python dns dnspython


    【解决方案1】:

    关于脚本1:

    我遇到了类似的问题,因为 SOA 是未知的 - 所有其他 rdata 类型也是如此。要么使用from 指令导入它们,要么给出全名,例如dns.rdatatype.SOA, ...

    关于脚本 2:

    演示从文件名中猜测区域来源。如果文件名不是区域来源,请将os.path.basename(filename) 替换为区域来源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-30
      相关资源
      最近更新 更多