From 3cb95fcbbde2ea7252d6eb4721f62c98f1d81a39 Mon Sep 17 00:00:00 2001 From: James Valleroy Date: Wed, 27 Dec 2017 12:54:22 -0500 Subject: [PATCH] bind: Add tests for config Signed-off-by: James Valleroy Reviewed-by: Sunil Mohan Adapa --- actions/bind | 104 +--------------------- plinth/modules/bind/__init__.py | 116 ++++++++++++++++++++++--- plinth/modules/bind/tests/test_bind.py | 62 +++++++++++++ plinth/modules/bind/views.py | 24 ++--- 4 files changed, 177 insertions(+), 129 deletions(-) create mode 100644 plinth/modules/bind/tests/test_bind.py diff --git a/actions/bind b/actions/bind index c4529c996..3e840d2a5 100755 --- a/actions/bind +++ b/actions/bind @@ -16,7 +16,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - """ 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() diff --git a/plinth/modules/bind/__init__.py b/plinth/modules/bind/__init__.py index ed1ad5d91..389b5b8e2 100644 --- a/plinth/modules/bind/__init__.py +++ b/plinth/modules/bind/__init__.py @@ -14,7 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - """ 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() diff --git a/plinth/modules/bind/tests/test_bind.py b/plinth/modules/bind/tests/test_bind.py new file mode 100644 index 000000000..f66f650f6 --- /dev/null +++ b/plinth/modules/bind/tests/test_bind.py @@ -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 . +# +""" +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'], '') diff --git a/plinth/modules/bind/views.py b/plinth/modules/bind/views.py index f7cdc90c6..5f8764631 100644 --- a/plinth/modules/bind/views.py +++ b/plinth/modules/bind/views.py @@ -14,7 +14,6 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # - """ 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 '' \