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 '' \