summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core.py4
-rw-r--r--model.py71
-rwxr-xr-xpywhoisd.py4
-rw-r--r--xml.py4
4 files changed, 77 insertions, 6 deletions
diff --git a/core.py b/core.py
index a68d1e5..1ac7e4f 100644
--- a/core.py
+++ b/core.py
@@ -1,5 +1,5 @@
import socketserver
-import ipcalc
+import ipaddr
class Daemon():
def __init__(data):
@@ -26,7 +26,7 @@ class Daemon():
# Iterate over all IP block elements
for network in self.data.get_networks():
for block in network.ip_blocks:
- if ip in ipcalc.Network(block):
+ if ipaddr.IPAddress(ip) in ipaddr.IPNetwork(block):
result['name'] = network.name
for key in network.data:
result[key] = network.data[key]
diff --git a/model.py b/model.py
index fbba248..13bcfa8 100644
--- a/model.py
+++ b/model.py
@@ -1,3 +1,5 @@
+from xml.etree import ElementTree
+
class Network():
"""A simple network definition"""
@@ -76,3 +78,72 @@ class Data():
self.load_data()
return self.persons
+
+class DataXML(model.Data):
+ """Reads network information from a XML file"""
+
+ def parse_config(self):
+ """Reads and sets up XML config file fields"""
+
+ self.data_file = self.config['Storage']['xml_file']
+
+ def load_data(self):
+ """Parse XML for getting network information"""
+
+ root = ElementTree(file=self.data_file).getroot()
+
+ for elem in root:
+ if elem.tag == 'person':
+ self.add_person(elem)
+ elif elem.tag == 'domain':
+ self.add_domain(elem)
+ elif elem.tag == 'network':
+ self.add_network(elem)
+ else:
+ pass # raise TagNotFoundError
+
+ def add_person(self, elem):
+ """Adds a new person"""
+
+ person = model.Person()
+ for e in elem:
+ if e.tag == 'name':
+ person.name = e.text
+ elif e.tag == 'surname':
+ person.surname = e.text
+ elif e.tag == 'email':
+ person.email = e.text
+ else:
+ person.data[e.tag] = e.text
+
+ self.persons[elem.attrib['id']] = person
+
+ def add_domain(self, elem):
+ """Adds a new domain"""
+
+ domain = model.Domain()
+ for e in elem:
+ if e.tag == 'name':
+ domain.name == e.text
+ else:
+ domain.data[e.tag] = e.text
+
+ self.domains[elem.attrib['id']] = domain
+
+ def add_network(self, elem):
+ """Adds a new network"""
+
+ network = model.Network()
+ for e in elem:
+ if e.tag == 'name':
+ network.name = e.text
+ elif e.tag == 'domain':
+ network.domains.append(e.text)
+ elif e.tag == 'ip_block':
+ network.ip_blocks.append(e.text)
+ elif e.tag == 'admin':
+ network.admins.append(e.text)
+ else:
+ network.data[e.tag] = e.text
+
+ self.networks[elem.attrib['id']] = network
diff --git a/pywhoisd.py b/pywhoisd.py
index 4e78564..6572cac 100755
--- a/pywhoisd.py
+++ b/pywhoisd.py
@@ -2,7 +2,7 @@
import configparser
import core
-import xml
+import model
class PyWhoisD():
"""Main class. It reads the configuration options and starts the server"""
@@ -18,7 +18,7 @@ class PyWhoisD():
def config_data(self):
"""Config data sources.
- Only XML is supported.
+ At the moment only XML is supported.
"""
mode = self.config['Storage']['mode']
diff --git a/xml.py b/xml.py
index e01a338..f8fb0f2 100644
--- a/xml.py
+++ b/xml.py
@@ -1,4 +1,4 @@
-from xml.etree.ElementTree import ElementTree
+from xml.etree import ElementTree
import model
class DataXML(model.Data):
@@ -20,7 +20,7 @@ class DataXML(model.Data):
elif elem.tag == 'domain':
self.add_domain(elem)
elif elem.tag == 'network':
- self.add_network(elem):
+ self.add_network(elem)
else:
pass # raise TagNotFoundError
nihil fit ex nihilo