@ -1,12 +1,12 @@
# Binder VIews
# 3rd Party
from django.conf import setting s
from django.contrib import message s
from django.shortcuts import get_object_or_404 , redirect , render
# App Imports
from binder import exceptions , forms, helpers , models
from binder import forms , helpers , models
from binder.exceptions import KeyringException , RecordException , TransferException , ZoneException
def home_index ( request ) :
""" List the main index page for Binder. """
@ -27,184 +27,147 @@ def view_server_list(request):
def view_server_zones ( request , dns_server ) :
""" Display the list of DNS zones a particular DNS host provides. """
errors = " "
zone_array = { }
this_server = get_object_or_404 ( models . BindServer , hostname = dns_server )
try :
zone_array = this_server . list_zones ( )
except exceptions . ZoneException , err :
errors = " Unable to list server zones. Error: %s " % err
except ZoneException as exc :
messages . error ( request , " Unable to list server zones. Error: %s " % exc )
return render ( request , " bcommon/list_server_zones.html " ,
{ " errors " : errors ,
" dns_server " : this_server ,
{ " dns_server " : this_server ,
" zone_array " : zone_array } )
def view_zone_records ( request , dns_server , zone_name ) :
""" Display the list of records for a particular zone. """
errors = " "
zone_array = { }
this_server = get_object_or_404 ( models . BindServer , hostname = dns_server )
try :
zone_array = this_server . list_zone_records ( zone_name )
except exceptions . TransferException , err :
except TransferException as exc :
return render ( request , " bcommon/list_zone.html " ,
{ " errors " : err ,
" zone_name " : zone_name ,
{ " zone_name " : zone_name ,
" dns_server " : this_server } )
return render ( request , " bcommon/list_zone.html " ,
{ " zone_array " : zone_array ,
" dns_server " : this_server ,
" zone_name " : zone_name ,
" errors " : errors } )
" zone_name " : zone_name } )
def view_add_record ( request , dns_server , zone_name ) :
""" View to provide form to add a DNS record . """
""" View to allow to add A records . """
this_server = get_object_or_404 ( models . BindServer , hostname = dns_server )
return render ( request , " bcommon/add_record_form.html " ,
{ " dns_server " : this_server ,
" zone_name " : zone_name ,
" tsig_keys " : models . Key . objects . all ( ) ,
" ttl_choices " : settings . TTL_CHOICES ,
" record_type_choices " : settings . RECORD_TYPE_CHOICES } )
def view_add_record_result ( request ) :
""" Process the input given to add a DNS record. """
errors = " "
if request . method == " GET " :
return redirect ( " / " )
if " HTTP_REFERER " in request . META :
incoming_zone = request . META [ " HTTP_REFERER " ] . split ( " / " ) [ - 2 ]
if ( " in-addr.arpa " in incoming_zone ) or ( " ip6.arpa " in incoming_zone ) :
form = forms . FormAddReverseRecord ( request . POST )
else :
form = forms . FormAddForwardRecord ( request . POST )
else :
if request . method == ' POST ' :
form = forms . FormAddForwardRecord ( request . POST )
if form . is_valid ( ) :
form_cleaned = form . cleaned_data
try :
response = helpers . add_record ( form_cleaned [ " dns_server " ] ,
str ( form_cleaned [ " zone _name" ] ) ,
str ( form_cleaned [ " record_nam e " ] ) ,
str ( form_cleaned [ " record_type " ] ) ,
str ( form_cleaned [ " record_data " ] ) ,
form_cleaned [ " ttl " ] ,
form_cleaned [ " key_name " ] ,
form_cleaned [ " create_reverse " ] )
except exceptions . RecordException , err :
# TODO: Start using this exception.
# What would cause this?
errors = err
return render ( request , " bcommon/response_result.html " ; ,
{ " errors " : errors ,
" response " : response } )
dns_server = models . BindServer . objects . get ( hostname = request . POST [ " dns_server " ] )
if form . is_valid ( ) :
form_cleaned = form . cleaned_data
try :
helpers . add_record ( form_cleaned [ " dns_server " ] ,
str ( form_cleaned [ " zone_name " ] ) ,
str ( form_cleaned [ " record_name " ] ) ,
str ( form_cleaned [ " record_type " ] ) ,
str ( form_cleaned [ " record_data " ] ) ,
form_cleaned [ " ttl " ] ,
form_cleaned [ " key_name " ] ,
form_cleaned [ " create_reverse " ] )
except ( KeyringException , RecordException ) as exc :
messages . error ( request , " Adding %s . %s failed: %s " %
( form_cleaned [ " record_name " ] , zone_name , exc ) )
else :
messages . success ( request , " %s . %s was added successfully. " %
( form_cleaned [ " record_name " ] , zone_name ) )
return redirect ( ' zone_list ' ,
dns_server = dns_server ,
zone_name = zone_name )
else :
form = forms . FormAddForwardRecord ( initial = { ' zone_name ' : zone_name } )
return render ( request , " bcommon/add_record_form.html " ,
{ " dns_server " : dns_server ,
" zone_name " : request . POST [ " zone_name " ] ,
" tsig_keys " : models . Key . objects . all ( ) ,
" ttl_choices " : settings . TTL_CHOICES ,
" record_type_choices " : settings . RECORD_TYPE_CHOICES ,
{ " dns_server " : this_server ,
" form " : form } )
def view_add_cname_record ( request , dns_server , zone_name , record_name ) :
""" Process given input to add a CNAME pointer ."""
""" View to allow to add CNAME records ."""
this_server = get_object_or_404 ( models . BindServer , hostname = dns_server )
return render ( request , " bcommon/add_cname_record_form.html " ,
{ " dns_server " : this_server ,
" originating_record " : " %s . %s " % ( record_name , zone_name ) ,
" zone_name " : zone_name ,
" ttl_choices " : settings . TTL_CHOICES ,
" tsig_keys " : models . Key . objects . all ( ) } )
def view_add_cname_result ( request ) :
""" Process input on the CNAME form and provide a response. """
if request . method == " GET " :
return redirect ( " / " )
errors = " "
add_cname_response = " "
form = forms . FormAddCnameRecord ( request . POST )
if form . is_valid ( ) :
form_cleaned = form . cleaned_data
try :
add_cname_response = helpers . add_cname_record (
form_cleaned [ " dns_server " ] ,
form_cleaned [ " zone_name " ] ,
form_cleaned [ " cname " ] ,
str ( form_cleaned [ " originating_record " ] ) ,
form_cleaned [ " ttl " ] ,
form_cleaned [ " key_name " ] )
except exceptions . RecordException , err :
errors = err
return render ( request , " bcommon/response_result.html " ,
{ " response " : add_cname_response ,
" errors " : errors } )
dns_server = models . BindServer . objects . get ( hostname = request . POST [ " dns_server " ] )
if request . method == ' POST ' :
form = forms . FormAddCnameRecord ( request . POST )
if form . is_valid ( ) :
form_cleaned = form . cleaned_data
try :
helpers . add_cname_record ( form_cleaned [ " dns_server " ] ,
str ( form_cleaned [ " zone_name " ] ) ,
str ( form_cleaned [ " cname " ] ) ,
' %s . %s ' % ( str ( form_cleaned [ " originating_record " ] ) ,
str ( form_cleaned [ " zone_name " ] ) ) ,
form_cleaned [ " ttl " ] ,
form_cleaned [ " key_name " ] )
except ( KeyringException , RecordException ) as exc :
messages . error ( request , " Adding %s . %s failed: %s " %
( form_cleaned [ " record_name " ] , zone_name , exc ) )
else :
messages . success ( request , " %s . %s was added successfully. " %
( form_cleaned [ " record_name " ] , zone_name ) )
return redirect ( ' zone_list ' ,
dns_server = dns_server ,
zone_name = zone_name )
else :
form = forms . FormAddCnameRecord ( initial = { ' originating_record ' : record_name ,
' zone_name ' : zone_name } )
return render ( request , " bcommon/add_cname_record_form.html " ,
{ " dns_server " : dns_server ,
" zone_name " : request . POST [ " zone_name " ] ,
" record_name " : request . POST [ " cname " ] ,
" originating_record " : request . POST [ " originating_record " ] ,
" ttl_choices " : settings . TTL_CHOICES ,
" tsig_keys " : models . Key . objects . all ( ) ,
{ " dns_server " : this_server ,
" form " : form } )
def view_delete_record ( request ) :
""" Provide the initial form for deleting records. """
if request . method == " GET " :
return redirect ( " / " )
dns_server = models . BindServer . objects . get ( hostname = request . POST [ " dns_server " ] )
zone_name = request . POST [ " zone_name " ]
def view_delete_record ( request , dns_server , zone_name ) :
""" View to handle the deletion of records. """
dns_server = models . BindServer . objects . get ( hostname = dns_server )
rr_list = request . POST . getlist ( " rr_list " )
return render ( request , " bcommon/delete_record_initial.html " ,
{ " dns_server " : dns_server ,
" zone_name " : zone_name ,
" rr_list " : rr_list ,
" tsig_keys " : models . Key . objects . all ( ) } )
def view_delete_result ( request ) :
""" View that deletes records and returns the response. """
if request . method == " GET " :
return redirect ( " / " )
form = forms . FormDeleteRecord ( request . POST )
if form . is_valid ( ) :
clean_form = form . cleaned_data
if len ( rr_list ) == 0 :
messages . error ( request , " Select at least one record for deletion. " )
return redirect ( ' zone_list ' ,
dns_server = dns_server ,
zone_name = zone_name )
if request . method == ' POST ' :
form = forms . FormDeleteRecord ( request . POST )
if form . is_valid ( ) :
form_cleaned = form . cleaned_data
rr_list = form_cleaned [ " rr_list " ]
try :
response = helpers . delete_record ( form_cleaned [ " dns_server " ] ,
rr_list ,
form_cleaned [ " key_name " ] )
except KeyringException as exc :
for record in rr_list :
messages . error ( request , " Deleting %s . %s failed: %s " %
( record , zone_name , exc ) )
else :
for record in response :
if record [ ' success ' ] == True :
messages . success ( request , " %s . %s was removed successfully. " %
( record [ ' record ' ] , zone_name ) )
else :
messages . error ( request , " Deleting %s . %s failed: %s " %
( record [ ' record ' ] , zone_name , record [ ' description ' ] ) )
return redirect ( ' zone_list ' ,
dns_server = dns_server ,
zone_name = zone_name )
else :
# TODO: What situations would cause this form
# not to validate?
print " in view_delete_result, form errors: %r " % form . errors
delete_result = helpers . delete_record ( clean_form [ " dns_server " ] ,
clean_form [ " rr_list " ] ,
clean_form [ " key_name " ] )
form = forms . FormDeleteRecord ( initial = { ' zone_name ' : zone_name } )
return render ( request , " bcommon/response_result.html " ,
{ " response " : delete_result } )
return render ( request , " bcommon/delete_record.html " ,
{ " dns_server " : dns_server ,
" zone_name " : zone_name ,
" rr_list " : rr_list ,
" form " : form } )