2010-12-03 12 views
1

私は自分自身をPython(そして一般的なプログラミング)の初心者だと思っていますが、私はZed A Shawの「難しい方法を学ぶ」と取り組んでいます。 私は、ドメインのライブMXレコードが期待されると(長い話)に変更されていないのようにしているかどうかを確認するために少しのスクリプトを書いているし、これまでのところ、私は次のようしている:出力をリスト/配列と比較する

import dns.resolver 
domain = 'bbc.co.uk' 
for x in dns.resolver.query(domain,'MX',): 
    print x.to_text() 

は、これは使用していますdnspythonモジュールはmailhostと設定番号を吐き出します。私が今行う必要があるのは、この出力を2つの期待される結果と比較することです。したがって、bbc.co.ukの場合はcluster1a.eu.messagelabs.comとなります。 & cluster1.eu.messagelabs.com。 (現在の設定番号に応じて順序が変わります)

これを行う最も良い方法は、予想される結果を配列/リストに追加して、スクリプトに出力を配列/リストと比較させることです真実または偽の陳述を提供しますが、一日中、さまざまなコードの整理をしようとすると、これまでのところ私の理解を超えていることが証明されています。

最終的には、結果が偽になる場合は自分自身や同僚に警告することができますが、これが実装される最良の方法を決定していないため、後で待つことができます。 私が望んでいる結果を達成するためのベストプラクティスについて、大まかな概要を私に与えることができますか?

私はこれを読むために時間を割いて誰に感謝:)

はありがとう、クリス

EDIT:これは私が望んでいた正確に何をするように見える、あなたが助けるために皆に感謝!

import dns.resolver 
domain = 'bbc.co.uk' 
expected_responses = ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.'] 
for x in dns.resolver.query(domain, 'MX'): 
     if x.to_text().split()[1] not in expected_responses: 
       print "Unexpected MX record found!" 
     else: 
       print x.to_text().split()[1] + " OK!" 

答えて

1

結果は、フォーマット「XXのdns_entry」に返されます。

import dns.resolver 
domain = 'bbc.co.uk' 
results = [] 
for x in dns.resolver.query(domain,'MX',): 
    results.append(x.to_text().split(' ')[1]) 
print results 

>>> ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.'] 

今、あなたは、このリストと比較することができます。

+0

あなたの返信ありがとう!この変更を行うと、出力は['cluster1.eu.messagelabs.com。'] ['cluster1.eu.messagelabs.com。'、 'cluster1a.eu.messagelabs.com。'] ですか? –

3

もしかして:

x.to_text() in {'cluster1a.eu.messagelabs.com', 'cluster1.eu.messagelabs.com'} 

?あなたが行うことができますので

+1

さらに、 'set( 'cluster1a.eu.messagelabs.com'、 'cluster1.eu.messagelabs.com')。 –

+0

私は{'a、b、c}'という構造体を使ってセットを定義することについて知らなかったので、あなたのプラスを取ってください。 – werehuman

+0

@werehuman - '{a、b、c}'セットのリテラル構文は、Python 2.7以降でのみ使用できます。 – bgporter

1

さて、その最初の何x.to_text()戻ってから先頭の番号をドロップする必要があります。

records = [x.to_text().split()[1] for x in dns.resolver.query(domain, 'MX')] 

それからちょうど確認してください。あなたがloopily、またはリスト内包とすることを行うことができます

txt = '20 cluster1a.eu.messagelabs.com.' # an example x.to_text() 
txt = txt.split()[1] # Get rid of everything before (and including) the first space. 

あなたが期待するものはすべてレコードにあります。

expected = ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.'] 
if False in [val in records for val in expected] or len(records) != len(expected): 
    # Die. 
+0

私はこれがまさに私が探していたものだと思います!私はそれを行って、それが動作する場合は投稿します:) –

1

import dns.resolver 

expected_domains = set(['cluster1a.eu.messagelabs.com.', 'cluster1.eu.messagelabs.com.']) 
domains = set(str(mx.exchange) for mx in dns.resolver.query('bbc.co.uk', 'MX')) 
if not domains.issuperset(expected_domains): 
    print("Missing MX domains:", ", ".join(expected_domains - domains)) 
+0

何らかの理由で無効な構文のエラー:( –

+0

@christopher、あなたが使用していますか?これはPython 2.7でうまく動作します。 2.5 – tokland

+0

私は2.6を使用していますが、expected_domains = {'cluster1a.eu.messagelabs.com。'、 'cluster1.eu.messagelabs.com。'}の間にカンマでエラーが表示されます –

0

編集:これは私が望んでいたものとまったく同じように見えます、皆さん、お手伝いをしてくれてありがとうございます!

import dns.resolver 
domain = 'bbc.co.uk' 
expected_responses = ['cluster1.eu.messagelabs.com.', 'cluster1a.eu.messagelabs.com.'] 
for x in dns.resolver.query(domain, 'MX'): 
     if x.to_text().split()[1] not in expected_responses: 
       print "Unexpected MX record found!" 
     else: 
       print x.to_text().split()[1] + " OK!"