bind: Add tests for config

Signed-off-by: James Valleroy <jvalleroy@mailbox.org>
Reviewed-by: Sunil Mohan Adapa <sunil@medhas.org>
This commit is contained in:
James Valleroy 2017-12-27 12:54:22 -05:00 committed by Sunil Mohan Adapa
parent a2102ff4ad
commit 3cb95fcbbd
No known key found for this signature in database
GPG Key ID: 43EA1CFF0AA7C5F2
4 changed files with 177 additions and 129 deletions

View File

@ -16,7 +16,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
"""
Configuration helper for BIND server.
"""
@ -24,32 +23,8 @@ Configuration helper for BIND server.
import argparse
from plinth import action_utils
CONFIG_FILE = '/etc/bind/named.conf.options'
DEFAULT_CONFIG = '''
acl goodclients {
localnets;
};
options {
directory "/var/cache/bind";
recursion yes;
allow-query { goodclients; };
forwarders {
8.8.8.8; 8.8.4.4;
};
forward first;
dnssec-enable yes;
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
'''
from plinth.modules.bind import CONFIG_FILE, DEFAULT_CONFIG
from plinth.modules.bind import set_forwarding, enable_dnssec, set_forwarders
def parse_arguments():
@ -98,81 +73,6 @@ def subcommand_configure(arguments):
action_utils.service_restart('bind9')
def set_forwarding(choice):
"""Enable or disable DNS forwarding."""
data = [line.strip() for line in open(CONFIG_FILE, 'r')]
flag = 0
if choice == "false":
if 'forwarders {' in data and not '// forwarders {' in data:
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if 'forwarders {' in line and not '// forwarders {' in line:
flag = 1
if flag == 1:
line = ' // ' + line
if 'forward first' in line:
flag = 0
if "0.0.0.0" not in line:
conf_file.write(line + '\n')
conf_file.close()
else:
if '// forwarders {' in data:
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if '// forwarders {' in line:
flag = 1
if flag == 1:
line = line[2:]
if 'forward first' in line:
flag = 0
if "0.0.0.0" not in line:
conf_file.write(line + '\n')
conf_file.close()
def enable_dnssec(choice):
"""Enable or disable DNSSEC."""
data = [line.strip() for line in open(CONFIG_FILE, 'r')]
if choice == "false":
if '//dnssec-enable yes;' not in data:
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if 'dnssec-enable yes;' in line:
line = '//' + line
conf_file.write(line+'\n')
conf_file.close()
else:
if '//dnssec-enable yes;' in data:
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if '//dnssec-enable yes;' in line:
line = line[2:]
conf_file.write(line + '\n')
conf_file.close()
def set_forwarders(forwarders):
"""Set DNS forwarders."""
flag = 0
data = [line.strip() for line in open(CONFIG_FILE, 'r')]
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if 'forwarders {' in line:
conf_file.write(line + '\n')
for dns in forwarders.split():
conf_file.write(dns + '; ')
conf_file.write('\n')
flag = 1
elif '};' in line and flag == 1:
conf_file.write(line + '\n')
flag = 0
elif flag == 0:
conf_file.write(line + '\n')
conf_file.close()
def main():
"""Parse arguments and perform all duties"""
arguments = parse_arguments()

View File

@ -14,7 +14,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
"""
Plinth module to configure BIND server
"""
@ -28,7 +27,6 @@ from plinth import action_utils
from plinth import service as service_module
from plinth.menu import main_menu
version = 1
name = _('BIND')
@ -45,7 +43,6 @@ description = [
_('BIND is open source software that enables you to publish your Domain '
'Name System (DNS) information on the Internet, and to resolve '
'DNS queries for your users.'),
_('BIND is by far the most widely used DNS software on the Internet, '
'providing a robust and stable platform on top of which organizations'
' can build distributed computing systems with the knowledge that those '
@ -54,6 +51,29 @@ description = [
CONFIG_FILE = '/etc/bind/named.conf.options'
DEFAULT_CONFIG = '''
acl goodclients {
localnets;
};
options {
directory "/var/cache/bind";
recursion yes;
allow-query { goodclients; };
forwarders {
8.8.8.8; 8.8.4.4;
};
forward first;
dnssec-enable yes;
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
'''
def init():
"""Intialize the BIND module."""
@ -63,10 +83,8 @@ def init():
global service
setup_helper = globals()['setup_helper']
if setup_helper.get_state() != 'needs-setup':
service = service_module.Service(
managed_services[0], name, ports=['dns'],
is_external=False,
)
service = service_module.Service(managed_services[0], name,
ports=['dns'], is_external=False)
def setup(helper, old_version=None):
@ -74,10 +92,9 @@ def setup(helper, old_version=None):
helper.install(managed_packages)
global service
if service is None:
service = service_module.Service(
managed_services[0], name, ports=['dns'],
is_external=True,
enable=enable, disable=disable)
service = service_module.Service(managed_services[0], name,
ports=['dns'], is_external=True,
enable=enable, disable=disable)
helper.call('post', service.notify_enabled, None, True)
helper.call('post', default_config)
@ -109,7 +126,7 @@ def default_config():
actions.superuser_run('bind', ['setup'])
def get_default():
def get_config():
"""Get initial value for forwarding"""
data = [line.strip() for line in open(CONFIG_FILE, 'r')]
if '// forwarders {' in data:
@ -139,3 +156,78 @@ def get_default():
'forwarders': forwarders
}
return conf
def set_forwarding(choice):
"""Enable or disable DNS forwarding."""
data = [line.strip() for line in open(CONFIG_FILE, 'r')]
flag = 0
if choice == "false":
if 'forwarders {' in data and '// forwarders {' not in data:
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if 'forwarders {' in line and '// forwarders {' not in line:
flag = 1
if flag == 1:
line = ' // ' + line
if 'forward first' in line:
flag = 0
if "0.0.0.0" not in line:
conf_file.write(line + '\n')
conf_file.close()
else:
if '// forwarders {' in data:
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if '// forwarders {' in line:
flag = 1
if flag == 1:
line = line[2:]
if 'forward first' in line:
flag = 0
if "0.0.0.0" not in line:
conf_file.write(line + '\n')
conf_file.close()
def enable_dnssec(choice):
"""Enable or disable DNSSEC."""
data = [line.strip() for line in open(CONFIG_FILE, 'r')]
if choice == "false":
if '//dnssec-enable yes;' not in data:
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if 'dnssec-enable yes;' in line:
line = '//' + line
conf_file.write(line + '\n')
conf_file.close()
else:
if '//dnssec-enable yes;' in data:
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if '//dnssec-enable yes;' in line:
line = line[2:]
conf_file.write(line + '\n')
conf_file.close()
def set_forwarders(forwarders):
"""Set DNS forwarders."""
flag = 0
data = [line.strip() for line in open(CONFIG_FILE, 'r')]
conf_file = open(CONFIG_FILE, 'w')
for line in data:
if 'forwarders {' in line:
conf_file.write(line + '\n')
for dns in forwarders.split():
conf_file.write(dns + '; ')
conf_file.write('\n')
flag = 1
elif '};' in line and flag == 1:
conf_file.write(line + '\n')
flag = 0
elif flag == 0:
conf_file.write(line + '\n')
conf_file.close()

View File

@ -0,0 +1,62 @@
#
# This file is part of Plinth.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
"""
Test actions for configuring bind
"""
import tempfile
import unittest
from plinth.modules import bind
class TestBind(unittest.TestCase):
"""Test actions for configuring bind."""
def setUp(self):
self.conf_file = tempfile.NamedTemporaryFile()
with open(self.conf_file.name, 'w') as conf:
conf.write(bind.DEFAULT_CONFIG)
bind.CONFIG_FILE = self.conf_file.name
def test_set_forwarding(self):
bind.set_forwarding("true")
conf = bind.get_config()
self.assertEqual(conf['set_forwarding'], True)
bind.set_forwarding("false")
conf = bind.get_config()
self.assertEqual(conf['set_forwarding'], False)
def test_enable_dnssec(self):
bind.enable_dnssec("true")
conf = bind.get_config()
self.assertEqual(conf['enable_dnssec'], True)
bind.enable_dnssec("false")
conf = bind.get_config()
self.assertEqual(conf['enable_dnssec'], False)
def test_set_forwarders(self):
bind.set_forwarders('8.8.8.8 8.8.4.4')
conf = bind.get_config()
self.assertEqual(conf['forwarders'], '8.8.8.8 8.8.4.4')
bind.set_forwarders('')
conf = bind.get_config()
self.assertEqual(conf['forwarders'], '')

View File

@ -14,7 +14,6 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
"""
Views for BIND module.
"""
@ -25,12 +24,11 @@ from django.utils.translation import ugettext_lazy as _
from plinth import actions
from plinth.views import ServiceView
from . import description, managed_services, get_default
from . import description, managed_services, get_config
from .forms import BindForm
class BindServiceView(ServiceView): # pylint: disable=too-many-ancestors
class BindServiceView(ServiceView): # pylint: disable=too-many-ancestors
"""A specialized view for configuring Bind."""
service_id = managed_services[0]
diagnostics_module_name = "bind"
@ -41,35 +39,31 @@ class BindServiceView(ServiceView): # pylint: disable=too-many-ancestors
def get_initial(self):
"""Return the values to fill in the form."""
initial = super().get_initial()
initial.update(get_default())
initial.update(get_config())
return initial
def form_valid(self, form):
"""Change the configurations of Bind service."""
data = form.cleaned_data
old_config = get_default()
old_config = get_config()
if old_config['set_forwarding'] != data['set_forwarding']:
value = 'true' if data['set_forwarding'] else 'false'
actions.superuser_run(
'bind',
['configure', '--set-forwarding', value])
actions.superuser_run('bind',
['configure', '--set-forwarding', value])
messages.success(self.request,
_('Set forwarding configuration updated'))
if old_config['enable_dnssec'] != data['enable_dnssec']:
value = 'true' if data['enable_dnssec'] else 'false'
actions.superuser_run(
'bind',
['configure', '--enable-dnssec', value])
actions.superuser_run('bind',
['configure', '--enable-dnssec', value])
messages.success(self.request,
_('Enable DNSSEC configuration updated'))
if old_config['forwarders'] != data['forwarders'] \
and old_config['forwarders'] is not '':
actions.superuser_run(
'bind',
['dns', '--set', data['forwarders']])
actions.superuser_run('bind', ['dns', '--set', data['forwarders']])
messages.success(self.request,
_('DNS server configuration updated'))
elif old_config['forwarders'] is '' \