summaryrefslogtreecommitdiff
path: root/contrib/python/examples
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/python/examples')
-rwxr-xr-xcontrib/python/examples/ldns-axfr.py56
-rwxr-xr-xcontrib/python/examples/ldns-buf.py8
-rwxr-xr-xcontrib/python/examples/ldns-dnssec.py45
-rwxr-xr-xcontrib/python/examples/ldns-higher.py36
-rwxr-xr-xcontrib/python/examples/ldns-keygen.py46
-rwxr-xr-xcontrib/python/examples/ldns-mx.py15
-rwxr-xr-xcontrib/python/examples/ldns-mx1.py18
-rwxr-xr-xcontrib/python/examples/ldns-mx2.py19
-rwxr-xr-xcontrib/python/examples/ldns-newpkt.py17
-rwxr-xr-xcontrib/python/examples/ldns-signzone.py65
-rwxr-xr-xcontrib/python/examples/ldns-zone.py15
-rw-r--r--contrib/python/examples/ldns_rr_iter_frm_fp_l.demo.py15
-rw-r--r--contrib/python/examples/ldns_rr_new_frm_fp_l.demo.py43
-rwxr-xr-xcontrib/python/examples/python3/ldns-axfr.py56
-rwxr-xr-xcontrib/python/examples/python3/ldns-buf.py8
-rwxr-xr-xcontrib/python/examples/python3/ldns-dnssec.py45
-rwxr-xr-xcontrib/python/examples/python3/ldns-higher.py36
-rwxr-xr-xcontrib/python/examples/python3/ldns-keygen.py46
-rwxr-xr-xcontrib/python/examples/python3/ldns-mx.py15
-rwxr-xr-xcontrib/python/examples/python3/ldns-mx1.py18
-rwxr-xr-xcontrib/python/examples/python3/ldns-mx2.py19
-rwxr-xr-xcontrib/python/examples/python3/ldns-newpkt.py17
-rwxr-xr-xcontrib/python/examples/python3/ldns-zone.py15
-rw-r--r--contrib/python/examples/python3/ldns_rr_iter_frm_fp_l.demo.py12
-rw-r--r--contrib/python/examples/python3/ldns_rr_new_frm_fp_l.demo.py43
-rw-r--r--contrib/python/examples/zone.txt15
26 files changed, 743 insertions, 0 deletions
diff --git a/contrib/python/examples/ldns-axfr.py b/contrib/python/examples/ldns-axfr.py
new file mode 100755
index 000000000000..5333484fa11a
--- /dev/null
+++ b/contrib/python/examples/ldns-axfr.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+# vim:fileencoding=utf-8
+#
+# AXFR client with IDN (Internationalized Domain Names) support
+#
+
+import ldns
+import encodings.idna
+
+def utf2name(name):
+ return '.'.join([encodings.idna.ToASCII(a) for a in name.split('.')])
+def name2utf(name):
+ return '.'.join([encodings.idna.ToUnicode(a) for a in name.split('.')])
+
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+#addr = ldns.ldns_get_rr_list_addr_by_name(resolver, "zone.nic.cz", ldns.LDNS_RR_CLASS_IN, ldns.LDNS_RD);
+addr = resolver.get_addr_by_name("zone.nic.cz", ldns.LDNS_RR_CLASS_IN, ldns.LDNS_RD);
+if (not addr):
+ raise Exception("Can't retrieve server address")
+
+print "Addr_by_name:",str(addr).replace("\n","; ")
+
+#remove all nameservers
+while resolver.pop_nameserver():
+ pass
+
+#insert server addr
+for rr in addr.rrs():
+ resolver.push_nameserver_rr(rr)
+
+#AXFR transfer
+status = resolver.axfr_start(utf2name(u"háčkyčárky.cz"), ldns.LDNS_RR_CLASS_IN)
+if status != ldns.LDNS_STATUS_OK:
+ raise Exception("Can't start AXFR. Error: %s" % ldns.ldns_get_errorstr_by_id(status))
+
+#Print results
+while True:
+ rr = resolver.axfr_next()
+ if not rr:
+ break
+
+ rdf = rr.owner()
+ if (rdf.get_type() == ldns.LDNS_RDF_TYPE_DNAME):
+ print "RDF owner: type=",rdf.get_type_str(),"data=",name2utf(str(rdf))
+ else:
+ print "RDF owner: type=",rdf.get_type_str(),"data=",str(rdf)
+ print " RR type=", rr.get_type_str()," ttl=",rr.ttl()
+ for rdf in rr.rdfs():
+ if (rdf.get_type() == ldns.LDNS_RDF_TYPE_DNAME):
+ print " RDF: type=",rdf.get_type_str(),"data=",name2utf(str(rdf))
+ else:
+ print " RDF: type=",rdf.get_type_str(),"data=",str(rdf)
+
+ print
diff --git a/contrib/python/examples/ldns-buf.py b/contrib/python/examples/ldns-buf.py
new file mode 100755
index 000000000000..73d8a029ffb0
--- /dev/null
+++ b/contrib/python/examples/ldns-buf.py
@@ -0,0 +1,8 @@
+#!/usr/bin/python
+
+import ldns
+
+buf = ldns.ldns_buffer(1024)
+buf.printf("Test buffer")
+print buf
+
diff --git a/contrib/python/examples/ldns-dnssec.py b/contrib/python/examples/ldns-dnssec.py
new file mode 100755
index 000000000000..bb2acfdf762a
--- /dev/null
+++ b/contrib/python/examples/ldns-dnssec.py
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+import ldns
+import sys
+
+debug = True
+
+# Check args
+argc = len(sys.argv)
+name = "www.nic.cz"
+if argc < 2:
+ print "Usage:", sys.argv[0], "domain [resolver_addr]"
+ sys.exit(1)
+else:
+ name = sys.argv[1]
+
+# Create resolver
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+resolver.set_dnssec(True)
+
+# Custom resolver
+if argc > 2:
+ # Clear previous nameservers
+ ns = resolver.pop_nameserver()
+ while ns != None:
+ ns = resolver.pop_nameserver()
+ ip = ldns.ldns_rdf.new_frm_str(sys.argv[2], ldns.LDNS_RDF_TYPE_A)
+ resolver.push_nameserver(ip)
+
+# Resolve DNS name
+pkt = resolver.query(name, ldns.LDNS_RR_TYPE_A, ldns.LDNS_RR_CLASS_IN)
+if pkt and pkt.answer():
+
+ # Debug
+ if debug:
+ print "NS returned:", pkt.get_rcode(), "(AA: %d AD: %d)" % ( pkt.ad(), pkt.ad() )
+
+ # SERVFAIL indicated bogus name
+ if pkt.get_rcode() is ldns.LDNS_RCODE_SERVFAIL:
+ print name, "is bogus"
+
+ # Check AD (Authenticated) bit
+ if pkt.get_rcode() is ldns.LDNS_RCODE_NOERROR:
+ if pkt.ad(): print name, "is secure"
+ else: print name, "is insecure"
diff --git a/contrib/python/examples/ldns-higher.py b/contrib/python/examples/ldns-higher.py
new file mode 100755
index 000000000000..5175ec0e7ae9
--- /dev/null
+++ b/contrib/python/examples/ldns-higher.py
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+import ldns
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+dnn = ldns.ldns_dname("www.google.com")
+print dnn.get_type_str(), dnn
+
+dna = ldns.ldns_rdf.new_frm_str("74.125.43.99",ldns.LDNS_RDF_TYPE_A)
+print dna.get_type_str(), dna
+
+name = resolver.get_name_by_addr(dna)
+if (not name): raise Exception("Can't retrieve server name")
+for rr in name.rrs():
+ print rr
+
+name = resolver.get_name_by_addr("74.125.43.99")
+if (not name): raise Exception("Can't retrieve server name")
+for rr in name.rrs():
+ print rr
+
+addr = resolver.get_addr_by_name(dnn)
+if (not addr): raise Exception("Can't retrieve server address")
+for rr in addr.rrs():
+ print rr
+
+addr = resolver.get_addr_by_name("www.google.com")
+if (not addr): raise Exception("Can't retrieve server address")
+for rr in addr.rrs():
+ print rr
+
+hosts = ldns.ldns_rr_list.new_frm_file("/etc/hosts")
+if (not hosts): raise Exception("Can't retrieve the content of file")
+for rr in hosts.rrs():
+ print rr
+
diff --git a/contrib/python/examples/ldns-keygen.py b/contrib/python/examples/ldns-keygen.py
new file mode 100755
index 000000000000..3ddf41a946e6
--- /dev/null
+++ b/contrib/python/examples/ldns-keygen.py
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+#
+# This example shows how to generate public/private key pair
+#
+import ldns
+
+algorithm = ldns.LDNS_SIGN_DSA
+bits = 512
+
+ldns.ldns_init_random(open("/dev/random","rb"), (bits+7)//8)
+
+domain = ldns.ldns_dname("example.")
+
+#generate a new key
+key = ldns.ldns_key.new_frm_algorithm(algorithm, bits);
+print key
+
+#set owner
+key.set_pubkey_owner(domain)
+
+#create the public from the ldns_key
+pubkey = key.key_to_rr()
+#previous command is equivalent to
+# pubkey = ldns.ldns_key2rr(key)
+print pubkey
+
+#calculate and set the keytag
+key.set_keytag(ldns.ldns_calc_keytag(pubkey))
+
+#build the DS record
+ds = ldns.ldns_key_rr2ds(pubkey, ldns.LDNS_SHA1)
+print ds
+
+owner, tag = pubkey.owner(), key.keytag()
+
+#write public key to .key file
+fw = open("key-%s-%d.key" % (owner,tag), "wb")
+pubkey.print_to_file(fw)
+
+#write private key to .priv file
+fw = open("key-%s-%d.private" % (owner,tag), "wb")
+key.print_to_file(fw)
+
+#write DS to .ds file
+fw = open("key-%s-%d.ds" % (owner,tag), "wb")
+ds.print_to_file(fw)
diff --git a/contrib/python/examples/ldns-mx.py b/contrib/python/examples/ldns-mx.py
new file mode 100755
index 000000000000..38c3f11c1631
--- /dev/null
+++ b/contrib/python/examples/ldns-mx.py
@@ -0,0 +1,15 @@
+#!/usr/bin/python
+#
+# MX is a small program that prints out the mx records for a particular domain
+#
+import ldns
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+pkt = resolver.query("nic.cz", ldns.LDNS_RR_TYPE_MX,ldns.LDNS_RR_CLASS_IN)
+
+if (pkt):
+ mx = pkt.rr_list_by_type(ldns.LDNS_RR_TYPE_MX, ldns.LDNS_SECTION_ANSWER)
+ if (mx):
+ mx.sort()
+ print mx
diff --git a/contrib/python/examples/ldns-mx1.py b/contrib/python/examples/ldns-mx1.py
new file mode 100755
index 000000000000..3dade1ed3d36
--- /dev/null
+++ b/contrib/python/examples/ldns-mx1.py
@@ -0,0 +1,18 @@
+#!/usr/bin/python
+#
+# MX is a small program that prints out the mx records for a particular domain
+#
+import ldns
+
+dname = ldns.ldns_dname("nic.cz")
+print dname
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+pkt = resolver.query(dname, ldns.LDNS_RR_TYPE_MX,ldns.LDNS_RR_CLASS_IN)
+
+if (pkt):
+ mx = pkt.rr_list_by_type(ldns.LDNS_RR_TYPE_MX, ldns.LDNS_SECTION_ANSWER)
+ if (mx):
+ mx.sort()
+ print mx
diff --git a/contrib/python/examples/ldns-mx2.py b/contrib/python/examples/ldns-mx2.py
new file mode 100755
index 000000000000..4fff98a4b1d6
--- /dev/null
+++ b/contrib/python/examples/ldns-mx2.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+#
+# MX is a small program that prints out the mx records for a particular domain
+#
+import ldns
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+pkt = resolver.query("nic.cz", ldns.LDNS_RR_TYPE_MX,ldns.LDNS_RR_CLASS_IN)
+if (pkt) and (pkt.answer()):
+
+ for rr in pkt.answer().rrs():
+ if (rr.get_type() != ldns.LDNS_RR_TYPE_MX):
+ continue
+
+ rdf = rr.owner()
+ print rdf," ",rr.ttl()," ",rr.get_class_str()," ",rr.get_type_str()," ",
+ print " ".join(str(rdf) for rdf in rr.rdfs())
+
diff --git a/contrib/python/examples/ldns-newpkt.py b/contrib/python/examples/ldns-newpkt.py
new file mode 100755
index 000000000000..d124a80f80e7
--- /dev/null
+++ b/contrib/python/examples/ldns-newpkt.py
@@ -0,0 +1,17 @@
+#!/usr/bin/python
+
+import ldns
+
+pkt = ldns.ldns_pkt.new_query_frm_str("www.google.com",ldns.LDNS_RR_TYPE_ANY, ldns.LDNS_RR_CLASS_IN, ldns.LDNS_QR | ldns.LDNS_AA)
+
+rra = ldns.ldns_rr.new_frm_str("www.google.com. IN A 192.168.1.1",300)
+rrb = ldns.ldns_rr.new_frm_str("www.google.com. IN TXT Some\ Description",300)
+
+list = ldns.ldns_rr_list()
+if (rra): list.push_rr(rra)
+if (rrb): list.push_rr(rrb)
+
+pkt.push_rr_list(ldns.LDNS_SECTION_ANSWER, list)
+
+print "Packet:"
+print pkt
diff --git a/contrib/python/examples/ldns-signzone.py b/contrib/python/examples/ldns-signzone.py
new file mode 100755
index 000000000000..41f76626eae3
--- /dev/null
+++ b/contrib/python/examples/ldns-signzone.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+# This example shows how to sign a given zone file with private key
+
+import ldns
+import sys, os, time
+
+#private key TAG which identifies the private key
+#use ldns-keygen.py in order to obtain private key
+keytag = 30761
+
+# Read zone file
+#-------------------------------------------------------------
+
+zone = ldns.ldns_zone.new_frm_fp(open("zone.txt","r"), None, 0, ldns.LDNS_RR_CLASS_IN)
+soa = zone.soa()
+origin = soa.owner()
+
+# Prepare keys
+#-------------------------------------------------------------
+
+#Read private key from file
+keyfile = open("key-%s-%d.private" % (origin, keytag), "r");
+key = ldns.ldns_key.new_frm_fp(keyfile)
+
+#Read public key from file
+pubfname = "key-%s-%d.key" % (origin, keytag)
+pubkey = None
+if os.path.isfile(pubfname):
+ pubkeyfile = open(pubfname, "r");
+ pubkey,_,_,_ = ldns.ldns_rr.new_frm_fp(pubkeyfile)
+
+if not pubkey:
+ #Create new public key
+ pubkey = key.key_to_rr()
+
+#Set key expiration
+key.set_expiration(int(time.time()) + 365*60*60*24) #365 days
+
+#Set key owner (important step)
+key.set_pubkey_owner(origin)
+
+#Insert DNSKEY RR
+zone.push_rr(pubkey)
+
+# Sign zone
+#-------------------------------------------------------------
+
+#Create keylist and push private key
+keys = ldns.ldns_key_list()
+keys.push_key(key)
+
+#Add SOA
+signed_zone = ldns.ldns_dnssec_zone()
+signed_zone.add_rr(soa)
+
+#Add RRs
+for rr in zone.rrs().rrs():
+ print "RR:",str(rr),
+ signed_zone.add_rr(rr)
+
+added_rrs = ldns.ldns_rr_list()
+status = signed_zone.sign(added_rrs, keys)
+if (status == ldns.LDNS_STATUS_OK):
+ signed_zone.print_to_file(open("zone_signed.txt","w"))
+
diff --git a/contrib/python/examples/ldns-zone.py b/contrib/python/examples/ldns-zone.py
new file mode 100755
index 000000000000..266e6e5b4719
--- /dev/null
+++ b/contrib/python/examples/ldns-zone.py
@@ -0,0 +1,15 @@
+#!/usr/bin/python
+import ldns
+
+#Read zone from file
+zone = ldns.ldns_zone.new_frm_fp(open("zone.txt","r"), None, 0, ldns.LDNS_RR_CLASS_IN)
+print zone
+
+print "SOA:", zone.soa()
+for r in zone.rrs().rrs():
+ print "RR:", r
+
+
+zone = ldns.ldns_zone()
+#print zone
+
diff --git a/contrib/python/examples/ldns_rr_iter_frm_fp_l.demo.py b/contrib/python/examples/ldns_rr_iter_frm_fp_l.demo.py
new file mode 100644
index 000000000000..e123f90dbc6a
--- /dev/null
+++ b/contrib/python/examples/ldns_rr_iter_frm_fp_l.demo.py
@@ -0,0 +1,15 @@
+import ldns
+import sys
+
+if len(sys.argv) <= 1:
+ print "Usage: %s zone_file" % sys.argv[0]
+ sys.exit()
+
+inp = open(sys.argv[1],"r");
+for rr in ldns.ldns_rr_iter_frm_fp_l(inp):
+ print rr
+
+inp.close()
+
+
+
diff --git a/contrib/python/examples/ldns_rr_new_frm_fp_l.demo.py b/contrib/python/examples/ldns_rr_new_frm_fp_l.demo.py
new file mode 100644
index 000000000000..70992254b6a0
--- /dev/null
+++ b/contrib/python/examples/ldns_rr_new_frm_fp_l.demo.py
@@ -0,0 +1,43 @@
+import ldns
+import sys
+
+if len(sys.argv) <= 1:
+ print "Usage: %s zone_file" % sys.argv[0]
+ sys.exit()
+
+inp = open(sys.argv[1],"r");
+# variables that preserve the parsers state
+my_ttl = 3600;
+my_origin = None
+my_prev = None
+# additional state variables
+last_pos = 0
+line_nr = 0
+
+while True:
+ ret = ldns.ldns_rr_new_frm_fp_l_(inp, my_ttl, my_origin, my_prev)
+ s, rr, line_inc, new_ttl, new_origin, new_prev = ret # unpack the result
+ line_nr += line_inc # increase number of parsed lines
+ my_prev = new_prev # update ref to previous owner
+
+ if s == ldns.LDNS_STATUS_SYNTAX_TTL:
+ my_ttl = new_ttl # update default TTL
+ print "$TTL:", my_ttl
+ elif s == ldns.LDNS_STATUS_SYNTAX_ORIGIN:
+ my_origin = new_origin # update reference to origin
+ print "$ORIGIN:", my_origin
+ elif s == ldns.LDNS_STATUS_SYNTAX_EMPTY:
+ if last_pos == inp.tell():
+ break # no advance since last read - EOF
+ last_pos = inp.tell()
+ elif s != ldns.LDNS_STATUS_OK:
+ print "! parse error in line", line_nr
+ else:
+ # we are sure to have LDNS_STATUS_OK
+ print rr
+
+inp.close()
+print "--------------------"
+print "Read %d lines" % line_nr
+
+
diff --git a/contrib/python/examples/python3/ldns-axfr.py b/contrib/python/examples/python3/ldns-axfr.py
new file mode 100755
index 000000000000..fb8e5cf5e2f7
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-axfr.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+# vim:fileencoding=utf-8
+#
+# AXFR client with IDN (Internationalized Domain Names) support
+#
+
+import ldns
+import encodings.idna
+
+def utf2name(name):
+ return '.'.join([encodings.idna.ToASCII(a).decode("utf-8") for a in name.split('.')])
+def name2utf(name):
+ return '.'.join([encodings.idna.ToUnicode(a) for a in name.split('.')])
+
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+#addr = ldns.ldns_get_rr_list_addr_by_name(resolver, "zone.nic.cz", ldns.LDNS_RR_CLASS_IN, ldns.LDNS_RD);
+addr = resolver.get_addr_by_name("zone.nic.cz", ldns.LDNS_RR_CLASS_IN, ldns.LDNS_RD);
+if (not addr):
+ raise Exception("Can't retrieve server address")
+
+print("Addr_by_name:",str(addr).replace("\n","; "))
+
+#remove all nameservers
+while resolver.pop_nameserver():
+ pass
+
+#insert server addr
+for rr in addr.rrs():
+ resolver.push_nameserver_rr(rr)
+
+#AXFR transfer
+status = resolver.axfr_start(utf2name("háčkyčárky.cz"), ldns.LDNS_RR_CLASS_IN)
+if status != ldns.LDNS_STATUS_OK:
+ raise Exception("Can't start AXFR. Error: %s" % ldns.ldns_get_errorstr_by_id(status))
+
+#Print results
+while True:
+ rr = resolver.axfr_next()
+ if not rr:
+ break
+
+ rdf = rr.owner()
+ if (rdf.get_type() == ldns.LDNS_RDF_TYPE_DNAME):
+ print("RDF owner: type=",rdf.get_type_str(),"data=",name2utf(str(rdf)))
+ else:
+ print("RDF owner: type=",rdf.get_type_str(),"data=",str(rdf))
+ print(" RR type=", rr.get_type_str()," ttl=",rr.ttl())
+ for rdf in rr.rdfs():
+ if (rdf.get_type() == ldns.LDNS_RDF_TYPE_DNAME):
+ print(" RDF: type=",rdf.get_type_str(),"data=",name2utf(str(rdf)))
+ else:
+ print(" RDF: type=",rdf.get_type_str(),"data=",str(rdf))
+
+ print()
diff --git a/contrib/python/examples/python3/ldns-buf.py b/contrib/python/examples/python3/ldns-buf.py
new file mode 100755
index 000000000000..498d51f6c3af
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-buf.py
@@ -0,0 +1,8 @@
+#!/usr/bin/python
+
+import ldns
+
+buf = ldns.ldns_buffer(1024)
+buf.printf("Test buffer")
+print(buf)
+
diff --git a/contrib/python/examples/python3/ldns-dnssec.py b/contrib/python/examples/python3/ldns-dnssec.py
new file mode 100755
index 000000000000..7dabb9179025
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-dnssec.py
@@ -0,0 +1,45 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+import ldns
+import sys
+
+debug = True
+
+# Check args
+argc = len(sys.argv)
+name = "www.nic.cz"
+if argc < 2:
+ print("Usage:", sys.argv[0], "domain [resolver_addr]")
+ sys.exit(1)
+else:
+ name = sys.argv[1]
+
+# Create resolver
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+resolver.set_dnssec(True)
+
+# Custom resolver
+if argc > 2:
+ # Clear previous nameservers
+ ns = resolver.pop_nameserver()
+ while ns != None:
+ ns = resolver.pop_nameserver()
+ ip = ldns.ldns_rdf.new_frm_str(sys.argv[2], ldns.LDNS_RDF_TYPE_A)
+ resolver.push_nameserver(ip)
+
+# Resolve DNS name
+pkt = resolver.query(name, ldns.LDNS_RR_TYPE_A, ldns.LDNS_RR_CLASS_IN)
+if pkt and pkt.answer():
+
+ # Debug
+ if debug:
+ print("NS returned:", pkt.get_rcode(), "(AA: %d AD: %d)" % ( pkt.ad(), pkt.ad() ))
+
+ # SERVFAIL indicated bogus name
+ if pkt.get_rcode() is ldns.LDNS_RCODE_SERVFAIL:
+ print(name, "is bogus")
+
+ # Check AD (Authenticated) bit
+ if pkt.get_rcode() is ldns.LDNS_RCODE_NOERROR:
+ if pkt.ad(): print(name, "is secure")
+ else: print(name, "is insecure")
diff --git a/contrib/python/examples/python3/ldns-higher.py b/contrib/python/examples/python3/ldns-higher.py
new file mode 100755
index 000000000000..8712e63178d7
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-higher.py
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+import ldns
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+dnn = ldns.ldns_dname("www.google.com")
+print(dnn.get_type_str(), dnn)
+
+dna = ldns.ldns_rdf.new_frm_str("74.125.43.99",ldns.LDNS_RDF_TYPE_A)
+print(dna.get_type_str(), dna)
+
+name = resolver.get_name_by_addr(dna)
+if (not name): raise Exception("Can't retrieve server name")
+for rr in name.rrs():
+ print(rr)
+
+name = resolver.get_name_by_addr("74.125.43.99")
+if (not name): raise Exception("Can't retrieve server name")
+for rr in name.rrs():
+ print(rr)
+
+addr = resolver.get_addr_by_name(dnn)
+if (not addr): raise Exception("Can't retrieve server address")
+for rr in addr.rrs():
+ print(rr)
+
+addr = resolver.get_addr_by_name("www.google.com")
+if (not addr): raise Exception("Can't retrieve server address")
+for rr in addr.rrs():
+ print(rr)
+
+hosts = ldns.ldns_rr_list.new_frm_file("/etc/hosts")
+if (not hosts): raise Exception("Can't retrieve the content of file")
+for rr in hosts.rrs():
+ print(rr)
+
diff --git a/contrib/python/examples/python3/ldns-keygen.py b/contrib/python/examples/python3/ldns-keygen.py
new file mode 100755
index 000000000000..4a5457e4988d
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-keygen.py
@@ -0,0 +1,46 @@
+#!/usr/bin/python
+#
+# This example shows how to generate public/private key pair
+#
+import ldns
+
+algorithm = ldns.LDNS_SIGN_DSA
+bits = 512
+
+ldns.ldns_init_random(open("/dev/random","rb"), (bits+7)//8)
+
+domain = ldns.ldns_dname("example.")
+
+#generate a new key
+key = ldns.ldns_key.new_frm_algorithm(algorithm, bits);
+print(key)
+
+#set owner
+key.set_pubkey_owner(domain)
+
+#create the public from the ldns_key
+pubkey = key.key_to_rr()
+#previous command is equivalent to
+# pubkey = ldns.ldns_key2rr(key)
+print(pubkey)
+
+#calculate and set the keytag
+key.set_keytag(ldns.ldns_calc_keytag(pubkey))
+
+#build the DS record
+ds = ldns.ldns_key_rr2ds(pubkey, ldns.LDNS_SHA1)
+print(ds)
+
+owner, tag = pubkey.owner(), key.keytag()
+
+#write public key to .key file
+fw = open("key-%s-%d.key" % (owner,tag), "wb")
+pubkey.print_to_file(fw)
+
+#write private key to .priv file
+fw = open("key-%s-%d.private" % (owner,tag), "wb")
+key.print_to_file(fw)
+
+#write DS to .ds file
+fw = open("key-%s-%d.ds" % (owner,tag), "wb")
+ds.print_to_file(fw)
diff --git a/contrib/python/examples/python3/ldns-mx.py b/contrib/python/examples/python3/ldns-mx.py
new file mode 100755
index 000000000000..1d2ba03669cc
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-mx.py
@@ -0,0 +1,15 @@
+#!/usr/bin/python
+#
+# MX is a small program that prints out the mx records for a particular domain
+#
+import ldns
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+pkt = resolver.query("nic.cz", ldns.LDNS_RR_TYPE_MX,ldns.LDNS_RR_CLASS_IN)
+
+if (pkt):
+ mx = pkt.rr_list_by_type(ldns.LDNS_RR_TYPE_MX, ldns.LDNS_SECTION_ANSWER)
+ if (mx):
+ mx.sort()
+ print(mx)
diff --git a/contrib/python/examples/python3/ldns-mx1.py b/contrib/python/examples/python3/ldns-mx1.py
new file mode 100755
index 000000000000..d10863e39366
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-mx1.py
@@ -0,0 +1,18 @@
+#!/usr/bin/python
+#
+# MX is a small program that prints out the mx records for a particular domain
+#
+import ldns
+
+dname = ldns.ldns_dname("nic.cz")
+print(dname)
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+pkt = resolver.query(dname, ldns.LDNS_RR_TYPE_MX,ldns.LDNS_RR_CLASS_IN)
+
+if (pkt):
+ mx = pkt.rr_list_by_type(ldns.LDNS_RR_TYPE_MX, ldns.LDNS_SECTION_ANSWER)
+ if (mx):
+ mx.sort()
+ print(mx)
diff --git a/contrib/python/examples/python3/ldns-mx2.py b/contrib/python/examples/python3/ldns-mx2.py
new file mode 100755
index 000000000000..9c8b103bf135
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-mx2.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+#
+# MX is a small program that prints out the mx records for a particular domain
+#
+import ldns
+
+resolver = ldns.ldns_resolver.new_frm_file("/etc/resolv.conf")
+
+pkt = resolver.query("nic.cz", ldns.LDNS_RR_TYPE_MX,ldns.LDNS_RR_CLASS_IN)
+if (pkt) and (pkt.answer()):
+
+ for rr in pkt.answer().rrs():
+ if (rr.get_type() != ldns.LDNS_RR_TYPE_MX):
+ continue
+
+ rdf = rr.owner()
+ print(rdf," ",rr.ttl()," ",rr.get_class_str()," ",rr.get_type_str()," ", end=" ")
+ print(" ".join(str(rdf) for rdf in rr.rdfs()))
+
diff --git a/contrib/python/examples/python3/ldns-newpkt.py b/contrib/python/examples/python3/ldns-newpkt.py
new file mode 100755
index 000000000000..49bad5ef77e7
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-newpkt.py
@@ -0,0 +1,17 @@
+#!/usr/bin/python
+
+import ldns
+
+pkt = ldns.ldns_pkt.new_query_frm_str("www.google.com",ldns.LDNS_RR_TYPE_ANY, ldns.LDNS_RR_CLASS_IN, ldns.LDNS_QR | ldns.LDNS_AA)
+
+rra = ldns.ldns_rr.new_frm_str("www.google.com. IN A 192.168.1.1",300)
+rrb = ldns.ldns_rr.new_frm_str("www.google.com. IN TXT Some\ Description",300)
+
+list = ldns.ldns_rr_list()
+if (rra): list.push_rr(rra)
+if (rrb): list.push_rr(rrb)
+
+pkt.push_rr_list(ldns.LDNS_SECTION_ANSWER, list)
+
+print("Packet:")
+print(pkt)
diff --git a/contrib/python/examples/python3/ldns-zone.py b/contrib/python/examples/python3/ldns-zone.py
new file mode 100755
index 000000000000..b465eaa56bdb
--- /dev/null
+++ b/contrib/python/examples/python3/ldns-zone.py
@@ -0,0 +1,15 @@
+#!/usr/bin/python
+import ldns
+
+#Read zone from file
+zone = ldns.ldns_zone.new_frm_fp(open("../zone.txt","r"), None, 0, ldns.LDNS_RR_CLASS_IN)
+print(zone)
+
+print("SOA:", zone.soa())
+for r in zone.rrs().rrs():
+ print("RR:", r)
+
+
+zone = ldns.ldns_zone()
+#print zone
+
diff --git a/contrib/python/examples/python3/ldns_rr_iter_frm_fp_l.demo.py b/contrib/python/examples/python3/ldns_rr_iter_frm_fp_l.demo.py
new file mode 100644
index 000000000000..18edd1109bfa
--- /dev/null
+++ b/contrib/python/examples/python3/ldns_rr_iter_frm_fp_l.demo.py
@@ -0,0 +1,12 @@
+import ldns
+import sys
+
+if len(sys.argv) <= 1:
+ print("Usage: %s zone_file" % sys.argv[0])
+ sys.exit()
+
+inp = open(sys.argv[1],"r");
+for rr in ldns.ldns_rr_iter_frm_fp_l(inp):
+ print(rr)
+
+inp.close()
diff --git a/contrib/python/examples/python3/ldns_rr_new_frm_fp_l.demo.py b/contrib/python/examples/python3/ldns_rr_new_frm_fp_l.demo.py
new file mode 100644
index 000000000000..1bd667b027c4
--- /dev/null
+++ b/contrib/python/examples/python3/ldns_rr_new_frm_fp_l.demo.py
@@ -0,0 +1,43 @@
+import ldns
+import sys
+
+if len(sys.argv) <= 1:
+ print("Usage: %s zone_file" % sys.argv[0])
+ sys.exit()
+
+inp = open(sys.argv[1],"r");
+# variables that preserve the parsers state
+my_ttl = 3600;
+my_origin = None
+my_prev = None
+# additional state variables
+last_pos = 0
+line_nr = 0
+
+while True:
+ ret = ldns.ldns_rr_new_frm_fp_l_(inp, my_ttl, my_origin, my_prev)
+ s, rr, line_inc, new_ttl, new_origin, new_prev = ret # unpack the result
+ line_nr += line_inc # increase number of parsed lines
+ my_prev = new_prev # update ref to previous owner
+
+ if s == ldns.LDNS_STATUS_SYNTAX_TTL:
+ my_ttl = new_ttl # update default TTL
+ print("$TTL:", my_ttl)
+ elif s == ldns.LDNS_STATUS_SYNTAX_ORIGIN:
+ my_origin = new_origin # update reference to origin
+ print("$ORIGIN:", my_origin)
+ elif s == ldns.LDNS_STATUS_SYNTAX_EMPTY:
+ if last_pos == inp.tell():
+ break # no advance since last read - EOF
+ last_pos = inp.tell()
+ elif s != ldns.LDNS_STATUS_OK:
+ print("! parse error in line", line_nr)
+ else:
+ # we are sure to have LDNS_STATUS_OK
+ print(rr)
+
+inp.close()
+print("--------------------")
+print("Read %d lines" % line_nr)
+
+
diff --git a/contrib/python/examples/zone.txt b/contrib/python/examples/zone.txt
new file mode 100644
index 000000000000..ffc87263f124
--- /dev/null
+++ b/contrib/python/examples/zone.txt
@@ -0,0 +1,15 @@
+$ORIGIN example.
+$TTL 600
+
+example. IN SOA example. admin.example. (
+ 2008022501 ; serial
+ 28800 ; refresh (8 hours)
+ 7200 ; retry (2 hours)
+ 604800 ; expire (1 week)
+ 18000 ; minimum (5 hours)
+ )
+
+@ IN MX 10 mail.example.
+@ IN NS ns1
+@ IN NS ns2
+@ IN A 192.168.1.1