Сравнение вывода с списком / массивом - PullRequest
1 голос
/ 03 декабря 2010

Я считаю себя очень новичком в python (и программировании в целом!), Но я работаю, хотя "изучаю 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 и номер предпочтения. Теперь мне нужно сравнить эти результаты с двумя ожидаемыми результатами, поэтому для bbc.co.uk это будет cluster1a.eu.messagelabs.com. & cluster1.eu.messagelabs.com. (Их порядок меняется в зависимости от текущего номера предпочтения)

Я подумал, что лучший способ сделать это - добавить ожидаемые результаты в массив / список, чтобы скрипт попытался сравнить выходные данные с массивом / списком и предоставить утверждение true или false, но после того, как все потрачено день, пробующий различные варианты кода, это до сих пор выходит за рамки моего понимания.

В конечном итоге я хотел бы предупредить себя или своих коллег, если результат окажется ложным, но это может подождать до тех пор, пока я не определился с наилучшим способом реализации этого. Сможет ли какая-нибудь добрая душа дать мне приблизительное представление о том, какой будет наилучшая практика для достижения результата, на который я надеюсь?

Я ценю всех, кто нашел время, чтобы прочитать это:)

Спасибо, Крис

РЕДАКТИРОВАТЬ: Это похоже на то, что я надеялся, спасибо всем за помощь!

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!"

Ответы [ 5 ]

3 голосов
/ 03 декабря 2010

Вы имеете в виду:

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

1 голос
/ 03 декабря 2010

А как же?

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))
1 голос
/ 03 декабря 2010

Хорошо, поэтому сначала вы должны отбросить начальный номер из того, что возвращает x.to_text():

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.

Вы можете сделать это циклично или с пониманием списка:

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

Тогда просто убедитесь, что все, что вы ожидаете, находится в записях

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.
1 голос
/ 03 декабря 2010

Результаты возвращаются в формате «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 голосов
/ 03 декабря 2010

РЕДАКТИРОВАТЬ: Это похоже на то, что я надеялся, спасибо всем за помощь!

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!"
...