From 7dbea06e158c10fc59962ba2b988ca0976d5c000 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Fri, 30 Oct 2009 10:17:30 -0400
Subject: [PATCH] Implemented: FS#868 - Add support for BIND 

---
 install/dist/conf/centos53.conf.php                      |    9 +
 server/mods-available/dns_module.inc.php                 |   23 ++
 install/dist/conf/fedora9.conf.php                       |    9 +
 install/dist/conf/debian40.conf.php                      |    9 +
 install/update.php                                       |    4 
 interface/web/admin/lib/lang/en_server_config.lng        |    9 +
 install/tpl/server.ini.master                            |    7 
 interface/web/admin/form/server_config.tform.php         |   69 ++++++++
 install/dist/conf/centos52.conf.php                      |    9 +
 install/install.php                                      |    8 +
 install/lib/installer_base.lib.php                       |    9 +
 install/dist/conf/opensuse110.conf.php                   |    9 +
 interface/web/admin/templates/server_config_dns_edit.htm |   38 ++++
 server/conf/bind_named.conf.local.master                 |    7 
 server/conf/bind_pri.domain.master                       |   51 ++++++
 server/plugins-available/bind_plugin.inc.php             |  199 ++++++++++++++++++++++++
 16 files changed, 468 insertions(+), 1 deletions(-)

diff --git a/install/dist/conf/centos52.conf.php b/install/dist/conf/centos52.conf.php
index 5d1216b..4a745f8 100644
--- a/install/dist/conf/centos52.conf.php
+++ b/install/dist/conf/centos52.conf.php
@@ -154,6 +154,15 @@
 $conf["powerdns"]["config_dir"] = '/etc/powerdns/pdns.d';
 $conf['powerdns']['init_script'] = 'pdns';
 
+//* BIND DNS Server
+$conf['bind']['installed'] = false; // will be detected automatically during installation
+$conf['bind']['bind_user'] = 'root';
+$conf['bind']['bind_group'] = 'bind';
+$conf['bind']['bind_zonefiles_dir'] = '/etc/bind';
+$conf['bind']['named_conf_path'] = '/etc/bind/named.conf';
+$conf['bind']['named_conf_local_path'] = '/etc/bind/named.conf.local';
+$conf['bind']['init_script'] = 'named';
+
 //* Jailkit
 $conf['jailkit']['installed'] = false; // will be detected automatically during installation
 $conf['jailkit']['config_dir'] = '/etc/jailkit';
diff --git a/install/dist/conf/centos53.conf.php b/install/dist/conf/centos53.conf.php
index 5d1216b..4a745f8 100644
--- a/install/dist/conf/centos53.conf.php
+++ b/install/dist/conf/centos53.conf.php
@@ -154,6 +154,15 @@
 $conf["powerdns"]["config_dir"] = '/etc/powerdns/pdns.d';
 $conf['powerdns']['init_script'] = 'pdns';
 
+//* BIND DNS Server
+$conf['bind']['installed'] = false; // will be detected automatically during installation
+$conf['bind']['bind_user'] = 'root';
+$conf['bind']['bind_group'] = 'bind';
+$conf['bind']['bind_zonefiles_dir'] = '/etc/bind';
+$conf['bind']['named_conf_path'] = '/etc/bind/named.conf';
+$conf['bind']['named_conf_local_path'] = '/etc/bind/named.conf.local';
+$conf['bind']['init_script'] = 'named';
+
 //* Jailkit
 $conf['jailkit']['installed'] = false; // will be detected automatically during installation
 $conf['jailkit']['config_dir'] = '/etc/jailkit';
diff --git a/install/dist/conf/debian40.conf.php b/install/dist/conf/debian40.conf.php
index cdfdb26..a124489 100644
--- a/install/dist/conf/debian40.conf.php
+++ b/install/dist/conf/debian40.conf.php
@@ -154,6 +154,15 @@
 $conf["powerdns"]["config_dir"] = '/etc/powerdns/pdns.d';
 $conf['powerdns']['init_script'] = 'pdns';
 
+//* BIND DNS Server
+$conf['bind']['installed'] = false; // will be detected automatically during installation
+$conf['bind']['bind_user'] = 'root';
+$conf['bind']['bind_group'] = 'bind';
+$conf['bind']['bind_zonefiles_dir'] = '/etc/bind';
+$conf['bind']['named_conf_path'] = '/etc/bind/named.conf';
+$conf['bind']['named_conf_local_path'] = '/etc/bind/named.conf.local';
+$conf['bind']['init_script'] = 'bind9';
+
 //* Jailkit
 $conf['jailkit']['installed'] = false; // will be detected automatically during installation
 $conf['jailkit']['config_dir'] = '/etc/jailkit';
diff --git a/install/dist/conf/fedora9.conf.php b/install/dist/conf/fedora9.conf.php
index 0ab5a0b..86693cb 100644
--- a/install/dist/conf/fedora9.conf.php
+++ b/install/dist/conf/fedora9.conf.php
@@ -154,6 +154,15 @@
 $conf["powerdns"]["config_dir"] = '/etc/powerdns/pdns.d';
 $conf['powerdns']['init_script'] = 'pdns';
 
+//* BIND DNS Server
+$conf['bind']['installed'] = false; // will be detected automatically during installation
+$conf['bind']['bind_user'] = 'root';
+$conf['bind']['bind_group'] = 'bind';
+$conf['bind']['bind_zonefiles_dir'] = '/etc/bind';
+$conf['bind']['named_conf_path'] = '/etc/bind/named.conf';
+$conf['bind']['named_conf_local_path'] = '/etc/bind/named.conf.local';
+$conf['bind']['init_script'] = 'named';
+
 //* Jailkit
 $conf['jailkit']['installed'] = false; // will be detected automatically during installation
 $conf['jailkit']['config_dir'] = '/etc/jailkit';
diff --git a/install/dist/conf/opensuse110.conf.php b/install/dist/conf/opensuse110.conf.php
index 8c40a88..5ebc536 100644
--- a/install/dist/conf/opensuse110.conf.php
+++ b/install/dist/conf/opensuse110.conf.php
@@ -154,6 +154,15 @@
 $conf["powerdns"]["config_dir"] = '/etc/powerdns/pdns.d';
 $conf['powerdns']['init_script'] = 'pdns';
 
+//* BIND DNS Server
+$conf['bind']['installed'] = false; // will be detected automatically during installation
+$conf['bind']['bind_user'] = 'root';
+$conf['bind']['bind_group'] = 'bind';
+$conf['bind']['bind_zonefiles_dir'] = '/etc/bind';
+$conf['bind']['named_conf_path'] = '/etc/bind/named.conf';
+$conf['bind']['named_conf_local_path'] = '/etc/bind/named.conf.local';
+$conf['bind']['init_script'] = 'named';
+
 //* Jailkit
 $conf['jailkit']['installed'] = false; // will be detected automatically during installation
 $conf['jailkit']['config_dir'] = '/etc/jailkit';
diff --git a/install/install.php b/install/install.php
index 5449028..5c19b54 100644
--- a/install/install.php
+++ b/install/install.php
@@ -194,6 +194,9 @@
 	if($conf['powerdns']['installed'] == true) {
 		swriteln('Configuring PowerDNS');
 		$inst->configure_powerdns();
+	} elseif($conf['bind']['installed'] == true) {
+		swriteln('Configuring BIND');
+		$inst->configure_bind();
 	} else {
 		swriteln('Configuring MyDNS');
 		$inst->configure_mydns();
@@ -246,6 +249,7 @@
 	if($conf['pureftpd']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['pureftpd']['init_script']))				system($conf['init_scripts'].'/'.$conf['pureftpd']['init_script'].' restart');
 	if($conf['mydns']['installed'] == true && $conf['mydns']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['mydns']['init_script']))					system($conf['init_scripts'].'/'.$conf['mydns']['init_script'].' restart &> /dev/null');
 	if($conf['powerdns']['installed'] == true && $conf['powerdns']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['powerdns']['init_script']))					system($conf['init_scripts'].'/'.$conf['powerdns']['init_script'].' restart &> /dev/null');
+	if($conf['bind']['installed'] == true && $conf['bind']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['bind']['init_script']))					system($conf['init_scripts'].'/'.$conf['bind']['init_script'].' restart &> /dev/null');
 	
 }else{
 	
@@ -370,6 +374,10 @@
 			swriteln('Configuring PowerDNS');
 			$inst->configure_powerdns();
 			if($conf['powerdns']['init_script'] != '')	system($conf['init_scripts'].'/'.$conf['powerdns']['init_script'].' restart &> /dev/null');
+		} elseif($conf['bind']['installed'] == true) {
+			swriteln('Configuring BIND');
+			$inst->configure_bind();
+			if($conf['bind']['init_script'] != '')	system($conf['init_scripts'].'/'.$conf['bind']['init_script'].' restart &> /dev/null');
 		} else {
 			swriteln('Configuring MyDNS');
 			$inst->configure_mydns();
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index 7b4eba8..9e79b55 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -128,7 +128,7 @@
 		if(is_installed('mydns') || is_installed('mydns-ng')) $conf['mydns']['installed'] = true;
 		if(is_installed('jk_chrootsh')) $conf['jailkit']['installed'] = true;
 		if(is_installed('pdns_server') || is_installed('pdns_control')) $conf['powerdns']['installed'] = true;
-		
+		if(is_installed('named') || is_installed('bind') || is_installed('bind9')) $conf['bind']['installed'] = true;
 		
 	}
 	
@@ -818,6 +818,13 @@
 		
 	}
 	
+	public function configure_bind() {
+		global $conf;
+		
+		//* Nothing to do
+		
+	}
+	
 	
 	
 	public function configure_apache()
diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master
index 9cc4e6f..080f9fd 100644
--- a/install/tpl/server.ini.master
+++ b/install/tpl/server.ini.master
@@ -43,6 +43,13 @@
 apps_vhost_ip=_default_
 apps_vhost_servername=
 
+[dns]
+bind_user=root
+bind_group=bind
+bind_zonefiles_dir=/etc/bind
+named_conf_path=/etc/bind/named.conf
+named_conf_local_path=/etc/bind/named.conf.local
+
 [fastcgi]
 fastcgi_starter_path=/var/www/php-fcgi-scripts/[system_user]/
 fastcgi_starter_script=.php-fcgi-starter
diff --git a/install/update.php b/install/update.php
index 01158e6..479ad9e 100644
--- a/install/update.php
+++ b/install/update.php
@@ -342,6 +342,9 @@
 		if($conf['powerdns']['installed'] == true) {
 			swriteln('Configuring PowerDNS');
 			$inst->configure_powerdns();
+		} elseif($conf['bind']['installed'] == true) {
+			swriteln('Configuring BIND');
+			$inst->configure_bind();
 		} else {
 			swriteln('Configuring MyDNS');
 			$inst->configure_mydns();
@@ -413,6 +416,7 @@
 	if($conf['services']['dns']) {
 		if($conf['mydns']['installed'] == true && $conf['mydns']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['mydns']['init_script']))					system($conf['init_scripts'].'/'.$conf['mydns']['init_script'].' restart &> /dev/null');
 		if($conf['powerdns']['installed'] == true && $conf['powerdns']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['powerdns']['init_script']))					system($conf['init_scripts'].'/'.$conf['powerdns']['init_script'].' restart &> /dev/null');
+		if($conf['bind']['installed'] == true && $conf['bind']['init_script'] != '' && is_file($conf['init_scripts'].'/'.$conf['bind']['init_script']))					system($conf['init_scripts'].'/'.$conf['bind']['init_script'].' restart &> /dev/null');
 	}
 }
 
diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php
index 31f5542..7d9d493 100644
--- a/interface/web/admin/form/server_config.tform.php
+++ b/interface/web/admin/form/server_config.tform.php
@@ -411,6 +411,75 @@
 	)
 );
 
+$form["tabs"]['dns'] = array (
+	'title' 	=> "DNS",
+	'width' 	=> 60,
+	'template' 	=> "templates/server_config_dns_edit.htm",
+	'fields' 	=> array (
+	##################################
+	# Begin Datatable fields
+	##################################
+		'bind_user' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'bind_user_error_empty'),
+									),
+			'value'		=> '',
+			'width'		=> '40',
+			'maxlength'	=> '255'
+		),
+		'bind_group' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'bind_group_error_empty'),
+									),
+			'value'		=> '',
+			'width'		=> '40',
+			'maxlength'	=> '255'
+		),
+		'bind_zonefiles_dir' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'bind_zonefiles_dir_error_empty'),
+									),
+			'value'		=> '',
+			'width'		=> '40',
+			'maxlength'	=> '255'
+		),
+		'named_conf_path' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'named_conf_path_error_empty'),
+									),
+			'value'		=> '',
+			'width'		=> '40',
+			'maxlength'	=> '255'
+		),
+		'named_conf_local_path' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'named_conf_local_path_error_empty'),
+									),
+			'value'		=> '',
+			'width'		=> '40',
+			'maxlength'	=> '255'
+		),
+	##################################
+	# ENDE Datatable fields
+	##################################
+	)
+);
+
 $form["tabs"]['fastcgi'] = array (
 	'title' 	=> "FastCGI",
 	'width' 	=> 80,
diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng
index c3c7019..8582818 100644
--- a/interface/web/admin/lib/lang/en_server_config.lng
+++ b/interface/web/admin/lib/lang/en_server_config.lng
@@ -50,4 +50,13 @@
 $wb["apps_vhost_port_txt"] = 'Apps-vhost port';
 $wb["apps_vhost_ip_txt"] = 'Apps-vhost IP';
 $wb["apps_vhost_servername_txt"] = 'Apps-vhost Domain';
+$wb["bind_user_txt"] = 'BIND User';
+$wb["bind_group_txt"] = 'BIND Group';
+$wb["bind_zonefiles_dir_txt"] = 'BIND zonefiles directory';
+$wb["named_conf_path_txt"] = 'BIND named.conf path';
+$wb["bind_user_error_empty"] = 'BIND user is empty.';
+$wb["bind_group_error_empty"] = 'BIND group is empty.';
+$wb["bind_zonefiles_dir_error_empty"] = 'BIND zonefiles directory is empty.';
+$wb["named_conf_path_error_empty"] = 'BIND named.conf path is empty.';
+$wb["named_conf_local_path_error_empty"] = 'BIND named.conf.local path is empty.';
 ?>
\ No newline at end of file
diff --git a/interface/web/admin/templates/server_config_dns_edit.htm b/interface/web/admin/templates/server_config_dns_edit.htm
new file mode 100644
index 0000000..eee6626
--- /dev/null
+++ b/interface/web/admin/templates/server_config_dns_edit.htm
@@ -0,0 +1,38 @@
+<h2><tmpl_var name="list_head_txt"></h2>
+<p><tmpl_var name="list_desc_txt"></p>
+
+<div class="panel panel_server_config">
+  
+  <div class="pnl_formsarea">
+    <fieldset class="inlineLabels">
+      <div class="ctrlHolder">
+      	<label for="bind_user">{tmpl_var name='bind_user_txt'}</label>
+        <input name="bind_user" id="bind_user" value="{tmpl_var name='bind_user'}" size="40" maxlength="255" type="text" class="textInput" />
+			</div>
+	  <div class="ctrlHolder">
+      	<label for="bind_group">{tmpl_var name='bind_group_txt'}</label>
+        <input name="bind_group" id="bind_group" value="{tmpl_var name='bind_group'}" size="40" maxlength="255" type="text" class="textInput" />
+	  </div>
+	  <div class="ctrlHolder">
+      	<label for="bind_zonefiles_dir">{tmpl_var name='bind_zonefiles_dir_txt'}</label>
+        <input name="bind_zonefiles_dir" id="bind_zonefiles_dir" value="{tmpl_var name='bind_zonefiles_dir'}" size="40" maxlength="255" type="text" class="textInput" />
+	  </div>
+	  <div class="ctrlHolder">
+      	<label for="named_conf_path">{tmpl_var name='named_conf_path_txt'}</label>
+        <input name="named_conf_path" id="named_conf_path" value="{tmpl_var name='named_conf_path'}" size="40" maxlength="255" type="text" class="textInput" />
+	  </div>
+	  <div class="ctrlHolder">
+      	<label for="named_conf_local_path">{tmpl_var name='named_conf_local_path_txt'}</label>
+        <input name="named_conf_local_path" id="named_conf_local_path" value="{tmpl_var name='named_conf_local_path'}" size="40" maxlength="255" type="text" class="textInput" />
+	  </div>
+    </fieldset>
+
+    <input type="hidden" name="id" value="{tmpl_var name='id'}">
+
+    <div class="buttonHolder buttons">
+      <button class="positive iconstxt icoPositive" type="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/server_config_edit.php');"><span>{tmpl_var name='btn_save_txt'}</span></button>
+      <button class="negative iconstxt icoNegative" type="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/server_config_list.php');"><span>{tmpl_var name='btn_cancel_txt'}</span></button>
+    </div>
+  </div>
+  
+</div>
diff --git a/server/conf/bind_named.conf.local.master b/server/conf/bind_named.conf.local.master
new file mode 100644
index 0000000..27ec3cf
--- /dev/null
+++ b/server/conf/bind_named.conf.local.master
@@ -0,0 +1,7 @@
+
+<tmpl_loop name='zones'>
+zone "<tmpl_var name='origin'>" {
+        type master;
+        file "pri.<tmpl_var name='origin'>";
+};
+</tmpl_loop>
diff --git a/server/conf/bind_pri.domain.master b/server/conf/bind_pri.domain.master
new file mode 100644
index 0000000..ce545cb
--- /dev/null
+++ b/server/conf/bind_pri.domain.master
@@ -0,0 +1,51 @@
+$TTL        {tmpl_var name='ttl'}
+@       IN      SOA     {tmpl_var name='ns'} {tmpl_var name='mbox'}. (
+                        {tmpl_var name='serial'}       ; serial, todays date + todays serial #
+                        {tmpl_var name='refresh'}              ; refresh, seconds
+                        {tmpl_var name='retry'}              ; retry, seconds
+                        {tmpl_var name='expire'}              ; expire, seconds
+                        {tmpl_var name='ttl'} )            ; minimum, seconds
+;
+
+<tmpl_loop name='zones'>
+<tmpl_if name="type" op='==' value='NS'>
+{tmpl_var name='name'}      NS        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='A'>
+{tmpl_var name='name'}      A        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='AAAA'>
+{tmpl_var name='name'}      AAAA        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='ALIAS'>
+{tmpl_var name='name'}      CNAME        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='CNAME'>
+{tmpl_var name='name'}      CNAME        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='HINFO'>
+{tmpl_var name='name'}      HINFO        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='MX'>
+{tmpl_var name='name'}      MX    {tmpl_var name='aux'}   {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='NAPTR'>
+{tmpl_var name='name'}      NAPTR        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='NS'>
+{tmpl_var name='name'}      NS        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='PTR'>
+{tmpl_var name='name'}      PTR        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='RP'>
+{tmpl_var name='name'}      RP        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='SRV'>
+{tmpl_var name='name'}      SRV        {tmpl_var name='data'}
+</tmpl_if>
+<tmpl_if name="type" op='==' value='TXT'>
+{tmpl_var name='name'}      TXT        {tmpl_var name='data'}
+</tmpl_if>
+</tmpl_loop>
+
diff --git a/server/mods-available/dns_module.inc.php b/server/mods-available/dns_module.inc.php
index 79b0e5b..72ae1df 100644
--- a/server/mods-available/dns_module.inc.php
+++ b/server/mods-available/dns_module.inc.php
@@ -75,6 +75,10 @@
 		$app->modules->registerTableHook('dns_soa',$this->module_name,'process');
 		$app->modules->registerTableHook('dns_rr',$this->module_name,'process');
 		
+		
+		// Register service
+		$app->services->registerService('bind','dns_module','restartBind');
+		
 	}
 	
 	/*
@@ -99,6 +103,25 @@
 		} // end switch
 	} // end function
 	
+	
+	function restartBind($action = 'restart') {
+		global $app;
+		
+		$command = '';
+		if(is_file('/etc/init.d/bind9')) {
+			$command = '/etc/init.d/bind9';
+		} else {
+			$command = '/etc/init.d/named';
+		}
+		
+		if($action == 'restart') {
+			exec($command.' restart');
+		} else {
+			exec($command.' reload');
+		}
+		
+	}
+	
 
 } // end class
 
diff --git a/server/plugins-available/bind_plugin.inc.php b/server/plugins-available/bind_plugin.inc.php
new file mode 100644
index 0000000..5aebc37
--- /dev/null
+++ b/server/plugins-available/bind_plugin.inc.php
@@ -0,0 +1,199 @@
+<?php
+
+/*
+Copyright (c) 2009, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class bind_plugin {
+	
+	var $plugin_name = 'bind_plugin';
+	var $class_name  = 'bind_plugin';
+	var $action = 'update';
+	
+	//* This function is called during ispconfig installation to determine
+	//  if a symlink shall be created for this plugin.
+	function onInstall() {
+		global $conf;
+		
+		if(isset($conf['bind']['installed']) && $conf['bind']['installed'] == true) {
+			return true;
+		} else {
+			return false;
+		}
+		
+	}
+	
+		
+	/*
+	 	This function is called when the plugin is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Register for the events
+		*/
+		
+		//* SOA
+		$app->plugins->registerEvent('dns_soa_insert',$this->plugin_name,'soa_insert');
+		$app->plugins->registerEvent('dns_soa_update',$this->plugin_name,'soa_update');
+		$app->plugins->registerEvent('dns_soa_delete',$this->plugin_name,'soa_delete');
+		
+		//* RR
+		$app->plugins->registerEvent('dns_rr_insert',$this->plugin_name,'rr_insert');
+		$app->plugins->registerEvent('dns_rr_update',$this->plugin_name,'rr_update');
+		$app->plugins->registerEvent('dns_rr_delete',$this->plugin_name,'rr_delete');
+		
+	}
+	
+	
+	function soa_insert($event_name,$data) {
+		global $app, $conf;
+		
+		$this->action = 'insert';
+		$this->soa_update($event_name,$data);
+		
+	}
+	
+	function soa_update($event_name,$data) {
+		global $app, $conf;
+		
+		//* load the server configuration options
+		$app->uses("getconf");
+		$dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns');
+		
+		//* Write the domain file
+		$tpl = new tpl();
+		$tpl->newTemplate("bind_pri.domain.master");
+		
+		$zone = $data['new'];
+		$tpl->setVar($zone);
+		
+		$records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = ".$zone['id']);
+		$tpl->setLoop('records',$records);
+		
+		$filename = escapeshellcmd($dns_config['bind_zonefiles_dir'].'/pri.'.$zone['origin']);
+		file_put_contents($filename,$tpl->grab());
+		exec('chown '.escapeshellcmd($dns_config['bind_user']).':'.escapeshellcmd($dns_config['bind_group']).' '.$filename);
+		unset($tpl);
+		unset($records);
+		unset($zone);
+		
+		//* rebuild the named.conf file if the origin has changed or when the origin is inserted.
+		if($this->action == 'insert' || $data['old']['origin'] != $data['new']['origin']) {
+			$this->write_named_conf($data,$dns_config);
+		}
+		
+		//* Delete old domain file, if domain name has been changed
+		if($data['old']['origin'] != $data['new']['origin']) {
+			$filename = $dns_config['bind_zonefiles_dir'].'/pri.'.$data['old']['origin'];
+			if(is_file($filename)) unset($filename);
+		}
+		
+		//* Reload bind nameserver
+		$app->services->restartServiceDelayed('bind','reload');
+		
+	}
+	
+	function soa_delete($event_name,$data) {
+		global $app, $conf;
+		
+		//* load the server configuration options
+		$app->uses("getconf");
+		$dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns');
+		
+		//* rebuild the named.conf file
+		$this->write_named_conf($data,$dns_config);
+		
+		//* Delete the domain file
+		$filename = $dns_config['bind_zonefiles_dir'].'/pri.'.$data['old']['origin'];
+		if(is_file($filename)) unset($filename);
+		
+		//* Reload bind nameserver
+		$app->services->restartServiceDelayed('bind','reload');
+			
+	}
+	
+	function rr_insert($event_name,$data) {
+		global $app, $conf;
+		
+		//* Get the data of the soa and call soa_update
+		$tmp = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data['new']['zone']);
+		$data["new"] = $tmp;
+		$data["old"] = $tmp;
+		$this->action = 'update';
+		$this->soa_update($event_name,$data);
+
+	}
+	
+	function rr_update($event_name,$data) {
+		global $app, $conf;
+		
+		//* Get the data of the soa and call soa_update
+		$tmp = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data['new']['zone']);
+		$data["new"] = $tmp;
+		$data["old"] = $tmp;
+		$this->action = 'update';
+		$this->soa_update($event_name,$data);
+		
+	}
+	
+	function rr_delete($event_name,$data) {
+		global $app, $conf;
+		
+		//* Get the data of the soa and call soa_update
+		$tmp = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE id = ".$data['old']['zone']);
+		$data["new"] = $tmp;
+		$data["old"] = $tmp;
+		$this->action = 'update';
+		$this->soa_update($event_name,$data);
+		
+	}
+	
+	###################################################################
+	
+	function write_named_conf($data, $dns_config) {
+		global $app, $conf;
+		
+		$zones = $app->db->queryAllRecords("SELECT origin FROM dns_soa WHERE active = 'Y'");
+		
+		$tpl = new tpl();
+		$tpl->newTemplate("bind_named.conf.local.master");
+		$tpl->setLoop('zones',$zones);
+		
+		file_put_contents($dns_config['named_conf_local_path'],$tpl->grab());
+		unset($tpl);
+		
+	}
+	
+	
+	
+
+} // end class
+
+?>
\ No newline at end of file

--
Gitblit v1.9.1