Seite 1 von 1

Umwandlung eines Rückgabeobjects (rdata) in einen String

Verfasst: Mittwoch 11. Februar 2009, 13:24
von Markus K.
Hallo,

ich bin noch ein Python- bzw. Programmieranfänger und kämpfe mit einem Problem, das von euch sicher belächelt wird. Ich habe schon Stunden damit verbracht bei Google und auf der Webseite von dnspython nach Antworten zu suchen.

Nun, worum geht's in meinem Code?
Für eine Domain soll ein Zonentransfer versucht werden. Dafür fragt er den Benutzer nach der gewünschten Domain. Das Script holt sich dann die authorativen Nameserver.
Das klappt auch soweit, und ich kann die Nameserver auch mit print ausgeben.

Verwende ich dann diese Nameserver für den Zonentransfer mittels Variable, dann kommt die Fehlermeldung, dass der Typ nicht passt.

Ich habe mir dann mittels print dir() die Methoden und Attribute des Rückgabeobjekts ausgegen und mit to_text versucht umzuwandeln.

Der Code dafür ist:

Code: Alles auswählen

line2=liste[j].to_text       
        
Klappt leider auch nicht, wenn ich das mit Print ausgebe.

Das Objekt, um das es sich handelt, befülle ich mit:

Code: Alles auswählen

for rdata in ns:
         print 'Nameserver', i, 'for', domain, 'is', rdata.target
         liste.append(rdata.target)
         i=i+1

line2.str ging ebenso nicht.
Könnt ihr mich da bitte in die richtige Richtung bringen? Ich brauch den Code für ein Weiterbildungsprojekt, wo auch Python gestreift wird und ich komm einfach nicht drauf was ich tun soll.

Vielen Dank. Und verzeiht mir meine nicht ganz so programmtechnisch gut formulierte und lange Frage.

lg Markus

Verfasst: Mittwoch 11. Februar 2009, 13:38
von cofi
Ich hab deine Frage nur überflogen, aber ich glaube str(OBJEKT_EINFÜGEN) bzw unicode(OBJEKT_EINFÜGEN) sollten dir behilflich sein ;)

Verfasst: Mittwoch 11. Februar 2009, 21:00
von BlackJack
Oder falls die Objekte wirklich eine `to_text()`-Methode haben, solltest Du die auch *aufrufen*.

Verfasst: Mittwoch 11. Februar 2009, 21:20
von Markus K.
cofi: str() half nicht, wie erwähnt. Ich habe, wie Blackjack erwähnt, die Funktion to_text() nicht richtig aufgerufen.

Blackjack: OK, etwas peinlich. Ich dachte das Anhängen der Funktion macht schon den Trick.

Mit

Code: Alles auswählen

line2=liste[j].to_text(liste[j])
ging's dann natürlich. Sehr fein!
Ich bekomm jetzt nur einen dns.exception.FormError. Mal wieder googlen. *seufz*

Aber danke!

Verfasst: Mittwoch 11. Februar 2009, 22:17
von Hyperion
Markus K. hat geschrieben:

Code: Alles auswählen

line2=liste[j].to_text(liste[j])
line2 verheißt nichts gutes! Das schreit nach einer Struktur wie einer Liste!

Verfasst: Mittwoch 11. Februar 2009, 22:26
von Markus K.
Ja, hab's dann gleich mit einer Liste gemacht.
Mein Code klappt nun bei bestimmten Domains (auch mit mehreren autorativen Nameservern) und bei den meisten nicht. Da krieg ich eben den vorhin erwähnten Fehler "dns.exception.FormError".

Verfasst: Mittwoch 11. Februar 2009, 22:30
von Hyperion
Markus K. hat geschrieben:Ja, hab's dann gleich mit einer Liste gemacht.
Mein Code klappt nun bei bestimmten Domains (auch mit mehreren autorativen Nameservern) und bei den meisten nicht. Da krieg ich eben den vorhin erwähnten Fehler "dns.exception.FormError".
Ohne den dafür verantwortlichen Code können wir hier nicht viel dazu sagen ;-)

Verfasst: Donnerstag 12. Februar 2009, 09:34
von Markus K.
OK, aber: Ja, ich weiß, dass man das auch bestimmt viel eleganter lösen könnte. Aber das ist mein erstes Script, daher bitte Nachsicht. :P

Code: Alles auswählen

import dns.query
import dns.zone
import dns.resolver
import sys
import re
import string

domain=raw_input ('Enter the domain you want to try a zone transfer:\n')

print '\n\n'


liste = []
i=0

ns = dns.resolver.query(domain, 'NS')
for rdata in ns:
	print 'Nameserver', i, 'for', domain, 'is', rdata.target
	liste.append(rdata.target)
	i=i+1


j=0
liste2=[]

while j < i:
	liste2.append(liste[j].to_text(liste[j]))
	
	print 'this is liste2', liste2
	
	line2 = liste2[j]
	print 'this is line2', line2
	
	z = dns.zone.from_xfr(dns.query.xfr(line2, domain))
        names = z.nodes.keys()
        names.sort()
        for n in names:
		print z[n].to_text(n)
	j=j+1

[/code]

Verfasst: Donnerstag 12. Februar 2009, 11:25
von Hyperion
So, jetzt dann bitte noch die exakte Fehlermeldung ;-)

Ist das Modul dns in der standardinstallation drin?

Verfasst: Donnerstag 12. Februar 2009, 13:01
von Leonidas
Hyperion hat geschrieben:Ist das Modul dns in der standardinstallation drin?
Das ist dnspython (siehe erstes Posting). Müsste bei quasi allen größeren Distributionen paketiert sein.

Verfasst: Donnerstag 12. Februar 2009, 18:29
von Markus K.
Hyperion: Sorry! Leonidas hat Recht, es is DNSpython. Hab ich nachträglich installiert.

Eine "funktionierende" Domain sieht so aus:

Code: Alles auswählen

bt python # python zone.py
Enter the domain you want to try a zone transfer:
funder.at



Nameserver 0 for funder.at is ns2.sedoparking.com.
Nameserver 1 for funder.at is ns1.sedoparking.com.
this is liste2 ['ns2.sedoparking.com']
this is line2 ns2.sedoparking.com
@ 86400 IN SOA ns1.sedoparking.com. hostmaster.sedo.de. 2007021501 86400 7200 604800 86400
@ 86400 IN NS ns1.sedoparking.com.
@ 86400 IN NS ns2.sedoparking.com.
@ 600 IN A 82.98.86.173
this is liste2 ['ns2.sedoparking.com', 'ns1.sedoparking.com']
this is line2 ns1.sedoparking.com
@ 86400 IN SOA ns1.sedoparking.com. hostmaster.sedo.de. 2007021501 86400 7200 604800 86400
@ 86400 IN NS ns1.sedoparking.com.
@ 86400 IN NS ns2.sedoparking.com.
@ 600 IN A 82.98.86.173
Ansonsten krieg ich Fehlermeldungen a la:

Code: Alles auswählen

Nameserver 0 for python-forum.de is a.regfish-ns.net.
Nameserver 1 for python-forum.de is b.regfish-ns.net.
Nameserver 2 for python-forum.de is c.regfish-ns.net.
this is liste2 ['a.regfish-ns.net']
this is line2 a.regfish-ns.net
Traceback (most recent call last):
  File "zone.py", line 34, in <module>
    z = dns.zone.from_xfr(dns.query.xfr(line2, domain))
  File "/usr/lib/python2.5/site-packages/dns/zone.py", line 846, in from_xfr
    for r in xfr:
  File "/usr/lib/python2.5/site-packages/dns/query.py", line 346, in xfr
    raise dns.exception.FormError
dns.exception.FormError
[/code]