我的老板给我分配了一项任务,我不知道如何完成任务。他需要我构建一个脚本,以便他可以使用命令行脚本执行各种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()后记。
我不希望你们大家为我编写整个dang程序,但是如果你能指出我正确的方向,或者给我一些想法,那就太棒了!
我注意到它似乎没有保存排序列表。所以,我开始调查原因。以下是基于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
我做错了什么?
答案 0 :(得分: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(), and sort() functions。请注意,您需要其中一个数组条目的完全内容才能将其删除...您可以使用类似
for entry in mylist:
if 'string_to_remove' in entry:
mylist.remove(entry)
4)最后,当您准备用修改后的列表内容覆盖旧文件时,从文件的开头开始,写出列表中的所有条目,然后在结果位置后丢弃所有条目。来自a different stackoverflow question,
myfile.seek(0)
for entry in mylist:
myfile.write(entry)
myfile.truncate()
myfile.close()
希望这有帮助!