installer_base.lib.php 49.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
<?php

/*
Copyright (c) 2007, 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 installer_base {
	
	var $wb = array();
	var $language = 'en';
	var $db;
oliver's avatar
oliver committed
36
	public $conf;
tbrehm's avatar
tbrehm committed
37
	public $install_ispconfig_interface = true;
tbrehm's avatar
tbrehm committed
38
	public $is_update = false; // true if it is an update, falsi if it is a new install
39 40


pedro_morgan's avatar
pedro_morgan committed
41
    public function __construct()
42
    {
pedro_morgan's avatar
pedro_morgan committed
43
        global $conf; //TODO: maybe $conf  should be passed to constructor
44
        //$this->conf = $conf;
45
    }
46
	
47
    //: TODO  Implement the translation function and language files for the installer.
pedro_morgan's avatar
pedro_morgan committed
48 49
	public function lng($text)
    {
tbrehm's avatar
tbrehm committed
50
		return $text;
51 52
	}
	
pedro_morgan's avatar
pedro_morgan committed
53 54
	public function error($msg)
    {
55 56 57
		die("ERROR: ".$msg."\n");
	}
	
pedro_morgan's avatar
pedro_morgan committed
58 59
	public function simple_query($query, $answers, $default)
    {		
tbrehm's avatar
tbrehm committed
60 61
		$finished = false;
		do {
pedro_morgan's avatar
pedro_morgan committed
62
			$answers_str = implode(',', $answers);
tbrehm's avatar
tbrehm committed
63
			swrite($this->lng($query).' ('.$answers_str.') ['.$default.']: ');
tbrehm's avatar
tbrehm committed
64 65
			$input = sread();
			
pedro_morgan's avatar
pedro_morgan committed
66
			//* Stop the installation
tbrehm's avatar
tbrehm committed
67
			if($input == 'quit') {
pedro_morgan's avatar
pedro_morgan committed
68
				swriteln($this->lng("Installation terminated by user.\n"));
tbrehm's avatar
tbrehm committed
69
				die();
tbrehm's avatar
tbrehm committed
70 71
			}
			
pedro_morgan's avatar
pedro_morgan committed
72
			//* Select the default
tbrehm's avatar
tbrehm committed
73 74 75 76 77
			if($input == '') {
				$answer = $default;
				$finished = true;
			}
			
pedro_morgan's avatar
pedro_morgan committed
78 79
            //* Set answer id valid
			if(in_array($input, $answers)) {
tbrehm's avatar
tbrehm committed
80 81 82 83 84
				$answer = $input;
				$finished = true;
			}
			
		} while ($finished == false);
tbrehm's avatar
tbrehm committed
85
		swriteln();
tbrehm's avatar
tbrehm committed
86 87 88
		return $answer;
	}
	
pedro_morgan's avatar
pedro_morgan committed
89 90
	public function free_query($query,$default)
    {		
tbrehm's avatar
tbrehm committed
91
		swrite($this->lng($query).' ['.$default.']: ');
tbrehm's avatar
tbrehm committed
92 93
		$input = sread();
			
pedro_morgan's avatar
pedro_morgan committed
94
		//* Stop the installation
tbrehm's avatar
tbrehm committed
95
		if($input == 'quit') {
pedro_morgan's avatar
pedro_morgan committed
96 97
            swriteln($this->lng("Installation terminated by user.\n"));
            die();
tbrehm's avatar
tbrehm committed
98 99
		}
			
pedro_morgan's avatar
pedro_morgan committed
100
        $answer =  ($input == '') ? $default : $input;
tbrehm's avatar
tbrehm committed
101
		swriteln();
tbrehm's avatar
tbrehm committed
102 103 104
		return $answer;
	}
	
105
	/*
pedro_morgan's avatar
pedro_morgan committed
106 107
	// TODO: this function is not used atmo I think - pedro
	function request_language(){
108 109 110 111 112
		
		swriteln(lng('Enter your language'));
		swriteln(lng('de, en'));
		
	}
113
	*/
114
	
tbrehm's avatar
tbrehm committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
	//** Detect installed applications
	public function find_installed_apps() {
		global $conf;
		
		if(is_installed('mysql') || is_installed('mysqld')) $conf['mysql']['installed'] = true;
		if(is_installed('postfix')) $conf['postfix']['installed'] = true;
		if(is_installed('apache') || is_installed('apache2') || is_installed('httpd')) $conf['apache']['installed'] = true;
		if(is_installed('getmail')) $conf['getmail']['installed'] = true;
		if(is_installed('couriertcpd')) $conf['courier']['installed'] = true;
		if(is_installed('saslsauthd')) $conf['saslauthd']['installed'] = true;
		if(is_installed('amavisd-new')) $conf['amavis']['installed'] = true;
		if(is_installed('clamdscan')) $conf['clamav']['installed'] = true;
		if(is_installed('pure-ftpd') || is_installed('pure-ftpd-wrapper')) $conf['pureftpd']['installed'] = true;
		if(is_installed('mydns') || is_installed('mydns-ng')) $conf['mydns']['installed'] = true;
		if(is_installed('jk_chrootsh')) $conf['jailkit']['installed'] = true;
		
		
	}
	
134
	/** Create the database for ISPConfig */ 
tbrehm's avatar
tbrehm committed
135
	public function configure_database() {
136
		global $conf;
tbrehm's avatar
tbrehm committed
137
		
138
		//** Create the database
139 140
		if(!$this->db->query('CREATE DATABASE IF NOT EXISTS '.$conf['mysql']['database'].' DEFAULT CHARACTER SET '.$conf['mysql']['charset'])) {
			$this->error('Unable to create MySQL database: '.$conf['mysql']['database'].'.');
141 142
		}
		
143
		//* Set the database name in the DB library
144
		$this->db->dbName = $conf['mysql']['database'];
145
		
146
		//* Load the database dump into the database, if database contains no tables
147 148
		$db_tables = $this->db->getTables();
		if(count($db_tables) > 0) {
149
			$this->error('Stopped: Database already contains some tables.');
150
		} else {
151 152
			if($conf['mysql']['admin_password'] == '') {
				caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' '".$conf['mysql']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/ispconfig3.sql' &> /dev/null", 
153
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
154
			} else {
155
				caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' -p'".$conf['mysql']['admin_password']."' '".$conf['mysql']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/ispconfig3.sql' &> /dev/null", 
156
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
157 158 159 160 161
			}
			$db_tables = $this->db->getTables();
			if(count($db_tables) == 0) {
				$this->error('Unable to load SQL-Dump into database table.');
			}
162 163 164 165 166
			
			//* Load system.ini into the sys_ini table
			$system_ini = $this->db->quote(rf('tpl/system.ini.master'));
			$this->db->query("UPDATE sys_ini SET config = '$system_ini' WHERE sysini_id = 1");
			
167 168 169
		}
	}
	
170
	//** Create the server record in the database
171 172
	public function add_database_server_record() {
		
173
		global $conf;
tbrehm's avatar
tbrehm committed
174
		
175
		if($conf['mysql']['host'] == 'localhost') {
tbrehm's avatar
tbrehm committed
176 177
			$from_host = 'localhost';
		} else {
178
			$from_host = $conf['hostname'];
tbrehm's avatar
tbrehm committed
179 180
		}
		
181 182 183
		// Delete ISPConfig user in the local database, in case that it exists
		$this->db->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['ispconfig_user']."' AND Host = '".$from_host."';");
		$this->db->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['database']."' AND Host = '".$from_host."';");
184 185
		$this->db->query('FLUSH PRIVILEGES;');
		
186 187 188 189
		//* Create the ISPConfig database user in the local database
        $query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['database'].".* "
                ."TO '".$conf['mysql']['ispconfig_user']."'@'".$from_host."' "
                ."IDENTIFIED BY '".$conf['mysql']['ispconfig_password']."';";
190
		if(!$this->db->query($query)) {
191
			$this->error('Unable to create database user: '.$conf['mysql']['ispconfig_user'].' Error: '.$this->db->errorMessage);
192 193 194 195 196
		}
		
		//* Reload database privelages
		$this->db->query('FLUSH PRIVILEGES;');
		
tbrehm's avatar
tbrehm committed
197
		//* Set the database name in the DB library
198
		$this->db->dbName = $conf['mysql']['database'];
199
		
tbrehm's avatar
tbrehm committed
200 201 202 203 204 205 206
		$tpl_ini_array = ini_to_array(rf('tpl/server.ini.master'));
		
		// TODO: Update further distribution specific parameters for server config here
		$tpl_ini_array['web']['vhost_conf_dir'] = $conf['apache']['vhost_conf_dir'];
		$tpl_ini_array['web']['vhost_conf_enabled_dir'] = $conf['apache']['vhost_conf_enabled_dir'];
		
		$server_ini_content = array_to_ini($tpl_ini_array);
207
		$server_ini_content = mysql_real_escape_string($server_ini_content);
208
		
tbrehm's avatar
tbrehm committed
209 210 211 212 213 214 215
		$mail_server_enabled = ($conf['services']['mail'])?1:0;
		$web_server_enabled = ($conf['services']['web'])?1:0;
		$dns_server_enabled = ($conf['services']['dns'])?1:0;
		$file_server_enabled = ($conf['services']['file'])?1:0;
		$db_server_enabled = ($conf['services']['db'])?1:0;
		$vserver_server_enabled = ($conf['services']['vserver'])?1:0;
		
216 217 218
		if($conf['mysql']['master_slave_setup'] == 'y') {
			
			//* Insert the server record in master DB
tbrehm's avatar
tbrehm committed
219
			$sql = "INSERT INTO `server` (`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_name`, `mail_server`, `web_server`, `dns_server`, `file_server`, `db_server`, `vserver_server`, `config`, `updated`, `active`) VALUES (1, 1, 'riud', 'riud', 'r', '".$conf['hostname']."', '$mail_server_enabled', '$web_server_enabled', '$dns_server_enabled', '$file_server_enabled', '$db_server_enabled', '$vserver_server_enabled', '$server_ini_content', 0, 1);";
220 221 222 223 224
			$this->dbmaster->query($sql);
			$conf['server_id'] = $this->dbmaster->insertID();
			$conf['server_id'] = $conf['server_id'];
			
			//* Insert the same record in the local DB
tbrehm's avatar
tbrehm committed
225
			$sql = "INSERT INTO `server` (`server_id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_name`, `mail_server`, `web_server`, `dns_server`, `file_server`, `db_server`, `vserver_server`, `config`, `updated`, `active`) VALUES ('".$conf['server_id']."',1, 1, 'riud', 'riud', 'r', '".$conf['hostname']."', '$mail_server_enabled', '$web_server_enabled', '$dns_server_enabled', '$file_server_enabled', '$db_server_enabled', '$vserver_server_enabled', '$server_ini_content', 0, 1);";
226 227 228 229
			$this->db->query($sql);
			
			//* insert the ispconfig user in the remote server
			$from_host = $conf['hostname'];
tbrehm's avatar
tbrehm committed
230
			$from_ip = gethostbyname($conf['hostname']);
231 232
			
			//* username for the ispconfig user
233
			$conf['mysql']['master_ispconfig_user'] = 'ispcsrv'.$conf['server_id'];
234
		
tbrehm's avatar
tbrehm committed
235
			//* Delete ISPConfig user in the master database, in case that it exists
236 237
			$this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_host."';");
			$this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_host."';");
tbrehm's avatar
tbrehm committed
238 239
			$this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_ip."';");
			$this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_ip."';");
240 241 242 243 244 245
			$this->dbmaster->query('FLUSH PRIVILEGES;');
		
			//* Create the ISPConfig database user in the local database
        	$query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['master_database'].".* "
                	."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$from_host."' "
                	."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
tbrehm's avatar
tbrehm committed
246 247 248
			$query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['master_database'].".* "
                	."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$from_ip."' "
                	."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
249 250 251 252 253 254
			if(!$this->dbmaster->query($query)) {
				$this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
			}
		
		} else {
			//* Insert the server, if its not a mster / slave setup
tbrehm's avatar
tbrehm committed
255
			$sql = "INSERT INTO `server` (`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_name`, `mail_server`, `web_server`, `dns_server`, `file_server`, `db_server`, `vserver_server`, `config`, `updated`, `active`) VALUES (1, 1, 'riud', 'riud', 'r', '".$conf['hostname']."', '$mail_server_enabled', '$web_server_enabled', '$dns_server_enabled', '$file_server_enabled', '$db_server_enabled', '$vserver_server_enabled', '$server_ini_content', 0, 1);";
256 257 258 259 260 261
			$this->db->query($sql);
			$conf['server_id'] = $this->db->insertID();
			$conf['server_id'] = $conf['server_id'];
		}
		
		
262 263
	}
	
264

265
    //** writes postfix configuration files
tbrehm's avatar
tbrehm committed
266
    public function process_postfix_config($configfile)
tbrehm's avatar
tbrehm committed
267 268 269
    {	
		global $conf;
		
270
        $config_dir = $conf['postfix']['config_dir'].'/';
271 272 273 274 275 276
        $full_file_name = $config_dir.$configfile; 
        //* Backup exiting file
        if(is_file($full_file_name)){
            copy($full_file_name, $config_dir.$configfile.'~');
        }
        $content = rf('tpl/'.$configfile.'.master');
277 278 279 280 281
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
        $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content);
        $content = str_replace('{server_id}', $conf['server_id'], $content);
282 283 284
        wf($full_file_name, $content);
    }

285 286
	public function configure_jailkit()
    {
tbrehm's avatar
tbrehm committed
287 288 289
        global $conf;
		
		$cf = $conf['jailkit'];
290 291 292 293
		$config_dir = $cf['config_dir'];
		$jk_init = $cf['jk_init'];
		$jk_chrootsh = $cf['jk_chrootsh'];
		
294
		if (is_dir($config_dir))
295
		{
296 297
			if(is_file($config_dir.'/'.$jk_init)) copy($config_dir.'/'.$jk_init, $config_dir.'/'.$jk_init.'~');
			if(is_file($config_dir.'/'.$jk_chrootsh.".master")) copy($config_dir.'/'.$jk_chrootsh.".master", $config_dir.'/'.$jk_chrootsh.'~');
298 299 300 301 302 303 304
			
			copy('tpl/'.$jk_init.".master", $config_dir.'/'.$jk_init);
			copy('tpl/'.$jk_chrootsh.".master", $config_dir.'/'.$jk_chrootsh);
		}
		
    }
        
305 306
	public function configure_postfix($options = '')
    {
307 308
        global $conf;
		$cf = $conf['postfix'];
309 310
		$config_dir = $cf['config_dir'];
        
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337
		if(!is_dir($config_dir)){
            $this->error("The postfix configuration directory '$config_dir' does not exist.");
        }
        
		//* mysql-virtual_domains.cf
        $this->process_postfix_config('mysql-virtual_domains.cf');

		//* mysql-virtual_forwardings.cf
        $this->process_postfix_config('mysql-virtual_forwardings.cf');

		//* mysql-virtual_mailboxes.cf
        $this->process_postfix_config('mysql-virtual_mailboxes.cf');

		//* mysql-virtual_email2email.cf
        $this->process_postfix_config('mysql-virtual_email2email.cf');

		//* mysql-virtual_transports.cf
        $this->process_postfix_config('mysql-virtual_transports.cf');

		//* mysql-virtual_recipient.cf
        $this->process_postfix_config('mysql-virtual_recipient.cf');

		//* mysql-virtual_sender.cf
        $this->process_postfix_config('mysql-virtual_sender.cf');

		//* mysql-virtual_client.cf
        $this->process_postfix_config('mysql-virtual_client.cf');
338 339 340
		
		//* mysql-virtual_relaydomains.cf
        $this->process_postfix_config('mysql-virtual_relaydomains.cf');
341 342

		//* Changing mode and group of the new created config files.
343 344 345 346 347 348 349
		caselog('chmod o= '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null',
                 __FILE__, __LINE__, 'chmod on mysql-virtual_*.cf*', 'chmod on mysql-virtual_*.cf* failed');
		caselog('chgrp '.$cf['group'].' '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null', 
                __FILE__, __LINE__, 'chgrp on mysql-virtual_*.cf*', 'chgrp on mysql-virtual_*.cf* failed');
		
		//* Creating virtual mail user and group
		$command = 'groupadd -g '.$cf['vmail_groupid'].' '.$cf['vmail_groupname'];
350
		if(!is_group($cf['vmail_groupname'])) caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
351 352

		$command = 'useradd -g '.$cf['vmail_groupname'].' -u '.$cf['vmail_userid'].' '.$cf['vmail_username'].' -d '.$cf['vmail_mailbox_base'].' -m';
353
		if(!is_user($cf['vmail_username'])) caselog("$command &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");		
354 355

		$postconf_commands = array (
356 357
			'myhostname = '.$conf['hostname'],
			'mydestination = '.$conf['hostname'].', localhost, localhost.localdomain',
358 359
			'mynetworks = 127.0.0.0/8',
			'virtual_alias_domains =',
pedro_morgan's avatar
pedro_morgan committed
360 361
			'virtual_alias_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_forwardings.cf, mysql:'.$config_dir.'/mysql-virtual_email2email.cf',
			'virtual_mailbox_domains = proxy:mysql:'.$config_dir.'/mysql-virtual_domains.cf',
362 363 364 365
			'virtual_mailbox_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailboxes.cf',
			'virtual_mailbox_base = '.$cf['vmail_mailbox_base'],
			'virtual_uid_maps = static:'.$cf['vmail_userid'],
			'virtual_gid_maps = static:'.$cf['vmail_groupid'],
366 367
			'smtpd_sasl_auth_enable = yes',
			'broken_sasl_auth_clients = yes',
368
			'smtpd_sasl_authenticated_header = yes',
pedro_morgan's avatar
pedro_morgan committed
369
			'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination',
370
			'smtpd_use_tls = yes',
redray's avatar
redray committed
371
			'smtpd_tls_security_level = may',
redray's avatar
redray committed
372 373
			'smtpd_tls_cert_file = '.$config_dir.'/smtpd.cert',
			'smtpd_tls_key_file = '.$config_dir.'/smtpd.key',
pedro_morgan's avatar
pedro_morgan committed
374
			'transport_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_transports.cf',
375
			'relay_domains = mysql:'.$config_dir.'/mysql-virtual_relaydomains.cf',
376
			'virtual_create_maildirsize = yes',
377
			'virtual_maildir_extended = yes',
pedro_morgan's avatar
pedro_morgan committed
378
			'virtual_mailbox_limit_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailbox_limit_maps.cf',
379 380 381 382
			'virtual_mailbox_limit_override = yes',
			'virtual_maildir_limit_message = "The user you are trying to reach is over quota."',
			'virtual_overquota_bounce = yes',
			'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps',
pedro_morgan's avatar
pedro_morgan committed
383 384
			'smtpd_sender_restrictions = check_sender_access mysql:'.$config_dir.'/mysql-virtual_sender.cf',
			'smtpd_client_restrictions = check_client_access mysql:'.$config_dir.'/mysql-virtual_client.cf',
385 386
			'maildrop_destination_concurrency_limit = 1',
			'maildrop_destination_recipient_limit   = 1',
387
			'virtual_transport = maildrop',
pedro_morgan's avatar
pedro_morgan committed
388 389 390 391
			'header_checks = regexp:'.$config_dir.'/header_checks',
			'mime_header_checks = regexp:'.$config_dir.'/mime_header_checks',
			'nested_header_checks = regexp:'.$config_dir.'/nested_header_checks',
			'body_checks = regexp:'.$config_dir.'/body_checks'
392 393
		);
		
pedro_morgan's avatar
pedro_morgan committed
394 395 396 397 398
		//* Create the header and body check files
		touch($config_dir.'/header_checks');
		touch($config_dir.'/mime_header_checks');
		touch($config_dir.'/nested_header_checks');
		touch($config_dir.'/body_checks');
399 400
		
		
pedro_morgan's avatar
pedro_morgan committed
401 402
		//* Make a backup copy of the main.cf file
		copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
403
		
pedro_morgan's avatar
pedro_morgan committed
404
		//* Executing the postconf commands
405 406
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
pedro_morgan's avatar
pedro_morgan committed
407
			caselog($command." &> /dev/null", __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
408 409
		}
		
tbrehm's avatar
tbrehm committed
410
		if(!stristr($options,'dont-create-certs')) {
pedro_morgan's avatar
pedro_morgan committed
411
			//* Create the SSL certificate
redray's avatar
redray committed
412
			$command = 'cd '.$config_dir.'; '
redray's avatar
redray committed
413
                      .'openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509';
tbrehm's avatar
tbrehm committed
414
			exec($command);
415
		
redray's avatar
redray committed
416
			$command = 'chmod o= '.$config_dir.'/smtpd.key';
pedro_morgan's avatar
pedro_morgan committed
417
			caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
tbrehm's avatar
tbrehm committed
418
		}
419
		
420
		//** We have to change the permissions of the courier authdaemon directory to make it accessible for maildrop.
pedro_morgan's avatar
pedro_morgan committed
421 422
		$command = 'chmod 755  /var/run/courier/authdaemon/';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
423
		
pedro_morgan's avatar
pedro_morgan committed
424 425 426 427 428 429 430 431
		//* Changing maildrop lines in posfix master.cf
		if(is_file($config_dir.'/master.cf')){
            copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
        }
		if(is_file($config_dir.'/master.cf~')){
            exec('chmod 400 '.$config_dir.'/master.cf~');
        }
		$configfile = $config_dir.'/master.cf';
432
		$content = rf($configfile);
vogelor's avatar
vogelor committed
433 434
		$content = str_replace('flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}', 
                   'flags=R user='.$cf['vmail_username'].' argv=/usr/bin/maildrop -d ${recipient} ${extension} ${recipient} ${user} ${nexthop} ${sender}',
435 436
                     $content);
		wf($configfile, $content);
437
		
pedro_morgan's avatar
pedro_morgan committed
438
		//* Writing the Maildrop mailfilter file
439
		$configfile = 'mailfilter';
440 441 442 443 444 445
		if(is_file($cf['vmail_mailbox_base'].'/.'.$configfile)){
            copy($cf['vmail_mailbox_base'].'/.'.$configfile, $cf['vmail_mailbox_base'].'/.'.$configfile.'~');
        }
		$content = rf("tpl/$configfile.master");
		$content = str_replace('{dist_postfix_vmail_mailbox_base}', $cf['vmail_mailbox_base'], $content);
		wf($cf['vmail_mailbox_base'].'/.'.$configfile, $content);
446
		
447
		//* Create the directory for the custom mailfilters
448 449 450 451
		if(!is_dir($cf['vmail_mailbox_base'].'/mailfilters')) {
			$command = 'mkdir '.$cf['vmail_mailbox_base'].'/mailfilters';
			caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
		}
452
		
453 454 455
		//* Chmod and chown the .mailfilter file
		$command = 'chown -R '.$cf['vmail_username'].':'.$cf['vmail_groupname'].' '.$cf['vmail_mailbox_base'].'/.mailfilter';
		caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
456
		
457 458
		$command = 'chmod -R 600 '.$cf['vmail_mailbox_base'].'/.mailfilter';
		caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
459 460 461
		
	}
	
tbrehm's avatar
tbrehm committed
462
	public function configure_saslauthd() {
463 464
		global $conf;
		
465
	
466
		$configfile = 'sasl_smtpd.conf';
oliver's avatar
oliver committed
467 468
		if(is_file($conf["postfix"]["config_dir"].'/sasl/smtpd.conf')) copy($conf["postfix"]["config_dir"].'/sasl/smtpd.conf',$conf["postfix"]["config_dir"].'/sasl/smtpd.conf~');
		if(is_file($conf["postfix"]["config_dir"].'/sasl/smtpd.conf~')) exec('chmod 400 '.$conf["postfix"]["config_dir"].'/sasl/smtpd.conf~');
469
		$content = rf("tpl/".$configfile.".master");
470 471 472 473
		$content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
		$content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
		$content = str_replace('{mysql_server_ip}',$conf['mysql']['ip'],$content);
oliver's avatar
oliver committed
474
		wf($conf["postfix"]["config_dir"].'/sasl/smtpd.conf',$content);
475 476 477 478
		
		// TODO: Chmod and chown on the config file
		
		
479 480
		
		// Create the spool directory
481
		exec('mkdir -p /var/spool/postfix/var/run/saslauthd');
482 483
		
		// Edit the file /etc/default/saslauthd
oliver's avatar
oliver committed
484
		$configfile = $conf["saslauthd"]["config"];
485
		if(is_file($configfile)) copy($configfile,$configfile.'~');
486
		if(is_file($configfile.'~')) exec('chmod 400 '.$configfile.'~');
487 488
		$content = rf($configfile);
		$content = str_replace('START=no','START=yes',$content);
489
		// Debian
490
		$content = str_replace('OPTIONS="-c"','OPTIONS="-m /var/spool/postfix/var/run/saslauthd -r"',$content);
491 492
		// Ubuntu
		$content = str_replace('OPTIONS="-c -m /var/run/saslauthd"','OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"',$content);
493 494
		wf($configfile,$content);
		
495
		// Edit the file /etc/init.d/saslauthd
oliver's avatar
oliver committed
496
		$configfile = $conf["init_scripts"].'/'.$conf["saslauthd"]["init_script"];
497 498 499 500
		$content = rf($configfile);
		$content = str_replace('PIDFILE=$RUN_DIR/saslauthd.pid','PIDFILE="/var/spool/postfix/var/run/${NAME}/saslauthd.pid"',$content);
		wf($configfile,$content);
		
501 502 503
		// add the postfix user to the sasl group (at least nescessary for ubuntu 8.04 and most likely debian lenny too.
		exec('adduser postfix sasl');
		
504
		
505 506
	}
	
507 508
	public function configure_pam()
    {
509 510
		global $conf;
		$pam = $conf['pam'];
511
		//* configure pam for SMTP authentication agains the ispconfig database
512
		$configfile = 'pamd_smtp';
513 514 515 516
		if(is_file("$pam/smtp"))    copy("$pam/smtp", "$pam/smtp~");
		if(is_file("$pam/smtp~"))   exec("chmod 400 $pam/smtp~");

		$content = rf("tpl/$configfile.master");
517 518 519 520
		$content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
		$content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
		$content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content);
521 522 523
		wf("$pam/smtp", $content);
		exec("chmod 660 $pam/smtp");
		exec("chown daemon:daemon $pam/smtp");
524 525 526
	
	}
	
527 528
	public function configure_courier()
    {
529 530
		global $conf;
		$config_dir = $conf['courier']['config_dir'];
531
		//* authmysqlrc
532
		$configfile = 'authmysqlrc';
533 534 535 536 537
		if(is_file("$config_dir/$configfile")){
            copy("$config_dir/$configfile", "$config_dir/$configfile~");
        }
		exec("chmod 400 $config_dir/$configfile~");
		$content = rf("tpl/$configfile.master");
538 539 540 541
		$content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
		$content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
		$content = str_replace('{mysql_server_host}',$conf['mysql']['host'],$content);
542
		wf("$config_dir/$configfile", $content);
543
		
544 545
		exec("chmod 660 $config_dir/$configfile");
		exec("chown daemon:daemon $config_dir/$configfile");
546
		
547
		//* authdaemonrc
548
		$configfile = $conf['courier']['config_dir'].'/authdaemonrc';
549 550 551 552 553 554
		if(is_file($configfile)){
            copy($configfile, $configfile.'~');
        }
		if(is_file($configfile.'~')){
            exec('chmod 400 '.$configfile.'~');
        }
555
		$content = rf($configfile);
556 557
		$content = str_replace('authmodulelist="authpam"', 'authmodulelist="authmysql"', $content);
		wf($configfile, $content);
558 559
	}
	
tbrehm's avatar
tbrehm committed
560
	public function configure_amavis() {
561 562 563 564
		global $conf;
		
		// amavisd user config file
		$configfile = 'amavisd_user_config';
oliver's avatar
oliver committed
565 566
		if(is_file($conf["amavis"]["config_dir"].'/conf.d/50-user')) copy($conf["amavis"]["config_dir"].'/conf.d/50-user',$conf["courier"]["config_dir"].'/50-user~');
		if(is_file($conf["amavis"]["config_dir"].'/conf.d/50-user~')) exec('chmod 400 '.$conf["amavis"]["config_dir"].'/conf.d/50-user~');
567
		$content = rf("tpl/".$configfile.".master");
568 569 570
		$content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
		$content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
571
		$content = str_replace('{mysql_server_port}',$conf["mysql"]["port"],$content);
572
		$content = str_replace('{mysql_server_ip}',$conf['mysql']['ip'],$content);
oliver's avatar
oliver committed
573
		wf($conf["amavis"]["config_dir"].'/conf.d/50-user',$content);
574 575 576 577 578 579 580 581 582 583 584
		
		// TODO: chmod and chown on the config file
		
		
		// Adding the amavisd commands to the postfix configuration
		$postconf_commands = array (
			'content_filter = amavis:[127.0.0.1]:10024',
			'receive_override_options = no_address_mappings'
		);
		
		// Make a backup copy of the main.cf file
oliver's avatar
oliver committed
585
		copy($conf["postfix"]["config_dir"].'/main.cf',$conf["postfix"]["config_dir"].'/main.cf~2');
586 587 588 589
		
		// Executing the postconf commands
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
590
			caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
591 592 593
		}
		
		// Append the configuration for amavisd to the master.cf file
oliver's avatar
oliver committed
594
		if(is_file($conf["postfix"]["config_dir"].'/master.cf')) copy($conf["postfix"]["config_dir"].'/master.cf',$conf["postfix"]["config_dir"].'/master.cf~');
tbrehm's avatar
tbrehm committed
595
		$content = rf($conf["postfix"]["config_dir"].'/master.cf');
596
		// Only add the content if we had not addded it before
tbrehm's avatar
tbrehm committed
597
		if(!stristr($content,"127.0.0.1:10025")) {
tbrehm's avatar
tbrehm committed
598 599
			unset($content);
			$content = rf("tpl/master_cf_amavis.master");
oliver's avatar
oliver committed
600
			af($conf["postfix"]["config_dir"].'/master.cf',$content);
601
		}
tbrehm's avatar
tbrehm committed
602
		unset($content);
603 604 605 606 607 608 609
		
		// Add the clamav user to the amavis group
		exec('adduser clamav amavis');
		
		
	}
	
610 611
	public function configure_spamassassin()
    {
612 613
		global $conf;
		
614
		//* Enable spamasasssin on debian and ubuntu
615
		$configfile = '/etc/default/spamassassin';
616
		if(is_file($configfile)){
617
            copy($configfile, $configfile.'~');
618
        }
619
		$content = rf($configfile);
620 621
		$content = str_replace('ENABLED=0', 'ENABLED=1', $content);
		wf($configfile, $content);
622 623
	}
	
624 625
	public function configure_getmail()
    {
626 627
		global $conf;
		
628
		$config_dir = $conf['getmail']['config_dir'];
629 630
		
		if(!is_dir($config_dir)) exec("mkdir -p ".escapeshellcmd($config_dir));
631 632

		$command = "useradd -d $config_dir getmail";
633
		if(!is_user('getmail')) caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
tbrehm's avatar
tbrehm committed
634
		
635 636
		$command = "chown -R getmail $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
637
		
638 639
		$command = "chmod -R 700 $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
640 641
	}
	
642
	
643 644
	public function configure_pureftpd()
    {
645 646
		global $conf;
		
647
		$config_dir = $conf['pureftpd']['config_dir'];
648 649

		//* configure pam for SMTP authentication agains the ispconfig database
650
		$configfile = 'db/mysql.conf';
651 652 653 654 655 656 657
		if(is_file("$config_dir/$configfile")){
            copy("$config_dir/$configfile", "$config_dir/$configfile~");
        }
		if(is_file("$config_dir/$configfile~")){
            exec("chmod 400 $config_dir/$configfile~");
        }
		$content = rf('tpl/pureftpd_mysql.conf.master');
658 659 660 661 662
		$content = str_replace('{mysql_server_ispconfig_user}', $conf["mysql"]["ispconfig_user"], $content);
		$content = str_replace('{mysql_server_ispconfig_password}', $conf["mysql"]["ispconfig_password"], $content);
		$content = str_replace('{mysql_server_database}', $conf["mysql"]["database"], $content);
		$content = str_replace('{mysql_server_ip}', $conf["mysql"]["ip"], $content);
		$content = str_replace('{server_id}', $conf["server_id"], $content);
663 664 665 666
		wf("$config_dir/$configfile", $content);
		exec("chmod 600 $config_dir/$configfile");
		exec("chown root:root $config_dir/$configfile");
		// **enable chrooting
667
		//exec('mkdir -p '.$config_dir.'/conf/ChrootEveryone');
668
		exec('echo "yes" > '.$config_dir.'/conf/ChrootEveryone');
669
		exec('echo "yes" > '.$config_dir.'/conf/BrokenClientsCompatibility');
tbrehm's avatar
tbrehm committed
670 671
	}
	
672 673
	public function configure_mydns()
    {
674 675 676 677
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
oliver's avatar
oliver committed
678 679
		if(is_file($conf["mydns"]["config_dir"].'/'.$configfile)) copy($conf["mydns"]["config_dir"].'/'.$configfile,$conf["mydns"]["config_dir"].'/'.$configfile.'~');
		if(is_file($conf["mydns"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["mydns"]["config_dir"].'/'.$configfile.'~');
680
		$content = rf("tpl/".$configfile.".master");
681 682 683
		$content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
		$content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
684
		$content = str_replace('{mysql_server_host}',$conf["mysql"]["host"],$content);
685
		$content = str_replace('{server_id}',$conf["server_id"],$content);
oliver's avatar
oliver committed
686 687 688
		wf($conf["mydns"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
689 690 691
	
	}
	
692 693
	public function configure_apache()
    {	
694 695
		global $conf;
		
696 697
		//* Create the logging directory for the vhost logfiles
		exec('mkdir -p /var/log/ispconfig/httpd');
698
		
699
		if(is_file('/etc/suphp/suphp.conf')) {
700
			replaceLine('/etc/suphp/suphp.conf','php=php:/usr/bin','x-httpd-suphp=php:/usr/bin/php-cgi',0);
701 702 703
			replaceLine('/etc/suphp/suphp.conf','docroot=','docroot=/var/clients',0);
		}
		
704 705 706 707 708
		if(is_file('/etc/apache2/sites-enabled/000-default')) {
			replaceLine('/etc/apache2/sites-available/000-default','NameVirtualHost *','NameVirtualHost *:80',1);
			replaceLine('/etc/apache2/sites-available/000-default','<VirtualHost *>','<VirtualHost *:80>',1);
		}
		
709 710 711 712 713
		if(is_file('/etc/apache2/ports.conf')) {
			// add a line "Listen 443" to ports conf if line does not exist
			replaceLine('/etc/apache2/ports.conf','Listen 443','Listen 443',1);
		}
		
714
		
715 716 717 718 719
		//* Copy the ISPConfig configuration include
        $vhost_conf_dir = $conf['apache']['vhost_conf_dir'];
        $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
        
		copy('tpl/apache_ispconfig.conf.master',$vhost_conf_dir.'/ispconfig.conf');
720 721
		if(!@is_link($vhost_conf_enabled_dir."/000-ispconfig.conf")) {
			exec("ln -s ".$vhost_conf_dir."/ispconfig.conf ".$vhost_conf_enabled_dir."/000-ispconfig.conf");
722 723
		}
		
724 725
	}
	
tbrehm's avatar
tbrehm committed
726 727 728 729 730 731
	public function configure_firewall()
	{
		global $conf;
		
		$dist_init_scripts = $conf['init_scripts'];
  		
732
		if(is_dir("/etc/Bastille.backup")) caselog("rm -rf /etc/Bastille.backup", __FILE__, __LINE__);
733
		if(is_dir("/etc/Bastille")) caselog("mv -f /etc/Bastille /etc/Bastille.backup", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
734
  		@mkdir("/etc/Bastille", octdec($directory_mode));
735 736 737
  		if(is_dir("/etc/Bastille.backup/firewall.d")) caselog("cp -pfr /etc/Bastille.backup/firewall.d /etc/Bastille/", __FILE__, __LINE__);
  		caselog("cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
  		caselog("chmod 644 /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
738 739 740 741 742 743
  		$content = rf("/etc/Bastille/bastille-firewall.cfg");
  		$content = str_replace("{DNS_SERVERS}", "", $content);

  		$tcp_public_services = '';
  		$udp_public_services = '';
		
744
		$row = $this->db->queryOneRecord("SELECT * FROM firewall WHERE server_id = ".intval($conf['server_id']));
tbrehm's avatar
tbrehm committed
745 746 747 748 749
		
  		if(trim($row["tcp_port"]) != '' || trim($row["udp_port"]) != ''){
    		$tcp_public_services = trim(str_replace(',',' ',$row["tcp_port"]));
    		$udp_public_services = trim(str_replace(',',' ',$row["udp_port"]));
  		} else {
750
    		$tcp_public_services = '21 22 25 53 80 110 143 443 3306 8080 10000';
tbrehm's avatar
tbrehm committed
751 752
    		$udp_public_services = '53';
  		}
tbrehm's avatar
tbrehm committed
753 754
		
		if(!stristr($tcp_public_services, $conf['apache']['vhost_port'])) {
fantu's avatar
fantu committed
755
			$tcp_public_services .= ' '.intval($conf['apache']['vhost_port']);
fantu's avatar
fantu committed
756
			if($row["tcp_port"] != '') $this->db->query("UPDATE firewall SET tcp_port = tcp_port + ',".intval($conf['apache']['vhost_port'])."' WHERE server_id = ".intval($conf['server_id']));
757 758
		}
		
tbrehm's avatar
tbrehm committed
759 760 761 762 763
  		$content = str_replace("{TCP_PUBLIC_SERVICES}", $tcp_public_services, $content);
  		$content = str_replace("{UDP_PUBLIC_SERVICES}", $udp_public_services, $content);

  		wf("/etc/Bastille/bastille-firewall.cfg", $content);

tbrehm's avatar
tbrehm committed
764
  		if(is_file($dist_init_scripts."/bastille-firewall")) caselog("mv -f $dist_init_scripts/bastille-firewall $dist_init_scripts/bastille-firewall.backup", __FILE__, __LINE__);
765 766
  		caselog("cp -f apps/bastille-firewall $dist_init_scripts", __FILE__, __LINE__);
  		caselog("chmod 700 $dist_init_scripts/bastille-firewall", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
767

768 769 770
  		if(is_file("/sbin/bastille-ipchains")) caselog("mv -f /sbin/bastille-ipchains /sbin/bastille-ipchains.backup", __FILE__, __LINE__);
  		caselog("cp -f apps/bastille-ipchains /sbin", __FILE__, __LINE__);
  		caselog("chmod 700 /sbin/bastille-ipchains", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
771

772 773 774 775 776
  		if(is_file("/sbin/bastille-netfilter")) caselog("mv -f /sbin/bastille-netfilter /sbin/bastille-netfilter.backup", __FILE__, __LINE__);
  		caselog("cp -f apps/bastille-netfilter /sbin", __FILE__, __LINE__);
  		caselog("chmod 700 /sbin/bastille-netfilter", __FILE__, __LINE__);
		
		if(!@is_dir('/var/lock/subsys')) caselog("mkdir /var/lock/subsys", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
777 778

  		exec("which ipchains &> /dev/null", $ipchains_location, $ret_val);
779
  		if(!is_file("/sbin/ipchains") && !is_link("/sbin/ipchains") && $ret_val == 0) phpcaselog(@symlink(shell_exec("which ipchains"), "/sbin/ipchains"), 'create symlink', __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
780 781
  		unset($ipchains_location);
  		exec("which iptables &> /dev/null", $iptables_location, $ret_val);
782
  		if(!is_file("/sbin/iptables") && !is_link("/sbin/iptables") && $ret_val == 0) phpcaselog(@symlink(trim(shell_exec("which iptables")), "/sbin/iptables"), 'create symlink', __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
783 784 785 786
  		unset($iptables_location);

	}
	
tbrehm's avatar
tbrehm committed
787
	
788 789
	public function install_ispconfig()
    {
790 791
		global $conf;
		
792
		$install_dir = $conf['ispconfig_install_dir'];
793 794

		//* Create the ISPConfig installation directory
795
		if(!@is_dir("$install_dir")) {
796 797 798
			$command = "mkdir $install_dir";
			caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
		}
799
		
800 801
		//* Create a ISPConfig user and group
		$command = 'groupadd ispconfig';
802
		if(!is_group('ispconfig')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
803
		
804
		$command = "useradd -g ispconfig -d $install_dir ispconfig";
805
		if(!is_user('ispconfig')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
806
		
807 808 809
		//* copy the ISPConfig interface part
		$command = "cp -rf ../interface $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
810
		
811 812 813
		//* copy the ISPConfig server part
		$command = "cp -rf ../server $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
814