Umwandlung eines Rückgabeobjects (rdata) in einen String

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Markus K.
User
Beiträge: 5
Registriert: Mittwoch 11. Februar 2009, 09:09

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich hab deine Frage nur überflogen, aber ich glaube str(OBJEKT_EINFÜGEN) bzw unicode(OBJEKT_EINFÜGEN) sollten dir behilflich sein ;)
BlackJack

Oder falls die Objekte wirklich eine `to_text()`-Methode haben, solltest Du die auch *aufrufen*.
Markus K.
User
Beiträge: 5
Registriert: Mittwoch 11. Februar 2009, 09:09

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!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
Markus K.
User
Beiträge: 5
Registriert: Mittwoch 11. Februar 2009, 09:09

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".
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
Markus K.
User
Beiträge: 5
Registriert: Mittwoch 11. Februar 2009, 09:09

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]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So, jetzt dann bitte noch die exakte Fehlermeldung ;-)

Ist das Modul dns in der standardinstallation drin?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Markus K.
User
Beiträge: 5
Registriert: Mittwoch 11. Februar 2009, 09:09

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]
Antworten