1

我的老板给我分配了一项任务,我不知道如何完成。他需要我构建一个脚本,以便他可以使用命令行脚本执行各种 DNS 管理任务。虽然我不是程序员,但我至少玩过一点python。

我不确定哪种方法是完成这项工作的最佳方式。该文件遵循非常(至少对人类而言)简单的 5 行模式。每个条目中唯一更改的部分是域名本身。

zone "bostire.com" {
        type master;
        allow-transfer {none;};
        file "/etc/bind/zones/bostire.com";
};
zone "caylorscustommolds.com" {
        type master;
        allow-transfer {none;};
        file "/etc/bind/zones/caylorscustommolds.com";
};
zone "contractorsservicesofsek.com" {
        type master;
        allow-transfer {none;};
        file "/etc/bind/zones/contractorsservicesofsek.com";
};

我需要能够拥有可以添加、删除和排序此文件的功能。为了将来对脚本的改进,我想努力做到这样:

add_entry(newdomain.tld)
del_entry(olddomain.tld)
sort_entries()

在我的想法中,我承认这不是世界上最好的,如果我知道如何将文件读入某种数组以便对其进行排序,我应该能够使用相同的数组概念来删除。添加将是直截了当的,只需调用 sort_entries() 后记。

我不希望你们为我编写整个该死的程序,但如果你们能指出我正确的方向,或者提出一些想法让我阅读,那就太好了!


我注意到它似乎没有保存排序列表。所以,我开始调查原因。这是根据 Barnacle_Ed 的说明修改的代码:

import re

recordslist = open('/home/bradboy/named.conf.local', 'r+')
myregex = re.compile('^zone.*^\};\n', re.DOTALL | re.MULTILINE)
mylist = myregex.findall(recordslist.read())
mylist.sort()
print len(mylist)
numitems = 0
recordslist.seek(0)
for entry in sorted(mylist):
    recordslist.write(entry)
    numitems += 1
    print numitems
recordslist.truncate()
recordslist.close()

产生以下输出:

bradboy@ns1:~$ python dns.py 
1
1

我究竟做错了什么?

4

1 回答 1

1

这里有一些基本的构建块可以帮助您入门:

1)打开文件进行读写

myfile = open('your_filename_here', r+)


2) 使用re.findall()将条目划分为一个列表,其中每个条目以 'zone' 开头并以 '};' 结尾

myregex = re.compile('zone.*?\};', re.DOTALL | re.MULTILINE)
mylist = myregex.findall(myfile.read())


3) 要添加、删除和排序,请使用append()、remove() 和 sort() 函数。请注意,您需要其中一个数组条目的确切内容才能删除它...您可以使用类似的方法巧妙地做到这一点

for entry in mylist:
    if 'string_to_remove' in entry:
        mylist.remove(entry)


4) 最后,当您准备好用列表的修改内容覆盖旧文件时,从文件的开头开始,写出列表中的所有条目,然后丢弃结果位置之后的所有内容。从另一个stackoverflow问题

myfile.seek(0)
for entry in mylist:
    myfile.write(entry)
myfile.truncate()
myfile.close()



希望这可以帮助!

于 2013-03-21T17:47:12.730 回答