From e08297876e554e2a1b48bca50b44c26e7d755d7e Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Sun, 3 Aug 2008 12:46:23 +0000
Subject: [PATCH] Network Configuration through the ISPConfig interface for
 debian and compatible linux distributions.

---
 install/tpl/server.ini.master                 |   1 +
 interface/web/admin/form/server.tform.php     |   2 +-
 .../web/admin/form/server_config.tform.php    |   6 +
 .../web/admin/lib/lang/en_server_config.lng   |   1 +
 .../templates/server_config_server_edit.htm   |   8 +-
 server/conf/debian_network_interfaces.master  |  27 +++
 .../network_settings_plugin.inc.php           | 166 ++++++++++++++++++
 7 files changed, 208 insertions(+), 3 deletions(-)
 create mode 100644 server/conf/debian_network_interfaces.master
 create mode 100644 server/plugins-available/network_settings_plugin.inc.php

diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master
index 5f19aa8e74..559f5eeab9 100644
--- a/install/tpl/server.ini.master
+++ b/install/tpl/server.ini.master
@@ -4,6 +4,7 @@ mailserver=postfix
 dnsserver=mydns
 
 [server]
+auto_network_configuration=n
 ip_address=192.168.0.105
 netmask=255.255.255.0
 gateway=192.168.0.1
diff --git a/interface/web/admin/form/server.tform.php b/interface/web/admin/form/server.tform.php
index f4ebd4c770..80b672ef1e 100644
--- a/interface/web/admin/form/server.tform.php
+++ b/interface/web/admin/form/server.tform.php
@@ -39,7 +39,7 @@ $form["name"] 			= "server";
 $form["action"]			= "server_edit.php";
 $form["db_table"]		= "server";
 $form["db_table_idx"]	= "server_id";
-$form["db_history"]		= "no";
+$form["db_history"]		= "yes";
 $form["tab_default"]	= "services";
 $form["list_default"]	= "server_list.php";
 $form["auth"]			= 'yes';
diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php
index f3e2a5a581..19bfb9a492 100644
--- a/interface/web/admin/form/server_config.tform.php
+++ b/interface/web/admin/form/server_config.tform.php
@@ -58,6 +58,12 @@ $form["tabs"]['server'] = array (
 	##################################
 	# Begin Datatable fields
 	##################################
+		'auto_network_configuration' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'CHECKBOX',
+			'default'	=> 'n',
+			'value'		=> array(0 => 'n',1 => 'y')
+		),
 		'ip_address' => array (
 			'datatype'	=> 'VARCHAR',
 			'formtype'	=> 'TEXT',
diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng
index 5c046b84b2..b4f1842742 100644
--- a/interface/web/admin/lib/lang/en_server_config.lng
+++ b/interface/web/admin/lib/lang/en_server_config.lng
@@ -33,4 +33,5 @@ $wb["netmask_txt"] = 'Netmask';
 $wb["gateway_txt"] = 'Gateway';
 $wb["hostname_txt"] = 'Hostname';
 $wb["nameservers_txt"] = 'Nameservers';
+$wb["auto_network_configuration_txt"] = 'Network Configuration';
 ?>
\ No newline at end of file
diff --git a/interface/web/admin/templates/server_config_server_edit.htm b/interface/web/admin/templates/server_config_server_edit.htm
index 6200fbc6ca..0d9d72202d 100644
--- a/interface/web/admin/templates/server_config_server_edit.htm
+++ b/interface/web/admin/templates/server_config_server_edit.htm
@@ -1,4 +1,8 @@
 <table width="500" border="0" cellspacing="0" cellpadding="2">
+  <tr>
+    <td width="126" class="frmText11">{tmpl_var name='auto_network_configuration_txt'}:</td>
+    <td width="366" class="frmText11">{tmpl_var name='auto_network_configuration'}</td>
+  </tr>
   <tr>
     <td class="frmText11">{tmpl_var name='ip_address_txt'}:</td>
     <td class="frmText11"><input name="ip_address" type="text" class="text" value="{tmpl_var name='ip_address'}" size="15" maxlength="255"></td>
@@ -27,6 +31,6 @@
     <td><input name="btn_save" type="button" class="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/server_config_edit.php');"><div class="buttonEnding"></div>&nbsp;
       <input name="btn_cancel" type="button" class="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/server_config_list.php');"><div class="buttonEnding"></div>
     </td>
-  </tr>
-</table>
+  </tr>
+</table>
 <input type="hidden" name="id" value="{tmpl_var name='id'}">
\ No newline at end of file
diff --git a/server/conf/debian_network_interfaces.master b/server/conf/debian_network_interfaces.master
new file mode 100644
index 0000000000..08c713691c
--- /dev/null
+++ b/server/conf/debian_network_interfaces.master
@@ -0,0 +1,27 @@
+# This file describes the network interfaces available on your system
+# and how to activate them. For more information, see interfaces(5).
+
+# The loopback network interface
+auto lo
+iface lo inet loopback
+
+# The primary network interface
+auto eth0
+iface eth0 inet static
+        address <tmpl_var name="ip_address">
+        netmask <tmpl_var name="netmask">
+        network <tmpl_var name="network">
+        broadcast <tmpl_var name="broadcast">
+        gateway <tmpl_var name="gateway">
+
+<tmpl_if name="additionl_ip_records">
+<tmpl_loop name="interfaces">
+auto eth0:<tmpl_var name="id">
+iface eth0:<tmpl_var name="id"> inet static
+        address <tmpl_var name="ip_address">
+        netmask <tmpl_var name="netmask">
+        network <tmpl_var name="network">
+        broadcast <tmpl_var name="broadcast">
+        gateway <tmpl_var name="gateway">
+</tmpl_loop>
+</tmpl_if>
diff --git a/server/plugins-available/network_settings_plugin.inc.php b/server/plugins-available/network_settings_plugin.inc.php
new file mode 100644
index 0000000000..94e37b44bb
--- /dev/null
+++ b/server/plugins-available/network_settings_plugin.inc.php
@@ -0,0 +1,166 @@
+<?php
+
+/*
+Copyright (c) 2008, 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 network_settings_plugin {
+	
+	var $plugin_name = 'network_settings_plugin';
+	var $class_name = 'network_settings_plugin';
+	
+	
+	/*
+	 	This function is called when the plugin is loaded
+	*/
+	
+	function onLoad() {
+		global $app;
+		
+		/*
+		Register for the events
+		*/
+		
+		$app->plugins->registerEvent('server_insert','network_settings_plugin','insert');
+		$app->plugins->registerEvent('server_update','network_settings_plugin','update');
+		
+		$app->plugins->registerEvent('server_ip_insert','network_settings_plugin','insert');
+		$app->plugins->registerEvent('server_ip_update','network_settings_plugin','update');
+		
+		
+		
+	}
+	
+	function insert($event_name,$data) {
+		global $app, $conf;
+		
+		$this->update($event_name,$data);
+		
+	}
+	
+	// The purpose of this plugin is to rewrite the main.cf file
+	function update($event_name,$data) {
+		global $app, $conf;
+		
+		// get the config
+		$app->uses("getconf");
+		$server_config = $app->getconf->get_server_config($conf["server_id"], 'server');
+		
+		// Configure the debian network card settings
+		if(is_file('/etc/debian_version') && $server_config['auto_network_configuration'] == 'y') {
+			copy('/etc/network/interfaces','/etc/network/interfaces~');
+			
+			$app->load('tpl');
+			
+			$network_tpl = new tpl();
+			$network_tpl->newTemplate("debian_network_interfaces.master");
+				
+			$network_tpl->setVar('ip_address',$server_config["ip_address"]);
+			$network_tpl->setVar('netmask',$server_config["netmask"]);
+			$network_tpl->setVar('gateway',$server_config["gateway"]);
+			$network_tpl->setVar('broadcast',$this->broadcast($server_config["ip_address"],$server_config["netmask"]));
+			$network_tpl->setVar('network',$this->network($server_config["ip_address"],$server_config["netmask"]));
+			
+			$records = $app->db->queryAllRecords("SELECT ip_address FROM server_ip WHERE server_id = ".intval($conf["server_id"]));
+			$ip_records = array();
+			$additionl_ip_records = 0;
+			$n = 0;
+			if(is_array($records)) {
+				foreach($records as $rec) {
+					$ip_records[] = array(
+						'id' => $n,
+						'ip_address' => $rec['ip_address'],
+						'netmask' => $server_config["netmask"],
+						'gateway' => $server_config["gateway"],
+						'broadcast' => $this->broadcast($rec['ip_address'],$server_config["netmask"]),
+						'network' => $this->network($rec['ip_address'],$server_config["netmask"])
+					);
+					$additionl_ip_records = 1;
+					$n++;
+				}
+			}
+			
+			$network_tpl->setVar('additionl_ip_records',$additionl_ip_records);
+			$network_tpl->setLoop('interfaces',$ip_records);
+
+			file_put_contents('/etc/network/interfaces',$network_tpl->grab());
+			unset($network_tpl);
+			
+			$app->log("Changed Network settings",LOGLEVEL_DEBUG);
+			
+			exec('/etc/init.d/networking force-reload');
+		}
+		
+	}
+	
+	function network($ip, $netmask){
+		$netmask = $this->netmask($netmask);
+		list($f1,$f2,$f3,$f4) = explode(".", $netmask);
+		$netmask_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT);
+		list($f1,$f2,$f3,$f4) = explode(".", $ip);
+		$ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT);
+		for($i=0;$i<32;$i++){
+			$network_bin .= substr($netmask_bin,$i,1) * substr($ip_bin,$i,1);
+		}
+		$network_bin = wordwrap($network_bin, 8, ".", 1);
+		list($f1,$f2,$f3,$f4) = explode(".", trim($network_bin));
+		return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4);
+	}
+
+	function broadcast($ip, $netmask){
+		$netmask = $this->netmask($netmask);
+		$binary_netmask = $this->binary_netmask($netmask);
+		list($f1,$f2,$f3,$f4) = explode(".", $ip);
+		$ip_bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT);
+		$broadcast_bin = str_pad(substr($ip_bin, 0, $binary_netmask),32,"1",STR_PAD_RIGHT);
+		$broadcast_bin = wordwrap($broadcast_bin, 8, ".", 1);
+		list($f1,$f2,$f3,$f4) = explode(".", trim($broadcast_bin));
+		return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4);
+	}
+	
+	function netmask($netmask){
+		list($f1,$f2,$f3,$f4) = explode(".", trim($netmask));
+		$bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT);
+		$parts = explode("0", $bin);
+		$bin = str_pad($parts[0], 32, "0", STR_PAD_RIGHT);
+		$bin = wordwrap($bin, 8, ".", 1);
+		list($f1,$f2,$f3,$f4) = explode(".", trim($bin));
+		return bindec($f1).".".bindec($f2).".".bindec($f3).".".bindec($f4);
+	}
+
+	function binary_netmask($netmask){
+		list($f1,$f2,$f3,$f4) = explode(".", trim($netmask));
+		$bin = str_pad(decbin($f1),8,"0",STR_PAD_LEFT).str_pad(decbin($f2),8,"0",STR_PAD_LEFT).str_pad(decbin($f3),8,"0",STR_PAD_LEFT).str_pad(decbin($f4),8,"0",STR_PAD_LEFT);
+		$parts = explode("0", $bin);
+		return substr_count($parts[0], "1");
+	}
+
+} // end class
+
+
+
+?>
\ No newline at end of file
-- 
GitLab