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() 関数を使用します。それを削除するには、配列エントリの1つの正確な内容が必要になることに注意してください...次のようなものでこれを巧みに行うことができます

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


4) 最後に、変更されたリストの内容で古いファイルを上書きする準備ができたら、ファイルの先頭から開始し、リストからすべてのエントリを書き出してから、結果の位置の後のすべてを破棄します。別のスタックオーバーフローの質問から、

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



お役に立てれば!

于 2013-03-21T17:47:12.730 に答える