Add ip info on server list page.
Also clean up imports, standardize on order
This commit is contained in:
parent
9dcb07e996
commit
d4d4afdaa1
|
@ -1,4 +1,9 @@
|
||||||
|
### Binder Forms
|
||||||
|
|
||||||
|
# 3rd Party
|
||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
|
# App Imports
|
||||||
from models import Key
|
from models import Key
|
||||||
|
|
||||||
TTL_CHOICES = ((300, "5 minutes"),
|
TTL_CHOICES = ((300, "5 minutes"),
|
||||||
|
|
|
@ -1,11 +1,17 @@
|
||||||
from binder import exceptions, keyutils, models
|
### Binder Helpers
|
||||||
|
|
||||||
|
# Standard Imports
|
||||||
|
from collections import OrderedDict
|
||||||
|
import re
|
||||||
|
import socket
|
||||||
|
|
||||||
|
# 3rd Party
|
||||||
import dns.query
|
import dns.query
|
||||||
import dns.reversename
|
import dns.reversename
|
||||||
import dns.update
|
import dns.update
|
||||||
import dns.tsig
|
|
||||||
import socket
|
# App Imports
|
||||||
import re
|
from binder import exceptions, keyutils, models
|
||||||
|
|
||||||
def add_record(dns_server, zone_name, record_name, record_type, record_data, ttl, key_name, create_reverse=False):
|
def add_record(dns_server, zone_name, record_name, record_type, record_data, ttl, key_name, create_reverse=False):
|
||||||
""" Parse passed elements and determine which records to create.
|
""" Parse passed elements and determine which records to create.
|
||||||
|
@ -108,19 +114,22 @@ def update_record(dns_server, zone_name, record_name, record_type, record_data,
|
||||||
|
|
||||||
return output
|
return output
|
||||||
|
|
||||||
def ip_info(host_name): # , family_dict, socket_dict):
|
def ip_info(host_name):
|
||||||
"""Create a dictionary mapping address types to their IP's.
|
"""Create a dictionary mapping address types to their IP's.
|
||||||
If an error is encountered, key to error is "Error".
|
If an error is encountered, key to error is "Error".
|
||||||
"""
|
"""
|
||||||
info = {}
|
info = []
|
||||||
|
ipv4_count = 0
|
||||||
|
ipv6_count = 0
|
||||||
try:
|
try:
|
||||||
for s_family, s_type, s_proto, s_cannoname, s_sockaddr in socket.getaddrinfo(host_name.hostname, None):
|
for s_family, s_type, s_proto, s_cannoname, s_sockaddr in socket.getaddrinfo(host_name, None):
|
||||||
if s_family == 2 and s_type == 1:
|
if s_family == 2 and s_type == 1:
|
||||||
info["IPv4"] = s_sockaddr[0]
|
ipv4_count += 1
|
||||||
|
info.append(["IPv4 (%d)" % ipv4_count, s_sockaddr[0]])
|
||||||
if s_family == 10 and s_type == 1:
|
if s_family == 10 and s_type == 1:
|
||||||
info["IPv6"] = s_sockaddr[0]
|
ipv6_count += 1
|
||||||
|
info.append(["IPv6 (%d)" % ipv6_count, s_sockaddr[0]])
|
||||||
except socket.gaierror, err:
|
except socket.gaierror, err:
|
||||||
info["Error"] = "Unable to resolve %s: %s" % (host_name, err)
|
info.append(["Error", "Unable to resolve %s: %s" % (host_name, err)])
|
||||||
|
|
||||||
return info
|
return info
|
||||||
|
|
|
@ -1,14 +1,20 @@
|
||||||
from django.db import models
|
### Binder Models
|
||||||
|
|
||||||
|
# Standard Imports
|
||||||
|
import socket
|
||||||
|
import urllib2
|
||||||
|
|
||||||
|
# 3rd Party
|
||||||
from BeautifulSoup import BeautifulStoneSoup as BS
|
from BeautifulSoup import BeautifulStoneSoup as BS
|
||||||
from binder import exceptions
|
import dns.exception
|
||||||
|
|
||||||
import dns.query
|
import dns.query
|
||||||
import dns.tsig
|
import dns.tsig
|
||||||
import dns.zone
|
import dns.zone
|
||||||
|
|
||||||
|
# App Imports
|
||||||
|
from binder import exceptions
|
||||||
|
from django.db import models
|
||||||
import keyutils
|
import keyutils
|
||||||
import socket
|
|
||||||
import urllib2
|
|
||||||
|
|
||||||
TSIG_ALGORITHMS = (('hmac-md5', 'MD5'),
|
TSIG_ALGORITHMS = (('hmac-md5', 'MD5'),
|
||||||
('hmac-sha1', 'SHA1'),
|
('hmac-sha1', 'SHA1'),
|
||||||
|
@ -95,15 +101,16 @@ class BindServer(models.Model):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
zone = dns.zone.from_xfr(dns.query.xfr(self.hostname, zone_name, keyring=keyring))
|
zone = dns.zone.from_xfr(dns.query.xfr(self.hostname, zone_name, keyring=keyring))
|
||||||
except dns.exception.FormError, err:
|
|
||||||
# TODO: What throws this?
|
|
||||||
raise exceptions.TransferException("There was an error attempting to list zone records.")
|
|
||||||
except dns.tsig.PeerBadKey:
|
except dns.tsig.PeerBadKey:
|
||||||
# The incorrect TSIG key was selected for transfers.
|
# The incorrect TSIG key was selected for transfers.
|
||||||
raise exceptions.TransferException("Unable to list zone records because of a TSIG key mismatch.")
|
raise exceptions.TransferException("Unable to list zone records because of a TSIG key mismatch.")
|
||||||
except socket.error, err:
|
except socket.error, err:
|
||||||
# Thrown when the DNS server does not respond for a zone transfer (XFR).
|
# Thrown when the DNS server does not respond for a zone transfer (XFR).
|
||||||
raise exceptions.TransferException("DNS server did not respond for transfer. Reason: %s" % err)
|
raise exceptions.TransferException("DNS server did not respond for transfer. Reason: %s" % err)
|
||||||
|
# except exception.FormError, err:
|
||||||
|
# # TODO: What throws this?
|
||||||
|
# raise exceptions.TransferException("There was an error attempting to list zone records.")
|
||||||
|
|
||||||
|
|
||||||
names = zone.nodes.keys()
|
names = zone.nodes.keys()
|
||||||
names.sort()
|
names.sort()
|
||||||
|
|
|
@ -14,8 +14,8 @@ Server List
|
||||||
{% for current_server in server_info %}
|
{% for current_server in server_info %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><a href="/info/{{ current_server.host_name }}/"> {{ current_server.host_name }}</td>
|
<td><a href="/info/{{ current_server.host_name }}/"> {{ current_server.host_name }}</td>
|
||||||
<td>{% for key, value in current_server.ip_address.items %}
|
<td>{% for type, data in current_server.ip_address %}
|
||||||
{{key}}: {{value}}<br>
|
{{type}}: {{data}}<br>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
@ -1,7 +1,9 @@
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
|
|
||||||
from binder import models
|
from binder import models, helpers
|
||||||
|
from collections import OrderedDict
|
||||||
|
|
||||||
|
|
||||||
class GetTests(TestCase):
|
class GetTests(TestCase):
|
||||||
""" Unit Tests that exercise HTTP GET. """
|
""" Unit Tests that exercise HTTP GET. """
|
||||||
|
@ -87,3 +89,16 @@ class PostTests(TestCase):
|
||||||
'<input type="hidden" name="dns_server" value="testserver.test.net" />',
|
'<input type="hidden" name="dns_server" value="testserver.test.net" />',
|
||||||
html=True)
|
html=True)
|
||||||
|
|
||||||
|
|
||||||
|
class HelperTests(TestCase):
|
||||||
|
def test_ipinfo_ResolutionFail(self):
|
||||||
|
response = helpers.ip_info("foobar.doesnotexist.local")
|
||||||
|
self.assertEqual([['Error', u'Unable to resolve foobar.doesnotexist.local: [Errno -2] Name or service not known']],
|
||||||
|
response)
|
||||||
|
# The following is currently the first globally unique IPv4 and IPv6 address I could find
|
||||||
|
# that did not change based upon your geography.
|
||||||
|
# http://test-ipv6.com/
|
||||||
|
response = helpers.ip_info("ds.test-ipv6.com")
|
||||||
|
self.assertEqual([['IPv4 (1)', u'216.218.228.114'], ['IPv6 (1)', u'2001:470:1:18::2']],
|
||||||
|
response)
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
|
### Binder VIews
|
||||||
|
|
||||||
|
# 3rd Party
|
||||||
from django.shortcuts import redirect, render
|
from django.shortcuts import redirect, render
|
||||||
|
|
||||||
|
# App Imports
|
||||||
from binder import exceptions, forms, helpers, models
|
from binder import exceptions, forms, helpers, models
|
||||||
|
|
||||||
# Views
|
|
||||||
|
|
||||||
def home_index(request):
|
def home_index(request):
|
||||||
""" List the main index page for Binder. """
|
""" List the main index page for Binder. """
|
||||||
return render(request, "index.htm")
|
return render(request, "index.htm")
|
||||||
|
@ -13,7 +15,7 @@ def view_server_list(request):
|
||||||
server_list = models.BindServer.objects.all().order_by("hostname")
|
server_list = models.BindServer.objects.all().order_by("hostname")
|
||||||
server_info = []
|
server_info = []
|
||||||
for current in server_list:
|
for current in server_list:
|
||||||
server_info.append({"host_name" : current, "ip_address" : helpers.ip_info(current)})
|
server_info.append({"host_name" : current, "ip_address" : helpers.ip_info(current.hostname)})
|
||||||
|
|
||||||
return render(request, "bcommon/list_servers.htm",
|
return render(request, "bcommon/list_servers.htm",
|
||||||
{ "server_info" : server_info})
|
{ "server_info" : server_info})
|
||||||
|
|
Loading…
Reference in New Issue